xfwm: support for 2d pagers

Paramjit Oberoi param at cs.wisc.edu
Tue Sep 21 06:09:07 CEST 2004


Updated patch attached.  This time I have the REAL cvs head, hopefully.

The following must be added to share/xfwm4/defaults:

wrap_layout=false
up_workspace_key=Control+Up
down_workspace_key=Control+Down
left_workspace_key=Control+Left
right_workspace_key=Control+Right
move_window_up_workspace_key=Alt+Control+Up
move_window_down_workspace_key=Alt+Control+Down
move_window_left_workspace_key=Alt+Control+Left
move_window_right_workspace_key=Alt+Control+Right

(modify keybindings as appropriate - note that Alt+Ctrl+Left/Right
conflict with the default next/prev workspace hotkey (I recommend
changing that to Atl+Ctrl+PgDn/PgUp))

I removed the hand-modification to xfwm4.xml.  None of the settings are
exposed to the settings manager yet---I can add that if the patch is
accepted and people agree that breaking the string freeze is worth it.

-param

Olivier Fourdan wrote (Mon, Sep 20, 2004 at 11:17:15PM +0200) :
> From: Olivier Fourdan <fourdan at xfce.org>
> To: xfce4 devel list <xfce4-dev at xfce.org>
> X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) 
> Date: Mon, 20 Sep 2004 23:17:15 +0200
> Subject: Re: xfwm: support for 2d pagers
> Sender: xfce4-dev-bounces at xfce.org
> 
> Hi
> 
> No new feature is being added to the 4.0 release and your patch doesn't
> apply on CVS HEAD.
> 
> Cheers,
> Olivier.
> 
> On Mon, 2004-09-20 at 08:50, Paramjit Oberoi wrote:
> > xfwm4 currently does not support 2d pagers very well: i.e., say that
> > your desktop pager/switcher displays 8 virtual desktops in 2 rows, 4
> > columns.  It is natural in this situation to want to move the virtual
> > desktop up/down/left/right.  However, xfwm only supports moving to the
> > next/previous desktop.  (the xfce pager doesn't support multiple rows;
> > I am using xfwm with GNOME, as a replacement for metacity)
> > 
> > According to the NetWM specification, pagers can communicate the layout
> > of the virtual desktops using the _NET_DESKTOP_LAYOUT property.  This
> > property is described in detail here:
> > http://freedesktop.org/Standards/wm-spec/1.3/ar01s03.html#id2503159
> > 
> > Attached to this email is a patch that adds support for this to xfwm.
> > The patch is against the current CVS head (I think).  Here's a summary
> > of the changes:
-------------- next part --------------
Index: client.c
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/client.c,v
retrieving revision 1.418
diff -u -r1.418 client.c
--- client.c	19 Sep 2004 19:58:06 -0000	1.418
+++ client.c	21 Sep 2004 03:56:56 -0000
@@ -326,6 +326,14 @@
     grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_WORKSPACE_7], c->window);
     grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_WORKSPACE_8], c->window);
     grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_WORKSPACE_9], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_UP_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_DOWN_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_LEFT_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_RIGHT_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_MOVE_UP_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_MOVE_DOWN_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_MOVE_LEFT_WORKSPACE], c->window);
+    grabKey (clientGetXDisplay (c), &screen_info->params->keys[KEY_MOVE_RIGHT_WORKSPACE], c->window);
 }
 
 void
Index: events.c
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/events.c,v
retrieving revision 1.244
diff -u -r1.244 events.c
--- events.c	5 Sep 2004 20:57:46 -0000	1.244
+++ events.c	21 Sep 2004 03:56:57 -0000
@@ -396,6 +396,18 @@
             case KEY_MOVE_PREV_WORKSPACE:
                 workspaceSwitch (screen_info, screen_info->current_ws - 1, c);
                 break;
+            case KEY_MOVE_UP_WORKSPACE:
+                workspaceMove (screen_info, -1, 0, c);
+                break;
+            case KEY_MOVE_DOWN_WORKSPACE:
+                workspaceMove (screen_info, 1, 0, c);
+                break;
+            case KEY_MOVE_LEFT_WORKSPACE:
+                workspaceMove (screen_info, 0, -1, c);
+                break;
+            case KEY_MOVE_RIGHT_WORKSPACE:
+                workspaceMove (screen_info, 0, 1, c);
+                break;
             case KEY_MOVE_WORKSPACE_1:
             case KEY_MOVE_WORKSPACE_2:
             case KEY_MOVE_WORKSPACE_3:
@@ -445,6 +457,18 @@
         case KEY_PREV_WORKSPACE:
             workspaceSwitch (screen_info, screen_info->current_ws - 1, NULL);
             break;
+        case KEY_UP_WORKSPACE:
+            workspaceMove(screen_info, -1, 0, NULL);
+            break;
+        case KEY_DOWN_WORKSPACE:
+            workspaceMove(screen_info, 1, 0, NULL);
+            break;
+        case KEY_LEFT_WORKSPACE:
+            workspaceMove(screen_info, 0, -1, NULL);
+            break;
+        case KEY_RIGHT_WORKSPACE:
+            workspaceMove(screen_info, 0, 1, NULL);
+            break;
         case KEY_ADD_WORKSPACE:
             workspaceSetCount (screen_info, screen_info->workspace_count + 1);
             break;
@@ -1529,6 +1553,11 @@
         getGnomeDesktopMargins (display_info->dpy, screen_info->screen, screen_info->gnome_margins);
         workspaceUpdateArea (screen_info);
     }
+    else if (ev->atom == net_desktop_layout)
+    {
+        TRACE ("root has received a net_desktop_layout notify");
+        getDesktopLayout(display_info->dpy, screen_info->xroot, screen_info->workspace_count, &screen_info->desktop_layout);
+    }
 }
 
 static void
Index: hints.c
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/hints.c,v
retrieving revision 1.85
diff -u -r1.85 hints.c
--- hints.c	28 Aug 2004 23:10:17 -0000	1.85
+++ hints.c	21 Sep 2004 03:56:58 -0000
@@ -70,6 +70,7 @@
 Atom net_desktop_geometry;
 Atom net_desktop_viewport;
 Atom net_desktop_names;
+Atom net_desktop_layout;
 Atom net_number_of_desktops;
 Atom net_showing_desktop;
 Atom net_startup_id;
@@ -396,6 +397,60 @@
 }
 
 void
+getDesktopLayout (Display * dpy, Window root, int ws_count, NetWmDesktopLayout * layout)
+{
+    Atom real_type;
+    int real_format;
+    gboolean success = FALSE;
+    unsigned long items_read, items_left;
+    unsigned long orientation, cols, rows, start;
+    unsigned long *data = NULL;
+
+    TRACE ("entering getDesktopLayout");
+
+    if ((XGetWindowProperty (dpy, root, net_desktop_layout,
+                0L, 4L, FALSE, XA_CARDINAL,
+                &real_type, &real_format, &items_read, &items_left,
+                (unsigned char **) &data) == Success) && (items_read >= 3))
+    {
+        do
+        {
+            orientation = data[0];
+            cols = data[1];
+            rows = data[2];
+            start = (items_read >= 4) ? data[3] : NET_WM_TOPLEFT;
+
+            if (orientation > NET_WM_ORIENTATION_VERT) break;
+            if (start > NET_WM_BOTTOMLEFT) break;
+            if ((rows == 0) && (cols == 0)) break;
+
+            if (rows == 0)
+                rows = (ws_count-1) / cols + 1;
+
+            if (cols == 0)
+                cols = (ws_count-1) / rows + 1;
+
+            layout->orientation = orientation;
+            layout->cols = cols;
+            layout->rows = rows;
+            layout->start = start;
+            success = TRUE;
+        } while (0);
+
+        XFree (data);
+    }
+
+    if (!success)
+    {
+        /* Assume HORZ, TOPLEFT, one row by default */
+        layout->orientation = NET_WM_ORIENTATION_HORZ;
+        layout->cols = ws_count;
+        layout->rows = 1;
+        layout->start = NET_WM_TOPLEFT;
+    }
+}
+
+void
 getGnomeDesktopMargins (Display * dpy, int screen, int * m)
 {
     Atom real_type;
@@ -458,6 +513,8 @@
         XInternAtom (dpy, "_NET_DESKTOP_VIEWPORT", FALSE);
     net_desktop_names = 
         XInternAtom (dpy, "_NET_DESKTOP_NAMES", FALSE);
+    net_desktop_layout =
+        XInternAtom (dpy, "_NET_DESKTOP_LAYOUT", FALSE);
     net_number_of_desktops =
         XInternAtom (dpy, "_NET_NUMBER_OF_DESKTOPS", FALSE);
     net_showing_desktop = 
@@ -569,6 +626,7 @@
     atoms[i++] = net_desktop_geometry;
     atoms[i++] = net_desktop_viewport;
     atoms[i++] = net_desktop_names;
+    atoms[i++] = net_desktop_layout;
     atoms[i++] = net_number_of_desktops;
     atoms[i++] = net_showing_desktop;
     atoms[i++] = net_supported;
Index: hints.h
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/hints.h,v
retrieving revision 1.49
diff -u -r1.49 hints.h
--- hints.h	28 Aug 2004 23:10:17 -0000	1.49
+++ hints.h	21 Sep 2004 03:56:59 -0000
@@ -98,6 +98,23 @@
 #define NET_WM_STATE_ADD                        1
 #define NET_WM_STATE_TOGGLE                     2
 
+#define NET_WM_ORIENTATION_HORZ                 0
+#define NET_WM_ORIENTATION_VERT                 1
+
+#define NET_WM_TOPLEFT                          0
+#define NET_WM_TOPRIGHT                         1
+#define NET_WM_BOTTOMRIGHT                      2
+#define NET_WM_BOTTOMLEFT                       3
+
+typedef struct
+{
+    unsigned long orientation;
+    unsigned long start;
+    unsigned long rows;
+    unsigned long cols;
+}
+NetWmDesktopLayout;
+
 #define LEFT                            0
 #define RIGHT                           1
 #define TOP                             2
@@ -151,6 +168,7 @@
 extern Atom net_desktop_geometry;
 extern Atom net_desktop_viewport;
 extern Atom net_desktop_names;
+extern Atom net_desktop_layout;
 extern Atom net_number_of_desktops;
 extern Atom net_showing_desktop;
 extern Atom net_startup_id;
@@ -219,6 +237,7 @@
 Atom initSystrayHints (Display *, int);
 gboolean getHint (Display *, Window, Atom, long *);
 void setHint (Display *, Window, Atom, long);
+void getDesktopLayout (Display *, Window, int, NetWmDesktopLayout *);
 void getGnomeDesktopMargins (Display *, int, int *);
 void setGnomeProtocols (Display *, int, Window);
 void initNetHints (Display * dpy);
Index: screen.h
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/screen.h,v
retrieving revision 1.7
diff -u -r1.7 screen.h
--- screen.h	19 Sep 2004 20:16:01 -0000	1.7
+++ screen.h	21 Sep 2004 03:56:59 -0000
@@ -95,6 +95,7 @@
     int workspace_count;
     gchar *workspace_names;
     int workspace_names_length;
+    NetWmDesktopLayout desktop_layout;
 
     /* Button handler for GTK */
     gulong button_handler_id;
Index: settings.c
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/settings.c,v
retrieving revision 1.105
diff -u -r1.105 settings.c
--- settings.c	14 Sep 2004 20:32:30 -0000	1.105
+++ settings.c	21 Sep 2004 03:57:00 -0000
@@ -909,13 +909,21 @@
     parseKeyString (dpy, &screen_info->params->keys[KEY_RAISE_WINDOW], getValue ("raise_window_key", rc));
     parseKeyString (dpy, &screen_info->params->keys[KEY_LOWER_WINDOW], getValue ("lower_window_key", rc));
     parseKeyString (dpy, &screen_info->params->keys[KEY_TOGGLE_FULLSCREEN], getValue ("fullscreen_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_UP_WORKSPACE], getValue ("up_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], getValue ("down_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], getValue ("left_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_RIGHT_WORKSPACE], getValue ("right_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_UP_WORKSPACE], getValue ("move_window_up_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN_WORKSPACE], getValue ("move_window_down_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_LEFT_WORKSPACE], getValue ("move_window_left_workspace_key", rc));
+    parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_RIGHT_WORKSPACE], getValue ("move_window_right_workspace_key", rc));
 
     ungrabKeys (dpy, screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_NEXT_WORKSPACE], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_PREV_WORKSPACE], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], screen_info->gnome_win);
-    grabKey (dpy, &screen_info->params->keys[KEY_NEXT_WORKSPACE], screen_info->gnome_win);
+    grabKey (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_1], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_2], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_3], screen_info->gnome_win);
@@ -935,6 +943,11 @@
     grabKey (dpy, &screen_info->params->keys[KEY_SHORTCUT_8], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_SHORTCUT_9], screen_info->gnome_win);
     grabKey (dpy, &screen_info->params->keys[KEY_SHORTCUT_10], screen_info->gnome_win);
+    grabKey (dpy, &screen_info->params->keys[KEY_UP_WORKSPACE], screen_info->gnome_win);
+    grabKey (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], screen_info->gnome_win);
+    grabKey (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], screen_info->gnome_win);
+    grabKey (dpy, &screen_info->params->keys[KEY_RIGHT_WORKSPACE], screen_info->gnome_win);
+
 
     return TRUE;
 }
@@ -1001,6 +1014,7 @@
         {"workspace_count", NULL, TRUE},
         {"wrap_windows", NULL, TRUE},
         {"wrap_workspaces", NULL, TRUE},
+        {"wrap_layout", NULL, TRUE},
         {"wrap_resistance", NULL, TRUE},
         /* Keys */
         {"add_workspace_key", NULL, TRUE},
@@ -1066,6 +1080,14 @@
         {"shortcut_10_exec", NULL, FALSE},
         {"raise_window_key", NULL, TRUE},
         {"lower_window_key", NULL, TRUE},
+        {"up_workspace_key", NULL, TRUE},
+        {"down_workspace_key", NULL, TRUE},
+        {"left_workspace_key", NULL, TRUE},
+        {"right_workspace_key", NULL, TRUE},
+        {"move_window_up_workspace_key", NULL, TRUE},
+        {"move_window_down_workspace_key", NULL, TRUE},
+        {"move_window_left_workspace_key", NULL, TRUE},
+        {"move_window_right_workspace_key", NULL, TRUE},
         {NULL, NULL, FALSE}
     };
 
@@ -1145,6 +1167,8 @@
 
     screen_info->params->wrap_workspaces =
         !g_ascii_strcasecmp ("true", getValue ("wrap_workspaces", rc));
+    screen_info->params->wrap_layout =
+        !g_ascii_strcasecmp ("true", getValue ("wrap_layout", rc));
     screen_info->params->wrap_windows =
         !g_ascii_strcasecmp ("true", getValue ("wrap_windows", rc));
     screen_info->params->wrap_resistance = abs (TOINT (getValue ("wrap_resistance", rc)));
@@ -1305,6 +1329,8 @@
         screen_info->workspace_names_length = 0;
     }
 
+    getDesktopLayout(myScreenGetXDisplay (screen_info), screen_info->xroot, screen_info->workspace_count, &screen_info->desktop_layout);
+
     if (!loadSettings (screen_info))
     {
         return FALSE;
Index: settings.h
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/settings.h,v
retrieving revision 1.40
diff -u -r1.40 settings.h
--- settings.h	8 Sep 2004 15:59:31 -0000	1.40
+++ settings.h	21 Sep 2004 03:57:00 -0000
@@ -28,6 +28,7 @@
 #include "screen.h"
 #include "keyboard.h"
 #include "mypixmap.h"
+#include "hints.h"
 
 #ifndef INC_SETTINGS_H
 #define INC_SETTINGS_H
@@ -107,7 +108,15 @@
 #define KEY_LOWER_WINDOW                50
 #define KEY_RAISE_WINDOW                51
 #define KEY_TOGGLE_FULLSCREEN           52
-#define KEY_COUNT                       53
+#define KEY_UP_WORKSPACE                53
+#define KEY_DOWN_WORKSPACE              54
+#define KEY_LEFT_WORKSPACE              55
+#define KEY_RIGHT_WORKSPACE             56
+#define KEY_MOVE_UP_WORKSPACE           57
+#define KEY_MOVE_DOWN_WORKSPACE         58
+#define KEY_MOVE_LEFT_WORKSPACE         59
+#define KEY_MOVE_RIGHT_WORKSPACE        60
+#define KEY_COUNT                       61
 #define NB_KEY_SHORTCUTS                10
 
 #define ALIGN_LEFT                      0
@@ -164,6 +173,7 @@
     gboolean title_vertical_offset_active;
     gboolean title_vertical_offset_inactive;
     gboolean wrap_workspaces;
+    gboolean wrap_layout;
     gboolean wrap_windows;
 };
 
Index: workspaces.c
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/workspaces.c,v
retrieving revision 1.79
diff -u -r1.79 workspaces.c
--- workspaces.c	28 Aug 2004 23:10:17 -0000	1.79
+++ workspaces.c	21 Sep 2004 03:57:00 -0000
@@ -42,6 +42,151 @@
 #include "hints.h"
 
 void
+workspaceGetPosition (ScreenInfo *screen_info, int n, int * row, int * col)
+{
+    NetWmDesktopLayout * l = &screen_info->desktop_layout;
+    int major_length, minor_length, tmp;
+
+    if (l->orientation == NET_WM_ORIENTATION_HORZ)
+    {
+        major_length = l->cols;
+        minor_length = l->rows;
+    }
+    else
+    {
+        major_length = l->rows;
+        minor_length = l->cols;
+    }
+
+    *row = n / major_length;
+    *col = n % major_length;
+
+    switch (l->start)
+    {
+        case NET_WM_TOPRIGHT:
+            *col = major_length - *col - 1;
+            break;
+        case NET_WM_BOTTOMLEFT:
+            *row = minor_length - *row - 1;
+            break;
+        case NET_WM_BOTTOMRIGHT:
+            *col = major_length - *col - 1;
+            *row = minor_length - *row - 1;
+            break;
+    }
+
+    if (l->orientation == NET_WM_ORIENTATION_VERT)
+    {
+        tmp = *row;
+        *row = *col;
+        *col = tmp;
+        if ((l->start == NET_WM_TOPRIGHT) || (l->start == NET_WM_BOTTOMLEFT))
+        {
+            *row = l->rows - *row - 1;
+            *col = l->cols - *col - 1;
+        }
+    }
+}
+
+int
+workspaceGetNumber (ScreenInfo *screen_info, int row, int col)
+{
+    NetWmDesktopLayout * l = &screen_info->desktop_layout;
+    int major_length, minor_length, n, tmp;
+
+    if (l->orientation == NET_WM_ORIENTATION_HORZ)
+    {
+        major_length = l->cols;
+        minor_length = l->rows;
+    }
+    else
+    {
+        major_length = l->rows;
+        minor_length = l->cols;
+    }
+
+    if (l->orientation == NET_WM_ORIENTATION_VERT)
+    {
+        tmp = row;
+        row = col;
+        col = tmp;
+        if ((l->start == NET_WM_TOPRIGHT) || (l->start == NET_WM_BOTTOMLEFT))
+        {
+            row = minor_length - row - 1;
+            col = major_length - col - 1;
+        }
+    }
+
+    switch (l->start)
+    {
+        case NET_WM_TOPRIGHT:
+            col = major_length - col - 1;
+            break;
+        case NET_WM_BOTTOMLEFT:
+            row = minor_length - row - 1;
+            break;
+        case NET_WM_BOTTOMRIGHT:
+            col = major_length - col - 1;
+            row = minor_length - row - 1;
+            break;
+    }
+
+    n = row*major_length + col;
+    return n;
+}
+
+int
+modify_with_wrap (int value, int by, int limit, gboolean wrap)
+{
+    if (by >= limit) by = limit - 1;
+    value += by;
+    if (value >= limit)
+    {
+        if (!wrap) value = limit - 1;
+        else value = value % limit;
+    }
+    else if (value < 0)
+    {
+        if (!wrap) value = 0;
+        else value = (value+limit) % limit;
+    }
+    return value;
+}
+
+void
+workspaceMove (ScreenInfo *screen_info, int rowmod, int colmod, Client * c2)
+{
+    int row, col, newrow, newcol, n;
+
+    workspaceGetPosition(screen_info, screen_info->current_ws, &row, &col);
+    newrow = modify_with_wrap(row, rowmod, screen_info->desktop_layout.rows, screen_info->params->wrap_layout);
+    newcol = modify_with_wrap(col, colmod, screen_info->desktop_layout.cols, screen_info->params->wrap_layout);
+    n = workspaceGetNumber(screen_info, newrow, newcol);
+
+    if (n == screen_info->current_ws) return;
+
+    if (n < screen_info->workspace_count)
+    {
+        workspaceSwitch(screen_info, n, c2);
+    }
+    else if (screen_info->params->wrap_layout)
+    {
+        if (colmod < 0) n = screen_info->workspace_count - 1;
+        else
+        {
+            if (colmod > 0) newcol = 0;
+            else if (rowmod > 0) newrow = 0;
+            else if (rowmod < 0) newrow--;
+            else g_return_if_fail(FALSE);
+
+            n = workspaceGetNumber(screen_info, newrow, newcol);
+        }
+        g_return_if_fail(n < screen_info->workspace_count);
+        workspaceSwitch(screen_info, n, c2);
+    }
+}
+
+void
 workspaceSwitch (ScreenInfo *screen_info, int new_ws, Client * c2)
 {
     Client *c, *new_focus = NULL;
Index: workspaces.h
===================================================================
RCS file: /cvsroot/xfce/xfce4/xfwm4/src/workspaces.h,v
retrieving revision 1.19
diff -u -r1.19 workspaces.h
--- workspaces.h	22 Aug 2004 22:18:50 -0000	1.19
+++ workspaces.h	21 Sep 2004 03:57:00 -0000
@@ -32,6 +32,7 @@
 #include "screen.h"
 #include "client.h"
 
+void workspaceMove (ScreenInfo *, int, int, Client *);
 void workspaceSwitch (ScreenInfo *, int, Client *);
 void workspaceSetNames (ScreenInfo *, char *, int);
 void workspaceSetCount (ScreenInfo *, int);


More information about the Xfce4-dev mailing list