summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2003-11-13 16:07:06 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2003-11-13 16:07:06 (GMT)
commitaf6a3ccf312d4f995fea96e87fc3ea0b78de9a7a (patch)
treec94adac89dfc0d33d44fd2538b3e0fd3cd50b528 /generic
parentff398c9de22aa928ab5b9129b92dd595159869b0 (diff)
downloadtk-af6a3ccf312d4f995fea96e87fc3ea0b78de9a7a.zip
tk-af6a3ccf312d4f995fea96e87fc3ea0b78de9a7a.tar.gz
tk-af6a3ccf312d4f995fea96e87fc3ea0b78de9a7a.tar.bz2
Tcl_EvalObjv is more robust than Tcl_VarEval
Diffstat (limited to 'generic')
-rw-r--r--generic/tkMenuDraw.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/generic/tkMenuDraw.c b/generic/tkMenuDraw.c
index ed0cf41..d2c022a 100644
--- a/generic/tkMenuDraw.c
+++ b/generic/tkMenuDraw.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMenuDraw.c,v 1.5 2003/11/12 00:07:25 hobbs Exp $
+ * RCS: @(#) $Id: tkMenuDraw.c,v 1.6 2003/11/13 16:07:06 dkf Exp $
*/
#include "tkMenu.h"
@@ -19,8 +19,7 @@
*/
static void AdjustMenuCoords _ANSI_ARGS_ ((TkMenu *menuPtr,
- TkMenuEntry *mePtr, int *xPtr, int *yPtr,
- char *string));
+ TkMenuEntry *mePtr, int *xPtr, int *yPtr));
static void ComputeMenuGeometry _ANSI_ARGS_((
ClientData clientData));
static void DisplayMenu _ANSI_ARGS_((ClientData clientData));
@@ -959,15 +958,13 @@ TkPostSubmenu(interp, menuPtr, mePtr)
* no submenu is posted. */
{
int result, x, y;
+ Tcl_Obj *subary[4];
if (mePtr == menuPtr->postedCascade) {
return TCL_OK;
}
if (menuPtr->postedCascade != NULL) {
- char *name = Tcl_GetStringFromObj(menuPtr->postedCascade->namePtr,
- NULL);
-
/*
* Note: when unposting a submenu, we have to redraw the entire
* parent menu. This is because of a combination of the following
@@ -985,8 +982,12 @@ TkPostSubmenu(interp, menuPtr, mePtr)
* the parent.
*/
+ subary[0] = menuPtr->postedCascade->namePtr;
+ subary[1] = Tcl_NewStringObj("unpost", -1);
+ Tcl_IncrRefCount(subary[1]);
TkEventuallyRedrawMenu(menuPtr, (TkMenuEntry *) NULL);
- result = Tcl_VarEval(interp, "{", name, "} unpost", (char *) NULL);
+ result = Tcl_EvalObjv(interp, 2, subary, 0);
+ Tcl_DecrRefCount(subary[1]);
menuPtr->postedCascade = NULL;
if (result != TCL_OK) {
return result;
@@ -1003,13 +1004,20 @@ TkPostSubmenu(interp, menuPtr, mePtr)
* The menu has to redrawn so that the entry can change relief.
*/
- char string[TCL_INTEGER_SPACE * 2];
- char *name;
-
- name = Tcl_GetStringFromObj(mePtr->namePtr, NULL);
Tk_GetRootCoords(menuPtr->tkwin, &x, &y);
- AdjustMenuCoords(menuPtr, mePtr, &x, &y, string);
- result = Tcl_VarEval(interp, "{", name, "} post ", string, (char *) NULL);
+ AdjustMenuCoords(menuPtr, mePtr, &x, &y);
+
+ subary[0] = mePtr->namePtr;
+ subary[1] = Tcl_NewStringObj("post", -1);
+ subary[2] = Tcl_NewIntObj(x);
+ subary[3] = Tcl_NewIntObj(x);
+ Tcl_IncrRefCount(subary[1]);
+ Tcl_IncrRefCount(subary[2]);
+ Tcl_IncrRefCount(subary[3]);
+ result = Tcl_EvalObjv(interp, 4, subary, 0);
+ Tcl_DecrRefCount(subary[1]);
+ Tcl_DecrRefCount(subary[2]);
+ Tcl_DecrRefCount(subary[3]);
if (result != TCL_OK) {
return result;
}
@@ -1037,12 +1045,11 @@ TkPostSubmenu(interp, menuPtr, mePtr)
*/
static void
-AdjustMenuCoords(menuPtr, mePtr, xPtr, yPtr, string)
+AdjustMenuCoords(menuPtr, mePtr, xPtr, yPtr)
TkMenu *menuPtr;
TkMenuEntry *mePtr;
int *xPtr;
int *yPtr;
- char *string;
{
if (menuPtr->menuType == MENUBAR) {
*xPtr += mePtr->x;
@@ -1058,5 +1065,4 @@ AdjustMenuCoords(menuPtr, mePtr, xPtr, yPtr, string)
- 2;
*yPtr += mePtr->y + activeBorderWidth + 2;
}
- sprintf(string, "%d %d", *xPtr, *yPtr);
}