📄 tkcmds.c
字号:
* Side effects: * See the user documentation. * *---------------------------------------------------------------------- */intTk_TkObjCmd(clientData, interp, objc, objv) ClientData clientData; /* Main window associated with interpreter. */ Tcl_Interp *interp; /* Current interpreter. */ int objc; /* Number of arguments. */ Tcl_Obj *CONST objv[]; /* Argument objects. */{ int index; Tk_Window tkwin; static char *optionStrings[] = { "appname", "scaling", NULL }; enum options { TK_APPNAME, TK_SCALING }; tkwin = (Tk_Window) clientData; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?"); return TCL_ERROR; } if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0, &index) != TCL_OK) { return TCL_ERROR; } switch ((enum options) index) { case TK_APPNAME: { TkWindow *winPtr; char *string; winPtr = (TkWindow *) tkwin; if (objc > 3) { Tcl_WrongNumArgs(interp, 2, objv, "?newName?"); return TCL_ERROR; } if (objc == 3) { string = Tcl_GetStringFromObj(objv[2], NULL); winPtr->nameUid = Tk_GetUid(Tk_SetAppName(tkwin, string)); } Tcl_SetStringObj(Tcl_GetObjResult(interp), winPtr->nameUid, -1); break; } case TK_SCALING: { Screen *screenPtr; int skip, width, height; double d; screenPtr = Tk_Screen(tkwin); skip = TkGetDisplayOf(interp, objc - 2, objv + 2, &tkwin); if (skip < 0) { return TCL_ERROR; } if (objc - skip == 2) { d = 25.4 / 72; d *= WidthOfScreen(screenPtr); d /= WidthMMOfScreen(screenPtr); Tcl_SetDoubleObj(Tcl_GetObjResult(interp), d); } else if (objc - skip == 3) { if (Tcl_GetDoubleFromObj(interp, objv[2 + skip], &d) != TCL_OK) { return TCL_ERROR; } d = (25.4 / 72) / d; width = (int) (d * WidthOfScreen(screenPtr) + 0.5); if (width <= 0) { width = 1; } height = (int) (d * HeightOfScreen(screenPtr) + 0.5); if (height <= 0) { height = 1; } WidthMMOfScreen(screenPtr) = width; HeightMMOfScreen(screenPtr) = height; } else { Tcl_WrongNumArgs(interp, 2, objv, "?-displayof window? ?factor?"); return TCL_ERROR; } break; } } return TCL_OK;}/* *---------------------------------------------------------------------- * * Tk_TkwaitCmd -- * * This procedure is invoked to process the "tkwait" Tcl command. * See the user documentation for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *---------------------------------------------------------------------- */ /* ARGSUSED */intTk_TkwaitCmd(clientData, interp, argc, argv) ClientData clientData; /* Main window associated with * interpreter. */ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ char **argv; /* Argument strings. */{ Tk_Window tkwin = (Tk_Window) clientData; int c, done; size_t length; if (argc != 3) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " variable|visibility|window name\"", (char *) NULL); 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; } 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 \"", 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); } /* * 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; } /* * Clear out the interpreter's result, since it may have been set * by event handlers. */ Tcl_ResetResult(interp); return TCL_OK;} /* ARGSUSED */static char *WaitVariableProc(clientData, interp, name1, name2, flags) ClientData clientData; /* Pointer to integer to set to 1. */ Tcl_Interp *interp; /* Interpreter containing variable. */ char *name1; /* Name of variable. */ char *name2; /* Second part of variable name. */ int flags; /* Information about what happened. */{ int *donePtr = (int *) clientData; *donePtr = 1; return (char *) NULL;} /*ARGSUSED*/static voidWaitVisibilityProc(clientData, eventPtr) ClientData clientData; /* Pointer to integer to set to 1. */ XEvent *eventPtr; /* Information about event (not used). */{ int *donePtr = (int *) clientData; if (eventPtr->type == VisibilityNotify) { *donePtr = 1; } if (eventPtr->type == DestroyNotify) { *donePtr = 2; }}static voidWaitWindowProc(clientData, eventPtr) ClientData clientData; /* Pointer to integer to set to 1. */ XEvent *eventPtr; /* Information about event. */{ int *donePtr = (int *) clientData; if (eventPtr->type == DestroyNotify) { *donePtr = 1; }}/* *---------------------------------------------------------------------- * * Tk_UpdateCmd -- * * This procedure is invoked to process the "update" Tcl command. * See the user documentation for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *---------------------------------------------------------------------- */ /* ARGSUSED */intTk_UpdateCmd(clientData, interp, argc, argv) ClientData clientData; /* Main window associated with * interpreter. */ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ char **argv; /* Argument strings. */{ int flags; TkDisplay *dispPtr; if (argc == 1) { flags = TCL_DONT_WAIT; } else if (argc == 2) { if (strncmp(argv[1], "idletasks", strlen(argv[1])) != 0) { Tcl_AppendResult(interp, "bad option \"", argv[1], "\": must be idletasks", (char *) NULL); return TCL_ERROR; } flags = TCL_IDLE_EVENTS; } else { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ?idletasks?\"", (char *) NULL); return TCL_ERROR; } /* * Handle all pending events, sync all displays, and repeat over * and over again until all pending events have been handled. * Special note: it's possible that the entire application could * be destroyed by an event handler that occurs during the update. * Thus, don't use any information from tkwin after calling * Tcl_DoOneEvent. */ while (1) { while (Tcl_DoOneEvent(flags) != 0) { /* Empty loop body */ } for (dispPtr = tkDisplayList; dispPtr != NULL; dispPtr = dispPtr->nextPtr) { XSync(dispPtr->display, False); } if (Tcl_DoOneEvent(flags) == 0) { break; } } /* * Must clear the interpreter's result because event handlers could * have executed commands. */ Tcl_ResetResult(interp); return TCL_OK;}/* *---------------------------------------------------------------------- * * Tk_WinfoObjCmd -- * * This procedure is invoked to process the "winfo" Tcl command. * See the user documentation for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. * *---------------------------------------------------------------------- */intTk_WinfoObjCmd(clientData, interp, objc, objv) ClientData clientData; /* Main window associated with * interpreter. */ Tcl_Interp *interp; /* Current interpreter. */ int objc; /* Number of arguments. */ Tcl_Obj *CONST objv[]; /* Argument objects. */{ int index, x, y, width, height, useX, useY, class, skip; char buf[128]; char *string; TkWindow *winPtr; Tk_Window tkwin; static TkStateMap visualMap[] = { {PseudoColor, "pseudocolor"}, {GrayScale, "grayscale"}, {DirectColor, "directcolor"}, {TrueColor, "truecolor"}, {StaticColor, "staticcolor"}, {StaticGray, "staticgray"}, {-1, NULL} }; static char *optionStrings[] = { "cells", "children", "class", "colormapfull", "depth", "geometry", "height", "id", "ismapped", "manager", "name", "parent", "pointerx", "pointery", "pointerxy", "reqheight", "reqwidth", "rootx", "rooty", "screen", "screencells", "screendepth", "screenheight", "screenwidth", "screenmmheight","screenmmwidth","screenvisual","server", "toplevel", "viewable", "visual", "visualid", "vrootheight", "vrootwidth", "vrootx", "vrooty", "width", "x", "y", "atom", "atomname", "containing", "interps", "pathname", "exists", "fpixels", "pixels", "rgb", "visualsavailable", NULL }; enum options { WIN_CELLS, WIN_CHILDREN, WIN_CLASS, WIN_COLORMAPFULL, WIN_DEPTH, WIN_GEOMETRY, WIN_HEIGHT, WIN_ID, WIN_ISMAPPED, WIN_MANAGER, WIN_NAME, WIN_PARENT, WIN_POINTERX, WIN_POINTERY, WIN_POINTERXY, WIN_REQHEIGHT, WIN_REQWIDTH, WIN_ROOTX, WIN_ROOTY, WIN_SCREEN, WIN_SCREENCELLS,WIN_SCREENDEPTH,WIN_SCREENHEIGHT,WIN_SCREENWIDTH, WIN_SCREENMMHEIGHT,WIN_SCREENMMWIDTH,WIN_SCREENVISUAL,WIN_SERVER, WIN_TOPLEVEL, WIN_VIEWABLE, WIN_VISUAL, WIN_VISUALID, WIN_VROOTHEIGHT,WIN_VROOTWIDTH, WIN_VROOTX, WIN_VROOTY, WIN_WIDTH, WIN_X, WIN_Y, WIN_ATOM, WIN_ATOMNAME, WIN_CONTAINING, WIN_INTERPS, WIN_PATHNAME, WIN_EXISTS, WIN_FPIXELS, WIN_PIXELS, WIN_RGB, WIN_VISUALSAVAILABLE }; tkwin = (Tk_Window) clientData; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?"); return TCL_ERROR; } if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0, &index) != TCL_OK) { return TCL_ERROR; } if (index < WIN_ATOM) { if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "window"); return TCL_ERROR; } string = Tcl_GetStringFromObj(objv[2], NULL); tkwin = Tk_NameToWindow(interp, string, tkwin); if (tkwin == NULL) { return TCL_ERROR; } } winPtr = (TkWindow *) tkwin; switch ((enum options) index) { case WIN_CELLS: { Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), Tk_Visual(tkwin)->map_entries); break; } case WIN_CHILDREN: { Tcl_Obj *strPtr; Tcl_ResetResult(interp); winPtr = winPtr->childList; for ( ; winPtr != NULL; winPtr = winPtr->nextPtr) { strPtr = Tcl_NewStringObj(winPtr->pathName, -1); Tcl_ListObjAppendElement(NULL, Tcl_GetObjResult(interp), strPtr); } break; } case WIN_CLASS: { Tcl_ResetResult(interp); Tcl_SetStringObj(Tcl_GetObjResult(interp), Tk_Class(tkwin), -1); break; } case WIN_COLORMAPFULL: { Tcl_ResetResult(interp); Tcl_SetBooleanObj(Tcl_GetObjResult(interp), TkpCmapStressed(tkwin, Tk_Colormap(tkwin))); break; } case WIN_DEPTH: { Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), Tk_Depth(tkwin)); break; } case WIN_GEOMETRY: { Tcl_ResetResult(interp); sprintf(buf, "%dx%d+%d+%d", Tk_Width(tkwin), Tk_Height(tkwin), Tk_X(tkwin), Tk_Y(tkwin)); Tcl_SetStringObj(Tcl_GetObjResult(interp), buf, -1); break; } case WIN_HEIGHT: { Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), Tk_Height(tkwin)); break; } case WIN_ID: { Tk_MakeWindowExist(tkwin); TkpPrintWindowId(buf, Tk_WindowId(tkwin)); Tcl_ResetResult(interp); Tcl_SetStringObj(Tcl_GetObjResult(interp), buf, -1); break; } case WIN_ISMAPPED: { Tcl_ResetResult(interp); Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (int) Tk_IsMapped(tkwin)); break; } case WIN_MANAGER: { Tcl_ResetResult(interp); if (winPtr->geomMgrPtr != NULL) { Tcl_SetStringObj(Tcl_GetObjResult(interp), winPtr->geomMgrPtr->name, -1); } break; } case WIN_NAME: { Tcl_ResetResult(interp); Tcl_SetStringObj(Tcl_GetObjResult(interp), Tk_Name(tkwin), -1); break; } case WIN_PARENT: { Tcl_ResetResult(interp); if (winPtr->parentPtr != NULL) { Tcl_SetStringObj(Tcl_GetObjResult(interp), winPtr->parentPtr->pathName, -1); } break; } case WIN_POINTERX: { useX = 1; useY = 0; goto pointerxy; } case WIN_POINTERY: { useX = 0; useY = 1; goto pointerxy; } case WIN_POINTERXY: { useX = 1; useY = 1; pointerxy: winPtr = GetToplevel(tkwin); if (winPtr == NULL) { x = -1; y = -1; } else { TkGetPointerCoords((Tk_Window) winPtr, &x, &y); } Tcl_ResetResult(interp); if (useX & useY) { sprintf(buf, "%d %d", x, y); Tcl_SetStringObj(Tcl_GetObjResult(interp), buf, -1); } else if (useX) { Tcl_SetIntObj(Tcl_GetObjResult(interp), x); } else { Tcl_SetIntObj(Tcl_GetObjResult(interp), y); } break; } case WIN_REQHEIGHT: { Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), Tk_ReqHeight(tkwin)); break; } case WIN_REQWIDTH: { Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), Tk_ReqWidth(tkwin)); break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -