1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-18 20:10:29 +01:00

Alternative way for traversing half-maximized windows.

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.
This commit is contained in:
2017-02-21 18:56:13 +01:00
committed by Carlos R. Mafra
parent 9e7987713f
commit eadb7f3ab2
2 changed files with 165 additions and 4 deletions

105
NEWS
View File

@@ -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
-----------------------------------------------

View File

@@ -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))