#ifndef SO@GUI@_H #define SO@GUI@_H // @configure_input@ /**************************************************************************\ * Copyright (c) Kongsberg Oil & Gas Technologies AS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \**************************************************************************/ #include // FIXME: use configure defines for the header files. // 20020613 mortene. #ifdef __COIN_SOQT__ #if QT_VERSION >= 0x040000 #include #else #include #endif #endif // __COIN_SOQT__ #ifdef __COIN_SOXT__ #include #include #endif // __COIN_SOXT__ #ifdef __COIN_SOGTK__ // Fetch stdlib.h, so NULL is defined before glib.h is (indirectly) // included. Otherwise we get a compile error with KCC on some // systems. #include #include class SoGtkComponent; class SbPList; #endif // __COIN_SOGTK__ #ifdef __COIN_SOWIN__ #include #endif // __COIN_SOWIN__ #include #include #include #include #include // ************************************************************************* class SO@GUI@_DLL_API So@Gui@ { public: static @WIDGET@ init(const char * appname, const char * classname = "So@Gui@"); static @WIDGET@ init(int & argc, char ** argv, const char * appname, const char * classname = "So@Gui@"); static void init(@WIDGET@ toplevelwidget); static void mainLoop(void); static void exitMainLoop(void); static void done(void); static @WIDGET@ getTopLevelWidget(void); static @WIDGET@ getShellWidget(const @WIDGET@ w); static void show(@WIDGET@ const widget); static void hide(@WIDGET@ const widget); static void setWidgetSize(@WIDGET@ const widget, const SbVec2s size); static SbVec2s getWidgetSize(const @WIDGET@ widget); static void createSimpleErrorDialog(@WIDGET@ widget, const char * title, const char * string1, const char * string2 = NULL); static void getVersionInfo(int * major = NULL, int * minor = NULL, int * micro = NULL); static const char * getVersionString(void); static const char * getVersionToolkitString(void); enum FatalErrors { UNSPECIFIED_ERROR = 0, NO_OPENGL_CANVAS, INTERNAL_ASSERT }; typedef void FatalErrorCB(const SbString errmsg, So@Gui@::FatalErrors errcode, void * userdata); static FatalErrorCB * setFatalErrorHandler(So@Gui@::FatalErrorCB * cb, void * userdata); static SbBool isDebugLibrary(void); static SbBool isCompatible(unsigned int major, unsigned int minor); enum ABIType { DLL, LIB, UNKNOWN }; static ABIType getABIType(void); static void lockGL(void); static void unlockGL(void); private: // Since the class consists solely of static functions, hide the // default constructor and the destructor so nobody can instantiate // it. So@Gui@(void); virtual ~So@Gui@(); friend class SoGuiP; friend class So@Gui@P; // FIXME!: audit and remove as much as possible of the remaining // toolkit specific parts below. 20020117 mortene. #ifdef __COIN_SOWIN__ public: static void doIdleTasks(void); #endif // __COIN_SOWIN__ #ifdef __COIN_SOXT__ public: static void nextEvent(XtAppContext, XEvent *); static Boolean dispatchEvent(XEvent * event); static XtAppContext getAppContext(void); static Display * getDisplay(void); static XmString encodeString(const char * const str); static char * decodeString(XmString xstring); static void getPopupArgs(Display * display, int screen, ArgList args, int * n); static void registerColormapLoad(Widget widget, Widget shell); static void addColormapToShell(Widget widget, Widget shell); static void removeColormapFromShell(Widget widget, Widget shell); static void addExtensionEventHandler(Widget widget, int eventType, XtEventHandler proc, XtPointer clientData); static void removeExtensionEventHandler(Widget widget, int eventType, XtEventHandler proc, XtPointer clientData); protected: static void getExtensionEventHandler(XEvent * event, Widget & widget, XtEventHandler & proc, XtPointer & clientData); #endif // __COIN_SOXT__ #ifdef __COIN_SOGTK__ public: friend class SoGtkComponent; enum SoGtkComponentAction { CREATION, DESTRUCTION, CHANGE }; typedef void SoGtkComponentActionCallback(SoGtkComponent *, SoGtk::SoGtkComponentAction, void *); static void addComponentActionCallback(SoGtkComponentActionCallback *, void *); static void removeComponentActionCallback(SoGtkComponentActionCallback *, void *); static int getComponents(SbPList & components); protected: static void invokeComponentActionCallbacks(SoGtkComponent * component, SoGtkComponentAction action); static gint componentCreation(SoGtkComponent * component); static gint componentDestruction(SoGtkComponent * component); static gint componentChange(SoGtkComponent * component); private: static gint timerSensorCB(gpointer data); static gint idleSensorCB(gpointer data); static gint delaySensorCB(gpointer data); static GtkWidget * mainWidget; static SbPList * components; static SbPList * component_callbacks; #endif // __COIN_SOGTK__ }; // ************************************************************************* // Here's something InventorWin provides for convenience. Belongs more // in the application code domain, imo, but we provide these macros // for better compile time compatibility with InventorWin. -mortene #define SO@GUI@_ENTER_GL_SECTION() do { So@Gui@::lockGL(); } while(FALSE) #define SO@GUI@_LEAVE_GL_SECTION() do { So@Gui@::unlockGL(); } while(FALSE) // ************************************************************************* #endif // ! SO@GUI@_H