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
00275 static void mainLoop();
00276
00281 static SbBool nextEvent(XtAppContext appContext, XEvent *event);
00282
00287 static Boolean dispatchEvent(XEvent *event);
00288
00292 static XtAppContext getAppContext();
00296 static SbGlContextHelper::Display getDisplay();
00297
00302 static SoWidget getTopLevelWidget();
00303
00304
00305
00306
00307
00313 static void show(SoWidget w);
00314
00320 static void hide(SoWidget w);
00321
00325 static XmString encodeString(char *s);
00326
00330 static char *decodeString(XmString xs);
00331
00335 static void setWidgetSize(SoWidget w, const SbVec2s &size);
00339 static SbVec2s getWidgetSize(SoWidget w);
00340
00341
00342
00343
00349 static SoWidget getShellWidget(SoWidget w);
00350
00356 static void createSimpleErrorDialog(SoWidget widget, char *dialogTitle,
00357 char *errorStr1, char *errorStr2 = NULL);
00358
00362 static void getPopupArgs(UINT *d, int scr, ArgList args, int *n);
00363
00367 static void addColormapToShell(SoWidget widget, SoWidget shell);
00368
00374 static SoConsole *getErrorConsole(void);
00375
00383 static void doIdleTasks(void);
00384
00385 private:
00390 static bool peekEvent(XEvent *event);
00391
00392
00393
00394
00395
00396
00397
00398
00399 static LRESULT isInventorMessage(HWND hwnd, UINT message,
00400 WPARAM wParam, LPARAM lParam);
00401
00402
00403 static void terminate(long terminateSyncTime = 100);
00404
00405
00406
00407 static SbBool PreTranslateMessage(MSG *event);
00408
00409 static UINT wmTimerMsg;
00410 static UINT wmWorkMsg;
00411
00412
00413
00414
00415 static void addExtensionEventHandler(SoWidget w,
00416 int extensionEventType,
00417 XtEventHandler proc,
00418 XtPointer clientData);
00419 static void removeExtensionEventHandler(SoWidget w,
00420 int extensionEventType,
00421 XtEventHandler proc,
00422 XtPointer clientData);
00423
00424
00425 static ATOM registerClass(WNDCLASS *pWndClass, char *actualClassName);
00426
00427
00428 static SbBool getClassInfo(HINSTANCE hDll, const char *className,
00429 char *actualClassName, WNDCLASS *pClassInfo);
00430
00431
00432 static void unregisterProcessClasses();
00433
00434
00435 static void addMessageHook(Hwnd hwnd, UINT msg);
00436 static void removeMessageHook(Hwnd hwnd, UINT msg);
00437
00438
00439
00440
00441
00442 static void setInstance(Hinst hInst);
00443 static Hinst getInstance(void);
00444
00445 static const SoDynamicLibManager::SafeLibraryHandle& getResDllSafeHandle();
00446
00447 static void setPrevInstance(Hinst hInst);
00448
00449 static void setCmdLine(LPSTR cmdLine);
00450
00451 static void setCmdShow(int cmdShow);
00452
00453
00454
00455
00456 static SoWinEventHandler *getEventHandler();
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 static void registerUIThread(uint32_t threadId = 0);
00472
00473 static void forwardQueryPalette(Window hWnd);
00474 static void forwardPaletteChanged(Window hWnd);
00475
00476 static SbBool handleCtl3DMessage();
00477
00478 static void setHandleCtl3DMessage(SbBool n);
00479
00480 static void Ctl3dColorChange();
00481
00482
00483
00484
00485 static void errorHandlerCB(const SoError *error, void *data);
00486 static void errorHandlerCBMessageBox(const SoError *error, void *userData);
00487
00488
00489 static SoOffscreenRenderer *getOffscreenRenderer();
00490
00491
00492
00493 static SbVec2s &updateRendererSize(SbVec2s size);
00494
00495
00496 static SbConfig * getConfig(void);
00497 static void setConfig(SbConfig *);
00498 static void setConfigFilename(char*);
00499 static char * getConfigFilename(void);
00500
00501 static void addAccelerator(ACCEL accel);
00502
00503 private:
00504 static FARPROC m_procCtl3dColorChange;
00505 static HINSTANCE m_hCtl3d;
00506 static void getExtensionEventHandler(XEvent *event, SoWidget &w,
00507 XtEventHandler &proc,
00508 XtPointer &clientData);
00509
00510 static SbThreadMutex *registerMutex;
00511
00512 private:
00513 static void activeLoop();
00514
00515 static bool internalMainWidget;
00516 static SoWidget mainWidget;
00517 static SoWinEventHandler *eventHandler;
00518 static SbPList *handlerList;
00519
00520
00521 static SbBool nHandleCtl3D;
00522
00523
00524 static SbPList *msgHookList;
00525
00526
00527 static void loadResourceDll();
00528
00529
00530 static Hinst hInstance;
00531 static Hinst hPrevInstance;
00532 static LPTSTR lpszCmdLine;
00533 static int nCmdShow;
00534 static SoDynamicLibManager::SafeLibraryHandle hResDll;
00535
00536
00537 struct RegisteredClassStruct
00538 {
00539 Hinst hinstance;
00540 SbString* className;
00541 };
00542 static SbPList registeredClassList;
00543
00544 friend class SoWinTimerManager;
00545 friend class SoWinEventHandler;
00546
00547 static HWND createThreadWindow(SoWinTimerManager *pTimerManager);
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 static LRESULT CALLBACK WindowProc(Hwnd hwnd, UINT message,
00558 WPARAM wParam, LPARAM lParam);
00559
00560
00561
00562 static SoOffscreenRenderer *m_pRenderer;
00563
00564 static SoConsole *errorConsole;
00565 static SbBool s_useOldErrorHandler;
00566
00567 static SbConfig *config;
00568 static char *configFile;
00569
00570 static HACCEL m_haccel;
00571
00572 static int s_initRefCount;
00573 static bool shouldExit;
00574 };
00575
00576
00578
00579
00580
00582
00583 #ifdef _WIN32
00584 # include <Inventor/Win/SoWinEndStrict.h>
00585 #endif
00586
00587 #endif
00588
00589