/******************************************************************************* * Copyright (c) 2007, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ #include "eclipseMotif.h" #include "eclipseCommon.h" #include #include struct MOTIF_PTRS motif; /* need to undef these so the FN_TABLE works ok */ #undef _XmStrings #undef XtShellStrings #undef XtStrings /* functions from libXm */ static FN_TABLE xmFunctions[] = { FN_TABLE_ENTRY(XmCreateDrawingArea), FN_TABLE_ENTRY(XmCreateLabelGadget), FN_TABLE_ENTRY(XmCreateMainWindow), FN_TABLE_ENTRY(XmCreateMessageDialog), FN_TABLE_ENTRY(XmMessageBoxGetChild), FN_TABLE_ENTRY(XmStringFree), FN_TABLE_ENTRY(XmStringGenerate), FN_TABLE_ENTRY(_XmStrings), /* not a function */ { NULL, NULL } }; /* functions from libXt */ static FN_TABLE xtFunctions[] = { FN_TABLE_ENTRY(XtAddCallback), FN_TABLE_ENTRY(XtAppCreateShell), FN_TABLE_ENTRY(XtAppNextEvent), FN_TABLE_ENTRY(XtAppPending), FN_TABLE_ENTRY(XtAppProcessEvent), FN_TABLE_ENTRY(XtDestroyWidget), FN_TABLE_ENTRY(XtDispatchEvent), FN_TABLE_ENTRY(XtGetValues), #ifndef AIX FN_TABLE_ENTRY(XtInitialize), #endif FN_TABLE_ENTRY(XtIsManaged), FN_TABLE_ENTRY(XtManageChild), FN_TABLE_ENTRY(XtMapWidget), FN_TABLE_ENTRY(XtPopup), FN_TABLE_ENTRY(XtRealizeWidget), FN_TABLE_ENTRY(XtSetLanguageProc), FN_TABLE_ENTRY(XtSetMappedWhenManaged), FN_TABLE_ENTRY(XtSetValues), FN_TABLE_ENTRY(XtUnmanageChild), FN_TABLE_ENTRY(XtWidgetToApplicationContext), FN_TABLE_ENTRY(XtWindowOfObject), FN_TABLE_ENTRY(XtShellStrings), /* not a function */ FN_TABLE_ENTRY(XtStrings), /* not a function */ FN_TABLE_ENTRY(applicationShellWidgetClass), /* not a function */ { NULL, NULL } }; #ifdef AIX static FN_TABLE shimFunctions[] = { FN_TABLE_ENTRY(eclipseXtInitialize), {NULL, NULL} }; #endif /* functions from libX11 */ static FN_TABLE x11Functions[] = { FN_TABLE_ENTRY(XDefaultScreenOfDisplay), FN_TABLE_ENTRY(XFree), FN_TABLE_ENTRY(XFlush), FN_TABLE_ENTRY(XGetGeometry), FN_TABLE_ENTRY(XMapWindow), { NULL, NULL } }; #ifndef NO_XINERAMA_EXTENSIONS static FN_TABLE xinFunctions[] = { FN_TABLE_ENTRY(XineramaIsActive), FN_TABLE_ENTRY(XineramaQueryScreens), { NULL, NULL } }; #endif static int loadMotifSymbols( void * library, FN_TABLE * table) { int i = 0; void * fn; for (i = 0; table[i].fnName != NULL; i++) { fn = findSymbol(library, table[i].fnName); if (fn != 0) { *(table[i].fnPtr) = fn; } else { *(table[i].fnPtr) = 0; return -1; } } return 0; } #ifdef AIX void * loadMotifShimLibrary() { if (eclipseLibrary != NULL) { /* library is the normal eclipse_.so, look for libeclipse-motif.so beside it */ _TCHAR* eclipseMotifLib = _T_ECLIPSE("libeclipse-motif.so"); _TCHAR* path = strdup(eclipseLibrary); _TCHAR* c = strrchr(path, '/'); if (c == NULL) return NULL; *c = 0; c = malloc((strlen(path) + 2 + strlen(eclipseMotifLib)) * sizeof(char)); _stprintf(c, _T_ECLIPSE("%s/%s"), path, eclipseMotifLib); return dlopen(c, RTLD_LAZY); } return 0; } #endif int loadMotif() { void * xmLib = NULL, *xtLib = NULL, *x11Lib = NULL, *xinLib = NULL; #ifdef AIX void * motifShim = NULL; #endif char * path = getProgramDir(); int dlFlags = RTLD_LAZY; /* initialize ptr struct to 0's */ memset(&motif, 0, sizeof(struct MOTIF_PTRS)); #ifndef AIX if (path != NULL) { /* look for libXm first in the root of eclipse */ char * lib = malloc((strlen(path) + strlen(_T_ECLIPSE(XM_LIB)) + 2) * sizeof(char)); sprintf( lib, "%s%c%s", path, dirSeparator, XM_LIB); xmLib = dlopen(lib, dlFlags); free(lib); } #else dlFlags |= RTLD_MEMBER; motifShim = loadMotifShimLibrary(); if (motifShim == NULL) return -1; #endif if (xmLib == NULL) { xmLib = dlopen(XM_LIB, dlFlags); } if (xmLib == NULL) { /* bail now, don't load the others, libXm must be loaded first, so leave things for * swt to do later */ return -1; } xtLib = dlopen(XT_LIB, dlFlags); x11Lib = dlopen(X11_LIB, dlFlags); /* printf("XmLib: %s: %x\nXtLib: %s: %x\nX11Lib:%s, %x\n", XM_LIB, xmLib, XT_LIB, xtLib, X11_LIB, x11Lib);*/ #ifndef NO_XINERAMA_EXTENSIONS /* don't fail without Xinerama */ xinLib = dlopen(XIN_LIB, dlFlags); if (xinLib != NULL) loadMotifSymbols(xinLib, xinFunctions); #endif if( xtLib == NULL || x11Lib == NULL) return -1; if (loadMotifSymbols(xmLib, xmFunctions) != 0) return -1; if (loadMotifSymbols(xtLib, xtFunctions) != 0) return -1; if (loadMotifSymbols(x11Lib, x11Functions) != 0) return -1; #ifdef AIX if (loadMotifSymbols(motifShim, shimFunctions) !=0) return -1; #endif return 0; }