Posted to tcl by patthoyts at Wed Apr 09 13:26:48 GMT 2008view raw
- ? doc/man.macros
- Index: unix/tkUnixWm.c
- ===================================================================
- RCS file: /cvsroot/tktoolkit/tk/unix/tkUnixWm.c,v
- retrieving revision 1.55
- diff -u -r1.55 tkUnixWm.c
- --- unix/tkUnixWm.c 27 Feb 2007 14:52:57 -0000 1.55
- +++ unix/tkUnixWm.c 27 Apr 2007 18:06:17 -0000
- @@ -350,6 +350,7 @@
- static void SetNetWmState(TkWindow*, const char *atomName, int on);
- static void CheckNetWmState(WmInfo *, Atom *atoms, int numAtoms);
- static void UpdateNetWmState(WmInfo *);
- +static void TkpWmSetDesktop(TkWindow *winPtr, int desktop);
- static void WaitForConfigureNotify(TkWindow *winPtr,
- unsigned long serial);
- static int WaitForEvent(Display *display,
- @@ -452,6 +453,9 @@
- Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]);
- static void WmUpdateGeom(WmInfo *wmPtr, TkWindow *winPtr);
- +static int WmDesktopCmd(Tk_Window tkwin, TkWindow *winPtr,
- + Tcl_Interp *interp, int objc,
- + Tcl_Obj *CONST objv[]);
- /*
- *--------------------------------------------------------------
- @@ -998,7 +1002,7 @@
- Tk_Window tkwin = (Tk_Window) clientData;
- static CONST char *optionStrings[] = {
- "aspect", "attributes", "client", "colormapwindows",
- - "command", "deiconify", "focusmodel", "frame",
- + "command", "deiconify", "desktop", "focusmodel", "frame",
- "geometry", "grid", "group", "iconbitmap",
- "iconify", "iconmask", "iconname",
- "iconphoto", "iconposition",
- @@ -1008,8 +1012,8 @@
- "withdraw", NULL };
- enum options {
- WMOPT_ASPECT, WMOPT_ATTRIBUTES, WMOPT_CLIENT, WMOPT_COLORMAPWINDOWS,
- - WMOPT_COMMAND, WMOPT_DEICONIFY, WMOPT_FOCUSMODEL, WMOPT_FRAME,
- - WMOPT_GEOMETRY, WMOPT_GRID, WMOPT_GROUP, WMOPT_ICONBITMAP,
- + WMOPT_COMMAND, WMOPT_DEICONIFY, WMOPT_DESKTOP, WMOPT_FOCUSMODEL,
- + WMOPT_FRAME, WMOPT_GEOMETRY, WMOPT_GRID, WMOPT_GROUP, WMOPT_ICONBITMAP,
- WMOPT_ICONIFY, WMOPT_ICONMASK, WMOPT_ICONNAME,
- WMOPT_ICONPHOTO, WMOPT_ICONPOSITION,
- WMOPT_ICONWINDOW, WMOPT_MAXSIZE, WMOPT_MINSIZE, WMOPT_OVERRIDEREDIRECT,
- @@ -1086,6 +1090,8 @@
- return WmCommandCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_DEICONIFY:
- return WmDeiconifyCmd(tkwin, winPtr, interp, objc, objv);
- + case WMOPT_DESKTOP:
- + return WmDesktopCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_FOCUSMODEL:
- return WmFocusmodelCmd(tkwin, winPtr, interp, objc, objv);
- case WMOPT_FRAME:
- @@ -1704,6 +1710,70 @@
- /*
- *----------------------------------------------------------------------
- *
- + * WmDesktopCmd --
- + *
- + * This function is invoked to process the "wm desktop" Tcl command.
- + * See the user documentation for details on what it does.
- + *
- + * Results:
- + * A standard Tcl result.
- + *
- + * Side effects:
- + * See the user documentation.
- + *
- + *----------------------------------------------------------------------
- + */
- +
- +static int
- +WmDesktopCmd(
- + Tk_Window tkwin, /* Main window of the application. */
- + TkWindow *winPtr, /* Toplevel to work with */
- + Tcl_Interp *interp, /* Current interpreter. */
- + int objc, /* Number of arguments. */
- + Tcl_Obj *CONST objv[]) /* Argument objects. */
- +{
- + register WmInfo *wmPtr = winPtr->wmInfoPtr;
- + int result = TCL_OK;
- +
- + if (objc < 3 || objc > 4) {
- + Tcl_WrongNumArgs(interp, 2, objv, "window desktop ?value?");
- + return TCL_ERROR;
- + }
- + if (objc == 4) {
- + int desktop = 0;
- + if (Tcl_GetIntFromObj(interp, objv[3], &desktop) != TCL_OK) {
- + return TCL_ERROR;
- + }
- + TkpWmSetDesktop(winPtr, desktop);
- + } else {
- + TkWindow *wrapperPtr = wmPtr->wrapperPtr;
- + Atom atom = Tk_InternAtom((Tk_Window)wmPtr->winPtr, "_NET_WM_DESKTOP");
- + Atom actualType;
- + int actualFormat;
- + unsigned long numItems, bytesAfter;
- + unsigned char *propertyValue = 0;
- + long maxLength = 1024;
- +
- + if (XGetWindowProperty(
- + wrapperPtr->display, wrapperPtr->window, atom,
- + 0l, maxLength, False, XA_CARDINAL,
- + &actualType, &actualFormat, &numItems, &bytesAfter,
- + &propertyValue) == Success) {
- + if ((actualType == XA_CARDINAL) && (actualFormat == 32) && (numItems == 1)) {
- + Tcl_SetObjResult(interp, Tcl_NewIntObj(*(int *)propertyValue));
- + } else {
- + Tcl_SetResult(interp, "invalid desktop property returned", TCL_STATIC);
- + result = TCL_ERROR;
- + }
- + XFree(propertyValue);
- + }
- + }
- + return result;
- +}
- +
- +/*
- + *----------------------------------------------------------------------
- + *
- * WmFocusmodelCmd --
- *
- * This function is invoked to process the "wm focusmodel" Tcl command.
- @@ -7020,6 +7090,48 @@
- }
- /*
- + *----------------------------------------------------------------------
- + *
- + * TkpWmSetDesktop --
- + *
- + * Request the window manager to set the desktop for this window.
- + *
- + * Results:
- + * None
- + *
- + * Side effects:
- + * May cause the window to change desktops.
- + *
- + *----------------------------------------------------------------------
- + */
- +
- +static void
- +TkpWmSetDesktop(
- + TkWindow *winPtr,
- + int desktop)
- +{
- + Tk_Window tkwin = (Tk_Window)winPtr;
- + Atom messageType = Tk_InternAtom(tkwin, "_NET_WM_DESKTOP");
- + XEvent e;
- +
- + if (!winPtr->wmInfoPtr->wrapperPtr) {
- + return;
- + }
- +
- + e.xany.type = ClientMessage;
- + e.xany.window = winPtr->wmInfoPtr->wrapperPtr->window;
- + e.xclient.message_type = messageType;
- + e.xclient.format = 32;
- + e.xclient.data.l[0] = desktop;
- + e.xclient.data.l[1] = 0l;
- + e.xclient.data.l[2] = e.xclient.data.l[3] = e.xclient.data.l[4] = 0l;
- +
- + XSendEvent(winPtr->display,
- + RootWindow(winPtr->display, winPtr->screenNum), 0,
- + SubstructureNotifyMask|SubstructureRedirectMask, &e);
- +}
- +
- +/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 4