📄 tkcanvas.c
字号:
for (itemPtr = StartTagSearch(canvasPtr, argv[i], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if (!gotAny) { x1 = itemPtr->x1; y1 = itemPtr->y1; x2 = itemPtr->x2; y2 = itemPtr->y2; gotAny = 1; } else { if (itemPtr->x1 < x1) { x1 = itemPtr->x1; } if (itemPtr->y1 < y1) { y1 = itemPtr->y1; } if (itemPtr->x2 > x2) { x2 = itemPtr->x2; } if (itemPtr->y2 > y2) { y2 = itemPtr->y2; } } } } if (gotAny) { sprintf(interp->result, "%d %d %d %d", x1, y1, x2, y2); } } else if ((c == 'b') && (strncmp(argv[1], "bind", length) == 0) && (length >= 2)) { ClientData object; if ((argc < 3) || (argc > 5)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " bind tagOrId ?sequence? ?command?\"", (char *) NULL); goto error; } /* * Figure out what object to use for the binding (individual * item vs. tag). */ object = 0; if (isdigit(UCHAR(argv[2][0]))) { int id; char *end; 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; } } if (object == 0) { Tcl_AppendResult(interp, "item \"", argv[2], "\" doesn't exist", (char *) NULL); goto error; } } else { bindByTag: object = (ClientData) Tk_GetUid(argv[2]); } /* * Make a binding table if the canvas doesn't already have * one. */ if (canvasPtr->bindingTable == NULL) { canvasPtr->bindingTable = Tk_CreateBindingTable(interp); } if (argc == 5) { int append = 0; unsigned long mask; if (argv[4][0] == 0) { result = Tk_DeleteBinding(interp, canvasPtr->bindingTable, object, argv[3]); goto done; } if (argv[4][0] == '+') { argv[4]++; append = 1; } mask = Tk_CreateBinding(interp, canvasPtr->bindingTable, object, argv[3], argv[4], append); if (mask == 0) { goto error; } if (mask & ~(ButtonMotionMask|Button1MotionMask|Button2MotionMask |Button3MotionMask|Button4MotionMask|Button5MotionMask |ButtonPressMask|ButtonReleaseMask|EnterWindowMask |LeaveWindowMask|KeyPressMask|KeyReleaseMask |PointerMotionMask)) { Tk_DeleteBinding(interp, canvasPtr->bindingTable, object, argv[3]); Tcl_ResetResult(interp); Tcl_AppendResult(interp, "requested illegal events; ", "only key, button, motion, and enter/leave ", "events may be used", (char *) NULL); goto error; } } else if (argc == 4) { char *command; command = Tk_GetBinding(interp, canvasPtr->bindingTable, object, argv[3]); if (command == NULL) { goto error; } interp->result = command; } else { Tk_GetAllBindings(interp, canvasPtr->bindingTable, object); } } else if ((c == 'c') && (strcmp(argv[1], "canvasx") == 0)) { int x; double grid; if ((argc < 3) || (argc > 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " canvasx screenx ?gridspacing?\"", (char *) NULL); goto error; } if (Tk_GetPixels(interp, canvasPtr->tkwin, argv[2], &x) != TCL_OK) { goto error; } if (argc == 4) { if (TkGetCanvasCoord(canvasPtr, argv[3], &grid) != TCL_OK) { goto error; } } else { grid = 0.0; } x += canvasPtr->xOrigin; Tcl_PrintDouble(interp, GridAlign((double) x, grid), interp->result); } else if ((c == 'c') && (strcmp(argv[1], "canvasy") == 0)) { int y; double grid; if ((argc < 3) || (argc > 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " canvasy screeny ?gridspacing?\"", (char *) NULL); goto error; } if (Tk_GetPixels(interp, canvasPtr->tkwin, argv[2], &y) != TCL_OK) { goto error; } if (argc == 4) { if (TkGetCanvasCoord(canvasPtr, argv[3], &grid) != TCL_OK) { goto error; } } else { grid = 0.0; } y += canvasPtr->yOrigin; Tcl_PrintDouble(interp, GridAlign((double) y, grid), interp->result); } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0) && (length >= 3)) { if (argc == 2) { result = Tk_ConfigureInfo(interp, canvasPtr->tkwin, configSpecs, (char *) canvasPtr, (char *) NULL, 0); } else if (argc == 3) { result = Tk_ConfigureInfo(interp, canvasPtr->tkwin, configSpecs, (char *) canvasPtr, argv[2], 0); } else { result = ConfigureCanvas(interp, canvasPtr, argc-2, argv+2, TK_CONFIG_ARGV_ONLY); } } else if ((c == 'c') && (strncmp(argv[1], "coords", length) == 0) && (length >= 3)) { if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " coords tagOrId ?x y x y ...?\"", (char *) NULL); goto error; } itemPtr = StartTagSearch(canvasPtr, argv[2], &search); if (itemPtr != NULL) { if (argc != 3) { EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } if (itemPtr->typePtr->coordProc != NULL) { result = (*itemPtr->typePtr->coordProc)(canvasPtr, itemPtr, argc-3, argv+3); } if (argc != 3) { EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } } else if ((c == 'c') && (strncmp(argv[1], "create", length) == 0) && (length >= 2)) { register Tk_ItemType *typePtr; Tk_ItemType *matchPtr = NULL; register Tk_Item *itemPtr; if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " create type ?arg arg ...?\"", (char *) NULL); goto error; } c = argv[2][0]; length = strlen(argv[2]); for (typePtr = typeList; typePtr != NULL; typePtr = typePtr->nextPtr) { if ((c == typePtr->name[0]) && (strncmp(argv[2], typePtr->name, length) == 0)) { if (matchPtr != NULL) { badType: Tcl_AppendResult(interp, "unknown or ambiguous item type \"", argv[2], "\"", (char *) NULL); goto error; } matchPtr = typePtr; } } if (matchPtr == NULL) { goto badType; } typePtr = matchPtr; itemPtr = (Tk_Item *) ckalloc((unsigned) typePtr->itemSize); itemPtr->id = canvasPtr->nextId; canvasPtr->nextId++; itemPtr->tagPtr = itemPtr->staticTagSpace; itemPtr->tagSpace = TK_TAG_SPACE; itemPtr->numTags = 0; itemPtr->typePtr = typePtr; if ((*typePtr->createProc)(canvasPtr, itemPtr, argc-3, argv+3) != TCL_OK) { ckfree((char *) itemPtr); goto error; } itemPtr->nextPtr = NULL; canvasPtr->hotPtr = itemPtr; canvasPtr->hotPrevPtr = canvasPtr->lastItemPtr; if (canvasPtr->lastItemPtr == NULL) { canvasPtr->firstItemPtr = itemPtr; } else { canvasPtr->lastItemPtr->nextPtr = itemPtr; } canvasPtr->lastItemPtr = itemPtr; EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); canvasPtr->flags |= REPICK_NEEDED; sprintf(interp->result, "%d", itemPtr->id); } else if ((c == 'd') && (strncmp(argv[1], "dchars", length) == 0) && (length >= 2)) { int first, last; if ((argc != 4) && (argc != 5)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " dchars tagOrId first ?last?\"", (char *) NULL); goto error; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if ((itemPtr->typePtr->indexProc == NULL) || (itemPtr->typePtr->dCharsProc == NULL)) { continue; } if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr, argv[3], &first) != TCL_OK) { goto error; } if (argc == 5) { if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr, argv[4], &last) != TCL_OK) { goto error; } } else { last = first; } /* * Redraw both item's old and new areas: it's possible * that a delete could result in a new area larger than * the old area. */ EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); result = (*itemPtr->typePtr->dCharsProc)(canvasPtr, itemPtr, first, last); EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); if (result != TCL_OK) { goto error; } } } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0) && (length >= 2)) { int i; for (i = 2; i < argc; i++) { for (itemPtr = StartTagSearch(canvasPtr, argv[i], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); if (canvasPtr->bindingTable != NULL) { Tk_DeleteAllBindings(canvasPtr->bindingTable, (ClientData) itemPtr); } (*itemPtr->typePtr->deleteProc)(canvasPtr, itemPtr); if (itemPtr->tagPtr != itemPtr->staticTagSpace) { ckfree((char *) itemPtr->tagPtr); } if (search.prevPtr == NULL) { 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; } ckfree((char *) itemPtr); if (itemPtr == canvasPtr->currentItemPtr) { canvasPtr->currentItemPtr = NULL; canvasPtr->flags |= REPICK_NEEDED; } if (itemPtr == canvasPtr->focusItemPtr) { canvasPtr->focusItemPtr = NULL; } if (itemPtr == canvasPtr->selItemPtr) { canvasPtr->selItemPtr = NULL; } if ((itemPtr == canvasPtr->hotPtr) || (itemPtr = canvasPtr->hotPrevPtr)) { canvasPtr->hotPtr = NULL; } } } } else if ((c == 'd') && (strncmp(argv[1], "dtag", length) == 0) && (length >= 2)) { Tk_Uid tag; int i; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " dtag tagOrId ?tagToDelete?\"", (char *) NULL); goto error; } if (argc == 4) { tag = Tk_GetUid(argv[3]); } else { tag = Tk_GetUid(argv[2]); } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { for (i = itemPtr->numTags-1; i >= 0; i--) { if (itemPtr->tagPtr[i] == tag) { itemPtr->tagPtr[i] = itemPtr->tagPtr[itemPtr->numTags-1]; itemPtr->numTags--; } } } } else if ((c == 'f') && (strncmp(argv[1], "find", length) == 0) && (length >= 2)) { if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " find searchCommand ?arg arg ...?\"", (char *) NULL); goto error; } result = FindItems(interp, canvasPtr, argc-2, argv+2, (char *) NULL, argv[0]," find"); } else if ((c == 'f') && (strncmp(argv[1], "focus", length) == 0) && (length >= 2)) { if (argc > 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " focus ?tagOrId?\"", (char *) NULL); goto error; } itemPtr = canvasPtr->focusItemPtr; if (argc == 2) { if (itemPtr != NULL) { sprintf(interp->result, "%d", itemPtr->id); } goto done; } if ((itemPtr != NULL) && (canvasPtr->flags & GOT_FOCUS)) { EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } if (argv[2][0] == 0) { canvasPtr->focusItemPtr = NULL; goto done; } for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if (itemPtr->typePtr->icursorProc != NULL) { break; } } if (itemPtr == NULL) { goto done; } canvasPtr->focusItemPtr = itemPtr; if (canvasPtr->flags & GOT_FOCUS) { EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } else if ((c == 'g') && (strncmp(argv[1], "gettags", length) == 0)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " gettags tagOrId\"", (char *) NULL); goto error; } itemPtr = StartTagSearch(canvasPtr, argv[2], &search); if (itemPtr != NULL) { int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -