simplified logic of handleMaximize function added maximize on top and bottom half and added maximize at 4 corners: left top, right top, left bottom, right bottom removed unneeded old_maximize flags added to WPrefs options to configure new maximize modes --- WPrefs.app/KeyboardShortcuts.c | 12 ++ src/actions.c | 253 ++++++++++++++++------------------------- src/actions.h | 8 +- src/defaults.c | 12 ++ src/event.c | 42 +++++++ src/keybind.h | 8 +- src/window.h | 3 +- 7 files changed, 175 insertions(+), 163 deletions(-)
diff --git a/WPrefs.app/KeyboardShortcuts.c b/WPrefs.app/KeyboardShortcuts.c index 61a49a1..98bd6cc 100644 --- a/WPrefs.app/KeyboardShortcuts.c +++ b/WPrefs.app/KeyboardShortcuts.c @@ -78,6 +78,12 @@ static char *keyOptions[] = { "HMaximizeKey", "LHMaximizeKey", "RHMaximizeKey", + "THMaximizeKey", + "BHMaximizeKey", + "LTCMaximizeKey", + "RTCMaximizeKey", + "LBCMaximizeKey", + "RBCMaximizeKey", "MaximusKey", "RaiseKey", "LowerKey", @@ -482,6 +488,12 @@ static void createPanel(Panel * p) WMAddListItem(panel->actLs, _("Maximize active window horizontally")); WMAddListItem(panel->actLs, _("Maximize active window left half")); WMAddListItem(panel->actLs, _("Maximize active window right half")); + WMAddListItem(panel->actLs, _("Maximize active window top half")); + WMAddListItem(panel->actLs, _("Maximize active window bottom half")); + WMAddListItem(panel->actLs, _("Maximize active window left top corner")); + WMAddListItem(panel->actLs, _("Maximize active window right top corner")); + WMAddListItem(panel->actLs, _("Maximize active window left bottom corner")); + WMAddListItem(panel->actLs, _("Maximize active window right bottom corner")); WMAddListItem(panel->actLs, _("Maximus: Tiled maximization ")); WMAddListItem(panel->actLs, _("Raise active window")); WMAddListItem(panel->actLs, _("Lower active window")); diff --git a/src/actions.c b/src/actions.c index 594b464..6e6dbf2 100644 --- a/src/actions.c +++ b/src/actions.c @@ -342,50 +342,37 @@ void update_saved_geometry(WWindow *wwin) save_old_geometry(wwin, SAVE_GEOMETRY_X); } -#define IS_MAX_HORIZONTALLY(directions) ((directions & MAX_HORIZONTAL) | (directions & MAX_LEFTHALF) | (directions & MAX_RIGHTHALF)) void wMaximizeWindow(WWindow *wwin, int directions) { - int new_x, new_y; - unsigned int new_width, new_height, half_scr_width; + unsigned int half_scr_width, half_scr_height; + int new_x = 0; + int new_y = 0; + unsigned int new_width = 0; + unsigned int new_height = 0; int maximus_x = 0; int maximus_y = 0; unsigned int maximus_width = 0; unsigned int maximus_height = 0; + int adj_size; WArea usableArea, totalArea; Bool has_border = 1; - int save_directions = 0; - int adj_size; if (!IS_RESIZABLE(wwin)) return; - if (!HAS_BORDER(wwin)) - has_border = 0; + /* save old coordinates before we change the current values */ + if (!wwin->flags.maximized) + save_old_geometry(wwin, SAVE_GEOMETRY_ALL); /* the size to adjust the geometry */ + if (!HAS_BORDER(wwin)) + has_border = 0; adj_size = wwin->screen_ptr->frame_border_width * 2 * has_border; - /* save old coordinates before we change the current values - * always if the window is not currently maximized at all - * but never if the window has been Maximusized */ - if (!wwin->flags.maximized) - save_directions |= SAVE_GEOMETRY_ALL; - else if (!(wwin->flags.old_maximized & MAX_MAXIMUS)) { - if ((directions & MAX_VERTICAL) && - !(wwin->flags.maximized & MAX_VERTICAL)) - save_directions |= SAVE_GEOMETRY_Y | SAVE_GEOMETRY_HEIGHT; - if (IS_MAX_HORIZONTALLY(directions) && - !IS_MAX_HORIZONTALLY(wwin->flags.maximized)) - save_directions |= SAVE_GEOMETRY_X | SAVE_GEOMETRY_WIDTH; - } - if ((directions & MAX_MAXIMUS) && !wwin->flags.maximized) - save_directions |= SAVE_GEOMETRY_ALL; - save_old_geometry(wwin, save_directions); - - totalArea.x1 = 0; - totalArea.y1 = 0; totalArea.x2 = wwin->screen_ptr->scr_width; totalArea.y2 = wwin->screen_ptr->scr_height; + totalArea.x1 = 0; + totalArea.y1 = 0; usableArea = totalArea; if (!(directions & MAX_IGNORE_XINERAMA)) { @@ -400,89 +387,76 @@ void wMaximizeWindow(WWindow *wwin, int directions) usableArea = wGetUsableAreaForHead(scr, head, &totalArea, True); } - /* remember Maximus geometry if we'll need it later */ - if ((wwin->flags.old_maximized & MAX_MAXIMUS) || (directions & MAX_MAXIMUS)) - find_Maximus_geometry(wwin, usableArea, &maximus_x, &maximus_y, &maximus_width, &maximus_height); - /* Only save directions, not kbd or xinerama hints */ - directions &= (MAX_HORIZONTAL | MAX_VERTICAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_MAXIMUS); + directions &= (MAX_HORIZONTAL | MAX_VERTICAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_TOPHALF | MAX_BOTTOMHALF| MAX_MAXIMUS); - if (WFLAGP(wwin, full_maximize)) { + if (WFLAGP(wwin, full_maximize)) usableArea = totalArea; - } - half_scr_width = (usableArea.x2 - usableArea.x1)/2; if (wwin->flags.shaded) { wwin->flags.skip_next_animation = 1; wUnshadeWindow(wwin); } - if (directions & MAX_HORIZONTAL) { - new_width = usableArea.x2 - usableArea.x1 - adj_size; - new_x = usableArea.x1; - } else if (directions & MAX_LEFTHALF) { - new_width = half_scr_width - adj_size; - new_x = usableArea.x1; - wwin->flags.old_maximized |= MAX_LEFTHALF; - wwin->flags.old_maximized &= ~MAX_RIGHTHALF; - } else if (directions & MAX_RIGHTHALF) { - new_width = half_scr_width - adj_size; - new_x = usableArea.x1 + half_scr_width; - wwin->flags.old_maximized |= MAX_RIGHTHALF; - wwin->flags.old_maximized &= ~MAX_LEFTHALF; - } else if (wwin->flags.old_maximized & MAX_MAXIMUS) { - new_x = maximus_x; - new_width = maximus_width - adj_size; - } else if (IS_MAX_HORIZONTALLY(wwin->flags.maximized)) { - new_x = (wwin->old_geometry.x) ? wwin->old_geometry.x : wwin->frame_x; - new_width = (wwin->old_geometry.width) ? wwin->old_geometry.width : wwin->frame->core->width; - } else { - wwin->flags.old_maximized &= ~(MAX_LEFTHALF | MAX_RIGHTHALF); - new_x = wwin->frame_x; - new_width = wwin->frame->core->width; - } - - if (directions & MAX_VERTICAL) { - new_height = usableArea.y2 - usableArea.y1 - adj_size; - new_y = usableArea.y1; - if (WFLAGP(wwin, full_maximize)) { - new_y -= wwin->frame->top_width; - new_height += wwin->frame->bottom_width - 1; - } - } else if (wwin->flags.old_maximized & MAX_MAXIMUS) { - new_y = maximus_y; - new_height = maximus_height - adj_size; - /* HACK: this will be subtracted again below */ - new_height += wwin->frame->top_width + wwin->frame->bottom_width; - } else if (wwin->flags.maximized & MAX_VERTICAL) { - new_y = (wwin->old_geometry.y) ? wwin->old_geometry.y : wwin->frame_y; - new_height = (wwin->old_geometry.height) ? wwin->old_geometry.height : wwin->frame->core->height; - /* HACK: this will be subtracted again below */ - new_height += wwin->frame->top_width + wwin->frame->bottom_width; - wwin->flags.old_maximized &= ~(MAX_LEFTHALF | MAX_RIGHTHALF); - } else { - new_y = wwin->frame_y; - new_height = wwin->frame->core->height; - } - - if (!WFLAGP(wwin, full_maximize)) { - new_height -= wwin->frame->top_width + wwin->frame->bottom_width; - } + half_scr_width = (usableArea.x2 - usableArea.x1)/2; + half_scr_height = (usableArea.y2 - usableArea.y1)/2; if (directions & MAX_MAXIMUS) { + find_Maximus_geometry(wwin, usableArea, &maximus_x, &maximus_y, &maximus_width, &maximus_height); + new_width = maximus_width - adj_size; + new_height = maximus_height - adj_size + wwin->frame->top_width + wwin->frame->bottom_width; new_x = maximus_x; new_y = maximus_y; - new_width = maximus_width - adj_size; - new_height = maximus_height - adj_size; - if (WFLAGP(wwin, full_maximize) && new_y == 0) { + if (WFLAGP(wwin, full_maximize)) new_y -= wwin->frame->top_width; - new_height += wwin->frame->top_width - 1; - } wwin->maximus_x = new_x; wwin->maximus_y = new_y; - wwin->flags.old_maximized |= MAX_MAXIMUS; + } else { + if (directions & MAX_LEFTHALF) { + new_width = half_scr_width - adj_size; + new_x = usableArea.x1; + } + if (directions & MAX_RIGHTHALF) { + new_width = half_scr_width - adj_size; + new_x = usableArea.x1 + half_scr_width; + } + if (directions & MAX_TOPHALF) { + new_height = half_scr_height - adj_size; + new_y = usableArea.y1; + } + if (directions & MAX_BOTTOMHALF) { + new_height = half_scr_height - adj_size; + new_y = usableArea.y1 + half_scr_height; + } + + if (directions & MAX_HORIZONTAL) { + new_width = usableArea.x2 - usableArea.x1 - adj_size; + new_x = usableArea.x1; + /* restore y and height, no other option was set then */ + if (!(directions & (MAX_VERTICAL | MAX_TOPHALF | MAX_BOTTOMHALF | MAX_MAXIMUS))) { + new_height = wwin->old_geometry.height + wwin->frame->top_width + wwin->frame->bottom_width; + new_y = wwin->old_geometry.y; + } + } + if (directions & MAX_VERTICAL) { + new_height = usableArea.y2 - usableArea.y1 - adj_size; + new_y = usableArea.y1; + /* restore x and height, no other option was set then */ + if (!(directions & (MAX_HORIZONTAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_MAXIMUS))) { + new_width= wwin->old_geometry.width; + new_x = wwin->old_geometry.x; + } + if (WFLAGP(wwin, full_maximize)) + new_y -= wwin->frame->top_width; + } } + if (!WFLAGP(wwin, full_maximize)) + new_height -= wwin->frame->top_width + wwin->frame->bottom_width; + + /* set maximization state */ + wwin->flags.maximized = directions; + wWindowConstrainSize(wwin, &new_width, &new_height); wWindowCropSize(wwin, usableArea.x2 - usableArea.x1, @@ -492,82 +466,48 @@ void wMaximizeWindow(WWindow *wwin, int directions) wWindowSynthConfigureNotify(wwin); WMPostNotificationName(WMNChangedState, wwin, "maximize"); - - /* set maximization state */ - wwin->flags.maximized = directions; - if ((wwin->flags.old_maximized & MAX_MAXIMUS) && !wwin->flags.maximized) - wwin->flags.maximized = MAX_MAXIMUS; } /* generic (un)maximizer */ void handleMaximize(WWindow *wwin, int directions) { - int current = wwin->flags.maximized; - int requested = directions & (MAX_HORIZONTAL | MAX_VERTICAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_MAXIMUS); - int effective = requested ^ current; + int requested = directions & (MAX_HORIZONTAL | MAX_VERTICAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_TOPHALF | MAX_BOTTOMHALF | MAX_MAXIMUS); int flags = directions & ~requested; - - if (!effective) { - /* allow wMaximizeWindow to restore the Maximusized size */ - if ((wwin->flags.old_maximized & MAX_MAXIMUS) && - !(requested & MAX_MAXIMUS)) - wMaximizeWindow(wwin, flags); - else - wUnmaximizeWindow(wwin); - } - else { - /* MAX_MAXIMUS takes precedence */ - effective &= ~MAX_MAXIMUS; - if (requested & MAX_MAXIMUS) { - /* window was previously Maximusized then maximized */ - if ((wwin->flags.old_maximized & MAX_MAXIMUS) && !current) { - wUnmaximizeWindow(wwin); - return; - } - else - effective = MAX_MAXIMUS; - } - else if (requested == (MAX_HORIZONTAL | MAX_VERTICAL)) - effective = requested; + int current = wwin->flags.maximized; + int effective = requested; + + /* test if is a maximize change */ + if (requested ^ current) { + if (directions & MAX_MAXIMUS) + effective = MAX_MAXIMUS; + else if ((directions & MAX_HORIZONTAL) & (directions & MAX_VERTICAL)) + effective = MAX_HORIZONTAL | MAX_VERTICAL; else { - /* handle MAX_HORIZONTAL -> MAX_(LEFT|RIGHT)HALF */ - if (IS_MAX_HORIZONTALLY(current)) { - if (IS_MAX_HORIZONTALLY(requested)) { - effective &= ~(MAX_HORIZONTAL | MAX_LEFTHALF | MAX_RIGHTHALF); - effective |= (requested & (MAX_HORIZONTAL | MAX_LEFTHALF | MAX_RIGHTHALF)); - if (requested & MAX_HORIZONTAL) { - /* restore to half maximization */ - if (wwin->flags.old_maximized & MAX_LEFTHALF) - effective |= MAX_LEFTHALF; - else if (wwin->flags.old_maximized & MAX_RIGHTHALF) - effective |= MAX_RIGHTHALF; - } - /* MAX_VERTICAL is implicit with MAX_(LEFT|RIGHT)HALF */ - else - effective |= MAX_VERTICAL; - } else { - /* toggling MAX_VERTICAL */ - if ((requested & MAX_VERTICAL) && - (current & MAX_VERTICAL)) { - effective &= ~(MAX_LEFTHALF | MAX_RIGHTHALF | MAX_VERTICAL); - } - } - } - /* handle MAX_VERTICAL -> MAX_(LEFT|RIGHT)HALF */ - if (current & MAX_VERTICAL) { - if ((requested & MAX_LEFTHALF) || - (requested & MAX_RIGHTHALF)) { + /* there is 8 possible window positions here: + * left, right, top, bottom and 4 corners */ + /* if left and not (top or bottom) then max vertical */ + if (directions & MAX_LEFTHALF) { + if (!(directions & (MAX_TOPHALF | MAX_BOTTOMHALF))) effective |= MAX_VERTICAL; - } + effective &= ~MAX_RIGHTHALF; + } else if (directions & MAX_RIGHTHALF) { + if (!(directions & (MAX_TOPHALF | MAX_BOTTOMHALF))) + effective |= MAX_VERTICAL; + effective &= ~MAX_LEFTHALF; + } + if (directions & MAX_TOPHALF) { + if (!(directions & (MAX_LEFTHALF | MAX_RIGHTHALF))) + effective |= MAX_HORIZONTAL; + effective &= ~MAX_BOTTOMHALF; + } else if (directions & MAX_BOTTOMHALF) { + if (!(directions & (MAX_LEFTHALF | MAX_RIGHTHALF))) + effective |= MAX_HORIZONTAL; + effective &= ~MAX_TOPHALF; } - /* toggling MAX_HORIZONTAL */ - if ((requested & MAX_HORIZONTAL) && - (current & MAX_HORIZONTAL)) - effective &= ~MAX_HORIZONTAL; } wMaximizeWindow(wwin, effective | flags); - } - return; + } else + wUnmaximizeWindow(wwin); } /* the window boundary coordinates */ @@ -719,7 +659,6 @@ void wUnmaximizeWindow(WWindow *wwin) } wwin->flags.maximized = 0; - wwin->flags.old_maximized = 0; wWindowConfigure(wwin, x, y, w, h); wWindowSynthConfigureNotify(wwin); diff --git a/src/actions.h b/src/actions.h index 55de740..8390e49 100644 --- a/src/actions.h +++ b/src/actions.h @@ -27,9 +27,11 @@ #define MAX_VERTICAL (1 << 1) #define MAX_LEFTHALF (1 << 2) #define MAX_RIGHTHALF (1 << 3) -#define MAX_MAXIMUS (1 << 4) -#define MAX_IGNORE_XINERAMA (1 << 5) -#define MAX_KEYBOARD (1 << 6) +#define MAX_TOPHALF (1 << 4) +#define MAX_BOTTOMHALF (1 << 5) +#define MAX_MAXIMUS (1 << 6) +#define MAX_IGNORE_XINERAMA (1 << 7) +#define MAX_KEYBOARD (1 << 8) #define SAVE_GEOMETRY_X (1 << 0) #define SAVE_GEOMETRY_Y (1 << 1) diff --git a/src/defaults.c b/src/defaults.c index 53d8173..75f8ccc 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -603,6 +603,18 @@ WDefaultEntry optionList[] = { NULL, getKeybind, setKeyGrab, NULL, NULL}, {"RHMaximizeKey", "None", (void*)WKBD_RHMAXIMIZE, NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"THMaximizeKey", "None", (void*)WKBD_THMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"BHMaximizeKey", "None", (void*)WKBD_BHMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"LTCMaximizeKey", "None", (void*)WKBD_LTCMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"RTCMaximizeKey", "None", (void*)WKBD_RTCMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"LBCMaximizeKey", "None", (void*)WKBD_LBCMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, + {"RBCMaximizeKey", "None", (void*)WKBD_RBCMAXIMIZE, + NULL, getKeybind, setKeyGrab, NULL, NULL}, {"MaximusKey", "None", (void*)WKBD_MAXIMUS, NULL, getKeybind, setKeyGrab, NULL, NULL}, {"RaiseKey", "\"Meta+Up\"", (void *)WKBD_RAISE, diff --git a/src/event.c b/src/event.c index a8f71f7..26cb445 100644 --- a/src/event.c +++ b/src/event.c @@ -1470,6 +1470,48 @@ static void handleKeyPress(XEvent * event) handleMaximize(wwin, MAX_VERTICAL | MAX_RIGHTHALF | MAX_KEYBOARD); } break; + case WKBD_THMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_HORIZONTAL | MAX_TOPHALF | MAX_KEYBOARD); + } + break; + case WKBD_BHMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_HORIZONTAL | MAX_BOTTOMHALF | MAX_KEYBOARD); + } + break; + case WKBD_LTCMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_LEFTHALF | MAX_TOPHALF | MAX_KEYBOARD); + } + break; + case WKBD_RTCMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_RIGHTHALF | MAX_TOPHALF | MAX_KEYBOARD); + } + break; + case WKBD_LBCMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_LEFTHALF | MAX_BOTTOMHALF | MAX_KEYBOARD); + } + break; + case WKBD_RBCMAXIMIZE: + if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { + CloseWindowMenu(scr); + + handleMaximize(wwin, MAX_RIGHTHALF | MAX_BOTTOMHALF | MAX_KEYBOARD); + } + break; case WKBD_MAXIMUS: if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) { CloseWindowMenu(scr); diff --git a/src/keybind.h b/src/keybind.h index 4437950..49552a1 100644 --- a/src/keybind.h +++ b/src/keybind.h @@ -35,8 +35,14 @@ enum { WKBD_MAXIMIZE, WKBD_VMAXIMIZE, WKBD_HMAXIMIZE, - WKBD_LHMAXIMIZE, + WKBD_LHMAXIMIZE, WKBD_RHMAXIMIZE, + WKBD_THMAXIMIZE, + WKBD_BHMAXIMIZE, + WKBD_LTCMAXIMIZE, + WKBD_RTCMAXIMIZE, + WKBD_LBCMAXIMIZE, + WKBD_RBCMAXIMIZE, WKBD_MAXIMUS, WKBD_SELECT, WKBD_RAISE, diff --git a/src/window.h b/src/window.h index a95b9f7..182db56 100644 --- a/src/window.h +++ b/src/window.h @@ -249,8 +249,7 @@ typedef struct WWindow { unsigned int miniaturized:1; unsigned int hidden:1; unsigned int shaded:1; - unsigned int maximized:5; - unsigned int old_maximized:5; + unsigned int maximized:7; unsigned int fullscreen:1; unsigned int omnipresent:1; unsigned int semi_focused:1; -- 1.8.1.2 -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.