From 7d67184a277c2923bc3f951b256ad643113c6a8e Mon Sep 17 00:00:00 2001
From: ericm <ericm>
Date: Wed, 2 Aug 2000 23:08:19 +0000
Subject: * generic/tkCmds.c (Tk_TkwaitObjCmd): Tcl_Obj'ified [tkwait] command.

* generic/tkWindow.c: Updated "tkwait" command entry to use
Tcl_Obj'ified command.

* generic/tkInt.h: Replace Tk_TkwaitCmd prototype with
Tk_TkwaitObjCmd prototype.
---
 ChangeLog          |   8 +++
 generic/tkCmds.c   | 148 ++++++++++++++++++++++++++++-------------------------
 generic/tkInt.h    |   7 +--
 generic/tkWindow.c |   4 +-
 4 files changed, 93 insertions(+), 74 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2f43ae5..fb3cf21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2000-08-02  Eric Melski  <ericm@ajubasolutions.com>
 
+	* generic/tkCmds.c (Tk_TkwaitObjCmd): Tcl_Obj'ified [tkwait] command.
+
+	* generic/tkWindow.c: Updated "tkwait" command entry to use
+	Tcl_Obj'ified command.
+
+	* generic/tkInt.h: Replace Tk_TkwaitCmd prototype with
+	Tk_TkwaitObjCmd prototype.
+
 	* generic/tkGrid.c (Tk_GridCmd): Split [grid] subcommands into
 	separate functions instead of inlining them all in Tk_GridCmd.
 
diff --git a/generic/tkCmds.c b/generic/tkCmds.c
index 7c98aa6..2718d03 100644
--- a/generic/tkCmds.c
+++ b/generic/tkCmds.c
@@ -11,7 +11,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tkCmds.c,v 1.14 2000/05/17 22:44:09 hobbs Exp $
+ * RCS: @(#) $Id: tkCmds.c,v 1.15 2000/08/02 23:08:20 ericm Exp $
  */
 
 #include "tkPort.h"
@@ -695,7 +695,7 @@ Tk_TkObjCmd(clientData, interp, objc, objv)
 /*
  *----------------------------------------------------------------------
  *
- * Tk_TkwaitCmd --
+ * Tk_TkwaitObjCmd --
  *
  *	This procedure is invoked to process the "tkwait" Tcl command.
  *	See the user documentation for details on what it does.
@@ -711,87 +711,97 @@ Tk_TkObjCmd(clientData, interp, objc, objv)
 
 	/* ARGSUSED */
 int
-Tk_TkwaitCmd(clientData, interp, argc, argv)
+Tk_TkwaitObjCmd(clientData, interp, objc, objv)
     ClientData clientData;	/* Main window associated with
 				 * interpreter. */
     Tcl_Interp *interp;		/* Current interpreter. */
-    int argc;			/* Number of arguments. */
-    char **argv;		/* Argument strings. */
+    int objc;			/* Number of arguments. */
+    Tcl_Obj *CONST objv[];	/* Argument objects. */
 {
     Tk_Window tkwin = (Tk_Window) clientData;
-    int c, done;
-    size_t length;
+    int done, index;
+    static char *optionStrings[] = { "variable", "visibility", "window",
+					 (char *) NULL };
+    enum options { TKWAIT_VARIABLE, TKWAIT_VISIBILITY, TKWAIT_WINDOW };
+    
+    if (objc != 3) {
+	Tcl_WrongNumArgs(interp, 1, objv, "variable|visibility|window name");
+	return TCL_ERROR;
+    }
 
-    if (argc != 3) {
-	Tcl_AppendResult(interp, "wrong # args: should be \"",
-		argv[0], " variable|visibility|window name\"", (char *) NULL);
+    if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
+	    &index) != TCL_OK) {
 	return TCL_ERROR;
     }
-    c = argv[1][0];
-    length = strlen(argv[1]);
-    if ((c == 'v') && (strncmp(argv[1], "variable", length) == 0)
-	    && (length >= 2)) {
-	if (Tcl_TraceVar(interp, argv[2],
-		TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
-		WaitVariableProc, (ClientData) &done) != TCL_OK) {
-	    return TCL_ERROR;
-	}
-	done = 0;
-	while (!done) {
-	    Tcl_DoOneEvent(0);
-	}
-	Tcl_UntraceVar(interp, argv[2],
-		TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
-		WaitVariableProc, (ClientData) &done);
-    } else if ((c == 'v') && (strncmp(argv[1], "visibility", length) == 0)
-	    && (length >= 2)) {
-	Tk_Window window;
 
-	window = Tk_NameToWindow(interp, argv[2], tkwin);
-	if (window == NULL) {
-	    return TCL_ERROR;
+    switch ((enum options) index) {
+	case TKWAIT_VARIABLE: {
+	    if (Tcl_TraceVar(interp, Tcl_GetString(objv[2]),
+		    TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+		    WaitVariableProc, (ClientData) &done) != TCL_OK) {
+		return TCL_ERROR;
+	    }
+	    done = 0;
+	    while (!done) {
+		Tcl_DoOneEvent(0);
+	    }
+	    Tcl_UntraceVar(interp, Tcl_GetString(objv[2]),
+		    TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+		    WaitVariableProc, (ClientData) &done);
+	    break;
 	}
-	Tk_CreateEventHandler(window, VisibilityChangeMask|StructureNotifyMask,
-	    WaitVisibilityProc, (ClientData) &done);
-	done = 0;
-	while (!done) {
-	    Tcl_DoOneEvent(0);
+	
+	case TKWAIT_VISIBILITY: {
+	    Tk_Window window;
+
+	    window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
+	    if (window == NULL) {
+		return TCL_ERROR;
+	    }
+	    Tk_CreateEventHandler(window,
+		    VisibilityChangeMask|StructureNotifyMask,
+		    WaitVisibilityProc, (ClientData) &done);
+	    done = 0;
+	    while (!done) {
+		Tcl_DoOneEvent(0);
+	    }
+	    if (done != 1) {
+		/*
+		 * Note that we do not delete the event handler because it
+		 * was deleted automatically when the window was destroyed.
+		 */
+		
+		Tcl_ResetResult(interp);
+		Tcl_AppendResult(interp, "window \"", Tcl_GetString(objv[2]),
+			"\" was deleted before its visibility changed",
+			(char *) NULL);
+		return TCL_ERROR;
+	    }
+	    Tk_DeleteEventHandler(window,
+		    VisibilityChangeMask|StructureNotifyMask,
+		    WaitVisibilityProc, (ClientData) &done);
+	    break;
 	}
-	if (done != 1) {
+	
+	case TKWAIT_WINDOW: {
+	    Tk_Window window;
+	    
+	    window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
+	    if (window == NULL) {
+		return TCL_ERROR;
+	    }
+	    Tk_CreateEventHandler(window, StructureNotifyMask,
+		    WaitWindowProc, (ClientData) &done);
+	    done = 0;
+	    while (!done) {
+		Tcl_DoOneEvent(0);
+	    }
 	    /*
-	     * Note that we do not delete the event handler because it
-	     * was deleted automatically when the window was destroyed.
+	     * Note:  there's no need to delete the event handler.  It was
+	     * deleted automatically when the window was destroyed.
 	     */
-
-	    Tcl_ResetResult(interp);
-	    Tcl_AppendResult(interp, "window \"", argv[2],
-		    "\" was deleted before its visibility changed",
-		    (char *) NULL);
-	    return TCL_ERROR;
-	}
-	Tk_DeleteEventHandler(window, VisibilityChangeMask|StructureNotifyMask,
-	    WaitVisibilityProc, (ClientData) &done);
-    } else if ((c == 'w') && (strncmp(argv[1], "window", length) == 0)) {
-	Tk_Window window;
-
-	window = Tk_NameToWindow(interp, argv[2], tkwin);
-	if (window == NULL) {
-	    return TCL_ERROR;
-	}
-	Tk_CreateEventHandler(window, StructureNotifyMask,
-	    WaitWindowProc, (ClientData) &done);
-	done = 0;
-	while (!done) {
-	    Tcl_DoOneEvent(0);
+	    break;
 	}
-	/*
-	 * Note:  there's no need to delete the event handler.  It was
-	 * deleted automatically when the window was destroyed.
-	 */
-    } else {
-	Tcl_AppendResult(interp, "bad option \"", argv[1],
-		"\": must be variable, visibility, or window", (char *) NULL);
-	return TCL_ERROR;
     }
 
     /*
diff --git a/generic/tkInt.h b/generic/tkInt.h
index 81e4bd1..d2e7d95 100644
--- a/generic/tkInt.h
+++ b/generic/tkInt.h
@@ -11,7 +11,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: $Id: tkInt.h,v 1.26 2000/08/02 01:33:33 ericm Exp $ 
+ * RCS: $Id: tkInt.h,v 1.27 2000/08/02 23:08:20 ericm Exp $ 
  */
 
 #ifndef _TKINT
@@ -1000,8 +1000,9 @@ EXTERN int		Tk_TextCmd _ANSI_ARGS_((ClientData clientData,
 EXTERN int		Tk_TkObjCmd _ANSI_ARGS_((ClientData clientData,
 			    Tcl_Interp *interp, int objc,
 			    Tcl_Obj *CONST objv[]));
-EXTERN int		Tk_TkwaitCmd _ANSI_ARGS_((ClientData clientData,
-			    Tcl_Interp *interp, int argc, char **argv));
+EXTERN int		Tk_TkwaitObjCmd _ANSI_ARGS_((ClientData clientData,
+			    Tcl_Interp *interp, int objc,
+			    Tcl_Obj *CONST objv[]));
 EXTERN int		Tk_ToplevelObjCmd _ANSI_ARGS_((ClientData clientData,
 			    Tcl_Interp *interp, int objc,
 			    Tcl_Obj *CONST objv[]));
diff --git a/generic/tkWindow.c b/generic/tkWindow.c
index c2bc9fb..7578c0f 100644
--- a/generic/tkWindow.c
+++ b/generic/tkWindow.c
@@ -12,7 +12,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tkWindow.c,v 1.19 2000/08/02 01:33:33 ericm Exp $
+ * RCS: @(#) $Id: tkWindow.c,v 1.20 2000/08/02 23:08:20 ericm Exp $
  */
 
 #include "tkPort.h"
@@ -115,7 +115,7 @@ static TkCmd commands[] = {
     {"raise",		NULL,			Tk_RaiseObjCmd,		1, 1},
     {"selection",	Tk_SelectionCmd,	NULL,			0, 1},
     {"tk",		NULL,			Tk_TkObjCmd,		0, 1},
-    {"tkwait",		Tk_TkwaitCmd,		NULL,			1, 1},
+    {"tkwait",		NULL,			Tk_TkwaitObjCmd,	1, 1},
 #if defined(__WIN32__) || defined(MAC_TCL)
     {"tk_chooseColor",  NULL,			Tk_ChooseColorObjCmd,	0, 1},
     {"tk_chooseDirectory", NULL,		Tk_ChooseDirectoryObjCmd, 0, 1},
-- 
cgit v0.12