📄 tkwinwm.c
字号:
wmPtr->cmdArgc = cmdArgc; wmPtr->cmdArgv = cmdArgv; if (!(wmPtr->flags & WM_NEVER_MAPPED)) { XSetCommand(winPtr->display, winPtr->window, cmdArgv, cmdArgc); } } else if ((c == 'd') && (strncmp(argv[1], "deiconify", length) == 0)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " deiconify window\"", (char *) NULL); return TCL_ERROR; } if (wmPtr->iconFor != NULL) { Tcl_AppendResult(interp, "can't deiconify ", argv[2], ": it is an icon for ", winPtr->pathName, (char *) NULL); return TCL_ERROR; } if (winPtr->flags & TK_EMBEDDED) { Tcl_AppendResult(interp, "can't deiconify ", winPtr->pathName, ": it is an embedded window", (char *) NULL); return TCL_ERROR; } TkpWmSetState(winPtr, NormalState); } else if ((c == 'f') && (strncmp(argv[1], "focusmodel", length) == 0) && (length >= 2)) { if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " focusmodel window ?active|passive?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { interp->result = wmPtr->hints.input ? "passive" : "active"; return TCL_OK; } c = argv[3][0]; length = strlen(argv[3]); if ((c == 'a') && (strncmp(argv[3], "active", length) == 0)) { wmPtr->hints.input = False; } else if ((c == 'p') && (strncmp(argv[3], "passive", length) == 0)) { wmPtr->hints.input = True; } else { Tcl_AppendResult(interp, "bad argument \"", argv[3], "\": must be active or passive", (char *) NULL); return TCL_ERROR; } } else if ((c == 'f') && (strncmp(argv[1], "frame", length) == 0) && (length >= 2)) { HWND hwnd; if (argc != 3) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " frame window\"", (char *) NULL); return TCL_ERROR; } if (Tk_WindowId((Tk_Window) winPtr) == None) { Tk_MakeWindowExist((Tk_Window) winPtr); } hwnd = wmPtr->wrapper; if (hwnd == NULL) { hwnd = Tk_GetHWND(Tk_WindowId((Tk_Window) winPtr)); } sprintf(interp->result, "0x%x", (unsigned int) hwnd); } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0) && (length >= 2)) { char xSign, ySign; int width, height; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " geometry window ?newGeometry?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+'; ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+'; if (wmPtr->gridWin != NULL) { width = wmPtr->reqGridWidth + (winPtr->changes.width - winPtr->reqWidth)/wmPtr->widthInc; height = wmPtr->reqGridHeight + (winPtr->changes.height - winPtr->reqHeight)/wmPtr->heightInc; } else { width = winPtr->changes.width; height = winPtr->changes.height; } sprintf(interp->result, "%dx%d%c%d%c%d", width, height, xSign, wmPtr->x, ySign, wmPtr->y); return TCL_OK; } if (*argv[3] == '\0') { wmPtr->width = -1; wmPtr->height = -1; goto updateGeom; } return ParseGeometry(interp, argv[3], winPtr); } else if ((c == 'g') && (strncmp(argv[1], "grid", length) == 0) && (length >= 3)) { int reqWidth, reqHeight, widthInc, heightInc; if ((argc != 3) && (argc != 7)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " grid window ?baseWidth baseHeight ", "widthInc heightInc?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->sizeHintsFlags & PBaseSize) { sprintf(interp->result, "%d %d %d %d", wmPtr->reqGridWidth, wmPtr->reqGridHeight, wmPtr->widthInc, wmPtr->heightInc); } return TCL_OK; } if (*argv[3] == '\0') { /* * Turn off gridding and reset the width and height * to make sense as ungridded numbers. */ wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc); if (wmPtr->width != -1) { wmPtr->width = winPtr->reqWidth + (wmPtr->width - wmPtr->reqGridWidth)*wmPtr->widthInc; wmPtr->height = winPtr->reqHeight + (wmPtr->height - wmPtr->reqGridHeight)*wmPtr->heightInc; } wmPtr->widthInc = 1; wmPtr->heightInc = 1; } else { if ((Tcl_GetInt(interp, argv[3], &reqWidth) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &reqHeight) != TCL_OK) || (Tcl_GetInt(interp, argv[5], &widthInc) != TCL_OK) || (Tcl_GetInt(interp, argv[6], &heightInc) != TCL_OK)) { return TCL_ERROR; } if (reqWidth < 0) { interp->result = "baseWidth can't be < 0"; return TCL_ERROR; } if (reqHeight < 0) { interp->result = "baseHeight can't be < 0"; return TCL_ERROR; } if (widthInc < 0) { interp->result = "widthInc can't be < 0"; return TCL_ERROR; } if (heightInc < 0) { interp->result = "heightInc can't be < 0"; return TCL_ERROR; } Tk_SetGrid((Tk_Window) winPtr, reqWidth, reqHeight, widthInc, heightInc); } goto updateGeom; } else if ((c == 'g') && (strncmp(argv[1], "group", length) == 0) && (length >= 3)) { Tk_Window tkwin2; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " group window ?pathName?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->hints.flags & WindowGroupHint) { interp->result = wmPtr->leaderName; } return TCL_OK; } if (*argv[3] == '\0') { wmPtr->hints.flags &= ~WindowGroupHint; if (wmPtr->leaderName != NULL) { ckfree(wmPtr->leaderName); } wmPtr->leaderName = NULL; } else { tkwin2 = Tk_NameToWindow(interp, argv[3], tkwin); if (tkwin2 == NULL) { return TCL_ERROR; } Tk_MakeWindowExist(tkwin2); wmPtr->hints.window_group = Tk_WindowId(tkwin2); wmPtr->hints.flags |= WindowGroupHint; wmPtr->leaderName = ckalloc((unsigned) (strlen(argv[3])+1)); strcpy(wmPtr->leaderName, argv[3]); } } else if ((c == 'i') && (strncmp(argv[1], "iconbitmap", length) == 0) && (length >= 5)) { Pixmap pixmap; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconbitmap window ?bitmap?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->hints.flags & IconPixmapHint) { interp->result = Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_pixmap); } return TCL_OK; } if (*argv[3] == '\0') { if (wmPtr->hints.icon_pixmap != None) { Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_pixmap); } wmPtr->hints.flags &= ~IconPixmapHint; } else { pixmap = Tk_GetBitmap(interp, (Tk_Window) winPtr, Tk_GetUid(argv[3])); if (pixmap == None) { return TCL_ERROR; } wmPtr->hints.icon_pixmap = pixmap; wmPtr->hints.flags |= IconPixmapHint; } } else if ((c == 'i') && (strncmp(argv[1], "iconify", length) == 0) && (length >= 5)) { if (argc != 3) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconify window\"", (char *) NULL); return TCL_ERROR; } if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName, "\": override-redirect flag is set", (char *) NULL); return TCL_ERROR; } if (wmPtr->masterPtr != NULL) { Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName, "\": it is a transient", (char *) NULL); return TCL_ERROR; } if (wmPtr->iconFor != NULL) { Tcl_AppendResult(interp, "can't iconify ", argv[2], ": it is an icon for ", winPtr->pathName, (char *) NULL); return TCL_ERROR; } if (winPtr->flags & TK_EMBEDDED) { Tcl_AppendResult(interp, "can't iconify ", winPtr->pathName, ": it is an embedded window", (char *) NULL); return TCL_ERROR; } TkpWmSetState(winPtr, IconicState); } else if ((c == 'i') && (strncmp(argv[1], "iconmask", length) == 0) && (length >= 5)) { Pixmap pixmap; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconmask window ?bitmap?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->hints.flags & IconMaskHint) { interp->result = Tk_NameOfBitmap(winPtr->display, wmPtr->hints.icon_mask); } return TCL_OK; } if (*argv[3] == '\0') { if (wmPtr->hints.icon_mask != None) { Tk_FreeBitmap(winPtr->display, wmPtr->hints.icon_mask); } wmPtr->hints.flags &= ~IconMaskHint; } else { pixmap = Tk_GetBitmap(interp, tkwin, Tk_GetUid(argv[3])); if (pixmap == None) { return TCL_ERROR; } wmPtr->hints.icon_mask = pixmap; wmPtr->hints.flags |= IconMaskHint; } } else if ((c == 'i') && (strncmp(argv[1], "iconname", length) == 0) && (length >= 5)) { if (argc > 4) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconname window ?newName?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { interp->result = (wmPtr->iconName != NULL) ? wmPtr->iconName : ""; return TCL_OK; } else { wmPtr->iconName = Tk_GetUid(argv[3]); if (!(wmPtr->flags & WM_NEVER_MAPPED)) { XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName); } } } else if ((c == 'i') && (strncmp(argv[1], "iconposition", length) == 0) && (length >= 5)) { int x, y; if ((argc != 3) && (argc != 5)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconposition window ?x y?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->hints.flags & IconPositionHint) { sprintf(interp->result, "%d %d", wmPtr->hints.icon_x, wmPtr->hints.icon_y); } return TCL_OK; } if (*argv[3] == '\0') { wmPtr->hints.flags &= ~IconPositionHint; } else { if ((Tcl_GetInt(interp, argv[3], &x) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)){ return TCL_ERROR; } wmPtr->hints.icon_x = x; wmPtr->hints.icon_y = y; wmPtr->hints.flags |= IconPositionHint; } } else if ((c == 'i') && (strncmp(argv[1], "iconwindow", length) == 0) && (length >= 5)) { Tk_Window tkwin2; WmInfo *wmPtr2; XSetWindowAttributes atts; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " iconwindow window ?pathName?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->icon != NULL) { interp->result = Tk_PathName(wmPtr->icon); } return TCL_OK; } if (*argv[3] == '\0') { wmPtr->hints.flags &= ~IconWindowHint; if (wmPtr->icon != NULL) { /* * Let the window use button events again, then remove * it as icon window. */ atts.event_mask = Tk_Attributes(wmPtr->icon)->event_mask | ButtonPressMask; Tk_ChangeWindowAttributes(wmPtr->icon, CWEventMask, &atts); wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; wmPtr2->iconFor = NULL; wmPtr2->hints.initial_state = WithdrawnState; } wmPtr->icon = NULL; } else { tkwin2 = Tk_NameToWindow(interp, argv[3], tkwin); if (tkwin2 == NULL) { return TCL_ERROR; } if (!Tk_IsTopLevel(tkwin2)) { Tcl_AppendResult(interp, "can't use ", argv[3], " as icon window: not at top level", (char *) NULL); return TCL_ERROR; } wmPtr2 = ((TkWindow *) tkwin2)->wmInfoPtr; if (wmPtr2->iconFor != NULL) { Tcl_AppendResult(interp, argv[3], " is already an icon for ", Tk_PathName(wmPtr2->iconFor), (char *) NULL); return TCL_ERROR; } if (wmPtr->icon != NULL) { WmInfo *wmPtr3 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; wmPtr3->iconFor = NULL; /* * Let the window use button events again. */ atts.event_mask = Tk_Attributes(wmPtr->icon)->event_mask | ButtonPressMask; Tk_ChangeWindowAttributes(wmPtr->icon, CWEventMask, &atts); } /* * Disable button events in the icon window: some window * managers (like olvwm) want to get the events themselves, * but X only allows one application at a time to receive * button events for a window. */ atts.event_mask = Tk_Attributes(tkwin2)->event_mask & ~ButtonPressMask; Tk_ChangeWindowAttributes(tkwin2, CWEventMask, &atts); Tk_MakeWindowExist(tkwin2); wmPtr->hints.icon_window = Tk_WindowId(tkwin2); wmPtr->hints.flags |= IconWindowHint; wmPtr->icon = tkwin2; wmPtr2->iconFor = (Tk_Window) winPtr; if (!(wmPtr2->flags & WM_NEVER_MAPPED)) { if (XWithdrawWindow(Tk_Display(tkwin2), Tk_WindowId(tkwin2), Tk_ScreenNumber(tkwin2)) == 0) { interp->result = "couldn't send withdraw message to window manager"; return TCL_ERROR; } } } } else if ((c == 'm') && (strncmp(argv[1], "maxsize", length) == 0) && (length >= 2)) { int width, height; if ((argc != 3) && (argc != 5)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " maxsize window ?width height?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { GetMaxSize(wmPtr, &width, &height); sprintf(interp->result, "%d %d", width, height); return TCL_OK; } if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &height) != TCL_OK)) { return TCL_ERROR; } wmPtr->maxWidth = width; wmPtr->maxHeight = height; goto updateGeom; } else if ((c == 'm') && (strncmp(argv[1], "minsize", length) == 0) && (length >= 2)) { int width, height; if ((argc != 3) && (argc != 5)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " minsize window ?width height?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { GetMinSize(wmPtr, &width, &height); sprintf(interp->result, "%d %d", width, height);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -