[Pkg-wmaker-commits] [wmaker] 17/40: Added possibility for half-maximized windows to move across the screens.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Sat Mar 11 13:08:18 UTC 2017


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch upstream
in repository wmaker.

commit 28da4c98e38db6ac783e2b95ae96ec1928653672
Author: gryf <gryf73 at gmail.com>
Date:   Tue Feb 7 21:05:17 2017 +0100

    Added possibility for half-maximized windows to move across the screens.
    
    Using MoveHalfMaximizedWindowsBetweenScreens option user can enable
    ability for moving half-maximized windows not only within current
    screen/head/display, but also to other heads, if they exists. Note, that
    only vertically or horizontally maximized windows can be transfered to
    another display. Quarter-maximized windows are not supported, since it
    is ambiguous to predict in which direction such window should be moved.
---
 NEWS          | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/actions.c | 48 ++++++++++++++++++++++++++++++++-
 2 files changed, 133 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 4dcacb7..b407b78 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,92 @@ respectively.  This setting can also be changed by unchecking or checking
 "Expert User Preferences" tab in WPrefs.app.
 
 
+Move half-maximized windows between the screens
+-----------------------------------------------
+
+New option was introduced to allow change of behaviour of half-maximize windows
+in multiple displays environment. In such environment it is more natural that
+half maximized windows would travel from one screen to another. Now it is
+possible to make that happen by setting an option
+"MoveHalfMaximizedWindowsBetweenScreens" to "Yes" in
+~/GNUstep/Defaults/WindowMaker config file, or by checking "Allow move
+half-maximized windows between multiple screens." in 'Expert User Preferences"
+tab in WPrefs.app.
+
+For example, given there are two screens in layout where one display is on the
+left and second display is on the right with window on first screen:
+
+ ┌┬────────────────┬─────────────────┬┐
+ ├┘ ┌───────┐      │                 ├┤
+ │  ├───────┤      │                 ├┤
+ │  │       │      │                 ├┤
+ │  │       │      │                 ├┤
+ │  └───────┘      │                 └┤
+ ├┬┐               ├┬┬┐               │
+ └┴┴───────────────┴┴┴┴───────────────┘
+
+It can be right-half-maximized (using previously defined key combination), so it
+become:
+
+ ┌┬───────┬────────┬─────────────────┬┐
+ ├┘       ├────────┤                 ├┤
+ │        │        │                 ├┤
+ │        │        │                 ├┤
+ │        │        │                 ├┤
+ │        │        │                 └┤
+ ├┬┐      └────────┼┬┬┐               │
+ └┴┴───────────────┴┴┴┴───────────────┘
+
+In this example there is an assumption that WindowMaker is configured, that
+maximized windows wont cover mini icons nor dock.
+
+Without setting new option to true, issuing another right-half-maximize will
+restore window dimensions and position to the original state (like on the first
+figure). With new option set to true it will move window to second screen like:
+
+ ┌┬────────────────┬────────┬────────┬┐
+ ├┘                ├────────┤        ├┤
+ │                 │        │        ├┤
+ │                 │        │        ├┤
+ │                 │        │        ├┤
+ │                 │        │        └┤
+ ├┬┐               ├┬┬┬─────┘         │
+ └┴┴───────────────┴┴┴┴───────────────┘
+
+Another activation of right-half-maxmimize:
+
+ ┌┬────────────────┬────────┬────────┬┐
+ ├┘                │        ├────────┼┤
+ │                 │        │        ├┤
+ │                 │        │        ├┤
+ │                 │        │        ├┤
+ │                 │        │        ├┤
+ ├┬┐               ├┬┬┐     └────────┘│
+ └┴┴───────────────┴┴┴┴───────────────┘
+
+And final activation of right-half-maxmimize:
+
+ ┌┬────────────────┬───────┬─────────┬┐
+ ├┘                ├───────┤         ├┤
+ │                 │       │         ├┤
+ │                 │       │         ├┤
+ │                 ├───────┘         ├┤
+ │                 │                 └┤
+ ├┬┐               ├┬┬┐               │
+ └┴┴───────────────┴┴┴┴───────────────┘
+
+Where window is restored its size (but not position, since it it on different
+head now). Moving window in directions like left-half-maximize,
+top-half-maximize and bottom-half-maximize will behave in similar way depending
+on the layout of displays.
+
+Note, that only windows that are half-maximized vertically or horizontally can
+be moved to another screen due to the fact, that direction of movement of
+quarter-maximized windows is ambiguous. As for vertical/horizontal-maximize,
+since doesn't move the window but only strech it vertically/horizontally this
+feature also doesn't apply.
+
+
 -- 0.95.7
 
 Window snapping
diff --git a/src/actions.c b/src/actions.c
index b2a2bbb..4a96ce3 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -496,7 +496,53 @@ void handleMaximize(WWindow *wwin, int directions)
 		if ((wwin->flags.old_maximized & MAX_MAXIMUS) &&
 				!(requested & MAX_MAXIMUS))
 			wMaximizeWindow(wwin, MAX_MAXIMUS | flags, head);
-		else
+
+		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
+			 * clear on which direction user intend to move such window. */
+			if ((current & MAX_VERTICAL) || (current & MAX_HORIZONTAL)) {
+				if (requested & MAX_LEFTHALF && current & MAX_LEFTHALF) {
+					head = wGetHeadRelativeToCurrentHead(wwin->screen_ptr,
+							head, DIRECTION_LEFT);
+					if (head != -1) {
+						effective |= MAX_RIGHTHALF;
+						effective |= MAX_VERTICAL;
+						effective &= ~(MAX_HORIZONTAL | MAX_LEFTHALF);
+					}
+				} else if (requested & MAX_RIGHTHALF &&
+						current & MAX_RIGHTHALF) {
+					head = wGetHeadRelativeToCurrentHead(wwin->screen_ptr,
+							head, DIRECTION_RIGHT);
+					if (head != -1) {
+						effective |= MAX_LEFTHALF;
+						effective |= MAX_VERTICAL;
+						effective &= ~(MAX_HORIZONTAL | MAX_RIGHTHALF);
+					}
+				} else if (requested & MAX_TOPHALF && current & MAX_TOPHALF) {
+					head = wGetHeadRelativeToCurrentHead(wwin->screen_ptr,
+							head, DIRECTION_UP);
+					if (head != -1) {
+						effective |= MAX_BOTTOMHALF;
+						effective |= MAX_HORIZONTAL;
+						effective &= ~(MAX_VERTICAL | MAX_TOPHALF);
+					}
+				} else if (requested & MAX_BOTTOMHALF && 
+						current & MAX_BOTTOMHALF) {
+					head = wGetHeadRelativeToCurrentHead(wwin->screen_ptr,
+							head, DIRECTION_DOWN);
+					if (head != -1) {
+						effective |= MAX_TOPHALF;
+						effective |= MAX_HORIZONTAL;
+						effective &= ~(MAX_VERTICAL | MAX_BOTTOMHALF);
+					}
+				} if (head == -1)
+					wUnmaximizeWindow(wwin);
+				else
+					wMaximizeWindow(wwin, effective | flags, head);
+			} else
+				wUnmaximizeWindow(wwin);
+		} else
 			wUnmaximizeWindow(wwin);
 	/* these alone mean vertical|horizontal toggle */
 	} else if ((effective == MAX_LEFTHALF) ||

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmaker.git



More information about the Pkg-wmaker-commits mailing list