blob: 84e7295f9314eded8ff15185bf9e92c7696edc7b [file] [log] [blame]
/*******************************************************************************
* 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 <dlfcn.h>
#include <stdlib.h>
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_<ver>.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;
}