Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotif.c')
-rw-r--r--features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotif.c336
1 files changed, 336 insertions, 0 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotif.c b/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotif.c
new file mode 100644
index 000000000..049cb7837
--- /dev/null
+++ b/features/org.eclipse.equinox.executable.feature/library/motif/eclipseMotif.c
@@ -0,0 +1,336 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 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
+ * Kevin Cornell (Rational Software Corporation)
+ *******************************************************************************/
+
+
+/* UNIX/Motif specific logic for displaying the splash screen. */
+#include "eclipseCommon.h"
+#include "eclipseMozilla.h"
+#include "eclipseMotif.h"
+#include "eclipseOS.h"
+#include "eclipseUtil.h"
+#include "NgImage.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#ifdef SOLARIS
+#include <sys/filio.h>
+#endif
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <locale.h>
+#include <stdlib.h>
+
+/* Global Variables */
+char* defaultVM = "java";
+char* vmLibrary = "libjvm.so";
+char* shippedVMDir = "jre/bin/";
+
+/* Define the special arguments for the various Java VMs. */
+static char* argVM_JAVA[] = { NULL };
+#if AIX
+static char* argVM_JAVA_AIX131[] = { "-Xquickstart", NULL };
+#endif
+static char* argVM_J9[] = { "-jit", "-mca:1024", "-mco:1024", "-mn:256", "-mo:4096",
+ "-moi:16384", "-mx:262144", "-ms:16", "-mr:16", NULL };
+
+/* Define local variables for the main window. */
+extern XtAppContext appContext;
+extern Widget topWindow;
+
+static pid_t jvmProcess = 0;
+static int jvmExitCode;
+
+/* Define local variables for handling the splash window and its image. */
+static Widget shellHandle = 0;
+
+extern void centreShell( Widget widget, Widget expose );
+
+#ifdef NETSCAPE_FIX
+void fixEnvForNetscape();
+#endif /* NETSCAPE_FIX */
+
+void takeDownSplashCB( Widget shell, XtPointer app_data, XtPointer widget_data ) {
+ shellHandle = NULL;
+}
+
+/* Show the Splash Window
+ *
+ * Create the splash window, load the pixmap and display the splash window.
+ */
+int showSplash( const char* featureImage )
+{
+ int x, y;
+ unsigned int width, height, depth, border;
+ ArgList args;
+ unsigned int nArgs;
+ Pixmap splashPixmap = 0;
+ Window root;
+ Display *xDisplay;
+ Screen* screen;
+ Widget scrolledHandle, drawingHandle, image;
+
+ if (shellHandle != 0)
+ return 0; /* already showing splash */
+
+ if (initialArgv == NULL)
+ initialArgc = 0;
+
+ if (initWindowSystem(&initialArgc, initialArgv, 1) != 0) {
+ return -1;
+ }
+
+ xDisplay = motif_XtDisplay(topWindow);
+ screen = motif.XDefaultScreenOfDisplay( xDisplay );
+ if (featureImage != NULL)
+ {
+ splashPixmap = loadBMPImage(xDisplay, screen, (char*)featureImage);
+ }
+ /* If the splash image could not be found, return an error. */
+ if (splashPixmap == 0)
+ return ENOENT;
+
+ motif.XGetGeometry (xDisplay, splashPixmap, &root, &x, &y, &width, &height, &border, &depth);
+
+ /* make sure we never pass more than 20 args */
+ args = malloc(10 * sizeof(Arg));
+
+ nArgs = 0;
+ /* Note that XtSetArg is a macro, and the 1st argument will be evaluated twice
+ * so increment nArgs on its own */
+ motif_XtSetArg(args[nArgs], XmNmwmDecorations, 0); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNtitle, getOfficialName()); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNwidth, width); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNheight, height); nArgs++;
+ shellHandle = motif.XtAppCreateShell(getOfficialName(), "", *motif.applicationShellWidgetClass, xDisplay, args, nArgs);
+ motif.XtAddCallback(shellHandle, XmNdestroyCallback, (XtCallbackProc) takeDownSplashCB, NULL);
+
+ nArgs = 0;
+ motif_XtSetArg(args[nArgs++], XmNancestorSensitive, 1);
+ scrolledHandle = motif.XmCreateMainWindow(shellHandle, NULL, args, nArgs);
+ if(scrolledHandle == 0)
+ return -1;
+ motif.XtManageChild(scrolledHandle);
+
+ nArgs = 0;
+ motif_XtSetArg(args[nArgs], XmNancestorSensitive, 1); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNborderWidth, 0); nArgs++;
+ /*motif_XtSetArg(args[nArgs], XmNbackground, 0xFF00FF); nArgs++; */
+ motif_XtSetArg(args[nArgs], XmNmarginWidth, 0); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNmarginHeight, 0); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNresizePolicy, XmRESIZE_NONE); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNtraversalOn, 1); nArgs++;
+ drawingHandle = motif.XmCreateDrawingArea(scrolledHandle, NULL, args, nArgs);
+ if(drawingHandle == 0)
+ return -1;
+ motif.XtManageChild(drawingHandle);
+
+ nArgs = 0;
+ motif_XtSetArg(args[nArgs], XmNlabelType, XmPIXMAP); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNlabelPixmap, splashPixmap); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNwidth, width); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNheight, height); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNmarginWidth, 0); nArgs++;
+ motif_XtSetArg(args[nArgs], XmNmarginHeight, 0); nArgs++;
+ image = motif.XmCreateLabelGadget ( drawingHandle, "", args, nArgs );
+ motif.XtManageChild( image );
+
+ motif.XtRealizeWidget(shellHandle);
+ motif.XtSetMappedWhenManaged(shellHandle, 1);
+
+ if(motif_XtIsTopLevelShell(shellHandle))
+ motif_XtMapWidget(shellHandle);
+ else
+ motif.XtPopup(shellHandle, XtGrabNone);
+
+ /* Centre the splash screen and display it. */
+ centreShell( shellHandle, drawingHandle );
+ dispatchMessages();
+
+ free(args);
+ return 0;
+}
+
+/* Get the window system specific VM arguments */
+char** getArgVM( char* vm )
+{
+ char** result;
+
+#ifdef AIX
+ char* version;
+#endif
+
+ if (isJ9VM( vm ))
+ return argVM_J9;
+
+ /* Use the default arguments for a standard Java VM */
+ result = argVM_JAVA;
+
+#ifdef AIX
+ /* Determine whether Java version is 1.3.1 or later */
+ version = getVMVersion( vm );
+ if (version != NULL)
+ {
+ if (versionCmp(version, "1.3.1") >= 0)
+ result = argVM_JAVA_AIX131;
+ free(version);
+ }
+#endif
+
+ return result;
+}
+
+
+jlong getSplashHandle() {
+ return (jlong)shellHandle;
+}
+
+void dispatchMessages() {
+ XtInputMask mask;
+ if (appContext != NULL && motif.XtAppPending != 0) {
+ /* Process any outstanding messages */
+ while ((mask = motif.XtAppPending(appContext)) != 0) {
+ motif.XtAppProcessEvent(appContext, mask);
+ }
+ }
+}
+
+void takeDownSplash()
+{
+ if (shellHandle != 0)
+ {
+ motif.XtDestroyWidget( shellHandle );
+ /*XFlush( XtDisplay( shellHandle ) );*/
+ shellHandle = NULL;
+ }
+}
+
+#ifdef NETSCAPE_FIX
+extern char* findCommand( char*);
+static const char* XFILESEARCHPATH = "XFILESEARCHPATH";
+
+void fixEnvForNetscape()
+{
+ char* netscapePath = NULL;
+ char* netscapeResource = NULL;
+ char* ch;
+ char* envValue;
+ struct stat stats;
+
+ /* If netscape appears to be installed */
+ netscapePath = findCommand("netscape");
+ if (netscapePath != NULL)
+ {
+ /* Look for the resource file Netscape.ad in the same directory as "netscape". */
+ netscapeResource = malloc( strlen(netscapePath) + 50 );
+ strcpy( netscapeResource, netscapePath );
+ ch = strrchr( netscapeResource, (int) dirSeparator );
+ ch =(ch == NULL ? netscapeResource : (ch+1));
+ strcpy( ch, "Netscape.ad" );
+
+ /* If it does not exist there, try "/opt/netscape/Netscape.ad". */
+ if (stat( netscapeResource, &stats ) != 0)
+ {
+ strcpy( netscapeResource, "/opt/netscape/Netscape.ad" );
+ }
+
+ /* If the resource file exists */
+ if (stat( netscapeResource, &stats ) == 0 && (stats.st_mode & S_IFREG) != 0)
+ {
+ /* Either define XFILESEARCHPATH or append the Netscape resource file. */
+ envValue = getenv( XFILESEARCHPATH );
+ if (envValue == NULL)
+ {
+ ch = malloc( strlen(XFILESEARCHPATH) + strlen(netscapeResource) + 5 );
+ sprintf( ch, "%s=%s", XFILESEARCHPATH, netscapeResource );
+ }
+ else
+ {
+ ch = malloc( strlen(XFILESEARCHPATH) + strlen(netscapeResource) +
+ strlen(envValue) + 5 );
+ sprintf( ch, "%s=%s:%s", XFILESEARCHPATH, envValue, netscapeResource );
+ }
+ putenv( ch );
+ free( ch );
+ }
+
+ /* Clean up. */
+ free( netscapePath );
+ free( netscapeResource );
+ }
+}
+#endif /* NETSCAPE_FIX */
+
+JavaResults* launchJavaVM( char* args[] )
+{
+ JavaResults* jvmResults = NULL;
+ int exitCode;
+
+#ifdef NETSCAPE_FIX
+ fixEnvForNetscape();
+#endif /* NETSCAPE_FIX */
+#ifdef MOZILLA_FIX
+ fixEnvForMozilla();
+#endif /* MOZILLA_FIX */
+
+#ifdef LINUX
+ {
+ /* put the root of eclipse on the LD_LIBRARY_PATH */
+ char * ldPath = (char*)getenv(_T_ECLIPSE("LD_LIBRARY_PATH"));
+ if (ldPath == NULL)
+ ldPath = _T_ECLIPSE("");
+ char * root = getProgramDir();
+ if (root != NULL) {
+ char * newPath = malloc((strlen(root) + strlen(ldPath) + 2) * sizeof(char));
+ sprintf(newPath, "%s%c%s", root, pathSeparator, ldPath);
+ setenv("LD_LIBRARY_PATH", newPath, 1);
+ free(newPath);
+ }
+ }
+#endif
+
+ /* Create a child process for the JVM. */
+ jvmProcess = fork();
+ if (jvmProcess == 0)
+ {
+ /* Child process ... start the JVM */
+ execv( args[0], args );
+
+ /* The JVM would not start ... return error code to parent process. */
+ /* TODO, how to distinguish this as a launch problem to the other process? */
+ jvmExitCode = errno;
+ exit( jvmExitCode );
+ }
+
+ jvmResults = malloc(sizeof(JavaResults));
+ memset(jvmResults, 0, sizeof(JavaResults));
+
+ /* If the JVM is still running, wait for it to terminate. */
+ if (jvmProcess != 0)
+ {
+ waitpid(jvmProcess, &exitCode, 0);
+ /* TODO, this should really be a runResult if we could distinguish the launch problem above */
+ jvmResults->launchResult = ((exitCode & 0x00ff) == 0 ? (exitCode >> 8) : exitCode); /* see wait(2) */
+ }
+
+ /* Return the exit code from the JVM. */
+ return jvmResults;
+}
+
+int reuseWorkbench(_TCHAR** filePath, int timeout) {
+ /* not yet implemented on motif */
+ return -1;
+}

Back to the top