[PATCH 3/6] Alternative way for traversing half-maximized windows.

Roman Dobosz <[email protected]>
Newsgroups gmane.compw.window-managers.windowmaker.devel
Message-ID <[email protected]>
Now it is possible for change a bit pattern for changing state between
half-maximized windows. Half maximized windows will become maximized if
there is issued half-maximizing shortcut in opposite direction. Issue
half-maximizing command on same direction on already maximized window,
will have no effect.
---
 NEWS          | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/actions.c |  64 ++++++++++++++++++++++++++++++++---
 2 files changed, 165 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index cdb41d5..f2b1b30 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,111 @@ NEWS for veteran Window Maker users
 -- 0.95.8
 
 
+Alternative way for traverse half-maximized windows
+---------------------------------------------------
+
+For now, there could be three possible state of the window while using
+half-maximized feature. Unmaximized window have its state saved during that
+process, which was use to unmaximize it. For example, if there is a window,
+which is maximized on the half left side of the screen, and while requesting
+left-half-maximized, it become unmaximized with size and dimension restored to
+original state.
+
+By setting "AlternativeHalfMaximized" option to "Yes"
+~/GNUstep/Defaults/WindowMaker config file (or by using WPrefs.app and option
+"Alternative transitions between states for half maximized windows."), there
+would be slightly different change in window "traverse". Given layout depicted
+below:
+
+ ┌┬────────────────────┬┐
+ ├┘ ┌───────┐          ├┤
+ │  ├───────┤          ├┤
+ │  │       │          ├┤
+ │  │       │          ├┤
+ │  └───────┘          └┤
+ ├┬┐                    │
+ └┴┴────────────────────┘
+
+Window can be moved using keyboard shortcut right-half-maximize:
+
+ ┌┬─────────┬──────────┬┐
+ ├┘         ├──────────┼┤
+ │          │          ├┤
+ │          │          ├┤
+ │          │          ├┤
+ │          │          ├┤
+ ├┬┐        └──────────┘│
+ └┴┴────────────────────┘
+
+Further invoking right-half-maximize will do nothing. Note, that window always
+can be unmaximzied using appropriate keyboard shortcut or by selecting
+"Unmaximize" from window menu.
+
+Going to opposite direction by invoking left-half-maximize, will make the window
+maximized in both, vertical and horizontal directions:
+
+ ┌─────────────────────┬┐
+ ├─────────────────────┼┤
+ │                     ├┤
+ │                     ├┤
+ │                     ├┤
+ │                     ├┤
+ ├┬┬───────────────────┘│
+ └┴┴────────────────────┘
+
+Further invoking left-half-maximize, will make the window maximized in half left
+side od the screen:
+
+ ┌──────────┬──────────┬┐
+ ├──────────┤          ├┤
+ │          │          ├┤
+ │          │          ├┤
+ │          │          ├┤
+ │          │          └┤
+ ├┬┬────────┘           │
+ └┴┴────────────────────┘
+
+And again, further invoking left-half-maximize, will do nothing in this mode.
+
+This change affects all possible half-maximized window state also quarters.
+Issuing bottom-left-corner will take lower left quarter of the screen (nothing
+is new so far):
+
+ ┌┬────────────────────┬┐
+ ├┘                    ├┤
+ │                     ├┤
+ ├──────────┐          ├┤
+ ├──────────┤          ├┤
+ │          │          └┤
+ ├┬┬────────┘           │
+ └┴┴────────────────────┘
+
+Issuing bottom-right-corner again will change window state to bottom half
+maximized:
+
+ ┌┬────────────────────┬┐
+ ├┘                    ├┤
+ │                     ├┤
+ ├─────────────────────┼┤
+ ├─────────────────────┼┤
+ │                     ├┤
+ ├┬┬───────────────────┘│
+ └┴┴────────────────────┘
+
+Invoking bottom-right-corner again:
+
+ ┌┬────────────────────┬┐
+ ├┘                    ├┤
+ │                     ├┤
+ │          ┌──────────┼┤
+ │          ├──────────┼┤
+ │          │          ├┤
+ ├┬┐        └──────────┘│
+ └┴┴────────────────────┘
+
+Issuing bottom-right-corner again will have no effect.
+
+
 Move half-maximized windows between the screens
 -----------------------------------------------
 
diff --git a/src/actions.c b/src/actions.c
index 119f5ec..cf0699e 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -505,7 +505,10 @@ void handleMaximize(WWindow *wwin, int directions)
 		if ((wwin->flags.old_maximized & MAX_MAXIMUS) &&
 				!(requested & MAX_MAXIMUS))
 			wMaximizeWindow(wwin, MAX_MAXIMUS | flags, head);
-
+		else if (wPreferences.alt_half_maximize &&
+				current & MAX_HORIZONTAL && current & MAX_VERTICAL &&
+				requested & MAX_HORIZONTAL && requested & MAX_VERTICAL)
+			wUnmaximizeWindow(wwin);
 		else if (wPreferences.move_half_max_between_heads) {
 			/* Select windows, which are only horizontally or vertically
 			 * maximized. Quarters cannot be handled here, since there is not
@@ -552,11 +555,11 @@ void handleMaximize(WWindow *wwin, int directions)
 					 * not from mouse pointer */
 					wMaximizeWindow(wwin, (effective | flags | MAX_KEYBOARD),
 							dest_head);
-				else
+				else if (!wPreferences.alt_half_maximize)
 					wUnmaximizeWindow(wwin);
-			} else
+			} else if (!wPreferences.alt_half_maximize)
 				wUnmaximizeWindow(wwin);
-		} else
+		} else if (!wPreferences.alt_half_maximize)
 			wUnmaximizeWindow(wwin);
 	/* these alone mean vertical|horizontal toggle */
 	} else if ((effective == MAX_LEFTHALF) ||
@@ -564,6 +567,59 @@ void handleMaximize(WWindow *wwin, int directions)
 			(effective == MAX_TOPHALF) ||
 			(effective == MAX_BOTTOMHALF))
 		wUnmaximizeWindow(wwin);
+
+	/* Following conditions might look complicated, but they are really simple:
+	 * allow fullscreen transition only for half maximized state (and not
+	 * corners) and only when requested state is also half maximized, but on
+	 * opposite side of the screen. As for corners, it is similar, but
+	 * expected is that only quarter maximized windows on corner can change
+	 * it's state to half maximized window, depending on direction. Note, that
+	 * MAX_KEYBOARD is passed to the wMaximizeWindow function, to preserve the
+	 * head, even if mouse was used for triggering the action. */
+
+	/* Quarters alternative transition. */
+	else if (wPreferences.alt_half_maximize &&
+			((requested & MAX_LEFTHALF && requested & MAX_TOPHALF &&
+			  current & MAX_RIGHTHALF && current & MAX_TOPHALF) ||
+			(requested & MAX_RIGHTHALF && requested & MAX_TOPHALF &&
+			  current & MAX_LEFTHALF && current & MAX_TOPHALF)))
+		wMaximizeWindow(wwin, (MAX_TOPHALF | MAX_HORIZONTAL | MAX_KEYBOARD),
+				head);
+	else if (wPreferences.alt_half_maximize &&
+			((requested & MAX_LEFTHALF && requested & MAX_BOTTOMHALF &&
+			 current & MAX_RIGHTHALF && current & MAX_BOTTOMHALF) ||
+			(requested & MAX_RIGHTHALF && requested & MAX_BOTTOMHALF &&
+			 current & MAX_LEFTHALF && current & MAX_BOTTOMHALF)))
+		wMaximizeWindow(wwin, (MAX_BOTTOMHALF | MAX_HORIZONTAL | MAX_KEYBOARD),
+				head);
+	else if (wPreferences.alt_half_maximize &&
+			((requested & MAX_LEFTHALF && requested & MAX_BOTTOMHALF &&
+			 current & MAX_LEFTHALF && current & MAX_TOPHALF) ||
+			(requested & MAX_LEFTHALF && requested & MAX_TOPHALF &&
+			 current & MAX_LEFTHALF && current & MAX_BOTTOMHALF)))
+		wMaximizeWindow(wwin, (MAX_LEFTHALF | MAX_VERTICAL| MAX_KEYBOARD),
+				head);
+	else if (wPreferences.alt_half_maximize &&
+			((requested & MAX_RIGHTHALF && requested & MAX_BOTTOMHALF &&
+			 current & MAX_RIGHTHALF && current & MAX_TOPHALF) ||
+			(requested & MAX_RIGHTHALF && requested & MAX_TOPHALF &&
+			 current & MAX_RIGHTHALF && current & MAX_BOTTOMHALF)))
+		wMaximizeWindow(wwin, (MAX_RIGHTHALF | MAX_VERTICAL| MAX_KEYBOARD),
+				head);
+
+	/* Half-maximized alternative transition */
+	else if (wPreferences.alt_half_maximize && (
+				(requested & MAX_LEFTHALF && requested & MAX_VERTICAL &&
+				 current & MAX_RIGHTHALF && current & MAX_VERTICAL) ||
+				(requested & MAX_RIGHTHALF && requested & MAX_VERTICAL &&
+				 current & MAX_LEFTHALF && current & MAX_VERTICAL) ||
+				(requested & MAX_TOPHALF && requested & MAX_HORIZONTAL &&
+				 current & MAX_BOTTOMHALF && current & MAX_HORIZONTAL) ||
+				(requested & MAX_BOTTOMHALF && requested & MAX_HORIZONTAL &&
+				 current & MAX_TOPHALF && current & MAX_HORIZONTAL)))
+		wMaximizeWindow(wwin, (MAX_HORIZONTAL|MAX_VERTICAL|MAX_KEYBOARD),
+				head);
+
 	else {
 		if ((requested == (MAX_HORIZONTAL | MAX_VERTICAL)) ||
 				(requested == MAX_MAXIMUS))
-- 
2.10.2


-- 
To unsubscribe, send mail to [email protected].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.