Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotifCommon.c')
-rw-r--r--features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotifCommon.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotifCommon.c b/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotifCommon.c
new file mode 100644
index 000000000..93f21cbd3
--- /dev/null
+++ b/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotifCommon.c
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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
+ * Andrew Niefer
+ *******************************************************************************/
+
+#include "eclipseCommon.h"
+#include "eclipseOS.h"
+#include "eclipseMotif.h"
+
+#include <locale.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#define ECLIPSE_ICON 401
+
+char dirSeparator = '/';
+char pathSeparator = ':';
+
+void centreShell( Widget widget, Widget expose );
+
+/* Global Variables */
+XtAppContext appContext = 0;
+Widget topWindow = 0;
+
+/* Define local variables for the main window. */
+static int saveArgc = 0; /* arguments after they were parsed, for window system */
+static char** saveArgv = 0;
+
+int motifInitialized = 0;
+
+/* Display a Message */
+void displayMessage( char* title, char* message )
+{
+ char* displayName = NULL;
+ Widget msgBox = NULL;
+ XmString msg;
+ Arg arg[20];
+ int nArgs;
+ XEvent event;
+
+ /* If there is no associated display, or we fail to initialize Xt, just print the error and return. */
+ displayName = getenv("DISPLAY");
+ if ( displayName == NULL || strlen(displayName) == 0 ||
+ (topWindow == 0 && initWindowSystem( &saveArgc, saveArgv, 1 ) != 0) )
+ {
+ printf("%s:\n%s\n", title, message);
+ return;
+ }
+ msg = motif.XmStringGenerate( message, NULL, XmCHARSET_TEXT, NULL );
+
+ /* Output a simple message box. */
+ nArgs = 0;
+
+ motif_XtSetArg( arg[ nArgs ], XmNdialogType, XmDIALOG_MESSAGE ); nArgs++;
+ motif_XtSetArg( arg[ nArgs ], XmNtitle, title ); nArgs++;
+ motif_XtSetArg( arg[ nArgs ], XmNmessageString, msg ); nArgs++;
+ msgBox = motif.XmCreateMessageDialog( topWindow, getOfficialName(), arg, nArgs );
+
+ motif.XtUnmanageChild( motif.XmMessageBoxGetChild( msgBox, XmDIALOG_CANCEL_BUTTON ) );
+ motif.XtUnmanageChild( motif.XmMessageBoxGetChild( msgBox, XmDIALOG_HELP_BUTTON ) );
+ motif.XtManageChild( msgBox );
+ centreShell( msgBox, msgBox );
+ if (msg != 0) motif.XmStringFree (msg);
+
+ /* Wait for the OK button to be pressed. */
+ while (motif_XtIsRealized( msgBox ) && motif.XtIsManaged( msgBox ))
+ {
+ motif.XtAppNextEvent( appContext, &event );
+ motif.XtDispatchEvent( &event );
+ }
+ motif.XtDestroyWidget( msgBox );
+}
+
+/* Initialize Window System
+ *
+ * Initialize the Xt and Xlib.
+ */
+int initWindowSystem( int* pArgc, char* argv[], int showSplash )
+{
+ Arg arg[20];
+ char * officialName;
+
+ if(motifInitialized == 1)
+ return 0;
+
+ if (loadMotif() != 0)
+ return -1;
+
+ /* Save the arguments in case displayMessage() is called in the main launcher. */
+ if (saveArgv == 0)
+ {
+ saveArgc = *pArgc;
+ saveArgv = argv;
+ }
+
+ officialName = getOfficialName();
+ if (officialName != NULL)
+ setenv("RESOURCE_NAME", getOfficialName(), 1);
+
+ /* Create the top level shell that will not be used other than
+ to initialize the application.
+ */
+#ifdef AIX
+ topWindow = motif.eclipseXtInitialize(NULL, officialName, NULL, 0, pArgc, argv);
+#else
+ topWindow = motif.XtInitialize(NULL, officialName, NULL, 0, pArgc, argv);
+#endif
+ appContext = motif.XtWidgetToApplicationContext(topWindow);
+ motif.XtSetLanguageProc (appContext, NULL, NULL);
+ motif_XtSetArg( arg[ 0 ], XmNmappedWhenManaged, False );
+ motif.XtSetValues( topWindow, arg, 1 );
+ motif.XtRealizeWidget( topWindow );
+ motifInitialized = 1;
+ return 0;
+}
+
+/* Centre the shell on the screen. */
+void centreShell( Widget widget, Widget expose )
+{
+ XtAppContext context;
+ XEvent event;
+ Arg arg[20];
+ int nArgs;
+ Position x, y;
+ Dimension width, height;
+ Screen* screen;
+ int waiting;
+ short screenWidth, screenHeight;
+
+#ifndef NO_XINERAMA_EXTENSIONS
+ Display* display;
+ int monitorCount;
+ XineramaScreenInfo* info;
+#endif
+
+ /* Realize the shell to calculate its width/height. */
+ motif.XtRealizeWidget( widget );
+
+ /* Get the desired dimensions of the shell. */
+ nArgs = 0;
+ motif_XtSetArg( arg[ nArgs ], XmNwidth, &width ); nArgs++;
+ motif_XtSetArg( arg[ nArgs ], XmNheight, &height ); nArgs++;
+ motif_XtSetArg( arg[ nArgs ], XmNscreen, &screen ); nArgs++;
+ motif.XtGetValues( widget, arg, nArgs );
+
+ screenWidth = screen->width;
+ screenHeight = screen->height;
+#ifndef NO_XINERAMA_EXTENSIONS
+ display = motif_XtDisplay( widget );
+ if (motif.XineramaIsActive != 0 && motif.XineramaIsActive( display )) {
+ info = motif.XineramaQueryScreens( display, &monitorCount );
+ if (info != 0) {
+ if (monitorCount > 1) {
+ screenWidth = info->width;
+ screenHeight = info->height;
+ }
+ motif.XFree (info);
+ }
+ }
+#endif
+
+ /* Calculate the X and Y position for the shell. */
+ x = (screenWidth - width) / 2;
+ y = (screenHeight - height) / 2;
+
+ /* Set the new shell position and display it. */
+ nArgs = 0;
+ motif_XtSetArg( arg[ nArgs ], XmNx, x ); nArgs++;
+ motif_XtSetArg( arg[ nArgs ], XmNy, y ); nArgs++;
+ motif.XtSetValues( widget, arg, nArgs );
+ motif_XtMapWidget( widget );
+
+ /* Wait for an expose event on the desired widget. This wait loop is required when
+ * the startVM command fails and the message box is created before the splash
+ * window is displayed. Without this wait, the message box sometimes appears
+ * under the splash window and the user cannot see it.
+ */
+ context = motif.XtWidgetToApplicationContext( widget );
+ waiting = True;
+ while (waiting)
+ {
+ motif.XtAppNextEvent( context, &event );
+ if (event.xany.type == Expose && event.xany.window == motif_XtWindow( expose ))
+ {
+ waiting = False;
+ }
+ motif.XtDispatchEvent( &event );
+ }
+ motif.XFlush( motif_XtDisplay( widget ) );
+}
+
+/* Load the specified shared library
+ */
+void * loadLibrary( char * library ){
+ void * result= dlopen(library, RTLD_LAZY);
+ if(result == 0)
+ printf("%s\n",dlerror());
+ return result;
+}
+
+/* Unload the shared library
+ */
+void unloadLibrary( void * handle ){
+ dlclose(handle);
+}
+
+/* Find the given symbol in the shared library
+ */
+void * findSymbol( void * handle, char * symbol ){
+ return dlsym(handle, symbol);
+}
+

Back to the top