diff -ur xfwm4-4.4.1/mcs-plugin/xfwm4_shortcuteditor.c xfwm4-4.4.1.new/mcs-plugin/xfwm4_shortcuteditor.c --- xfwm4-4.4.1/mcs-plugin/xfwm4_shortcuteditor.c 2007-03-11 13:44:51.000000000 +0000 +++ xfwm4-4.4.1.new/mcs-plugin/xfwm4_shortcuteditor.c 2007-10-07 21:07:31.000000000 +0000 @@ -342,7 +342,9 @@ "next_workspace_key", "prev_workspace_key", "add_workspace_key", + "add_adjacent_workspace_key", "del_workspace_key", + "del_active_workspace_key", "move_window_next_workspace_key", "move_window_prev_workspace_key", "move_window_up_workspace_key", @@ -383,7 +385,9 @@ N_("Next workspace"), N_("Previous workspace"), N_("Add workspace"), - N_("Delete workspace"), + N_("Add adjacent workspace"), + N_("Delete last workspace"), + N_("Delete active workspace"), N_("Move window to next workspace"), N_("Move window to previous workspace"), N_("Move window to upper workspace"), diff -ur xfwm4-4.4.1/src/events.c xfwm4-4.4.1.new/src/events.c --- xfwm4-4.4.1/src/events.c 2007-04-02 19:48:20.000000000 +0000 +++ xfwm4-4.4.1.new/src/events.c 2007-10-07 21:13:21.000000000 +0000 @@ -551,6 +551,12 @@ case KEY_DEL_WORKSPACE: workspaceSetCount (ev_screen_info, ev_screen_info->workspace_count - 1); break; + case KEY_ADD_ADJACENT_WORKSPACE: + workspaceInsert (ev_screen_info, ev_screen_info->current_ws + 1); + break; + case KEY_DEL_ACTIVE_WORKSPACE: + workspaceDelete (ev_screen_info, ev_screen_info->current_ws); + break; case KEY_WORKSPACE_1: case KEY_WORKSPACE_2: case KEY_WORKSPACE_3: diff -ur xfwm4-4.4.1/src/screen.c xfwm4-4.4.1.new/src/screen.c --- xfwm4-4.4.1/src/screen.c 2007-03-11 13:44:43.000000000 +0000 +++ xfwm4-4.4.1.new/src/screen.c 2007-10-07 19:59:03.000000000 +0000 @@ -415,9 +415,11 @@ dpy = myScreenGetXDisplay (screen_info); grabKey (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_ADD_ADJACENT_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_DEL_ACTIVE_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], screen_info->xroot); diff -ur xfwm4-4.4.1/src/settings.c xfwm4-4.4.1.new/src/settings.c --- xfwm4-4.4.1/src/settings.c 2007-04-02 19:48:20.000000000 +0000 +++ xfwm4-4.4.1.new/src/settings.c 2007-10-07 23:37:05.000000000 +0000 @@ -1226,10 +1226,12 @@ } parseKeyString (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], getValue ("add_workspace_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_ADD_ADJACENT_WORKSPACE], getValue ("add_adjacent_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_CANCEL], getValue ("cancel_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], getValue ("close_window_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], getValue ("cycle_windows_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], getValue ("del_workspace_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_ACTIVE_WORKSPACE], getValue ("del_active_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], getValue ("down_workspace_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], getValue ("hide_window_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], getValue ("left_workspace_key", rc)); @@ -1387,10 +1389,12 @@ {"wrap_workspaces", NULL, TRUE}, /* Keys */ {"add_workspace_key", NULL, TRUE}, + {"add_adjacent_workspace_key", NULL, TRUE}, {"cancel_key", NULL, TRUE}, {"close_window_key", NULL, TRUE}, {"cycle_windows_key", NULL, TRUE}, {"del_workspace_key", NULL, TRUE}, + {"del_active_workspace_key", NULL, TRUE}, {"down_workspace_key", NULL, TRUE}, {"fullscreen_key", NULL, TRUE}, {"hide_window_key", NULL, TRUE}, diff -ur xfwm4-4.4.1/src/settings.h xfwm4-4.4.1.new/src/settings.h --- xfwm4-4.4.1/src/settings.h 2007-04-02 19:48:20.000000000 +0000 +++ xfwm4-4.4.1.new/src/settings.h 2007-10-07 19:55:42.000000000 +0000 @@ -75,10 +75,12 @@ enum { KEY_ADD_WORKSPACE, + KEY_ADD_ADJACENT_WORKSPACE, KEY_CANCEL, KEY_CLOSE_WINDOW, KEY_CYCLE_WINDOWS, KEY_DEL_WORKSPACE, + KEY_DEL_ACTIVE_WORKSPACE, KEY_DOWN_WORKSPACE, KEY_HIDE_WINDOW, KEY_LEFT_WORKSPACE, diff -ur xfwm4-4.4.1/src/workspaces.c xfwm4-4.4.1.new/src/workspaces.c --- xfwm4-4.4.1/src/workspaces.c 2007-03-15 22:29:49.000000000 +0000 +++ xfwm4-4.4.1.new/src/workspaces.c 2007-10-07 19:55:42.000000000 +0000 @@ -455,6 +455,58 @@ } void +workspaceInsert (ScreenInfo * screen_info, int index) +{ + DisplayInfo *display_info; + Client *c; + int i; + int count = screen_info->workspace_count; + + TRACE ("entering workspaceInsert"); + + workspaceSetCount(screen_info, count + 1); + + if ((index < 0) || (index > count)) + { + return; + } + + for (c = screen_info->clients, i = 0; i < screen_info->client_count; c = c->next, i++) + { + if (c->win_workspace >= index) + { + clientSetWorkspace (c, c->win_workspace + 1, TRUE); + } + } +} + +void +workspaceDelete (ScreenInfo * screen_info, int index) +{ + DisplayInfo *display_info; + Client *c; + int i; + int count = screen_info->workspace_count; + + TRACE ("entering workspaceDelete"); + + if ((index < 0) || (index > count)) + { + return; + } + + for (c = screen_info->clients, i = 0; i < screen_info->client_count; c = c->next, i++) + { + if (c->win_workspace > index) + { + clientSetWorkspace (c, c->win_workspace - 1, TRUE); + } + } + + workspaceSetCount(screen_info, count - 1); +} + +void workspaceUpdateArea (ScreenInfo *screen_info) { DisplayInfo *display_info; diff -ur xfwm4-4.4.1/src/workspaces.h xfwm4-4.4.1.new/src/workspaces.h --- xfwm4-4.4.1/src/workspaces.h 2007-03-11 13:44:43.000000000 +0000 +++ xfwm4-4.4.1.new/src/workspaces.h 2007-10-07 19:55:42.000000000 +0000 @@ -52,4 +52,10 @@ int); void workspaceUpdateArea (ScreenInfo *); +void workspaceInsert (ScreenInfo *, + int); + +void workspaceDelete (ScreenInfo *, + int); + #endif /* INC_WORKSPACES_H */ diff -ur xfwm4-4.4.1/themes/default.keys/keythemerc xfwm4-4.4.1.new/themes/default.keys/keythemerc --- xfwm4-4.4.1/themes/default.keys/keythemerc 2007-03-11 13:44:40.000000000 +0000 +++ xfwm4-4.4.1.new/themes/default.keys/keythemerc 2007-10-07 21:05:18.000000000 +0000 @@ -1,8 +1,10 @@ add_workspace_key=Alt+Insert +add_adjacent_workspace_key=None cancel_key=Escape close_window_key=Alt+F4 cycle_windows_key=Alt+Tab del_workspace_key=Alt+Delete +del_active_workspace_key=None down_workspace_key=Control+Alt+Down fullscreen_key=Alt+F11 hide_window_key=Alt+F8