Index: themes/default.keys/keythemerc =================================================================== --- themes/default.keys/keythemerc (revision 25832) +++ themes/default.keys/keythemerc (working copy) @@ -59,3 +59,6 @@ workspace_7_key=Control+F7 workspace_8_key=Control+F8 workspace_9_key=Control+F9 +fill_horiz_key=None +fill_vert_key=None +fill_window_key=None Index: src/settings.c =================================================================== --- src/settings.c (revision 25832) +++ src/settings.c (working copy) @@ -1336,6 +1336,9 @@ parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_10], getValue ("workspace_10_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_11], getValue ("workspace_11_key", rc)); parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_12], getValue ("workspace_12_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_HORIZ], getValue ("fill_horiz_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_VERT], getValue ("fill_vert_key", rc)); + parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_WINDOW], getValue ("fill_window_key", rc)); myScreenUngrabKeys (screen_info); myScreenGrabKeys (screen_info); @@ -1501,6 +1504,9 @@ {"workspace_10_key", NULL, TRUE}, {"workspace_11_key", NULL, TRUE}, {"workspace_12_key", NULL, TRUE}, + {"fill_horiz_key", NULL, TRUE}, + {"fill_vert_key", NULL, TRUE}, + {"fill_window_key", NULL, TRUE}, {NULL, NULL, FALSE} }; Index: src/events.c =================================================================== --- src/events.c (revision 25832) +++ src/events.c (working copy) @@ -465,6 +465,11 @@ /* 'nuff for now */ return EVENT_FILTER_REMOVE; break; + case KEY_FILL_WINDOW: + case KEY_FILL_VERT: + case KEY_FILL_HORIZ: + clientFill (c, key); + break; default: break; } Index: src/settings.h =================================================================== --- src/settings.h (revision 25832) +++ src/settings.h (working copy) @@ -103,6 +103,9 @@ KEY_WORKSPACE_10, KEY_WORKSPACE_11, KEY_WORKSPACE_12, + KEY_FILL_HORIZ, + KEY_FILL_VERT, + KEY_FILL_WINDOW, KEY_COUNT }; Index: src/client.c =================================================================== --- src/client.c (revision 25832) +++ src/client.c (working copy) @@ -5226,3 +5226,119 @@ return (c->startup_id); } #endif /* HAVE_LIBSTARTUP_NOTIFICATION */ + +void +clientFill (Client * c, int fill_type) +{ + ScreenInfo *screen_info; + DisplayInfo *display_info; + GList *window_list; + Client *east_neighbour = NULL; + Client *west_neighbour = NULL; + Client *north_neighbour = NULL; + Client *south_neighbour = NULL; + + Client *c_n; + XWindowChanges wc; + int mask = 0; + int key = fill_type; + + screen_info = c->screen_info; + display_info = screen_info->display_info; + + window_list = screen_info->windows; + while(window_list) + { + c_n = (Client *)window_list->data; + if((c->win_workspace == c_n->win_workspace) && + (c != window_list->data)) + { + if((key == KEY_FILL_WINDOW) || (key == KEY_FILL_HORIZ)) + { + if(!(((c->y + c->height) < (c_n->y - frameTop(c_n))) || ((c_n->y + c_n->height) < (c->y - frameTop(c))))) + { + if((c_n->x + c_n->width) < c->x) + { + if(east_neighbour) + { + if((east_neighbour->x + east_neighbour->width) < (c_n->x + c_n->width)) + east_neighbour = c_n; + } + else + east_neighbour = c_n; + } + if((c->x + c->width) < c_n->x) + { + if(west_neighbour) + { + if(c_n->x < west_neighbour->x) + west_neighbour = c_n; + } + else + west_neighbour = c_n; + } + } + } + if((key == KEY_FILL_WINDOW) || key == KEY_FILL_VERT) + { + if(!(((c->x + c->width) < c_n->x) || ((c_n->x + c_n->width) < c->x))) + { + if((c_n->y + c_n->height) < c->y) + { + if(north_neighbour) + { + if((north_neighbour->y + north_neighbour->height) < (c_n->y + c_n->height)) + north_neighbour = c_n; + } + else + north_neighbour = c_n; + } + if((c->y + c->height) < c_n->y) + { + if(south_neighbour) + { + if(c_n->y < south_neighbour->y) + south_neighbour = c_n; + } + else + south_neighbour = c_n; + } + } + } + } + + window_list = g_list_next(window_list); + } + + wc.x = c->x; + + if(east_neighbour) + wc.x = east_neighbour->x + east_neighbour->width + + (frameLeft(c) + frameRight(east_neighbour)); + else + wc.x = frameLeft(c); + + if(west_neighbour) + wc.width = west_neighbour->x - wc.x - + frameRight(c); + else + wc.width = screen_info->width - wc.x - + frameRight(c); + + if(north_neighbour) + wc.y = north_neighbour->y + north_neighbour->height + + (frameTop(c) + frameBottom(north_neighbour)); + else + wc.y = frameTop(c); + + if(south_neighbour) + wc.height = south_neighbour->y - wc.y - frameTop(south_neighbour); + else + wc.height = screen_info->height - wc.y; + + if((key == KEY_FILL_WINDOW) || (key == KEY_FILL_HORIZ)) + mask |= CWX | CWWidth; + if((key == KEY_FILL_WINDOW) || (key == KEY_FILL_VERT)) + mask |= CWY | CWHeight; + + clientConfigure(c, &wc, mask, CFG_FORCE_REDRAW); +} Index: src/screen.c =================================================================== --- src/screen.c (revision 25832) +++ src/screen.c (working copy) @@ -473,6 +473,9 @@ grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_10], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_11], screen_info->xroot); grabKey (dpy, &screen_info->params->keys[KEY_WORKSPACE_12], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_FILL_HORIZ], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_FILL_VERT], screen_info->xroot); + grabKey (dpy, &screen_info->params->keys[KEY_FILL_WINDOW], screen_info->xroot); } void Index: src/client.h =================================================================== --- src/client.h (revision 25832) +++ src/client.h (working copy) @@ -406,4 +406,6 @@ void clientXSyncRequest (Client *); #endif /* HAVE_XSYNC */ +void clientFill (Client *, int); + #endif /* INC_CLIENT_H */ Index: mcs-plugin/xfwm4_shortcuteditor.c =================================================================== --- mcs-plugin/xfwm4_shortcuteditor.c (revision 25832) +++ mcs-plugin/xfwm4_shortcuteditor.c (working copy) @@ -353,6 +353,9 @@ "show_desktop_key", "cancel_key", "popup_menu_key", + "fill_horiz_key", + "fill_vert_key", + "fill_window_key", NULL }; @@ -395,6 +398,9 @@ N_("Show desktop"), N_("Cancel window action"), N_("Window operations menu"), + N_("Fill window horizontally"), + N_("Fill window vertically"), + N_("Fill window"), NULL };