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 <Inventor/Win/SoXt2SoWin.h>
00033 # include <Inventor/Win/SoWinDef.h>
00034 # include <Inventor/SbBasic.h>
00035 # include <SoVersion.h>
00036 # define RESOURCE_DLL "Error: SoWin resources not loaded\n Cannot find InventorR.DLL"
00037 #else
00038 # include <Xm/Xm.h>
00039 #endif
00040 #include <Inventor/threads/SbThreadMutex.h>
00041 #include <Inventor/helpers/SbGlContextHelper.h>
00042
00043 #include <Inventor/Win/SoWinLibName.h>
00044
00045 #ifndef InventorWin_EXPORTS
00046 #ifndef OIV_DISABLE_AUTOLINK
00047 # pragma comment(lib,__INVWLIB)
00048 #endif
00049 #endif
00050
00051 #include <Inventor/SbBasic.h>
00052 #include <Inventor/SbLinear.h>
00053 #include <Inventor/sys/SoDynamicLibManager.h>
00054
00055 class SbPList;
00056 class SoEvent;
00057 class SoWinEventHandler;
00058 class SoOffscreenRenderer;
00059 class SoConsole;
00060 class SbConfig;
00061 class SoAction;
00062
00063 #ifdef _WIN32
00064
00065
00066
00067
00068
00069
00070
00071
00072 class SoWinMessageHook;
00073
00074
00075
00076 #ifndef WM_ENTERSIZEMOVE
00077 #define WM_ENTERSIZEMOVE 0x0231
00078 #endif
00079 #ifndef WM_EXITSIZEMOVE
00080 #define WM_EXITSIZEMOVE 0x0232
00081 #endif
00082
00083
00084 class SoError;
00085
00086 extern CRITICAL_SECTION SoWinGLSection;
00087
00088 #define SOWIN_ENTER_GL_SECTION()\
00089 EnterCriticalSection(&SoWinGLSection)
00090
00091 #define SOWIN_LEAVE_GL_SECTION()\
00092 LeaveCriticalSection(&SoWinGLSection)
00093
00094 #define SOWIN_LEAVE_GL_SECTIONR()\
00095 {\
00096 LeaveCriticalSection(&SoWinGLSection);\
00097 return;\
00098 }
00099
00100 #define SOWIN_LEAVE_GL_SECTIONRV(v)\
00101 {\
00102 LeaveCriticalSection(&SoWinGLSection);\
00103 return v;\
00104 }
00105
00106 #define SOWIN_TIMER_MSG SoWin::wmTimerMsg
00107 #define SOWIN_WORK_MSG SoWin::wmWorkMsg
00108
00109 #else
00110
00111 #define SOWIN_ENTER_GL_SECTION()
00112 #define SOWIN_LEAVE_GL_SECTION()
00113 #define SOWIN_LEAVE_GL_SECTIONR()
00114 #define SOWIN_LEAVE_GL_SECTIONRV(v)
00115
00116 #endif //_WIN32
00117
00141 class SoWin {
00142
00143 public:
00152 static SoWidget init(const char *appName,
00153 const char *className = "Inventor");
00154
00160 static SoWidget threadInit(const char *appName,
00161 const char *className = "Inventor");
00162
00170 static void init(SoWidget topLevelWidget);
00171
00178 static void threadInit(SoWidget topLevelWidget);
00179
00185 static void init();
00186
00193 static void threadInit();
00194
00198 static bool isInitialized();
00199
00261 static void finish();
00262
00267 static void mainLoop();
00268
00273 static SbBool nextEvent(XtAppContext appContext, XEvent *event);
00274
00279 static Boolean dispatchEvent(XEvent *event);
00280
00284 static XtAppContext getAppContext();
00288 static SbGlContextHelper::Display getDisplay();
00289
00294 static SoWidget getTopLevelWidget();
00295
00296
00297
00298
00299
00305 static void show(SoWidget w);
00306
00312 static void hide(SoWidget w);
00313
00317 static XmString encodeString(char *s);
00318
00322 static char *decodeString(XmString xs);
00323
00327 static void setWidgetSize(SoWidget w, const SbVec2s &size);
00331 static SbVec2s getWidgetSize(SoWidget w);
00332
00333
00334
00335
00341 static SoWidget getShellWidget(SoWidget w);
00342
00348 static void createSimpleErrorDialog(SoWidget widget, char *dialogTitle,
00349 char *errorStr1, char *errorStr2 = NULL);
00350
00354 static void getPopupArgs(UINT *d, int scr, ArgList args, int *n);
00355
00359 static void addColormapToShell(SoWidget widget, SoWidget shell);
00360
00366 static SoConsole *getErrorConsole(void);
00367
00375 static void doIdleTasks(void);
00376
00377 private:
00382 static bool peekEvent(XEvent *event);
00383
00384
00385
00386
00387
00388
00389
00390
00391 static LRESULT isInventorMessage(HWND hwnd, UINT message,
00392 WPARAM wParam, LPARAM lParam);
00393
00394
00395 static void terminate(long terminateSyncTime = 100);
00396
00397
00398
00399 static SbBool PreTranslateMessage(MSG *event);
00400
00401 static UINT wmTimerMsg;
00402 static UINT wmWorkMsg;
00403
00404
00405
00406
00407 static void addExtensionEventHandler(SoWidget w,
00408 int extensionEventType,
00409 XtEventHandler proc,
00410 XtPointer clientData);
00411 static void removeExtensionEventHandler(SoWidget w,
00412 int extensionEventType,
00413 XtEventHandler proc,
00414 XtPointer clientData);
00415
00416
00417 static ATOM registerClass(WNDCLASS *pWndClass, char *actualClassName);
00418
00419
00420 static SbBool getClassInfo(HINSTANCE hDll, const char *className,
00421 char *actualClassName, WNDCLASS *pClassInfo);
00422
00423
00424 static void unregisterProcessClasses();
00425
00426
00427 static void addMessageHook(Hwnd hwnd, UINT msg);
00428 static void removeMessageHook(Hwnd hwnd, UINT msg);
00429
00430
00431
00432
00433
00434 static void setInstance(Hinst hInst);
00435 static Hinst getInstance(void);
00436
00437 static const SoDynamicLibManager::SafeLibraryHandle& getResDllSafeHandle();
00438
00439 static void setPrevInstance(Hinst hInst);
00440
00441 static void setCmdLine(LPSTR cmdLine);
00442
00443 static void setCmdShow(int cmdShow);
00444
00445
00446
00447
00448 static SoWinEventHandler *getEventHandler();
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463 static void registerUIThread(uint32_t threadId = 0);
00464
00465 static void forwardQueryPalette(Window hWnd);
00466 static void forwardPaletteChanged(Window hWnd);
00467
00468 static SbBool handleCtl3DMessage();
00469
00470 static void setHandleCtl3DMessage(SbBool n);
00471
00472 static void Ctl3dColorChange();
00473
00474
00475
00476
00477 static void errorHandlerCB(const SoError *error, void *data);
00478 static void errorHandlerCBMessageBox(const SoError *error, void *userData);
00479
00480
00481 static SoOffscreenRenderer *getOffscreenRenderer();
00482
00483
00484
00485 static SbVec2s &updateRendererSize(SbVec2s size);
00486
00487
00488 static SbConfig * getConfig(void);
00489 static void setConfig(SbConfig *);
00490 static void setConfigFilename(char*);
00491 static char * getConfigFilename(void);
00492
00493 static void addAccelerator(ACCEL accel);
00494
00495 private:
00496 static FARPROC m_procCtl3dColorChange;
00497 static HINSTANCE m_hCtl3d;
00498 static void getExtensionEventHandler(XEvent *event, SoWidget &w,
00499 XtEventHandler &proc,
00500 XtPointer &clientData);
00501
00502 static SbThreadMutex *registerMutex;
00503
00504 private:
00505 static bool internalMainWidget;
00506 static SoWidget mainWidget;
00507 static SoWinEventHandler *eventHandler;
00508 static SbPList *handlerList;
00509
00510
00511 static SbBool nHandleCtl3D;
00512
00513
00514 static SbPList *msgHookList;
00515
00516
00517 static void loadResourceDll();
00518
00519
00520 static Hinst hInstance;
00521 static Hinst hPrevInstance;
00522 static LPTSTR lpszCmdLine;
00523 static int nCmdShow;
00524 static SoDynamicLibManager::SafeLibraryHandle hResDll;
00525
00526
00527 struct RegisteredClassStruct
00528 {
00529 Hinst hinstance;
00530 SbString* className;
00531 };
00532 static SbPList registeredClassList;
00533
00534 friend class SoWinTimerManager;
00535 friend class SoWinEventHandler;
00536
00537 static HWND createThreadWindow(SoWinTimerManager *pTimerManager);
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547 static LRESULT CALLBACK WindowProc(Hwnd hwnd, UINT message,
00548 WPARAM wParam, LPARAM lParam);
00549
00550
00551
00552 static SoOffscreenRenderer *m_pRenderer;
00553
00554 static SoConsole *errorConsole;
00555 static SbBool s_useOldErrorHandler;
00556
00557 static SbConfig *config;
00558 static char *configFile;
00559
00560 static HACCEL m_haccel;
00561
00562 static int s_initRefCount;
00563 static bool shouldExit;
00564 };
00565
00566
00568
00569
00570
00572
00573 #ifdef _WIN32
00574 # include <Inventor/Win/SoWinEndStrict.h>
00575 #endif
00576
00577 #endif
00578
00579