blob: 93f21cbd3332cd5fa9467491a9b4a49faee2ab93 [file] [log] [blame]
/*******************************************************************************
* 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);
}