summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorstanton <stanton>1998-11-25 21:16:28 (GMT)
committerstanton <stanton>1998-11-25 21:16:28 (GMT)
commit0fe03c2e56a2ab06690ea189ab1136b35f5f80b6 (patch)
tree4ad0c5e136a5786750291df60b74a1358a56c774 /generic
parentcfaf90b6bd984f4e72ed307384968bcad79500d5 (diff)
downloadtk-0fe03c2e56a2ab06690ea189ab1136b35f5f80b6.zip
tk-0fe03c2e56a2ab06690ea189ab1136b35f5f80b6.tar.gz
tk-0fe03c2e56a2ab06690ea189ab1136b35f5f80b6.tar.bz2
* integrated tk8.0.4 changes.
* generic/tkBind.c: fixed deletion order bug where a crash would result if a binding deleted "."
Diffstat (limited to 'generic')
-rw-r--r--generic/tk.h17
-rw-r--r--generic/tkBind.c70
-rw-r--r--generic/tkCanvText.c4
-rw-r--r--generic/tkCanvas.c155
-rw-r--r--generic/tkCanvas.h4
-rw-r--r--generic/tkEvent.c13
-rw-r--r--generic/tkFont.c52
7 files changed, 197 insertions, 118 deletions
diff --git a/generic/tk.h b/generic/tk.h
index bee1073..3fb719d 100644
--- a/generic/tk.h
+++ b/generic/tk.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: tk.h,v 1.1.4.2 1998/09/30 02:16:35 stanton Exp $
+ * RCS: @(#) $Id: tk.h,v 1.1.4.3 1998/11/25 21:16:29 stanton Exp $
*/
#ifndef _TK
@@ -25,6 +25,7 @@
* unix/configure.in
* win/makefile.bc (Not for patch release updates)
* win/makefile.vc (Not for patch release updates)
+ * win/README
* library/tk.tcl
* README, win/README, unix/README, and mac/README
*
@@ -546,11 +547,14 @@ typedef struct Tk_GeomMgr {
#define VirtualEvent (LASTEvent)
#define ActivateNotify (LASTEvent + 1)
#define DeactivateNotify (LASTEvent + 2)
-#define TK_LASTEVENT (LASTEvent + 3)
+#define MouseWheelEvent (LASTEvent + 3)
+#define TK_LASTEVENT (LASTEvent + 4)
+
+#define MouseWheelMask (1L << 28)
-#define VirtualEventMask (1L << 30)
#define ActivateMask (1L << 29)
-#define TK_LASTEVENT (LASTEvent + 3)
+#define VirtualEventMask (1L << 30)
+#define TK_LASTEVENT (LASTEvent + 4)
/*
@@ -797,10 +801,13 @@ typedef struct Tk_Item {
* pixel drawn in item. Item area
* includes x1 and y1 but not x2
* and y2. */
+ struct Tk_Item *prevPtr; /* Previous in display list of all
+ * items in this canvas. Later items
+ * in list are drawn just below earlier
+ * ones. */
int reserved1; /* This padding is for compatibility */
char *reserved2; /* with Jan Nijtmans dash patch */
int reserved3;
- char *reserved4;
/*
*------------------------------------------------------------------
diff --git a/generic/tkBind.c b/generic/tkBind.c
index 7237b04..e74cdb7 100644
--- a/generic/tkBind.c
+++ b/generic/tkBind.c
@@ -6,11 +6,12 @@
*
* Copyright (c) 1989-1994 The Regents of the University of California.
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
+ * Copyright (c) 1998 by Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkBind.c,v 1.1.4.2 1998/09/30 02:16:38 stanton Exp $
+ * RCS: @(#) $Id: tkBind.c,v 1.1.4.3 1998/11/25 21:16:30 stanton Exp $
*/
#include "tkPort.h"
@@ -339,6 +340,8 @@ typedef struct BindInfo {
PendingBinding *pendingList;/* The list of pending C bindings, kept in
* case a C or Tcl binding causes the target
* window to be deleted. */
+ int deleted; /* 1 the application has been deleted but
+ * the structure has been preserved. */
} BindInfo;
/*
@@ -495,6 +498,7 @@ static EventInfo eventArray[] = {
{"Colormap", ColormapNotify, ColormapChangeMask},
{"Activate", ActivateNotify, ActivateMask},
{"Deactivate", DeactivateNotify, ActivateMask},
+ {"MouseWheel", MouseWheelEvent, MouseWheelMask},
{(char *) NULL, 0, 0}
};
static Tcl_HashTable eventTable;
@@ -567,7 +571,8 @@ static int flagArray[TK_LASTEVENT] = {
/* MappingNotify */ 0,
/* VirtualEvent */ VIRTUAL,
/* Activate */ ACTIVATE,
- /* Deactivate */ ACTIVATE
+ /* Deactivate */ ACTIVATE,
+ /* MouseWheel */ KEY
};
/*
@@ -763,6 +768,7 @@ TkBindInit(mainPtr)
bindInfoPtr->screenInfo.curScreenIndex = -1;
bindInfoPtr->screenInfo.bindingDepth = 0;
bindInfoPtr->pendingList = NULL;
+ bindInfoPtr->deleted = 0;
mainPtr->bindInfo = (TkBindInfo) bindInfoPtr;
TkpInitializeMenuBindings(mainPtr->interp, mainPtr->bindingTable);
@@ -796,7 +802,8 @@ TkBindFree(mainPtr)
bindInfoPtr = (BindInfo *) mainPtr->bindInfo;
DeleteVirtualEventTable(&bindInfoPtr->virtualEventTable);
- ckfree((char *) bindInfoPtr);
+ bindInfoPtr->deleted = 1;
+ Tcl_EventuallyFree((ClientData) bindInfoPtr, Tcl_Free);
mainPtr->bindInfo = NULL;
}
@@ -1735,10 +1742,11 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
* winPtr->mainPtr == NULL.
*/
+ Tcl_Preserve((ClientData) bindInfoPtr);
while (p < end) {
int code;
- if (winPtr->mainPtr != NULL) {
+ if (!bindInfoPtr->deleted) {
screenPtr->bindingDepth++;
}
Tcl_AllowExceptions(interp);
@@ -1767,7 +1775,7 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
}
p++;
- if (winPtr->mainPtr != NULL) {
+ if (!bindInfoPtr->deleted) {
screenPtr->bindingDepth--;
}
if (code != TCL_OK) {
@@ -1799,8 +1807,7 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
}
}
- if ((winPtr->mainPtr != NULL)
- && (screenPtr->bindingDepth != 0)
+ if (!bindInfoPtr->deleted && (screenPtr->bindingDepth != 0)
&& ((oldDispPtr != screenPtr->curDispPtr)
|| (oldScreen != screenPtr->curScreenIndex))) {
@@ -1818,7 +1825,7 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
Tcl_DStringFree(&scripts);
if (matchCount > 0) {
- if (winPtr->mainPtr != NULL) {
+ if (!bindInfoPtr->deleted) {
/*
* Delete the pending list from the list of pending scripts
* for this window.
@@ -1838,6 +1845,7 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
ckfree((char *) pendingPtr);
}
}
+ Tcl_Release((ClientData) bindInfoPtr);
}
/*
@@ -2417,6 +2425,13 @@ ExpandPercents(winPtr, before, eventPtr, keySym, dsPtr)
case 'B':
number = eventPtr->xcreatewindow.border_width;
goto doNumber;
+ case 'D':
+ /*
+ * This is used only by the MouseWheel event.
+ */
+
+ number = eventPtr->xkey.keycode;
+ goto doNumber;
case 'E':
number = (int) eventPtr->xany.send_event;
goto doNumber;
@@ -3155,7 +3170,8 @@ HandleEventGenerate(interp, mainWin, objc, objv)
unsigned long eventMask;
static char *fieldStrings[] = {
"-when", "-above", "-borderwidth", "-button",
- "-count", "-detail", "-focus", "-height",
+ "-count", "-delta", "-detail", "-focus",
+ "-height",
"-keycode", "-keysym", "-mode", "-override",
"-place", "-root", "-rootx", "-rooty",
"-sendevent", "-serial", "-state", "-subwindow",
@@ -3164,7 +3180,8 @@ HandleEventGenerate(interp, mainWin, objc, objv)
};
enum field {
EVENT_WHEN, EVENT_ABOVE, EVENT_BORDER, EVENT_BUTTON,
- EVENT_COUNT, EVENT_DETAIL, EVENT_FOCUS, EVENT_HEIGHT,
+ EVENT_COUNT, EVENT_DELTA, EVENT_DETAIL, EVENT_FOCUS,
+ EVENT_HEIGHT,
EVENT_KEYCODE, EVENT_KEYSYM, EVENT_MODE, EVENT_OVERRIDE,
EVENT_PLACE, EVENT_ROOT, EVENT_ROOTX, EVENT_ROOTY,
EVENT_SEND, EVENT_SERIAL, EVENT_STATE, EVENT_SUBWINDOW,
@@ -3190,6 +3207,7 @@ HandleEventGenerate(interp, mainWin, objc, objv)
name = Tcl_GetStringFromObj(objv[1], NULL);
p = name;
+ eventMask = 0;
count = ParseEventDescription(interp, &p, &pat, &eventMask);
if (count == 0) {
return TCL_ERROR;
@@ -3215,7 +3233,7 @@ HandleEventGenerate(interp, mainWin, objc, objv)
flags = flagArray[event.xany.type];
if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
event.xkey.state = pat.needMods;
- if (flags & KEY) {
+ if ((flags & KEY) && (event.xany.type != MouseWheelEvent)) {
SetKeycodeAndState(tkwin, pat.detail.keySym, &event);
} else if (flags & BUTTON) {
event.xbutton.button = pat.detail.button;
@@ -3316,6 +3334,17 @@ HandleEventGenerate(interp, mainWin, objc, objv)
}
break;
}
+ case EVENT_DELTA: {
+ if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ if ((flags & KEY) && (event.xkey.type == MouseWheelEvent)) {
+ event.xkey.keycode = number;
+ } else {
+ goto badopt;
+ }
+ break;
+ }
case EVENT_DETAIL: {
number = TkFindStateNumObj(interp, optionPtr, notifyDetail,
valuePtr);
@@ -3359,7 +3388,7 @@ HandleEventGenerate(interp, mainWin, objc, objv)
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & KEY) {
+ if ((flags & KEY) && (event.xkey.type != MouseWheelEvent)) {
event.xkey.keycode = number;
} else {
goto badopt;
@@ -3384,7 +3413,7 @@ HandleEventGenerate(interp, mainWin, objc, objv)
"\"", (char *) NULL);
return TCL_ERROR;
}
- if ((flags & KEY) == 0) {
+ if (!(flags & KEY) || (event.xkey.type == MouseWheelEvent)) {
goto badopt;
}
break;
@@ -3662,14 +3691,13 @@ NameToWindow(interp, mainWin, objPtr, tkwinPtr)
return TCL_OK;
}
- /*
- * When mapping from a keysym to a keycode, need
- * information about the modifier state that should be used
- * so that when they call XKeycodeToKeysym taking into
- * account the xkey.state, they will get back the original
- * keysym.
- */
-
+/*
+ * When mapping from a keysym to a keycode, need
+ * information about the modifier state that should be used
+ * so that when they call XKeycodeToKeysym taking into
+ * account the xkey.state, they will get back the original
+ * keysym.
+ */
static void
SetKeycodeAndState(tkwin, keySym, eventPtr)
diff --git a/generic/tkCanvText.c b/generic/tkCanvText.c
index a0cbfd3..fbda648 100644
--- a/generic/tkCanvText.c
+++ b/generic/tkCanvText.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: tkCanvText.c,v 1.1.4.2 1998/09/30 02:16:46 stanton Exp $
+ * RCS: @(#) $Id: tkCanvText.c,v 1.1.4.3 1998/11/25 21:16:31 stanton Exp $
*/
#include <stdio.h>
@@ -86,7 +86,7 @@ static Tk_ConfigSpec configSpecs[] = {
"center", Tk_Offset(TextItem, anchor),
TK_CONFIG_DONT_SET_DEFAULT},
{TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
- "black", Tk_Offset(TextItem, color), 0},
+ "black", Tk_Offset(TextItem, color), TK_CONFIG_NULL_OK},
{TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
DEF_CANVTEXT_FONT, Tk_Offset(TextItem, tkfont), 0},
{TK_CONFIG_JUSTIFY, "-justify", (char *) NULL, (char *) NULL,
diff --git a/generic/tkCanvas.c b/generic/tkCanvas.c
index af3c101..20c0e71 100644
--- a/generic/tkCanvas.c
+++ b/generic/tkCanvas.c
@@ -7,11 +7,12 @@
*
* Copyright (c) 1991-1994 The Regents of the University of California.
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
+ * Copyright (c) 1998 by Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkCanvas.c,v 1.1.4.2 1998/09/30 02:16:48 stanton Exp $
+ * RCS: @(#) $Id: tkCanvas.c,v 1.1.4.3 1998/11/25 21:16:31 stanton Exp $
*/
#include "default.h"
@@ -25,18 +26,19 @@
/*
* The structure defined below is used to keep track of a tag search
- * in progress. Only the "prevPtr" field should be accessed by anyone
- * other than StartTagSearch and NextItem.
+ * in progress. No field should be accessed by anyone other than
+ * StartTagSearch and NextItem.
*/
typedef struct TagSearch {
TkCanvas *canvasPtr; /* Canvas widget being searched. */
Tk_Uid tag; /* Tag to search for. 0 means return
* all items. */
- Tk_Item *prevPtr; /* Item just before last one found (or NULL
- * if last one found was first in the item
- * list of canvasPtr). */
Tk_Item *currentPtr; /* Pointer to last item returned. */
+ Tk_Item *lastPtr; /* The item right before the currentPtr
+ * is tracked so if the currentPtr is
+ * deleted we don't have to start from the
+ * beginning. */
int searchOver; /* Non-zero means NextItem should always
* return NULL. */
} TagSearch;
@@ -353,6 +355,7 @@ Tk_CanvasCmd(clientData, interp, argc, argv)
canvasPtr->flags = 0;
canvasPtr->nextId = 1;
canvasPtr->psInfoPtr = NULL;
+ Tcl_InitHashTable(&canvasPtr->idTable, TCL_ONE_WORD_KEYS);
Tk_SetClass(canvasPtr->tkwin, "Canvas");
TkSetClassProcs(canvasPtr->tkwin, &canvasClass, (ClientData) canvasPtr);
@@ -497,18 +500,18 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
if (isdigit(UCHAR(argv[2][0]))) {
int id;
char *end;
+ Tcl_HashEntry *entryPtr;
id = strtoul(argv[2], &end, 0);
if (*end != 0) {
goto bindByTag;
}
- for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
- itemPtr = itemPtr->nextPtr) {
- if (itemPtr->id == id) {
- object = (ClientData) itemPtr;
- break;
- }
+ entryPtr = Tcl_FindHashEntry(&canvasPtr->idTable, (char *) id);
+ if (entryPtr != NULL) {
+ itemPtr = (Tk_Item *) Tcl_GetHashValue(entryPtr);
+ object = (ClientData) itemPtr;
}
+
if (object == 0) {
Tcl_AppendResult(interp, "item \"", argv[2],
"\" doesn't exist", (char *) NULL);
@@ -686,6 +689,8 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
Tk_ItemType *matchPtr = NULL;
Tk_Item *itemPtr;
char buf[TCL_INTEGER_SPACE];
+ int isNew = 0;
+ Tcl_HashEntry *entryPtr;
if (argc < 3) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
@@ -724,6 +729,10 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
goto error;
}
itemPtr->nextPtr = NULL;
+ entryPtr = Tcl_CreateHashEntry(&canvasPtr->idTable,
+ (char *) itemPtr->id, &isNew);
+ Tcl_SetHashValue(entryPtr, itemPtr);
+ itemPtr->prevPtr = canvasPtr->lastItemPtr;
canvasPtr->hotPtr = itemPtr;
canvasPtr->hotPrevPtr = canvasPtr->lastItemPtr;
if (canvasPtr->lastItemPtr == NULL) {
@@ -783,6 +792,7 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
} else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)
&& (length >= 2)) {
int i;
+ Tcl_HashEntry *entryPtr;
for (i = 2; i < argc; i++) {
for (itemPtr = StartTagSearch(canvasPtr, argv[i], &search);
@@ -798,16 +808,23 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
if (itemPtr->tagPtr != itemPtr->staticTagSpace) {
ckfree((char *) itemPtr->tagPtr);
}
- if (search.prevPtr == NULL) {
+ entryPtr = Tcl_FindHashEntry(&canvasPtr->idTable,
+ (char *) itemPtr->id);
+ Tcl_DeleteHashEntry(entryPtr);
+ if (itemPtr->nextPtr != NULL) {
+ itemPtr->nextPtr->prevPtr = itemPtr->prevPtr;
+ }
+ if (itemPtr->prevPtr != NULL) {
+ itemPtr->prevPtr->nextPtr = itemPtr->nextPtr;
+ }
+ if (canvasPtr->firstItemPtr == itemPtr) {
canvasPtr->firstItemPtr = itemPtr->nextPtr;
if (canvasPtr->firstItemPtr == NULL) {
canvasPtr->lastItemPtr = NULL;
}
- } else {
- search.prevPtr->nextPtr = itemPtr->nextPtr;
}
if (canvasPtr->lastItemPtr == itemPtr) {
- canvasPtr->lastItemPtr = search.prevPtr;
+ canvasPtr->lastItemPtr = itemPtr->prevPtr;
}
ckfree((char *) itemPtr);
if (itemPtr == canvasPtr->currentItemPtr) {
@@ -1055,7 +1072,7 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
}
}
} else if ((c == 'l') && (strncmp(argv[1], "lower", length) == 0)) {
- Tk_Item *prevPtr;
+ Tk_Item *itemPtr;
if ((argc != 3) && (argc != 4)) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
@@ -1070,18 +1087,17 @@ CanvasWidgetCmd(clientData, interp, argc, argv)
*/
if (argc == 3) {
- prevPtr = NULL;
+ itemPtr = NULL;
} else {
- prevPtr = StartTagSearch(canvasPtr, argv[3], &search);
- if (prevPtr != NULL) {
- prevPtr = search.prevPtr;
- } else {
+ itemPtr = StartTagSearch(canvasPtr, argv[3], &search);
+ if (itemPtr == NULL) {
Tcl_AppendResult(interp, "tag \"", argv[3],
"\" doesn't match any items", (char *) NULL);
goto error;
}
+ itemPtr = itemPtr->prevPtr;
}
- RelinkItems(canvasPtr, argv[2], prevPtr);
+ RelinkItems(canvasPtr, argv[2], itemPtr);
} else if ((c == 'm') && (strncmp(argv[1], "move", length) == 0)) {
double xAmount, yAmount;
@@ -1464,6 +1480,7 @@ DestroyCanvas(memPtr)
* stuff.
*/
+ Tcl_DeleteHashTable(&canvasPtr->idTable);
if (canvasPtr->pixmapGC != None) {
Tk_FreeGC(canvasPtr->display, canvasPtr->pixmapGC);
}
@@ -2192,7 +2209,7 @@ StartTagSearch(canvasPtr, tag, searchPtr)
* will be initialized here. */
{
int id;
- Tk_Item *itemPtr, *prevPtr;
+ Tk_Item *itemPtr, *lastPtr;
Tk_Uid *tagPtr;
Tk_Uid uid;
int count;
@@ -2213,27 +2230,28 @@ StartTagSearch(canvasPtr, tag, searchPtr)
if (isdigit(UCHAR(*tag))) {
char *end;
-
+ Tcl_HashEntry *entryPtr;
+
numIdSearches++;
id = strtoul(tag, &end, 0);
if (*end == 0) {
itemPtr = canvasPtr->hotPtr;
- prevPtr = canvasPtr->hotPrevPtr;
- if ((itemPtr == NULL) || (itemPtr->id != id) || (prevPtr == NULL)
- || (prevPtr->nextPtr != itemPtr)) {
+ lastPtr = canvasPtr->hotPrevPtr;
+ if ((itemPtr == NULL) || (itemPtr->id != id) || (lastPtr == NULL)
+ || (lastPtr->nextPtr != itemPtr)) {
numSlowSearches++;
- for (prevPtr = NULL, itemPtr = canvasPtr->firstItemPtr;
- itemPtr != NULL;
- prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
- if (itemPtr->id == id) {
- break;
- }
+ entryPtr = Tcl_FindHashEntry(&canvasPtr->idTable, (char *) id);
+ if (entryPtr != NULL) {
+ itemPtr = (Tk_Item *)Tcl_GetHashValue(entryPtr);
+ lastPtr = itemPtr->prevPtr;
+ } else {
+ lastPtr = itemPtr = NULL;
}
}
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->searchOver = 1;
canvasPtr->hotPtr = itemPtr;
- canvasPtr->hotPrevPtr = prevPtr;
+ canvasPtr->hotPrevPtr = lastPtr;
return itemPtr;
}
}
@@ -2246,7 +2264,7 @@ StartTagSearch(canvasPtr, tag, searchPtr)
*/
searchPtr->tag = NULL;
- searchPtr->prevPtr = NULL;
+ searchPtr->lastPtr = NULL;
searchPtr->currentPtr = canvasPtr->firstItemPtr;
return canvasPtr->firstItemPtr;
}
@@ -2255,18 +2273,18 @@ StartTagSearch(canvasPtr, tag, searchPtr)
* None of the above. Search for an item with a matching tag.
*/
- for (prevPtr = NULL, itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
- prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
+ for (lastPtr = NULL, itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+ lastPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
for (tagPtr = itemPtr->tagPtr, count = itemPtr->numTags;
count > 0; tagPtr++, count--) {
if (*tagPtr == uid) {
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->currentPtr = itemPtr;
return itemPtr;
}
}
}
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->searchOver = 1;
return NULL;
}
@@ -2297,7 +2315,7 @@ NextItem(searchPtr)
TagSearch *searchPtr; /* Record describing search in
* progress. */
{
- Tk_Item *itemPtr, *prevPtr;
+ Tk_Item *itemPtr, *lastPtr;
int count;
Tk_Uid uid;
Tk_Uid *tagPtr;
@@ -2307,11 +2325,11 @@ NextItem(searchPtr)
* one to return), and return if there are no items left.
*/
- prevPtr = searchPtr->prevPtr;
- if (prevPtr == NULL) {
+ lastPtr = searchPtr->lastPtr;
+ if (lastPtr == NULL) {
itemPtr = searchPtr->canvasPtr->firstItemPtr;
} else {
- itemPtr = prevPtr->nextPtr;
+ itemPtr = lastPtr->nextPtr;
}
if ((itemPtr == NULL) || (searchPtr->searchOver)) {
searchPtr->searchOver = 1;
@@ -2321,12 +2339,12 @@ NextItem(searchPtr)
/*
* The structure of the list has changed. Probably the
* previously-returned item was removed from the list.
- * In this case, don't advance prevPtr; just return
+ * In this case, don't advance lastPtr; just return
* its new successor (i.e. do nothing here).
*/
} else {
- prevPtr = itemPtr;
- itemPtr = prevPtr->nextPtr;
+ lastPtr = itemPtr;
+ itemPtr = lastPtr->nextPtr;
}
/*
@@ -2335,7 +2353,7 @@ NextItem(searchPtr)
uid = searchPtr->tag;
if (uid == NULL) {
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->currentPtr = itemPtr;
return itemPtr;
}
@@ -2344,17 +2362,17 @@ NextItem(searchPtr)
* Look for an item with a particular tag.
*/
- for ( ; itemPtr != NULL; prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
+ for ( ; itemPtr != NULL; lastPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
for (tagPtr = itemPtr->tagPtr, count = itemPtr->numTags;
count > 0; tagPtr++, count--) {
if (*tagPtr == uid) {
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->currentPtr = itemPtr;
return itemPtr;
}
}
}
- searchPtr->prevPtr = prevPtr;
+ searchPtr->lastPtr = lastPtr;
searchPtr->searchOver = 1;
return NULL;
}
@@ -2524,14 +2542,16 @@ FindItems(interp, canvasPtr, argc, argv, newTag, cmdName, option)
DoItem(interp, itemPtr, uid);
}
} else if ((c == 'b') && (strncmp(argv[0], "below", length) == 0)) {
+ Tk_Item *itemPtr;
+
if (argc != 2) {
Tcl_AppendResult(interp, "wrong # args: should be \"",
cmdName, option, " below tagOrId", (char *) NULL);
return TCL_ERROR;
}
- (void) StartTagSearch(canvasPtr, argv[1], &search);
- if (search.prevPtr != NULL) {
- DoItem(interp, search.prevPtr, uid);
+ itemPtr = StartTagSearch(canvasPtr, argv[1], &search);
+ if (itemPtr->prevPtr != NULL) {
+ DoItem(interp, itemPtr->prevPtr, uid);
}
} else if ((c == 'c') && (strncmp(argv[0], "closest", length) == 0)) {
double closestDist;
@@ -2804,19 +2824,27 @@ RelinkItems(canvasPtr, tag, prevPtr)
* moved! Switch to insert after its predecessor.
*/
- prevPtr = search.prevPtr;
+ prevPtr = prevPtr->prevPtr;
}
- if (search.prevPtr == NULL) {
+ if (itemPtr->prevPtr == NULL) {
+ if (itemPtr->nextPtr != NULL) {
+ itemPtr->nextPtr->prevPtr = NULL;
+ }
canvasPtr->firstItemPtr = itemPtr->nextPtr;
} else {
- search.prevPtr->nextPtr = itemPtr->nextPtr;
+ if (itemPtr->nextPtr != NULL) {
+ itemPtr->nextPtr->prevPtr = itemPtr->prevPtr;
+ }
+ itemPtr->prevPtr->nextPtr = itemPtr->nextPtr;
}
if (canvasPtr->lastItemPtr == itemPtr) {
- canvasPtr->lastItemPtr = search.prevPtr;
+ canvasPtr->lastItemPtr = itemPtr->prevPtr;
}
if (firstMovePtr == NULL) {
+ itemPtr->prevPtr = NULL;
firstMovePtr = itemPtr;
} else {
+ itemPtr->prevPtr = lastMovePtr;
lastMovePtr->nextPtr = itemPtr;
}
lastMovePtr = itemPtr;
@@ -2834,10 +2862,19 @@ RelinkItems(canvasPtr, tag, prevPtr)
return;
}
if (prevPtr == NULL) {
+ if (canvasPtr->firstItemPtr != NULL) {
+ canvasPtr->firstItemPtr->prevPtr = lastMovePtr;
+ }
lastMovePtr->nextPtr = canvasPtr->firstItemPtr;
canvasPtr->firstItemPtr = firstMovePtr;
} else {
+ if (prevPtr->nextPtr != NULL) {
+ prevPtr->nextPtr->prevPtr = lastMovePtr;
+ }
lastMovePtr->nextPtr = prevPtr->nextPtr;
+ if (firstMovePtr != NULL) {
+ firstMovePtr->prevPtr = prevPtr;
+ }
prevPtr->nextPtr = firstMovePtr;
}
if (canvasPtr->lastItemPtr == prevPtr) {
diff --git a/generic/tkCanvas.h b/generic/tkCanvas.h
index 7c40113..d349e2b 100644
--- a/generic/tkCanvas.h
+++ b/generic/tkCanvas.h
@@ -6,11 +6,12 @@
*
* Copyright (c) 1991-1994 The Regents of the University of California.
* Copyright (c) 1994-1995 Sun Microsystems, Inc.
+ * Copyright (c) 1998 by Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkCanvas.h,v 1.1.4.1 1998/09/30 02:16:49 stanton Exp $
+ * RCS: @(#) $Id: tkCanvas.h,v 1.1.4.2 1998/11/25 21:16:31 stanton Exp $
*/
#ifndef _TKCANVAS
@@ -208,6 +209,7 @@ typedef struct TkCanvas {
* Postscript for the canvas. NULL means
* no Postscript is currently being
* generated. */
+ Tcl_HashTable idTable; /* Table of integer indices. */
} TkCanvas;
/*
diff --git a/generic/tkEvent.c b/generic/tkEvent.c
index 5d5f7ec..01aa75e 100644
--- a/generic/tkEvent.c
+++ b/generic/tkEvent.c
@@ -6,11 +6,12 @@
*
* Copyright (c) 1990-1994 The Regents of the University of California.
* Copyright (c) 1994-1995 Sun Microsystems, Inc.
+ * Copyright (c) 1998 by Scriptics Corporation.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkEvent.c,v 1.1.4.1 1998/09/30 02:16:55 stanton Exp $
+ * RCS: @(#) $Id: tkEvent.c,v 1.1.4.2 1998/11/25 21:16:31 stanton Exp $
*/
#include "tkPort.h"
@@ -129,7 +130,8 @@ static unsigned long eventMasks[TK_LASTEVENT] = {
0, /* Mapping Notify */
VirtualEventMask, /* VirtualEvents */
ActivateMask, /* ActivateNotify */
- ActivateMask /* DeactivateNotify */
+ ActivateMask, /* DeactivateNotify */
+ MouseWheelMask /* MouseWheelEvent */
};
/*
@@ -546,10 +548,13 @@ Tk_HandleEvent(eventPtr)
/*
* Redirect KeyPress and KeyRelease events to the focus window,
- * or ignore them entirely if there is no focus window.
+ * or ignore them entirely if there is no focus window. We also
+ * route the MouseWheel event to the focus window. The MouseWheel
+ * event is an extension to the X event set. Currently, it is only
+ * available on the Windows version of Tk.
*/
- if (mask & (KeyPressMask|KeyReleaseMask)) {
+ if (mask & (KeyPressMask|KeyReleaseMask|MouseWheelMask)) {
winPtr->dispPtr->lastEventTime = eventPtr->xkey.time;
winPtr = TkFocusKeyEvent(winPtr, eventPtr);
if (winPtr == NULL) {
diff --git a/generic/tkFont.c b/generic/tkFont.c
index 3a8d655..6340c76 100644
--- a/generic/tkFont.c
+++ b/generic/tkFont.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: tkFont.c,v 1.1.4.3 1998/10/21 22:12:43 stanton Exp $
+ * RCS: @(#) $Id: tkFont.c,v 1.1.4.4 1998/11/25 21:16:31 stanton Exp $
*/
#include "tkPort.h"
@@ -1993,31 +1993,6 @@ Tk_ComputeTextLayout(tkfont, string, numChars, wrapLength, justify, flags,
}
}
- /*
- * Using maximum line length, shift all the chunks so that the lines are
- * all justified correctly.
- */
-
- curLine = 0;
- chunkPtr = layoutPtr->chunks;
- y = chunkPtr->y;
- lineLengths = (int *) Tcl_DStringValue(&lineBuffer);
- for (n = 0; n < layoutPtr->numChunks; n++) {
- int extra;
-
- if (chunkPtr->y != y) {
- curLine++;
- y = chunkPtr->y;
- }
- extra = maxWidth - lineLengths[curLine];
- if (justify == TK_JUSTIFY_CENTER) {
- chunkPtr->x += extra / 2;
- } else if (justify == TK_JUSTIFY_RIGHT) {
- chunkPtr->x += extra;
- }
- chunkPtr++;
- }
-
layoutPtr->width = maxWidth;
layoutHeight = baseline - fmPtr->ascent;
if (layoutPtr->numChunks == 0) {
@@ -2037,6 +2012,31 @@ Tk_ComputeTextLayout(tkfont, string, numChars, wrapLength, justify, flags,
layoutPtr->chunks[0].y = fmPtr->ascent;
layoutPtr->chunks[0].totalWidth = 0;
layoutPtr->chunks[0].displayWidth = 0;
+ } else {
+ /*
+ * Using maximum line length, shift all the chunks so that the lines
+ * are all justified correctly.
+ */
+
+ curLine = 0;
+ chunkPtr = layoutPtr->chunks;
+ y = chunkPtr->y;
+ lineLengths = (int *) Tcl_DStringValue(&lineBuffer);
+ for (n = 0; n < layoutPtr->numChunks; n++) {
+ int extra;
+
+ if (chunkPtr->y != y) {
+ curLine++;
+ y = chunkPtr->y;
+ }
+ extra = maxWidth - lineLengths[curLine];
+ if (justify == TK_JUSTIFY_CENTER) {
+ chunkPtr->x += extra / 2;
+ } else if (justify == TK_JUSTIFY_RIGHT) {
+ chunkPtr->x += extra;
+ }
+ chunkPtr++;
+ }
}
if (widthPtr != NULL) {