00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _SO_WIN_
00026 #define _SO_WIN_
00027
00028 #ifdef _WIN32
00029 # include <Inventor/Win/SoWinBeginStrict.h>
00030 # include <string.h>
00031 # include <windows.h>
00032 # include <memory>
00033 # include <Inventor/Win/SoXt2SoWin.h>
00034 # include <Inventor/Win/SoWinDef.h>
00035 # include <Inventor/SbBasic.h>
00036 # include <SoVersion.h>
00037 # include <Inventor/Gui/SoGui.h>
00038 # define RESOURCE_DLL "Error: SoWin resources not loaded\n Cannot find InventorR.DLL"
00039 #else
00040 # include <Xm/Xm.h>
00041 #endif
00042 #include <Inventor/threads/SbThreadMutex.h>
00043 #include <Inventor/helpers/SbGlContextHelper.h>
00044
00045 #include <Inventor/Win/SoInventorWinLibName.h>
00046
00047 #include <Inventor/SoModule.h>
00048 SO_MODULE_HEADER(SoInventorWin, __INVENTORWINDLL)
00049
00050 #ifndef InventorWin_EXPORTS
00051 #ifndef OIV_DISABLE_AUTOLINK
00052 # pragma comment(lib,__INVENTORWINLIB)
00053 #endif
00054 #endif
00055
00056 #include <Inventor/SbBasic.h>
00057 #include <Inventor/SbLinear.h>
00058 #include <Inventor/sys/SoDynamicLibManager.h>
00059
00060 class SbPList;
00061 class SoEvent;
00062 class SoWinEventHandler;
00063 class SoOffscreenRenderer;
00064 class SoConsole;
00065 class SbConfig;
00066 class SoAction;
00067
00068 #ifdef _WIN32
00069
00070
00071
00072
00073
00074
00075
00076
00077 class SoWinMessageHook;
00078
00079
00080
00081 #ifndef WM_ENTERSIZEMOVE
00082 #define WM_ENTERSIZEMOVE 0x0231
00083 #endif
00084 #ifndef WM_EXITSIZEMOVE
00085 #define WM_EXITSIZEMOVE 0x0232
00086 #endif
00087
00088
00089 class SoError;
00090
00091 extern CRITICAL_SECTION SoWinGLSection;
00092
00093 #define SOWIN_ENTER_GL_SECTION()\
00094 EnterCriticalSection(&SoWinGLSection)
00095
00096 #define SOWIN_LEAVE_GL_SECTION()\
00097 LeaveCriticalSection(&SoWinGLSection)
00098
00099 #define SOWIN_LEAVE_GL_SECTIONR()\
00100 {\
00101 LeaveCriticalSection(&SoWinGLSection);\
00102 return;\
00103 }
00104
00105 #define SOWIN_LEAVE_GL_SECTIONRV(v)\
00106 {\
00107 LeaveCriticalSection(&SoWinGLSection);\
00108 return v;\
00109 }
00110
00111 #define SOWIN_TIMER_MSG SoWin::wmTimerMsg
00112 #define SOWIN_WORK_MSG SoWin::wmWorkMsg
00113
00114 #else
00115
00116 #define SOWIN_ENTER_GL_SECTION()
00117 #define SOWIN_LEAVE_GL_SECTION()
00118 #define SOWIN_LEAVE_GL_SECTIONR()
00119 #define SOWIN_LEAVE_GL_SECTIONRV(v)
00120
00121 #endif //_WIN32
00122
00145 class SoWin {
00146
00147 public:
00156 static SoWidget init(const char *appName,
00157 const char *className = "Inventor");
00158
00166 static void init( SoWidget topLevelWidget );
00167
00173 static void init();
00174
00175 #if 1 SoDEPRECATED
00182 static SoWidget threadInit(const char *appName, const char *className = "Inventor");
00183 SoDEPRECATED
00191 static void threadInit(SoWidget topLevelWidget);
00192 SoDEPRECATED
00200 static void threadInit();
00201 #endif
00206 static bool isInitialized();
00207
00269 static void finish();
00270
00278 static int mainLoop();
00279
00288 static void exit(int returnCode = 0);
00289
00294 static SbBool nextEvent(XtAppContext appContext, XEvent *event);
00295
00300 static Boolean dispatchEvent(XEvent *event);
00301
00305 static XtAppContext getAppContext();
00309 static SbGlContextHelper::Display getDisplay();
00310
00315 static SoWidget getTopLevelWidget();
00316
00317
00318
00319
00320
00326 static void show(SoWidget w);
00327
00333 static void hide(SoWidget w);
00334
00338 static XmString encodeString(char *s);
00339
00343 static char *decodeString(XmString xs);
00344
00348 static void setWidgetSize(SoWidget w, const SbVec2s &size);
00352 static SbVec2s getWidgetSize(SoWidget w);
00353
00354
00355
00356
00362 static SoWidget getShellWidget(SoWidget w);
00363
00369 static void createSimpleErrorDialog(SoWidget widget, char *dialogTitle,
00370 char *errorStr1, char *errorStr2 = NULL);
00371
00375 static void getPopupArgs(UINT *d, int scr, ArgList args, int *n);
00376
00380 static void addColormapToShell(SoWidget widget, SoWidget shell);
00381
00387 static SoConsole *getErrorConsole(void);
00388
00396 static void doIdleTasks(void);
00397
00398 private:
00403 static bool peekEvent(XEvent *event);
00404
00405
00406
00407
00408
00409
00410
00411
00412 static LRESULT isInventorMessage(HWND hwnd, UINT message,
00413 WPARAM wParam, LPARAM lParam);
00414
00415
00416 static void terminate(long terminateSyncTime = 100);
00417
00418
00419
00420 static SbBool PreTranslateMessage(MSG *event);
00421
00422 static UINT wmTimerMsg;
00423 static UINT wmWorkMsg;
00424
00425
00426
00427
00428 static void addExtensionEventHandler(SoWidget w,
00429 int extensionEventType,
00430 XtEventHandler proc,
00431 XtPointer clientData);
00432 static void removeExtensionEventHandler(SoWidget w,
00433 int extensionEventType,
00434 XtEventHandler proc,
00435 XtPointer clientData);
00436
00437
00438 static ATOM registerClass(WNDCLASS *pWndClass, char *actualClassName);
00439
00440
00441 static SbBool getClassInfo(HINSTANCE hDll, const char *className,
00442 char *actualClassName, WNDCLASS *pClassInfo);
00443
00444
00445 static void unregisterProcessClasses();
00446
00447
00448 static void addMessageHook(Hwnd hwnd, UINT msg);
00449 static void removeMessageHook(Hwnd hwnd, UINT msg);
00450
00451
00452
00453
00454
00455 static void setInstance(Hinst hInst);
00456 static Hinst getInstance(void);
00457
00458 static const SoDynamicLibManager::SafeLibraryHandle& getResDllSafeHandle();
00459
00460 static void setPrevInstance(Hinst hInst);
00461
00462 static void setCmdLine(LPSTR cmdLine);
00463
00464 static void setCmdShow(int cmdShow);
00465
00466
00467
00468
00469 static SoWinEventHandler *getEventHandler();
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484 static void registerUIThread(uint32_t threadId = 0);
00485
00486 static void forwardQueryPalette(Window hWnd);
00487 static void forwardPaletteChanged(Window hWnd);
00488
00489 static SbBool handleCtl3DMessage();
00490
00491 static void setHandleCtl3DMessage(SbBool n);
00492
00493 static void Ctl3dColorChange();
00494
00495
00496
00497
00498 static void errorHandlerCB(const SoError *error, void *data);
00499 static void errorHandlerCBMessageBox(const SoError *error, void *userData);
00500
00501
00502 static SoOffscreenRenderer *getOffscreenRenderer();
00503
00504
00505
00506 static SbVec2s &updateRendererSize(SbVec2s size);
00507
00508
00509 static SbConfig * getConfig(void);
00510 static void setConfig(SbConfig *);
00511 static void setConfigFilename(char*);
00512 static char * getConfigFilename(void);
00513
00514 static void addAccelerator(ACCEL accel);
00515
00516 private:
00517 static FARPROC m_procCtl3dColorChange;
00518 static HINSTANCE m_hCtl3d;
00519 static void getExtensionEventHandler(XEvent *event, SoWidget &w,
00520 XtEventHandler &proc,
00521 XtPointer &clientData);
00522
00523 static SbThreadMutex *registerMutex;
00524
00525 private:
00526 static void activeLoop();
00527
00528 static int s_returnCode;
00529
00530 static bool internalMainWidget;
00531 static SoWidget mainWidget;
00532 static SoWinEventHandler *eventHandler;
00533 static SbPList *handlerList;
00534
00535
00536 static SbBool nHandleCtl3D;
00537
00538
00539 static SbPList *msgHookList;
00540
00541
00542 static void loadResourceDll();
00543
00544
00545 static Hinst hInstance;
00546 static Hinst hPrevInstance;
00547 static LPTSTR lpszCmdLine;
00548 static int nCmdShow;
00549 static SoDynamicLibManager::SafeLibraryHandle hResDll;
00550
00551
00552 struct RegisteredClassStruct
00553 {
00554 Hinst hinstance;
00555 SbString* className;
00556 };
00557 static SbPList registeredClassList;
00558
00559 friend class SoWinTimerManager;
00560 friend class SoWinEventHandler;
00561
00562 static HWND createThreadWindow(SoWinTimerManager *pTimerManager);
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572 static LRESULT CALLBACK WindowProc(Hwnd hwnd, UINT message,
00573 WPARAM wParam, LPARAM lParam);
00574
00575
00576
00577 static SoOffscreenRenderer *m_pRenderer;
00578
00579 static SoConsole *errorConsole;
00580 static SbBool s_useOldErrorHandler;
00581
00582 static SbConfig *config;
00583 static char *configFile;
00584
00585 static HACCEL m_haccel;
00586
00587 static int s_initRefCount;
00588 static bool shouldExit;
00589 };
00590
00591
00593
00594
00595
00597
00598 #ifdef _WIN32
00599 # include <Inventor/Win/SoWinEndStrict.h>
00600 #endif
00601
00602 #endif
00603
00604