Tk Source Code

Check-in [7b50f557]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:make loading of tk.dll in cygwin possible reduce command table size
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 7b50f557d3ad9d4a305535e7604d65ad8e385471
User & Date: jan.nijtmans 2012-04-18 04:56:31
Context
2012-04-18
18:24
merge-mark check-in: 7c924dcf user: jan.nijtmans tags: trunk
04:56
make loading of tk.dll in cygwin possible reduce command table size check-in: 7b50f557 user: jan.nijtmans tags: trunk
04:40
make loading of tk.dll in cygwin possible reduce command table size check-in: 0cb2832c user: jan.nijtmans tags: core-8-5-branch
2012-04-13
19:43
[Bug 3517448] TclKit build fails (unresolved __strtoi64) check-in: cbc88968 user: jan.nijtmans tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to generic/tkWindow.c.

59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

/*
 * Default values for "changes" and "atts" fields of TkWindows. Note that Tk
 * always requests all events for all windows, except StructureNotify events
 * on internal windows: these events are generated internally.
 */

static XWindowChanges defChanges = {
    0, 0, 1, 1, 0, 0, Above
};
#define ALL_EVENTS_MASK \
    KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
    EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
    VisibilityChangeMask|PropertyChangeMask|ColormapChangeMask
static XSetWindowAttributes defAtts= {
    None,			/* background_pixmap */
    0,				/* background_pixel */
    CopyFromParent,		/* border_pixmap */
    0,				/* border_pixel */
    NorthWestGravity,		/* bit_gravity */
    NorthWestGravity,		/* win_gravity */
    NotUseful,			/* backing_store */







|






|







59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

/*
 * Default values for "changes" and "atts" fields of TkWindows. Note that Tk
 * always requests all events for all windows, except StructureNotify events
 * on internal windows: these events are generated internally.
 */

static const XWindowChanges defChanges = {
    0, 0, 1, 1, 0, 0, Above
};
#define ALL_EVENTS_MASK \
    KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
    EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
    VisibilityChangeMask|PropertyChangeMask|ColormapChangeMask
static const XSetWindowAttributes defAtts= {
    None,			/* background_pixmap */
    0,				/* background_pixel */
    CopyFromParent,		/* border_pixmap */
    0,				/* border_pixel */
    NorthWestGravity,		/* bit_gravity */
    NorthWestGravity,		/* win_gravity */
    NotUseful,			/* backing_store */
88
89
90
91
92
93
94




95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    None			/* cursor */
};

/*
 * The following structure defines all of the commands supported by Tk, and
 * the C functions that execute them.
 */




typedef int (TkInitProc)(Tcl_Interp *interp, ClientData clientData);
typedef struct {
    const char *name;		/* Name of command. */
    Tcl_CmdProc *cmdProc;	/* Command's string-based function. */
    Tcl_ObjCmdProc *objProc;	/* Command's object-based function. */
    TkInitProc *initProc;	/* Command's initialization function */
    int isSafe;			/* If !0, this command will be exposed in a
				 * safe interpreter. Otherwise it will be
				 * hidden in a safe interpreter. */
    int passMainWindow;		/* 0 means provide NULL clientData to command
				 * function; 1 means pass main window as
				 * clientData to command function. */
} TkCmd;

static const TkCmd commands[] = {
    /*
     * Commands that are part of the intrinsics:
     */

    {"bell",		NULL,		Tk_BellObjCmd,		NULL, 0, 1},
    {"bind",		NULL,		Tk_BindObjCmd,		NULL, 1, 1},
    {"bindtags",	NULL,		Tk_BindtagsObjCmd,	NULL, 1, 1},
    {"clipboard",	NULL,		Tk_ClipboardObjCmd,	NULL, 0, 1},
    {"destroy",		NULL,		Tk_DestroyObjCmd,	NULL, 1, 1},
    {"event",		NULL,		Tk_EventObjCmd,		NULL, 1, 1},
    {"focus",		NULL,		Tk_FocusObjCmd,		NULL, 1, 1},
    {"font",		NULL,		Tk_FontObjCmd,		NULL, 1, 1},
    {"grab",		NULL,		Tk_GrabObjCmd,		NULL, 0, 1},
    {"grid",		NULL,		Tk_GridObjCmd,		NULL, 1, 1},
    {"image",		NULL,		Tk_ImageObjCmd,		NULL, 1, 1},
    {"lower",		NULL,		Tk_LowerObjCmd,		NULL, 1, 1},
    {"option",		NULL,		Tk_OptionObjCmd,	NULL, 1, 1},
    {"pack",		NULL,		Tk_PackObjCmd,		NULL, 1, 1},
    {"place",		NULL,		Tk_PlaceObjCmd,		NULL, 1, 1},
    {"raise",		NULL,		Tk_RaiseObjCmd,		NULL, 1, 1},
    {"selection",	NULL,		Tk_SelectionObjCmd,	NULL, 0, 1},
    {"tk",		NULL,		NULL,		TkInitTkCmd,  1, 1},
    {"tkwait",		NULL,		Tk_TkwaitObjCmd,	NULL, 1, 1},
    {"update",		NULL,		Tk_UpdateObjCmd,	NULL, 1, 1},
    {"winfo",		NULL,		Tk_WinfoObjCmd,		NULL, 1, 1},
    {"wm",		NULL,		Tk_WmObjCmd,		NULL, 0, 1},

    /*
     * Default widget class commands.
     */

    {"button",		NULL,		Tk_ButtonObjCmd,	NULL, 1, 0},
    {"canvas",		NULL,		Tk_CanvasObjCmd,	NULL, 1, 1},
    {"checkbutton",	NULL,		Tk_CheckbuttonObjCmd,	NULL, 1, 0},
    {"entry",		NULL,		Tk_EntryObjCmd,		NULL, 1, 0},
    {"frame",		NULL,		Tk_FrameObjCmd,		NULL, 1, 0},
    {"label",		NULL,		Tk_LabelObjCmd,		NULL, 1, 0},
    {"labelframe",	NULL,		Tk_LabelframeObjCmd,	NULL, 1, 0},
    {"listbox",		NULL,		Tk_ListboxObjCmd,	NULL, 1, 0},
    {"menubutton",	NULL,		Tk_MenubuttonObjCmd,	NULL, 1, 0},
    {"message",		NULL,		Tk_MessageObjCmd,	NULL, 1, 0},
    {"panedwindow",	NULL,		Tk_PanedWindowObjCmd,	NULL, 1, 0},
    {"radiobutton",	NULL,		Tk_RadiobuttonObjCmd,	NULL, 1, 0},
    {"scale",		NULL,		Tk_ScaleObjCmd,		NULL, 1, 0},
    {"scrollbar",	Tk_ScrollbarCmd,NULL,			NULL, 1, 1},
    {"spinbox",		NULL,		Tk_SpinboxObjCmd,	NULL, 1, 0},
    {"text",		NULL,		Tk_TextObjCmd,		NULL, 1, 1},
    {"toplevel",	NULL,		Tk_ToplevelObjCmd,	NULL, 0, 0},

    /*
     * Classic widget class commands.
     */

    {"::tk::button",	NULL,		Tk_ButtonObjCmd,	NULL, 1, 0},
    {"::tk::canvas",	NULL,		Tk_CanvasObjCmd,	NULL, 1, 1},
    {"::tk::checkbutton",NULL,		Tk_CheckbuttonObjCmd,	NULL, 1, 0},
    {"::tk::entry",	NULL,		Tk_EntryObjCmd,		NULL, 1, 0},
    {"::tk::frame",	NULL,		Tk_FrameObjCmd,		NULL, 1, 0},
    {"::tk::label",	NULL,		Tk_LabelObjCmd,		NULL, 1, 0},
    {"::tk::labelframe",NULL,		Tk_LabelframeObjCmd,	NULL, 1, 0},
    {"::tk::listbox",	NULL,		Tk_ListboxObjCmd,	NULL, 1, 0},
    {"::tk::menubutton",NULL,		Tk_MenubuttonObjCmd,	NULL, 1, 0},
    {"::tk::message",	NULL,		Tk_MessageObjCmd,	NULL, 1, 0},
    {"::tk::panedwindow",NULL,		Tk_PanedWindowObjCmd,	NULL, 1, 0},
    {"::tk::radiobutton",NULL,		Tk_RadiobuttonObjCmd,	NULL, 1, 0},
    {"::tk::scale",	NULL,		Tk_ScaleObjCmd,		NULL, 1, 0},
    {"::tk::scrollbar",	Tk_ScrollbarCmd,NULL,			NULL, 1, 1},
    {"::tk::spinbox",	NULL,		Tk_SpinboxObjCmd,	NULL, 1, 0},
    {"::tk::text",	NULL,		Tk_TextObjCmd,		NULL, 1, 1},
    {"::tk::toplevel",	NULL,		Tk_ToplevelObjCmd,	NULL, 0, 0},

    /*
     * Standard dialog support. Note that the Unix/X11 platform implements
     * these commands differently (via the script library).
     */

#if defined(__WIN32__) || defined(MAC_OSX_TK)
    {"tk_chooseColor",	NULL,		Tk_ChooseColorObjCmd,	NULL, 0, 1},
    {"tk_chooseDirectory", NULL,	Tk_ChooseDirectoryObjCmd,NULL, 0,1},
    {"tk_getOpenFile",	NULL,		Tk_GetOpenFileObjCmd,	NULL, 0, 1},
    {"tk_getSaveFile",	NULL,		Tk_GetSaveFileObjCmd,	NULL, 0, 1},
    {"tk_messageBox",	NULL,		Tk_MessageBoxObjCmd,	NULL, 0, 1},
#endif

    /*
     * Misc.
     */

#if defined(MAC_OSX_TK)
    {"::tk::unsupported::MacWindowStyle",
			NULL,		TkUnsupported1ObjCmd,	NULL, 1, 1},
#endif
    {NULL,		NULL,		NULL,			NULL, 0, 0}
};

/*
 * The variables and table below are used to parse arguments from the "argv"
 * variable in Tk_Init.
 */








>
>
>
>






<
<
|
<
<
<







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







|
|
|
|
|








|

|







88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104


105



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
    None			/* cursor */
};

/*
 * The following structure defines all of the commands supported by Tk, and
 * the C functions that execute them.
 */

#define ISSAFE 1
#define PASSMAINWINDOW 2

typedef int (TkInitProc)(Tcl_Interp *interp, ClientData clientData);
typedef struct {
    const char *name;		/* Name of command. */
    Tcl_CmdProc *cmdProc;	/* Command's string-based function. */
    Tcl_ObjCmdProc *objProc;	/* Command's object-based function. */
    TkInitProc *initProc;	/* Command's initialization function */


    int flags;



} TkCmd;

static const TkCmd commands[] = {
    /*
     * Commands that are part of the intrinsics:
     */

    {"bell",		NULL,		Tk_BellObjCmd,		NULL, PASSMAINWINDOW},
    {"bind",		NULL,		Tk_BindObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"bindtags",	NULL,		Tk_BindtagsObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"clipboard",	NULL,		Tk_ClipboardObjCmd,	NULL, PASSMAINWINDOW},
    {"destroy",		NULL,		Tk_DestroyObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"event",		NULL,		Tk_EventObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"focus",		NULL,		Tk_FocusObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"font",		NULL,		Tk_FontObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"grab",		NULL,		Tk_GrabObjCmd,		NULL, PASSMAINWINDOW},
    {"grid",		NULL,		Tk_GridObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"image",		NULL,		Tk_ImageObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"lower",		NULL,		Tk_LowerObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"option",		NULL,		Tk_OptionObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"pack",		NULL,		Tk_PackObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"place",		NULL,		Tk_PlaceObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"raise",		NULL,		Tk_RaiseObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"selection",	NULL,		Tk_SelectionObjCmd,	NULL, PASSMAINWINDOW},
    {"tk",		NULL,		NULL,		TkInitTkCmd,  PASSMAINWINDOW|ISSAFE},
    {"tkwait",		NULL,		Tk_TkwaitObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"update",		NULL,		Tk_UpdateObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"winfo",		NULL,		Tk_WinfoObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"wm",		NULL,		Tk_WmObjCmd,		NULL, PASSMAINWINDOW},

    /*
     * Default widget class commands.
     */

    {"button",		NULL,		Tk_ButtonObjCmd,	NULL, ISSAFE},
    {"canvas",		NULL,		Tk_CanvasObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"checkbutton",	NULL,		Tk_CheckbuttonObjCmd,	NULL, ISSAFE},
    {"entry",		NULL,		Tk_EntryObjCmd,		NULL, ISSAFE},
    {"frame",		NULL,		Tk_FrameObjCmd,		NULL, ISSAFE},
    {"label",		NULL,		Tk_LabelObjCmd,		NULL, ISSAFE},
    {"labelframe",	NULL,		Tk_LabelframeObjCmd,	NULL, ISSAFE},
    {"listbox",		NULL,		Tk_ListboxObjCmd,	NULL, ISSAFE},
    {"menubutton",	NULL,		Tk_MenubuttonObjCmd,	NULL, ISSAFE},
    {"message",		NULL,		Tk_MessageObjCmd,	NULL, ISSAFE},
    {"panedwindow",	NULL,		Tk_PanedWindowObjCmd,	NULL, ISSAFE},
    {"radiobutton",	NULL,		Tk_RadiobuttonObjCmd,	NULL, ISSAFE},
    {"scale",		NULL,		Tk_ScaleObjCmd,		NULL, ISSAFE},
    {"scrollbar",	Tk_ScrollbarCmd,NULL,			NULL, PASSMAINWINDOW|ISSAFE},
    {"spinbox",		NULL,		Tk_SpinboxObjCmd,	NULL, ISSAFE},
    {"text",		NULL,		Tk_TextObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"toplevel",	NULL,		Tk_ToplevelObjCmd,	NULL, 0},

    /*
     * Classic widget class commands.
     */

    {"::tk::button",	NULL,		Tk_ButtonObjCmd,	NULL, ISSAFE},
    {"::tk::canvas",	NULL,		Tk_CanvasObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
    {"::tk::checkbutton",NULL,		Tk_CheckbuttonObjCmd,	NULL, ISSAFE},
    {"::tk::entry",	NULL,		Tk_EntryObjCmd,		NULL, ISSAFE},
    {"::tk::frame",	NULL,		Tk_FrameObjCmd,		NULL, ISSAFE},
    {"::tk::label",	NULL,		Tk_LabelObjCmd,		NULL, ISSAFE},
    {"::tk::labelframe",NULL,		Tk_LabelframeObjCmd,	NULL, ISSAFE},
    {"::tk::listbox",	NULL,		Tk_ListboxObjCmd,	NULL, ISSAFE},
    {"::tk::menubutton",NULL,		Tk_MenubuttonObjCmd,	NULL, ISSAFE},
    {"::tk::message",	NULL,		Tk_MessageObjCmd,	NULL, ISSAFE},
    {"::tk::panedwindow",NULL,		Tk_PanedWindowObjCmd,	NULL, ISSAFE},
    {"::tk::radiobutton",NULL,		Tk_RadiobuttonObjCmd,	NULL, ISSAFE},
    {"::tk::scale",	NULL,		Tk_ScaleObjCmd,		NULL, ISSAFE},
    {"::tk::scrollbar",	Tk_ScrollbarCmd,NULL,			NULL, PASSMAINWINDOW|ISSAFE},
    {"::tk::spinbox",	NULL,		Tk_SpinboxObjCmd,	NULL, ISSAFE},
    {"::tk::text",	NULL,		Tk_TextObjCmd,		NULL, PASSMAINWINDOW|ISSAFE},
    {"::tk::toplevel",	NULL,		Tk_ToplevelObjCmd,	NULL, 0},

    /*
     * Standard dialog support. Note that the Unix/X11 platform implements
     * these commands differently (via the script library).
     */

#if defined(__WIN32__) || defined(MAC_OSX_TK)
    {"tk_chooseColor",	NULL,		Tk_ChooseColorObjCmd,	NULL, PASSMAINWINDOW},
    {"tk_chooseDirectory", NULL,	Tk_ChooseDirectoryObjCmd,NULL, 0, 1},
    {"tk_getOpenFile",	NULL,		Tk_GetOpenFileObjCmd,	NULL, PASSMAINWINDOW},
    {"tk_getSaveFile",	NULL,		Tk_GetSaveFileObjCmd,	NULL, PASSMAINWINDOW},
    {"tk_messageBox",	NULL,		Tk_MessageBoxObjCmd,	NULL, PASSMAINWINDOW},
#endif

    /*
     * Misc.
     */

#if defined(MAC_OSX_TK)
    {"::tk::unsupported::MacWindowStyle",
			NULL,		TkUnsupported1ObjCmd,	NULL, PASSMAINWINDOW|ISSAFE},
#endif
    {NULL,		NULL,		NULL,			NULL, 0}
};

/*
 * The variables and table below are used to parse arguments from the "argv"
 * variable in Tk_Init.
 */

947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976

    isSafe = Tcl_IsSafe(interp);
    for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
	if ((cmdPtr->cmdProc == NULL) && (cmdPtr->objProc == NULL)
		&& (cmdPtr->initProc == NULL)) {
	    Tcl_Panic("TkCreateMainWindow: builtin command with NULL string and object procs");
	}
	if (cmdPtr->passMainWindow) {
	    clientData = tkwin;
	} else {
	    clientData = NULL;
	}
	if (cmdPtr->initProc != NULL) {
	    cmdPtr->initProc(interp, clientData);
	} else if (cmdPtr->cmdProc != NULL) {
	    Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
		    clientData, NULL);
	} else {
	    Tcl_CreateObjCommand(interp, cmdPtr->name, cmdPtr->objProc,
		    clientData, NULL);
	}
	if (isSafe) {
	    if (!(cmdPtr->isSafe)) {
		Tcl_HideCommand(interp, cmdPtr->name, cmdPtr->name);
	    }
	}
    }

    TkCreateMenuCmd(interp);








|














|







946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975

    isSafe = Tcl_IsSafe(interp);
    for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
	if ((cmdPtr->cmdProc == NULL) && (cmdPtr->objProc == NULL)
		&& (cmdPtr->initProc == NULL)) {
	    Tcl_Panic("TkCreateMainWindow: builtin command with NULL string and object procs");
	}
	if (cmdPtr->flags & PASSMAINWINDOW) {
	    clientData = tkwin;
	} else {
	    clientData = NULL;
	}
	if (cmdPtr->initProc != NULL) {
	    cmdPtr->initProc(interp, clientData);
	} else if (cmdPtr->cmdProc != NULL) {
	    Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
		    clientData, NULL);
	} else {
	    Tcl_CreateObjCommand(interp, cmdPtr->name, cmdPtr->objProc,
		    clientData, NULL);
	}
	if (isSafe) {
	    if (!(cmdPtr->flags & ISSAFE)) {
		Tcl_HideCommand(interp, cmdPtr->name, cmdPtr->name);
	    }
	}
    }

    TkCreateMenuCmd(interp);

Changes to unix/Makefile.in.

720
721
722
723
724
725
726


727




728

729
730
731
732
733
734
735
	    done;
	@if test "x$(TK_SHARED_BUILD)" = "x1"; then \
	    echo "Creating package index $(PKG_INDEX)"; \
	    rm -f "$(PKG_INDEX)"; \
	    (\
	    echo "if {[catch {package present Tcl $(TCLVERSION)$(TCLPATCHL)}]} return";\
	    relative=`echo | awk '{ORS=" "; split("$(TK_PKG_DIR)",a,"/"); for (f in a) {print ".."}}'`;\


	    echo "package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL)\




		[list load [file join \$$dir $${relative}$(TK_LIB_FILE)] Tk]";\

	    ) > "$(PKG_INDEX)"; \
	    fi
	@echo "Installing $(LIB_FILE) to @DLL_INSTALL_DIR@/"
	@@INSTALL_LIB@
	@chmod 555 "@DLL_INSTALL_DIR@"/$(LIB_FILE)
	@echo "Installing ${WISH_EXE} as $(BIN_INSTALL_DIR)/wish$(VERSION)${EXE_SUFFIX}"
	@$(INSTALL_PROGRAM) ${WISH_EXE} "$(BIN_INSTALL_DIR)"/wish$(VERSION)${EXE_SUFFIX}







>
>
|
>
>
>
>
|
>







720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
	    done;
	@if test "x$(TK_SHARED_BUILD)" = "x1"; then \
	    echo "Creating package index $(PKG_INDEX)"; \
	    rm -f "$(PKG_INDEX)"; \
	    (\
	    echo "if {[catch {package present Tcl $(TCLVERSION)$(TCLPATCHL)}]} return";\
	    relative=`echo | awk '{ORS=" "; split("$(TK_PKG_DIR)",a,"/"); for (f in a) {print ".."}}'`;\
	    echo "if {[string match CYGWIN* \$$::tcl_platform(os)]} {";\
	    echo "    if {([info exists ::env(DISPLAY)] || [lsearch -exact \$$::argv -display] > -1)} {";\
	    echo "	package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}.. bin $(TK_LIB_FILE)] Tk]";\
	    echo "    } else {";\
	    echo "	package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}.. bin tk${MAJOR_VERSION}${MINOR_VERSION}.dll] Tk]";\
	    echo "    }";\
	    echo "} else {";\
	    echo "    package ifneeded Tk $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCH_LEVEL) [list load [file join \$$dir $${relative}$(TK_LIB_FILE)] Tk]";\
	    echo "}";\
	    ) > "$(PKG_INDEX)"; \
	    fi
	@echo "Installing $(LIB_FILE) to @DLL_INSTALL_DIR@/"
	@@INSTALL_LIB@
	@chmod 555 "@DLL_INSTALL_DIR@"/$(LIB_FILE)
	@echo "Installing ${WISH_EXE} as $(BIN_INSTALL_DIR)/wish$(VERSION)${EXE_SUFFIX}"
	@$(INSTALL_PROGRAM) ${WISH_EXE} "$(BIN_INSTALL_DIR)"/wish$(VERSION)${EXE_SUFFIX}