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 | 252 +++++++++++++++++------------------------
src/actions.h | 8 +-
src/defaults.c | 12 ++
src/event.c | 41 +++++++
src/keybind.h | 8 +-
src/window.h | 3 +-
7 files changed, 179 insertions(+), 157 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 b461d4d..e6c2980 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -341,46 +341,54 @@ 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;
+ fprintf(stderr, "FLAGS:\t\tMH=%d, MV=%d, ML=%d, MR=%d, MT=%d, MB=%d,
MM=%d\n",
+ wwin->flags.maximized & MAX_HORIZONTAL,
+ wwin->flags.maximized & MAX_VERTICAL,
+ wwin->flags.maximized & MAX_LEFTHALF,
+ wwin->flags.maximized & MAX_RIGHTHALF,
+ wwin->flags.maximized & MAX_TOPHALF,
+ wwin->flags.maximized & MAX_BOTTOMHALF,
+ wwin->flags.maximized & MAX_MAXIMUS);
+ fprintf(stderr, "DIRECTIONS\tMH=%d, MV=%d, ML=%d, MR=%d, MT=%d, MB=%d,
MM=%d\n",
+ directions & MAX_HORIZONTAL,
+ directions & MAX_VERTICAL,
+ directions & MAX_LEFTHALF,
+ directions & MAX_RIGHTHALF,
+ directions & MAX_TOPHALF,
+ directions & MAX_BOTTOMHALF,
+ directions & MAX_MAXIMUS);
+ fprintf(stderr, "x=%d, y=%d, w=%d, h=%d\n",
+ wwin->old_geometry.x,
+ wwin->old_geometry.y,
+ wwin->old_geometry.width,
+ wwin->old_geometry.height);
+ 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;
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;
@@ -399,89 +407,66 @@ 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_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;
+ }
+ 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;
+ }
+ }
}
+ /* set maximization state */
+ wwin->flags.maximized = directions;
+
wWindowConstrainSize(wwin, &new_width, &new_height);
wWindowCropSize(wwin, usableArea.x2 - usableArea.x1,
@@ -491,82 +476,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 */
@@ -718,7 +669,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 5300a23..9ec7a1b 100644
--- a/src/defaults.c
+++ b/src/defaults.c
@@ -602,6 +602,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 302497b..3f73ff6 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1469,6 +1469,47 @@ 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);
+ }
+ 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 [email protected].