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 |