📄 tkcanvas.c
字号:
TagSearch search; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " option ?arg arg ...?\"", (char *) NULL); return TCL_ERROR; } Tcl_Preserve((ClientData) canvasPtr); result = TCL_OK; c = argv[1][0]; length = strlen(argv[1]); if ((c == 'a') && (strncmp(argv[1], "addtag", length) == 0)) { if (argc < 4) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " addtags tag searchCommand ?arg arg ...?\"", (char *) NULL); goto error; } result = FindItems(interp, canvasPtr, argc-3, argv+3, argv[2], argv[0], " addtag tag"); } else if ((c == 'b') && (strncmp(argv[1], "bbox", length) == 0) && (length >= 2)) { int i, gotAny; int x1 = 0, y1 = 0, x2 = 0, y2 = 0; /* Initializations needed * only to prevent compiler * warnings. */ if (argc < 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " bbox tagOrId ?tagOrId ...?\"", (char *) NULL); goto error; } gotAny = 0; for (i = 2; i < argc; i++) { for (itemPtr = StartTagSearch(canvasPtr, argv[i], &search); itemPtr != NULL; itemPtr = NextItem(&search)) { if ((itemPtr->x1 >= itemPtr->x2) || (itemPtr->y1 >= itemPtr->y2)) { continue; } 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 & (unsigned) ~(ButtonMotionMask|Button1MotionMask |Button2MotionMask|Button3MotionMask|Button4MotionMask |Button5MotionMask|ButtonPressMask|ButtonReleaseMask |EnterWindowMask|LeaveWindowMask|KeyPressMask |KeyReleaseMask|PointerMotionMask|VirtualEventMask)) { Tk_DeleteBinding(interp, canvasPtr->bindingTable, object, argv[3]); Tcl_ResetResult(interp); Tcl_AppendResult(interp, "requested illegal events; ", "only key, button, motion, enter, leave, and virtual ", "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 (Tk_CanvasGetCoord(interp, (Tk_Canvas) 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 (Tk_CanvasGetCoord(interp, (Tk_Canvas) 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], "cget", length) == 0) && (length >= 2)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " cget option\"", (char *) NULL); goto error; } result = Tk_ConfigureValue(interp, canvasPtr->tkwin, configSpecs, (char *) canvasPtr, argv[2], 0); } 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) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } if (itemPtr->typePtr->coordProc != NULL) { result = (*itemPtr->typePtr->coordProc)(interp, (Tk_Canvas) canvasPtr, itemPtr, argc-3, argv+3); } if (argc != 3) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } } else if ((c == 'c') && (strncmp(argv[1], "create", length) == 0) && (length >= 2)) { Tk_ItemType *typePtr; Tk_ItemType *matchPtr = NULL; 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)(interp, (Tk_Canvas) 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; Tk_CanvasEventuallyRedraw((Tk_Canvas) 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)(interp, (Tk_Canvas) canvasPtr, itemPtr, argv[3], &first) != TCL_OK) { goto error; } if (argc == 5) { if ((*itemPtr->typePtr->indexProc)(interp, (Tk_Canvas) 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. */ Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); (*itemPtr->typePtr->dCharsProc)((Tk_Canvas) canvasPtr, itemPtr, first, last); Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); } } 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)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, itemPtr->x1, itemPtr->y1, itemPtr->x2, itemPtr->y2); if (canvasPtr->bindingTable != NULL) { Tk_DeleteAllBindings(canvasPtr->bindingTable, (ClientData) itemPtr); } (*itemPtr->typePtr->deleteProc)((Tk_Canvas) canvasPtr, itemPtr, canvasPtr->display); 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->newCurrentPtr) { canvasPtr->newCurrentPtr = NULL; canvasPtr->flags |= REPICK_NEEDED; } if (itemPtr == canvasPtr->textInfo.focusItemPtr) { canvasPtr->textInfo.focusItemPtr = NULL; } if (itemPtr == canvasPtr->textInfo.selItemPtr) { canvasPtr->textInfo.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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -