Files
geant4/source/interfaces/common/src/G4Xt.cc
T
2016-06-08 15:09:25 +02:00

215 lines
6.8 KiB
C++

// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4Xt.cc,v 1.2 1999/04/13 01:26:33 yhajime Exp $
// GEANT4 tag $Name: geant4-00-01 $
//
// G.Barrand
#if defined(G4INTY_BUILD_XT) || defined(G4INTY_USE_XT)
#include <stdlib.h>
#include <string.h>
#include "G4ios.hh"
#include "G4Xt.hh"
#define NewString(str) \
((str) != NULL ? (strcpy((char*)malloc((unsigned)strlen(str) + 1), str)) : NULL)
static void XWidgetIconify (Widget);
static void XWidgetUniconify (Widget);
static void XDisplaySetWindowToNormalState (Display*,Window);
G4Xt* G4Xt::instance = NULL;
static G4bool XtInited = FALSE;
static int argn = 0;
static char** args = NULL;
static Widget topWidget = NULL;
/***************************************************************************/
G4Xt* G4Xt::getInstance (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
return G4Xt::getInstance (0,NULL,"Geant4");
}
/***************************************************************************/
G4Xt* G4Xt::getInstance (
int a_argn
,char** a_args
,char* a_class
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if (instance==NULL) {
instance = new G4Xt(a_argn,a_args,a_class);
}
return instance;
}
/***************************************************************************/
G4Xt::G4Xt (
int a_argn
,char** a_args
,char* a_class
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(XtInited==FALSE) { //Xt should be Inited once !
if(a_argn!=0) { //Save args.
args = (char**)malloc(a_argn * sizeof(char*));
if(args!=NULL) {
argn = a_argn;
for(int argi=0;argi<a_argn;argi++) {
args[argi] = (char*)NewString (a_args[argi]);
}
}
}
#if XtSpecificationRelease == 4
Cardinal argc;
argc = (Cardinal)a_argn;
#else
int argc;
argc = a_argn;
#endif
XtAppContext appContext;
topWidget = XtAppInitialize (&appContext,a_class,
NULL,(Cardinal)0,
&argc,a_args,NULL,
NULL,(Cardinal)0);
if(topWidget==NULL) {
G4cout << "G4Xt : Unable to init Xt." << endl;
}
// Restore a_args. XtAppInitialize corrupts the given ones !!!
if( (a_argn!=0) && (args!=NULL)) {
for(int argi=0;argi<a_argn;argi++) {
if(args[argi]!=NULL)
strcpy(a_args[argi],args[argi]);
else
a_args[argi] = NULL;
}
}
// If topWidget not realized, pbs with Inventor shells.
XtSetMappedWhenManaged (topWidget,False);
XtRealizeWidget (topWidget);
XtInited = TRUE;
}
SetArguments (argn,args);
SetMainInteractor (topWidget);
AddDispatcher ((G4DispatchFunction)XtDispatchEvent);
}
/***************************************************************************/
G4Xt::~G4Xt (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(this==instance) {
instance = NULL;
}
}
/***************************************************************************/
G4bool G4Xt::Inited (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
return XtInited;
}
/***************************************************************************/
void* G4Xt::GetEvent (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
static XEvent event;
if(topWidget==NULL) return NULL;
XtAppContext appContext = XtWidgetToApplicationContext(topWidget);
XtAppNextEvent (appContext, &event);
return &event;
}
/***************************************************************************/
void G4Xt::PutStringInResourceDatabase (
char* a_string
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(topWidget==NULL) return;
if(a_string==NULL) return;
Display* dpy = XtDisplay(topWidget);
XrmDatabase dbres = XrmGetStringDatabase (a_string);
if(dbres==NULL) return;
XrmDatabase database = XrmGetDatabase (dpy);
if(database!=NULL) {
XrmMergeDatabases (dbres,&database);
} else {
XrmSetDatabase (dpy,dbres);
}
}
/***************************************************************************/
void G4Xt::FlushAndWaitExecution (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(topWidget==NULL) return;
XSync(XtDisplay(topWidget),False);
}
/***************************************************************************/
/******* From OPACS Xx/v3 package ******************************************/
/***************************************************************************/
/***************************************************************************/
void XWidgetIconify (
Widget This
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(This==NULL) return;
if(!XtIsRealized(This)) return;
XIconifyWindow(XtDisplay(This),XtWindow(This),XScreenNumberOfScreen(XtScreen(This)));
}
/***************************************************************************/
void XWidgetUniconify (
Widget This
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(This==NULL) return;
if(!XtIsRealized(This)) return;
XDisplaySetWindowToNormalState (XtDisplay(This),XtWindow(This));
}
/***************************************************************************/
void XDisplaySetWindowToNormalState (
Display* This
,Window a_window
)
/***************************************************************************/
/*
Used to deiconify a window.
*/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
XWMHints wh;
if(This==NULL) return;
if(a_window==0L) return;
wh.initial_state = NormalState;
wh.flags = StateHint;
XSetWMHints (This,a_window,&wh);
XMapWindow (This,a_window);
}
#endif