For another project, please consult its home page to locate the current issue tracker.
View Issue Details [ Jump to Notes ] | [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0001376 | VTK | (No Category) | public | 2004-11-22 11:55 | 2007-01-17 11:41 | ||||
Reporter | Goodwin Lawlor | ||||||||
Assigned To | David Cole | ||||||||
Priority | low | Severity | feature | Reproducibility | always | ||||
Status | closed | Resolution | open | ||||||
Platform | OS | OS Version | |||||||
Product Version | |||||||||
Target Version | Fixed in Version | ||||||||
Summary | 0001376: stubs enabled vtk tcl libraries | ||||||||
Description | Below are some patches to give the option in cmake to build stubs enabled vtk tcl libraries. An advanced option TCL_TK_STUBS is offered which, if set, defines the USE_TCL_STUBS and USE_TK_STUBS preprocessor flags. The tcl and tk stubs tables are initialized first when the Vtk*tcl_Init functions are called. tclstub84.lib and tkstub84.lib should be linked instead of tcl84.lib and tk84.lib. TkWinChildProc is not exported in the stubs tables, so there is a work-around in vtkTkRenderWindowWidget and vtkTkImageViewerWidget to retrieve it from the the class info registered with windows. | ||||||||
Tags | No tags attached. | ||||||||
Project | |||||||||
Type | |||||||||
Attached Files | ![]() Index: CMake/cmVTKWrapTcl2Command.c =================================================================== RCS file: /cvsroot/VTK/VTK/CMake/cmVTKWrapTcl2Command.c,v retrieving revision 1.19 diff -u -r1.19 cmVTKWrapTcl2Command.c --- CMake/cmVTKWrapTcl2Command.c 31 Oct 2003 21:52:27 -0000 1.19 +++ CMake/cmVTKWrapTcl2Command.c 19 Nov 2004 15:13:49 -0000 @@ -47,6 +47,12 @@ } fprintf(fout,"#include \"vtkTclUtil.h\"\n"); + if (!strcmp(kitName,"Vtkrenderingtcl")) + { + fprintf(fout,"#ifdef USE_TK_STUBS\n" + " #include \"vtkTk.h\"\n" + "#endif\n"); + } fprintf(fout,"#include \"vtkVersion.h\"\n"); fprintf(fout,"#define VTK_TCL_TO_STRING(x) VTK_TCL_TO_STRING0(x)\n"); fprintf(fout,"#define VTK_TCL_TO_STRING0(x) #x\n"); @@ -118,6 +124,23 @@ fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n", kitName); + + /* for stubs enabled vtk libraries... */ + fprintf(fout,"\n #ifdef USE_TCL_STUBS\n" + " if (Tcl_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n"); + + if (!strcmp(kitName,"Vtkrenderingtcl")) + { + fprintf(fout,"\n #ifdef USE_TK_STUBS\n" + " if (Tk_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n\n"); + } + if (!strcmp(kitName,"Vtkcommontcl")) { fprintf(fout, ![]() Index: CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/CMakeLists.txt,v retrieving revision 1.276 diff -u -r1.276 CMakeLists.txt --- CMakeLists.txt 21 Oct 2004 15:46:09 -0000 1.276 +++ CMakeLists.txt 19 Nov 2004 12:16:10 -0000 @@ -702,7 +702,10 @@ OPTION(TCL_TK_STATIC "Build with static Tcl/Tk support. TCL_LIBRARY and TK_LIBRARY must point to the corresponding Tcl/Tk static libraries (example, tcl84sx.lib, tk84sx.lib)." OFF) MARK_AS_ADVANCED(TCL_TK_STATIC) - + + OPTION(TCL_TK_STUBS "Build with stubs enabled Tcl/Tk support. TCL_LIBRARY and TK_LIBRARY must point to the corresponding Tcl/Tk stubs libraries (example, tclstub84.lib, tkstub84.lib)." OFF) + MARK_AS_ADVANCED(TCL_TK_STUBS) + ENDIF(VTK_WRAP_TCL) # If TCL_TK_STATIC is meant to be used in C++, then we have to create a ![]() Index: Common/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Common/CMakeLists.txt,v retrieving revision 1.142 diff -u -r1.142 CMakeLists.txt --- Common/CMakeLists.txt 16 Nov 2004 13:46:30 -0000 1.142 +++ Common/CMakeLists.txt 19 Nov 2004 12:24:20 -0000 @@ -214,6 +214,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Graphics/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Graphics/CMakeLists.txt,v retrieving revision 1.97 diff -u -r1.97 CMakeLists.txt --- Graphics/CMakeLists.txt 4 Oct 2004 19:01:04 -0000 1.97 +++ Graphics/CMakeLists.txt 19 Nov 2004 13:58:40 -0000 @@ -212,6 +212,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Hybrid/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Hybrid/CMakeLists.txt,v retrieving revision 1.104 diff -u -r1.104 CMakeLists.txt --- Hybrid/CMakeLists.txt 20 Aug 2004 01:04:55 -0000 1.104 +++ Hybrid/CMakeLists.txt 19 Nov 2004 13:59:05 -0000 @@ -127,6 +127,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Imaging/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Imaging/CMakeLists.txt,v retrieving revision 1.74 diff -u -r1.74 CMakeLists.txt --- Imaging/CMakeLists.txt 25 Oct 2004 16:31:45 -0000 1.74 +++ Imaging/CMakeLists.txt 19 Nov 2004 13:59:27 -0000 @@ -159,6 +159,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: IO/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/IO/CMakeLists.txt,v retrieving revision 1.107 diff -u -r1.107 CMakeLists.txt --- IO/CMakeLists.txt 20 Aug 2004 01:04:55 -0000 1.107 +++ IO/CMakeLists.txt 19 Nov 2004 14:00:32 -0000 @@ -188,6 +188,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Parallel/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Parallel/CMakeLists.txt,v retrieving revision 1.118 diff -u -r1.118 CMakeLists.txt --- Parallel/CMakeLists.txt 1 Nov 2004 17:04:24 -0000 1.118 +++ Parallel/CMakeLists.txt 19 Nov 2004 14:00:56 -0000 @@ -171,6 +171,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Patented/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Patented/CMakeLists.txt,v retrieving revision 1.55 diff -u -r1.55 CMakeLists.txt --- Patented/CMakeLists.txt 20 Aug 2004 01:04:55 -0000 1.55 +++ Patented/CMakeLists.txt 19 Nov 2004 14:01:16 -0000 @@ -62,6 +62,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Rendering/CMakeLists.txt =================================================================== RCS file: /cvsroot/VTK/VTK/Rendering/CMakeLists.txt,v retrieving revision 1.198 diff -u -r1.198 CMakeLists.txt --- Rendering/CMakeLists.txt 16 Nov 2004 13:47:55 -0000 1.198 +++ Rendering/CMakeLists.txt 19 Nov 2004 14:04:18 -0000 @@ -376,6 +376,9 @@ VTK_WRAP_TCL2(vtk${KIT}TCL SOURCES KitTCL_SRCS ${Kit_SRCS} COMMANDS ${Kit_TCL_EXTRA_CMDS}) + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS -DUSE_TK_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) INSTALL_TARGETS(/lib/vtk vtk${KIT}TCL) ![]() Index: Rendering/vtkTkImageViewerWidget.cxx =================================================================== RCS file: /cvsroot/VTK/VTK/Rendering/vtkTkImageViewerWidget.cxx,v retrieving revision 1.73 diff -u -r1.73 vtkTkImageViewerWidget.cxx --- Rendering/vtkTkImageViewerWidget.cxx 15 Sep 2004 02:23:31 -0000 1.73 +++ Rendering/vtkTkImageViewerWidget.cxx 22 Nov 2004 16:06:42 -0000 @@ -18,6 +18,15 @@ #include "vtkRenderWindowInteractor.h" #include "vtkTkInternals.h" +#ifdef _WIN32 + #ifdef USE_TCL_STUBS + static WNDCLASS childClass; /* Window class for child windows. */ + static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) = NULL; + #define TK_WIN_CHILD_CLASS_NAME "TkChild" + #endif +#endif + #ifdef _MSC_VER #pragma warning ( disable : 4273 ) #else @@ -402,8 +411,26 @@ { SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window); + + #if USE_TCL_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from the class info + * registered with windows. + * kudos: http://cvs.sourceforge.net/viewcvs.py/togl/Togl/togl.c?rev=1.57 + */ + if (tkWinChildProc == NULL) { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), + GWL_WNDPROC,(LONG)tkWinChildProc); + #else SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), GWL_WNDPROC,(LONG)TkWinChildProc); + #endif + + } #endif Tcl_EventuallyFree( (ClientData) self, vtkTkImageViewerWidget_Destroy ); @@ -457,8 +484,23 @@ vtkSetWindowLong(hWnd,GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window); if (((TkWindow *)self->TkWin)->parentPtr) { - vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); - rval = TkWinChildProc(hWnd,message,wParam,lParam); + #if USE_TCL_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from the class info + * registered with windows. + * kudos: http://cvs.sourceforge.net/viewcvs.py/togl/Togl/togl.c?rev=1.57 + */ + if (tkWinChildProc == NULL) { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd, message, wParam, lParam); + #else + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); + rval = TkWinChildProc(hWnd,message,wParam,lParam); + #endif } else { @@ -514,8 +556,23 @@ Tcl_ServiceAll(); return 0; } - vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); - rval = TkWinChildProc(hWnd,message,wParam,lParam); + #if USE_TCL_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from the class info + * registered with windows. + * kudos: http://cvs.sourceforge.net/viewcvs.py/togl/Togl/togl.c?rev=1.57 + */ + if (tkWinChildProc == NULL) { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd, message, wParam, lParam); + #else + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); + rval = TkWinChildProc(hWnd,message,wParam,lParam); + #endif #endif } ![]() Index: Rendering/vtkTkRenderWidget.cxx =================================================================== RCS file: /cvsroot/VTK/VTK/Rendering/vtkTkRenderWidget.cxx,v retrieving revision 1.104 diff -u -r1.104 vtkTkRenderWidget.cxx --- Rendering/vtkTkRenderWidget.cxx 11 Sep 2004 14:55:16 -0000 1.104 +++ Rendering/vtkTkRenderWidget.cxx 22 Nov 2004 16:14:08 -0000 @@ -22,6 +22,15 @@ #include "vtkToolkits.h" #ifdef _WIN32 + #ifdef USE_TCL_STUBS + static WNDCLASS childClass; /* Window class for child windows. */ + static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) = NULL; + #define TK_WIN_CHILD_CLASS_NAME "TkChild" + #endif +#endif + +#ifdef _WIN32 #include "vtkWin32OpenGLRenderWindow.h" #else #ifdef VTK_USE_CARBON @@ -710,7 +719,6 @@ // Here is the windows specific code for creating the window // The Xwindows version follows after this #ifdef _WIN32 - LRESULT APIENTRY vtkTkRenderWidgetProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -747,8 +755,23 @@ vtkSetWindowLong(hWnd,4,(LONG)((TkWindow *)self->TkWin)->window); if (((TkWindow *)self->TkWin)->parentPtr) { - vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); - rval = TkWinChildProc(hWnd,message,wParam,lParam); + #if USE_TCL_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from the class info + * registered with windows. + * kudos: http://cvs.sourceforge.net/viewcvs.py/togl/Togl/togl.c?rev=1.57 + */ + if (tkWinChildProc == NULL) { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd, message, wParam, lParam); + #else + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); + rval = TkWinChildProc(hWnd,message,wParam,lParam); + #endif } else { @@ -800,8 +823,24 @@ Tcl_ServiceAll(); return 0; } - vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); - rval = TkWinChildProc(hWnd,message,wParam,lParam); + + #if USE_TCL_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from the class info + * registered with windows. + * kudos: http://cvs.sourceforge.net/viewcvs.py/togl/Togl/togl.c?rev=1.57 + */ + if (tkWinChildProc == NULL) { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd, message, wParam, lParam); + #else + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); + rval = TkWinChildProc(hWnd,message,wParam,lParam); + #endif #endif } ![]() Index: Wrapping/vtkWrapTclInit.c =================================================================== RCS file: /cvsroot/VTK/VTK/Wrapping/vtkWrapTclInit.c,v retrieving revision 1.14 diff -u -r1.14 vtkWrapTclInit.c --- Wrapping/vtkWrapTclInit.c 6 Nov 2003 14:06:47 -0000 1.14 +++ Wrapping/vtkWrapTclInit.c 22 Nov 2004 16:34:10 -0000 @@ -112,6 +112,23 @@ fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n", kitName); + + /* for stubs enabled vtk libraries... */ + fprintf(fout,"\n #ifdef USE_TCL_STUBS\n" + " if (Tcl_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n"); + + if (!strcmp(kitName,"Vtkrenderingtcl")) + { + fprintf(fout,"\n #ifdef USE_TK_STUBS\n" + " if (Tk_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n\n"); + } + if (!strcmp(kitName,"Vtkcommontcl")) { fprintf(fout, ![]() --- VTK/CMakeLists.txt.orig 2006-08-14 23:35:39.000000000 +0900 +++ VTK/CMakeLists.txt 2007-01-17 02:30:58.000000000 +0900 @@ -1105,22 +1105,28 @@ MACRO (VTK_INCLUDE_TCL_TK_MODULES) INCLUDE(${CMAKE_ROOT}/Modules/FindTCL.cmake) - SET(VTK_TCL_LIBRARIES ${TCL_LIBRARY}) + IF(TCL_TK_STUBS) + SET(VTK_TCL_LIBRARIES ${TCL_STUB_LIBRARY}) + ELSE(TCL_TK_STUBS) + SET(VTK_TCL_LIBRARIES ${TCL_LIBRARY}) + ENDIF(TCL_TK_STUBS) IF(UNIX) # The tcl library needs the math library on unix. SET(VTK_TCL_LIBRARIES ${VTK_TCL_LIBRARIES} m) ENDIF(UNIX) IF(VTK_USE_TK) - SET(VTK_TK_LIBRARIES ${TK_LIBRARY} ${VTK_TCL_LIBRARIES}) + IF(TCL_TK_STUBS) + SET(VTK_TK_LIBRARIES ${TK_STUB_LIBRARY} ${VTK_TCL_LIBRARIES}) + ELSE(TCL_TK_STUBS) + SET(VTK_TK_LIBRARIES ${TK_LIBRARY} ${VTK_TCL_LIBRARIES}) + ENDIF(TCL_TK_STUBS) ENDIF(VTK_USE_TK) INCLUDE(${VTK_SOURCE_DIR}/CMake/vtkTclTkMacros.cmake) # Hide useless settings provided by FindTCL. FOREACH(entry TCL_LIBRARY_DEBUG TK_LIBRARY_DEBUG - TCL_STUB_LIBRARY TCL_STUB_LIBRARY_DEBUG - TK_STUB_LIBRARY TK_STUB_LIBRARY_DEBUG TK_WISH) SET(${entry} "${${entry}}" CACHE INTERNAL "This value is not used by VTK.") @@ -1131,6 +1137,9 @@ SET(VTK_WRAP_TCL3_INIT_DIR "${VTK_SOURCE_DIR}/Wrapping") INCLUDE("${VTK_SOURCE_DIR}/CMake/vtkWrapTcl.cmake") + OPTION(TCL_TK_STUBS "Build with stubs enabled Tcl/Tk support. TCL_STUB_LIBRARY and TK_STUB_LIBRARY must point to the corresponding Tcl/Tk stubs libraries (example, tclstub84.lib, tkstub84.lib)." OFF) + MARK_AS_ADVANCED(TCL_TK_STUBS) + VTK_INCLUDE_TCL_TK_MODULES() # Wrapping executables. --- VTK/CMake/KitCommonBlock.cmake.orig 2005-08-25 08:38:58.000000000 +0900 +++ VTK/CMake/KitCommonBlock.cmake 2007-01-16 23:03:03.000000000 +0900 @@ -20,6 +20,9 @@ VTK_WRAP_TCL3(vtk${KIT}TCL KitTCL_SRCS "${Kit_SRCS}" "${Kit_TCL_EXTRA_CMDS}") + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TCL_STUBS) + ENDIF (TCL_TK_STUBS) ADD_LIBRARY(vtk${KIT}TCL ${KitTCL_SRCS} ${Kit_TCL_EXTRA_SRCS}) SET(KIT_LIBRARY_TARGETS ${KIT_LIBRARY_TARGETS} vtk${KIT}TCL) TARGET_LINK_LIBRARIES (vtk${KIT}TCL vtk${KIT} ${KIT_TCL_LIBS}) --- VTK/Rendering/CMakeLists.txt.orig 2005-08-31 23:05:22.000000000 +0900 +++ VTK/Rendering/CMakeLists.txt 2007-01-16 23:03:03.000000000 +0900 @@ -388,6 +388,10 @@ SET(Kit_TCL_EXTRA_CMDS vtkTkRenderWidget vtkTkImageViewerWidget) + + IF (TCL_TK_STUBS) + ADD_DEFINITIONS(-DUSE_TK_STUBS) + ENDIF (TCL_TK_STUBS) ENDIF (VTK_USE_TK) ENDIF (VTK_WRAP_TCL) --- VTK/Wrapping/vtkWrapTclInit.c.orig 2005-06-25 03:11:31.000000000 +0900 +++ VTK/Wrapping/vtkWrapTclInit.c 2007-01-17 02:10:18.000000000 +0900 @@ -42,6 +42,12 @@ } fprintf(fout,"#include \"vtkTclUtil.h\"\n"); + if (!strcmp(kitName,"Vtkrenderingtcl")) + { + fprintf(fout,"#ifdef USE_TK_STUBS\n"); + fprintf(fout,"#include \"vtkTk.h\"\n"); + fprintf(fout,"#endif\n"); + } fprintf(fout,"#include \"vtkVersion.h\"\n"); fprintf(fout,"#define VTK_TCL_TO_STRING(x) VTK_TCL_TO_STRING0(x)\n"); fprintf(fout,"#define VTK_TCL_TO_STRING0(x) #x\n"); @@ -113,6 +119,23 @@ fprintf(fout,"\n\nint VTK_EXPORT %s_Init(Tcl_Interp *interp)\n{\n", kitName); + + /* for stubs enabled vtk libraries... */ + fprintf(fout,"\n #ifdef USE_TCL_STUBS\n" + " if (Tcl_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n"); + + if (!strcmp(kitName,"Vtkrenderingtcl")) + { + fprintf(fout,"\n #ifdef USE_TK_STUBS\n" + " if (Tk_InitStubs(interp, \"8.1\", 0) == NULL) {\n" + " return TCL_ERROR;\n" + " }\n" + " #endif\n\n"); + } + if (!strcmp(kitName,"Vtkcommontcl")) { fprintf(fout, --- VTK/Rendering/vtkXRenderWindowTclInteractor.cxx.orig 2005-08-25 22:27:06.000000000 +0900 +++ VTK/Rendering/vtkXRenderWindowTclInteractor.cxx 2007-01-17 00:53:45.000000000 +0900 @@ -43,8 +43,43 @@ #if ((TK_MAJOR_VERSION <= 4)||((TK_MAJOR_VERSION == 8)&&(TK_MINOR_VERSION == 0))) extern TkMainInfo *tkMainWindowList; #else +#if USE_TK_STUBS +struct TkIntStubs +{ + int magic; struct TkIntStubHooks *hooks; + void *dummy0; void *dummy1; void *dummy2; void *dummy3; void *dummy4; + void *dummy5; void *dummy6; void *dummy7; void *dummy8; void *dummy9; + void *dummy10; void *dummy11; void *dummy12; void *dummy13; void *dummy14; + void *dummy15; void *dummy16; void *dummy17; void *dummy18; void *dummy19; + void *dummy20; void *dummy21; void *dummy22; void *dummy23; void *dummy24; + void *dummy25; void *dummy26; void *dummy27; void *dummy28; void *dummy29; + void *dummy30; void *dummy31; void *dummy32; void *dummy33; void *dummy34; + void *dummy35; void *dummy36; void *dummy37; void *dummy38; void *dummy39; + void *dummy40; void *dummy41; void *dummy42; void *dummy43; void *dummy44; + void *dummy45; void *dummy46; void *dummy47; void *dummy48; void *dummy49; + void *dummy50; void *dummy51; void *dummy52; void *dummy53; void *dummy54; + void *dummy55; void *dummy56; void *dummy57; void *dummy58; void *dummy59; + void *dummy60; void *dummy61; void *dummy62; void *dummy63; void *dummy64; + void *dummy65; void *dummy66; void *dummy67; void *dummy68; void *dummy69; + void *dummy70; void *dummy71; void *dummy72; void *dummy73; void *dummy74; + void *dummy75; void *dummy76; void *dummy77; void *dummy78; void *dummy79; + void *dummy80; void *dummy81; void *dummy82; void *dummy83; void *dummy84; + void *dummy85; void *dummy86; void *dummy87; void *dummy88; void *dummy89; + void *dummy90; void *dummy91; void *dummy92; void *dummy93; void *dummy94; + void *dummy95; void *dummy96; void *dummy97; void *dummy98; void *dummy99; + void *dummy100; void *dummy101; void *dummy102; void *dummy103; + void *dummy104; void *dummy105; void *dummy106; + TkMainInfo * (*tkGetMainInfoList) _ANSI_ARGS_((void)); +}; +extern "C" { +extern TkIntStubs *tkIntStubsPtr; +} +#define TkGetMainInfoList \ + (tkIntStubsPtr->tkGetMainInfoList) +#else extern "C" {TkMainInfo *TkGetMainInfoList();} #endif +#endif // returns 1 if done static int vtkTclEventProc(XtPointer clientData,XEvent *event) --- VTK/Rendering/vtkTkRenderWidget.cxx.orig 2006-05-11 02:52:08.000000000 +0900 +++ VTK/Rendering/vtkTkRenderWidget.cxx 2007-01-16 23:03:03.000000000 +0900 @@ -22,6 +22,18 @@ #include "vtkToolkits.h" #ifdef _WIN32 + #ifdef USE_TK_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from + * the class info registered with windows. + * kudos: http://togl.cvs.sourceforge.net/togl/Togl/togl.c?revision=1.57 + */ + static WNDCLASS childClass; /* Window class for child windows. */ + static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) = NULL; + #define TK_WIN_CHILD_CLASS_NAME "TkChild" + #endif #include "vtkWin32OpenGLRenderWindow.h" #else #ifdef VTK_USE_CARBON @@ -797,8 +809,18 @@ vtkSetWindowLong(hWnd,4,(LONG)((TkWindow *)self->TkWin)->window); if (((TkWindow *)self->TkWin)->parentPtr) { +#ifndef USE_TK_STUBS vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); rval = TkWinChildProc(hWnd,message,wParam,lParam); +#else + if (tkWinChildProc == NULL) + { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd,message,wParam,lParam); +#endif } else { @@ -850,8 +872,18 @@ Tcl_ServiceAll(); return 0; } +#ifndef USE_TK_STUBS vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); rval = TkWinChildProc(hWnd,message,wParam,lParam); +#else + if (tkWinChildProc == NULL) + { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd,message,wParam,lParam); +#endif #endif } --- VTK/Rendering/vtkTkImageViewerWidget.cxx.orig 2005-09-01 07:55:26.000000000 +0900 +++ VTK/Rendering/vtkTkImageViewerWidget.cxx 2007-01-16 23:03:03.000000000 +0900 @@ -18,6 +18,20 @@ #include "vtkRenderWindowInteractor.h" #include "vtkTkInternals.h" +#ifdef _WIN32 + #ifdef USE_TK_STUBS + /* + * OK, since TkWinChildProc is not explicitly exported in the + * dynamic libraries (stubs table), we have to retrieve it from + * the class info registered with windows. + * kudos: http://togl.cvs.sourceforge.net/togl/Togl/togl.c?revision=1.57 + */ + static WNDCLASS childClass; /* Window class for child windows. */ + static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) = NULL; + #define TK_WIN_CHILD_CLASS_NAME "TkChild" + #endif +#endif #ifdef _MSC_VER #pragma warning ( disable : 4273 ) #else @@ -402,8 +416,18 @@ { SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window); +#ifndef USE_TK_STUBS SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), GWL_WNDPROC,(LONG)TkWinChildProc); +#else + if (tkWinChildProc == NULL) + { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + SetWindowLong((HWND)self->ImageViewer->GetRenderWindow()->GetGenericWindowId(), + GWL_WNDPROC,(LONG)tkWinChildProc); +#endif } #endif Tcl_EventuallyFree( (ClientData) self, vtkTkImageViewerWidget_Destroy ); @@ -469,8 +493,18 @@ vtkSetWindowLong(hWnd,GWL_USERDATA,(LONG)((TkWindow *)self->TkWin)->window); if (((TkWindow *)self->TkWin)->parentPtr) { +#ifndef USE_TK_STUBS vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); rval = TkWinChildProc(hWnd,message,wParam,lParam); +#else + if (tkWinChildProc == NULL) + { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd,message,wParam,lParam); +#endif } else { @@ -526,8 +560,18 @@ Tcl_ServiceAll(); return 0; } +#ifndef USE_TK_STUBS vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)TkWinChildProc); rval = TkWinChildProc(hWnd,message,wParam,lParam); +#else + if (tkWinChildProc == NULL) + { + GetClassInfo(Tk_GetHINSTANCE(),TK_WIN_CHILD_CLASS_NAME,&childClass); + tkWinChildProc = childClass.lpfnWndProc; + } + vtkSetWindowLong(hWnd,GWL_WNDPROC,(LONG)tkWinChildProc); + rval = tkWinChildProc(hWnd,message,wParam,lParam); +#endif #endif } --- VTK/Wrapping/Tcl/CMakeLists.txt.orig 2005-12-15 23:39:27.000000000 +0900 +++ VTK/Wrapping/Tcl/CMakeLists.txt 2007-01-17 02:44:39.000000000 +0900 @@ -45,6 +45,10 @@ ENDIF (NOT BORLAND) ENDIF (WIN32) +IF(TCL_TK_STUBS) + SET(VTK_TCL_LIBRARIES ${VTK_TCL_LIBRARIES} ${TK_LIBRARY} ${TCL_LIBRARY}) +ENDIF(TCL_TK_STUBS) + # Create the vtk Tcl wrapper executable. ADD_EXECUTABLE(vtk vtkTkAppInit.cxx ${VTK_EXE_RESOURCE_FILES}) TARGET_LINK_LIBRARIES (vtk @@ -53,6 +57,7 @@ vtkGraphicsTCL vtkImagingTCL vtkIOTCL + ${VTK_TCL_LIBRARIES} ) IF(VTK_USE_CARBON) @@ -113,6 +118,7 @@ vtkImagingTCL vtkIOTCL vtkParallelTCL + ${VTK_TCL_LIBRARIES} ) IF (VTK_USE_RENDERING) --- VTK/Common/vtkTclUtil.cxx.orig 2006-05-26 13:11:03.000000000 +0900 +++ VTK/Common/vtkTclUtil.cxx 2007-01-17 13:39:51.000000000 +0900 @@ -738,7 +738,9 @@ const char* const argv[]) { vtkstd::string av0 = vtksys::SystemTools::CollapseFullPath(argv[0]); +#ifndef USE_TCL_STUBS Tcl_FindExecutable(av0.c_str()); +#endif } // We need two internal Tcl functions. They usually are declared in | ||||||||
Relationships | |
Relationships |
Notes | |
(0002742) Goodwin Lawlor (reporter) 2005-07-29 11:27 |
Stubs-enabling vtk dll libs allow them to be loaded into a tclkit... unfortunately they can't be (easily) wrapped into a starpack because of dependencies. To work around this, there are a couple of choices: 1. Copy dlls out of starpack at runtime and load them from disk 2. Distribute vtk dll with starpack and have them in a know relative path (kind of defeats the whole purpose). 3. Drop stubs enabling and statically link vtk libs into tclkit... this is the one I'm going for (cf www.bioengineering-research.com/vtk/vtkit.htm) |
(0006214) Hideaki Hiraki (reporter) 2007-01-17 11:08 |
I ported the patches (see tcltkstubs-VTK-5.0.2.patch) to vtk-5.0.2 release with some modifications. - TCL_STUB_LIBRARY and TK_STUB_LIBRARY are used. - The vtk executable had to be linked to both the stub and the original libraries. - cmVTKWrapTcl2Command.c isn't patched. (may depend on cmake version) - vtkXRenderWindowTclInteractor.cxx should include tkInt.h but the current code has a hack to avoid it. - Tcl_FindExecutable() in vtkTclApplicationInitExecutable() must not be called before stub initialization. The code should be moved back to vtkTkAppInit.cxx if it's really needed. With the modifications, I could just run a build process on linux. The functionality haven't been tested yet. |
Notes |
Issue History | |||
Date Modified | Username | Field | Change |
2011-06-16 13:11 | Zack Galbreath | Category | => (No Category) |
Issue History |
Copyright © 2000 - 2018 MantisBT Team |