Left Half / Right Half Maximize
authorJohann Haarhoff <johann@haarhoff.org.za>
Fri, 28 Aug 2009 19:31:26 +0000 (28 21:31 +0200)
committerCarlos R. Mafra <crmafra@gmail.com>
Sat, 29 Aug 2009 19:49:16 +0000 (29 21:49 +0200)
This adds Left Half / Right Half Maximize capability to WindowMaker.
It allows you to maximize a window to only the left or right half
of your screen.

It is useful on widescreen displays where one might to bring up
two different windows side-by-side.

WPrefs.app/KeyboardShortcuts.c
src/actions.c
src/actions.h
src/defaults.c
src/event.c
src/keybind.h
src/window.h

index ed0aff1..919d73b 100644 (file)
@@ -72,6 +72,8 @@ static char *keyOptions[] = {
        "MaximizeKey",
        "VMaximizeKey",
        "HMaximizeKey",
+       "LHMaximizeKey",
+       "RHMaximizeKey",
        "RaiseKey",
        "LowerKey",
        "RaiseLowerKey",
@@ -473,6 +475,8 @@ static void createPanel(Panel * p)
        WMAddListItem(panel->actLs, _("Maximize active window"));
        WMAddListItem(panel->actLs, _("Maximize active window vertically"));
        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, _("Raise active window"));
        WMAddListItem(panel->actLs, _("Lower active window"));
        WMAddListItem(panel->actLs, _("Raise/Lower window under mouse pointer"));
index 1ecb293..fc3d0cd 100644 (file)
@@ -394,7 +394,7 @@ void wMaximizeWindow(WWindow * wwin, int directions)
                wUnshadeWindow(wwin);
        }
        /* Only save directions, not kbd or xinerama hints */
-       directions &= (MAX_HORIZONTAL | MAX_VERTICAL);
+       directions &= (MAX_HORIZONTAL|MAX_VERTICAL|MAX_LEFTHALF|MAX_RIGHTHALF);
 
        changed_h = ((wwin->flags.maximized ^ directions) & MAX_HORIZONTAL);
        changed_v = ((wwin->flags.maximized ^ directions) & MAX_VERTICAL);
@@ -407,7 +407,7 @@ void wMaximizeWindow(WWindow * wwin, int directions)
                 * allow succesive maximizations in different directions without
                 * the need to first do an un-maximize (to avoid flicker).
                 */
-               if (!(wwin->flags.maximized & MAX_HORIZONTAL)) {
+               if (!(wwin->flags.maximized & (MAX_HORIZONTAL|MAX_LEFTHALF|MAX_RIGHTHALF))) {
                        wwin->old_geometry.x = wwin->frame_x;
                }
                if (!(wwin->flags.maximized & MAX_VERTICAL)) {
@@ -426,6 +426,16 @@ void wMaximizeWindow(WWindow * wwin, int directions)
                if (HAS_BORDER(wwin))
                        new_width -= FRAME_BORDER_WIDTH * 2;
                new_x = usableArea.x1;
+       } else if (directions & MAX_LEFTHALF) {
+               new_width = (usableArea.x2 - usableArea.x1)/2;
+               if (HAS_BORDER(wwin))
+                       new_width -= FRAME_BORDER_WIDTH * 2;
+               new_x = usableArea.x1;
+       } else if (directions & MAX_RIGHTHALF) {
+               new_width = (usableArea.x2 - usableArea.x1)/2;
+               if (HAS_BORDER(wwin))
+                       new_width -= FRAME_BORDER_WIDTH * 2;
+               new_x = usableArea.x1+((usableArea.x2 - usableArea.x1)/2);
        } else if (shrink_h) {
                new_x = wwin->old_geometry.x;
                new_width = wwin->old_geometry.width;
@@ -478,7 +488,7 @@ void wUnmaximizeWindow(WWindow * wwin)
                wwin->flags.skip_next_animation = 1;
                wUnshadeWindow(wwin);
        }
-       x = ((wwin->flags.maximized & MAX_HORIZONTAL) && wwin->old_geometry.x) ?
+       x = ((wwin->flags.maximized & (MAX_HORIZONTAL|MAX_LEFTHALF|MAX_RIGHTHALF)) && wwin->old_geometry.x) ?
            wwin->old_geometry.x : wwin->frame_x;
        y = ((wwin->flags.maximized & MAX_VERTICAL) && wwin->old_geometry.y) ?
            wwin->old_geometry.y : wwin->frame_y;
index 1674dc8..f420078 100644 (file)
 
 #define MAX_HORIZONTAL         1
 #define MAX_VERTICAL   2
-#define MAX_IGNORE_XINERAMA 4
-#define MAX_KEYBOARD 8
+#define MAX_LEFTHALF   4
+#define MAX_RIGHTHALF  8
+#define MAX_IGNORE_XINERAMA 16
+#define MAX_KEYBOARD 32
 
 void wSetFocusTo(WScreen *scr, WWindow *wwin);
 
index 1dec523..ef1fb71 100644 (file)
@@ -579,6 +579,10 @@ WDefaultEntry optionList[] = {
         NULL, getKeybind, setKeyGrab},
        {"HMaximizeKey", "None", (void *)WKBD_HMAXIMIZE,
         NULL, getKeybind, setKeyGrab},
+       {"LHMaximizeKey", "None", (void*)WKBD_LHMAXIMIZE,
+        NULL, getKeybind, setKeyGrab},
+       {"RHMaximizeKey", "None", (void*)WKBD_RHMAXIMIZE,
+        NULL, getKeybind, setKeyGrab},
        {"RaiseKey", "\"Meta+Up\"", (void *)WKBD_RAISE,
         NULL, getKeybind, setKeyGrab},
        {"LowerKey", "\"Meta+Down\"", (void *)WKBD_LOWER,
index 2069ee5..da83149 100644 (file)
@@ -1471,6 +1471,32 @@ static void handleKeyPress(XEvent * event)
                        }
                }
                break;
+       case WKBD_LHMAXIMIZE:
+               if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) {
+                       int newdir = (MAX_VERTICAL|MAX_LEFTHALF);
+
+                       CloseWindowMenu(scr);
+
+                       if (wwin->flags.maximized == newdir) {
+                               wUnmaximizeWindow(wwin);
+                       } else {
+                               wMaximizeWindow(wwin, newdir|MAX_KEYBOARD);
+                       }
+               }
+               break;
+       case WKBD_RHMAXIMIZE:
+               if (ISMAPPED(wwin) && ISFOCUSED(wwin) && IS_RESIZABLE(wwin)) {
+                       int newdir = (MAX_VERTICAL|MAX_RIGHTHALF);
+
+                       CloseWindowMenu(scr);
+
+                       if (wwin->flags.maximized == newdir) {
+                               wUnmaximizeWindow(wwin);
+                       } else {
+                               wMaximizeWindow(wwin, newdir|MAX_KEYBOARD);
+                       }
+               }
+               break;
        case WKBD_RAISE:
                if (ISMAPPED(wwin) && ISFOCUSED(wwin)) {
                        CloseWindowMenu(scr);
index 4165b48..d129a69 100644 (file)
 #define WKBD_MAXIMIZE           6
 #define WKBD_VMAXIMIZE          7
 #define WKBD_HMAXIMIZE          8
-#define WKBD_SELECT             9
+#define WKBD_LHMAXIMIZE                9
+#define WKBD_RHMAXIMIZE                10
+#define WKBD_SELECT             11
 /* Clip */
-#define WKBD_CLIPLOWER          10
-#define WKBD_CLIPRAISE         11
-#define WKBD_CLIPRAISELOWER    12
+#define WKBD_CLIPLOWER          12
+#define WKBD_CLIPRAISE         13
+#define WKBD_CLIPRAISELOWER    14
 /* window */
-#define WKBD_RAISE             13
-#define WKBD_LOWER             14
-#define WKBD_RAISELOWER                15
-#define WKBD_MOVERESIZE                16
-#define WKBD_SHADE             17
+#define WKBD_RAISE             15
+#define WKBD_LOWER             16
+#define WKBD_RAISELOWER                17
+#define WKBD_MOVERESIZE                18
+#define WKBD_SHADE             19
 /* window, menu */
-#define WKBD_CLOSE             18
+#define WKBD_CLOSE             20
 /* window */
-#define WKBD_FOCUSNEXT         19
-#define WKBD_FOCUSPREV          20
+#define WKBD_FOCUSNEXT         21
+#define WKBD_FOCUSPREV          22
 
-#define WKBD_WORKSPACE1                21
-#define WKBD_WORKSPACE2                22
-#define WKBD_WORKSPACE3                23
-#define WKBD_WORKSPACE4                24
-#define WKBD_WORKSPACE5                25
-#define WKBD_WORKSPACE6                26
-#define WKBD_WORKSPACE7                27
-#define WKBD_WORKSPACE8                28
-#define WKBD_WORKSPACE9                29
-#define WKBD_WORKSPACE10       30
-#define WKBD_NEXTWORKSPACE     31
-#define WKBD_PREVWORKSPACE     32
-#define WKBD_NEXTWSLAYER       33
-#define WKBD_PREVWSLAYER       34
+#define WKBD_WORKSPACE1                23
+#define WKBD_WORKSPACE2                24
+#define WKBD_WORKSPACE3                25
+#define WKBD_WORKSPACE4                26
+#define WKBD_WORKSPACE5                27
+#define WKBD_WORKSPACE6                28
+#define WKBD_WORKSPACE7                29
+#define WKBD_WORKSPACE8                30
+#define WKBD_WORKSPACE9                31
+#define WKBD_WORKSPACE10       32
+#define WKBD_NEXTWORKSPACE     33
+#define WKBD_PREVWORKSPACE     34
+#define WKBD_NEXTWSLAYER       35
+#define WKBD_PREVWSLAYER       36
 
 /* window shortcuts */
-#define WKBD_WINDOW1           35
-#define WKBD_WINDOW2           36
-#define WKBD_WINDOW3           37
-#define WKBD_WINDOW4           38
-#define WKBD_WINDOW5           39
-#define WKBD_WINDOW6           40
-#define WKBD_WINDOW7           41
-#define WKBD_WINDOW8           42
-#define WKBD_WINDOW9           43
-#define WKBD_WINDOW10          44
+#define WKBD_WINDOW1           37
+#define WKBD_WINDOW2           38
+#define WKBD_WINDOW3           39
+#define WKBD_WINDOW4           40
+#define WKBD_WINDOW5           41
+#define WKBD_WINDOW6           42
+#define WKBD_WINDOW7           43
+#define WKBD_WINDOW8           44
+#define WKBD_WINDOW9           45
+#define WKBD_WINDOW10          46
 
-#define WKBD_SWITCH_SCREEN      45
+#define WKBD_SWITCH_SCREEN      47
 
 #ifdef KEEP_XKB_LOCK_STATUS
-# define WKBD_TOGGLE           46
-# define WKBD_TMP              47
+# define WKBD_TOGGLE           48
+# define WKBD_TMP              49
 #else
-# define WKBD_TMP              46
+# define WKBD_TMP              48
 #endif
 
 #ifdef VIRTUAL_DESKTOP
index f729fd9..5e69eb2 100644 (file)
@@ -258,7 +258,7 @@ typedef struct WWindow {
         unsigned int miniaturized:1;
         unsigned int hidden:1;
         unsigned int shaded:1;
-        unsigned int maximized:2;
+               unsigned int maximized:4;
         unsigned int fullscreen:1;
         unsigned int omnipresent:1;