summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2004-02-23 21:34:34 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2004-02-23 21:34:34 +0000
commit2928a163b235d91385874aa6a1a6f893b045f606 (patch)
tree6f72daca2e517d094c6e5638d30b306ab9c2a960 /src
parentcdaa6bdee4f6796ac6337fa030bfe4aaa3975db2 (diff)
merge most of XFree86 RC3 (4.3.99.903) from vendor branch. bug #214XORG-RELEASE-1-BASEXEVIE-MERGEXINERAMA_2
Diffstat (limited to 'src')
-rw-r--r--src/Alloc.c10
-rw-r--r--src/Initialize.c62
-rw-r--r--src/Vendor.c23
3 files changed, 87 insertions, 8 deletions
diff --git a/src/Alloc.c b/src/Alloc.c
index 80fadfb..939d216 100644
--- a/src/Alloc.c
+++ b/src/Alloc.c
@@ -58,7 +58,7 @@ used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
*/
-/* $XFree86: xc/lib/Xt/Alloc.c,v 1.9 2001/12/14 19:56:07 dawes Exp $ */
+/* $XFree86: xc/lib/Xt/Alloc.c,v 1.10 2003/12/30 01:45:07 tsi Exp $ */
/*
* X Toolkit Memory Allocation Routines
@@ -117,7 +117,7 @@ char *XtMalloc(size)
{
char *ptr;
-#if defined (MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
/* preserve this (broken) behavior until everyone fixes their apps */
if (!size) size = 1;
#endif
@@ -132,12 +132,12 @@ char *XtRealloc(ptr, size)
unsigned size;
{
if (ptr == NULL) {
-#if MALLOC_0_RETURNS_NULL
+#ifdef MALLOC_0_RETURNS_NULL
if (!size) size = 1;
#endif
return(XtMalloc(size));
} else if ((ptr = Xrealloc(ptr, size)) == NULL
-#if MALLOC_0_RETURNS_NULL
+#ifdef MALLOC_0_RETURNS_NULL
&& size
#endif
)
@@ -151,7 +151,7 @@ char *XtCalloc(num, size)
{
char *ptr;
-#if defined (MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
+#if defined(MALLOC_0_RETURNS_NULL) && defined(XTMALLOC_BC)
/* preserve this (broken) behavior until everyone fixes their apps */
if (!size) num = size = 1;
#endif
diff --git a/src/Initialize.c b/src/Initialize.c
index c79ddc2..e590666 100644
--- a/src/Initialize.c
+++ b/src/Initialize.c
@@ -32,7 +32,7 @@ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
-/* $XFree86: xc/lib/Xt/Initialize.c,v 3.21 2003/04/21 16:34:27 herrb Exp $ */
+/* $XFree86: xc/lib/Xt/Initialize.c,v 3.22 2003/12/22 21:10:25 dickey Exp $ */
/*
@@ -184,6 +184,66 @@ void _XtInherit()
#define _XtInherit __XtInherit
#endif
+
+#if defined(__CYGWIN__)
+/*
+ * The Symbol _XtInherit is used in two different manners.
+ * First it could be used as a generic function and second
+ * as an absolute address reference, which will be used to
+ * check the initialisation process of several other libraries.
+ * Because of this the symbol must be accessable by all
+ * client dll's and applications. In unix environments
+ * this is no problem, because the used shared libraries
+ * format (elf) supports this immediatly. Under Windows
+ * this isn't true, because a functions address in a dll
+ * is different from the same function in another dll or
+ * applications, because the used Portable Executable
+ * File adds a code stub to each client to provide the
+ * exported symbol name. This stub uses an indirect
+ * pointer to get the original symbol address, which is
+ * then jumped to, like in this example:
+ *
+ * --- client --- --- dll ----
+ * ...
+ * call foo
+ *
+ * foo: jmp (*_imp_foo) ----> foo: ....
+ * nop
+ * nop
+ *
+ * _imp_foo: .long <index of foo in dll export table, is
+ * set to the real address by the runtime linker>
+ *
+ * Now it is clear why the clients symbol foo isn't the same
+ * as in the dll and we can think about how to deal which
+ * this two above mentioned requirements, to export this
+ * symbol to all clients and to allow calling this symbol
+ * as a function. The solution I've used exports the
+ * symbol _XtInherit as data symbol, because global data
+ * symbols are exported to all clients. But how to deal
+ * with the second requirement, that this symbol should
+ * be used as function. The Trick is to build a little
+ * code stub in the data section in the exact manner as
+ * above explained. This is done with the assembler code
+ * below.
+ *
+ * Ralf Habacker
+ *
+ * References:
+ * msdn http://msdn.microsoft.com/msdnmag/issues/02/02/PE/PE.asp
+ * cygwin-xfree: http://www.cygwin.com/ml/cygwin-xfree/2003-10/msg00000.html
+ */
+
+asm (".data\n\
+ .globl __XtInherit \n\
+ __XtInherit: jmp *_y \n\
+ _y: .long ___XtInherit \n\
+ .text \n");
+
+#define _XtInherit __XtInherit
+#endif
+
+
void _XtInherit()
{
XtErrorMsg("invalidProcedure","inheritanceProc",XtCXtToolkitError,
diff --git a/src/Vendor.c b/src/Vendor.c
index 3b282dc..b2f0b0d 100644
--- a/src/Vendor.c
+++ b/src/Vendor.c
@@ -46,7 +46,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
-/* $XFree86: xc/lib/Xt/Vendor.c,v 1.7 2002/05/31 18:45:46 dawes Exp $ */
+/* $XFree86: xc/lib/Xt/Vendor.c,v 1.8 2003/12/22 21:10:25 dickey Exp $ */
/* Make sure all wm properties can make it out of the resource manager */
@@ -64,9 +64,11 @@ SOFTWARE.
*
***************************************************************************/
-#ifdef __UNIXOS2__
+#if defined(__UNIXOS2__) || defined(__CYGWIN__)
/* to fix the EditRes problem because of wrong linker semantics */
extern WidgetClass vendorShellWidgetClass;
+
+#if defined(__UNIXOS2__)
unsigned long _DLL_InitTerm(unsigned long mod,unsigned long flag)
{
switch (flag) {
@@ -82,6 +84,23 @@ unsigned long _DLL_InitTerm(unsigned long mod,unsigned long flag)
}
#endif
+#if defined(__CYGWIN__)
+int __stdcall
+DllMain(unsigned long mod_handle, unsigned long flag, void *routine)
+{
+ switch (flag)
+ {
+ case 1: /* DLL_PROCESS_ATTACH - process attach */
+ vendorShellWidgetClass = (WidgetClass)(&vendorShellClassRec);
+ break;
+ case 0: /* DLL_PROCESS_DETACH - process detach */
+ break;
+ }
+ return 1;
+}
+#endif
+#endif
+
externaldef(vendorshellclassrec) VendorShellClassRec vendorShellClassRec = {
{
/* superclass */ (WidgetClass) &wmShellClassRec,