📄 tkunixwm.c
字号:
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->master != None) { 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 ", Tk_PathName(wmPtr->iconFor), (char *) NULL); return TCL_ERROR; } wmPtr->hints.initial_state = IconicState; if (wmPtr->flags & WM_NEVER_MAPPED) { return TCL_OK; } if (wmPtr->withdrawn) { UpdateHints(winPtr); Tk_MapWindow((Tk_Window) winPtr); wmPtr->withdrawn = 0; } else { if (XIconifyWindow(winPtr->display, wmPtr->wrapperPtr->window, winPtr->screenNum) == 0) { interp->result = "couldn't send iconify message to window manager"; return TCL_ERROR; } WaitForMapNotify(winPtr, 0); } } 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; } UpdateHints(winPtr); } 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 = ckalloc((unsigned) (strlen(argv[3]) + 1)); strcpy(wmPtr->iconName, argv[3]); if (!(wmPtr->flags & WM_NEVER_MAPPED)) { XSetIconName(winPtr->display, wmPtr->wrapperPtr->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; } UpdateHints(winPtr); } 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) { /* * Remove the icon window relationship. In principle we * should also re-enable button events for the window, but * this doesn't work in general because the window manager * is probably selecting on them (we'll get an error if * we try to re-enable the events). So, just leave the * icon window event-challenged; the user will have to * recreate it if they want button events. */ wmPtr2 = ((TkWindow *) wmPtr->icon)->wmInfoPtr; wmPtr2->iconFor = NULL; wmPtr2->withdrawn = 1; 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; wmPtr3->withdrawn = 1; wmPtr3->hints.initial_state = WithdrawnState; } /* * 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); if (wmPtr2->wrapperPtr == NULL) { CreateWrapper(wmPtr2); } wmPtr->hints.icon_window = Tk_WindowId(wmPtr2->wrapperPtr); wmPtr->hints.flags |= IconWindowHint; wmPtr->icon = tkwin2; wmPtr2->iconFor = (Tk_Window) winPtr; if (!wmPtr2->withdrawn && !(wmPtr2->flags & WM_NEVER_MAPPED)) { wmPtr2->withdrawn = 0; if (XWithdrawWindow(Tk_Display(tkwin2), Tk_WindowId(wmPtr2->wrapperPtr), Tk_ScreenNumber(tkwin2)) == 0) { interp->result = "couldn't send withdraw message to window manager"; return TCL_ERROR; } WaitForMapNotify((TkWindow *) tkwin2, 0); } } UpdateHints(winPtr); } 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; wmPtr->flags |= WM_UPDATE_SIZE_HINTS; 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) { sprintf(interp->result, "%d %d", wmPtr->minWidth, wmPtr->minHeight); return TCL_OK; } if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK) || (Tcl_GetInt(interp, argv[4], &height) != TCL_OK)) { return TCL_ERROR; } wmPtr->minWidth = width; wmPtr->minHeight = height; wmPtr->flags |= WM_UPDATE_SIZE_HINTS; goto updateGeom; } else if ((c == 'o') && (strncmp(argv[1], "overrideredirect", length) == 0)) { int boolean; XSetWindowAttributes atts; if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " overrideredirect window ?boolean?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { interp->result = "1"; } else { interp->result = "0"; } return TCL_OK; } if (Tcl_GetBoolean(interp, argv[3], &boolean) != TCL_OK) { return TCL_ERROR; } atts.override_redirect = (boolean) ? True : False; Tk_ChangeWindowAttributes((Tk_Window) winPtr, CWOverrideRedirect, &atts); if (winPtr->wmInfoPtr->wrapperPtr != NULL) { Tk_ChangeWindowAttributes( (Tk_Window) winPtr->wmInfoPtr->wrapperPtr, CWOverrideRedirect, &atts); } } else if ((c == 'p') && (strncmp(argv[1], "positionfrom", length) == 0) && (length >= 2)) { if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " positionfrom window ?user/program?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { if (wmPtr->sizeHintsFlags & USPosition) { interp->result = "user"; } else if (wmPtr->sizeHintsFlags & PPosition) { interp->result = "program"; } return TCL_OK; } if (*argv[3] == '\0') { wmPtr->sizeHintsFlags &= ~(USPosition|PPosition); } else { c = argv[3][0]; length = strlen(argv[3]); if ((c == 'u') && (strncmp(argv[3], "user", length) == 0)) { wmPtr->sizeHintsFlags &= ~PPosition; wmPtr->sizeHintsFlags |= USPosition; } else if ((c == 'p') && (strncmp(argv[3], "program", length) == 0)) { wmPtr->sizeHintsFlags &= ~USPosition; wmPtr->sizeHintsFlags |= PPosition; } else { Tcl_AppendResult(interp, "bad argument \"", argv[3], "\": must be program or user", (char *) NULL); return TCL_ERROR; } } wmPtr->flags |= WM_UPDATE_SIZE_HINTS; goto updateGeom; } else if ((c == 'p') && (strncmp(argv[1], "protocol", length) == 0) && (length >= 2)) { register ProtocolHandler *protPtr, *prevPtr; Atom protocol; int cmdLength; if ((argc < 3) || (argc > 5)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " protocol window ?name? ?command?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { /* * Return a list of all defined protocols for the window. */ for (protPtr = wmPtr->protPtr; protPtr != NULL; protPtr = protPtr->nextPtr) { Tcl_AppendElement(interp, Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol)); } return TCL_OK; } protocol = Tk_InternAtom((Tk_Window) winPtr, argv[3]); if (argc == 4) { /* * Return the command to handle a given protocol. */ for (protPtr = wmPtr->protPtr; protPtr != NULL; protPtr = protPtr->nextPtr) { if (protPtr->protocol == protocol) { interp->result = protPtr->command; return TCL_OK; } } return TCL_OK; } /* * Delete any current protocol handler, then create a new * one with the specified command, unless the command is * empty. */ for (protPtr = wmPtr->protPtr, prevPtr = NULL; protPtr != NULL; prevPtr = protPtr, protPtr = protPtr->nextPtr) { if (protPtr->protocol == protocol) { if (prevPtr == NULL) { wmPtr->protPtr = protPtr->nextPtr; } else { prevPtr->nextPtr = protPtr->nextPtr; } Tcl_EventuallyFree((ClientData) protPtr, TCL_DYNAMIC); break; } } cmdLength = strlen(argv[4]); if (cmdLength > 0) { protPtr = (ProtocolHandler *) ckalloc(HANDLER_SIZE(cmdLength)); protPtr->protocol = protocol; protPtr->nextPtr = wmPtr->protPtr; wmPtr->protPtr = protPtr; protPtr->interp = interp; strcpy(protPtr->command, argv[4]); } if (!(wmPtr->flags & WM_NEVER_MAPPED)) { UpdateWmProtocols(wmPtr); } } else if ((c == 'r') && (strncmp(argv[1], "resizable", length) == 0)) { int width, height; if ((argc != 3) && (argc != 5)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " resizable window ?width height?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) { sprintf(interp->result, "%d %d", (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) ? 0 : 1, (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) ? 0 : 1); return TCL_OK; } if ((Tcl_GetBoolean(interp, argv[3], &width) != TCL_OK) || (Tcl_GetBoolean(interp, argv[4], &height) != TCL_OK)) { return TCL_ERROR; } if (width) { wmPtr->flags &= ~WM_WIDTH_NOT_RESIZABLE; } else { wmPtr->flags |= WM_WIDTH_NOT_RESIZABLE; } if (height) { wmPtr->flags &= ~WM_HEIGHT_NOT_RESIZABLE; } else { wmPtr->flags |= WM_HEIGHT_NOT_RESIZABLE; } wmPtr->flags |= WM_UPDATE_SIZE_HINTS; goto updateGeom; } else if ((c == 's') && (strncmp(argv[1], "sizefrom", length) == 0) && (length >= 2)) { if ((argc != 3) && (argc != 4)) { Tcl_AppendResult(interp, "wrong # arguments: must be \"", argv[0], " sizefrom window ?user|program?\"", (char *) NULL); return TCL_ERROR; } if (argc == 3) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -