summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/extern.h1
-rw-r--r--src/parser.c1
-rw-r--r--src/sxwm.c50
3 files changed, 51 insertions, 1 deletions
diff --git a/src/extern.h b/src/extern.h
index 3816c5f..5e0bf4c 100644
--- a/src/extern.h
+++ b/src/extern.h
@@ -31,3 +31,4 @@ extern void switch_previous_workspace(void);
extern void toggle_floating(void);
extern void toggle_floating_global(void);
extern void toggle_fullscreen(void);
+extern void toggle_monocle(void);
diff --git a/src/parser.c b/src/parser.c
index ea0e789..0c626f0 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -48,6 +48,7 @@ static const CommandEntry call_table[] = {
{"stack_decrease", resize_stack_sub},
{"switch_previous_workspace", switch_previous_workspace},
{"toggle_floating", toggle_floating},
+ {"toggle_monocle", toggle_monocle},
{NULL, NULL},
};
diff --git a/src/sxwm.c b/src/sxwm.c
index f029bb3..4f902de 100644
--- a/src/sxwm.c
+++ b/src/sxwm.c
@@ -117,6 +117,7 @@ void tile(void);
/* void toggle_floating(void); */
/* void toggle_floating_global(void); */
/* void toggle_fullscreen(void); */
+/* void toggle_monocle(void); */
void toggle_scratchpad(int n);
void unswallow_window(Client *c);
void update_borders(void);
@@ -191,10 +192,11 @@ int n_mons = 0;
int previous_workspace = 0;
int current_ws = 0;
int current_mon = 0;
+long last_motion_time = 0;
Bool global_floating = False;
Bool in_ws_switch = False;
Bool running = False;
-long last_motion_time = 0;
+Bool monocle = False;
Mask numlock_mask = 0;
Mask mode_switch_mask = 0;
@@ -2663,6 +2665,42 @@ void tile(void)
return;
}
+ if (monocle) {
+ for (Client *c = head; c; c = c->next) {
+ if (!c->mapped || c->fullscreen) {
+ continue;
+ }
+
+ int border_width = user_config.border_width;
+ int gaps = user_config.gaps;
+
+ int mon = c->mon;
+ int x = mons[mon].x + mons[mon].reserve_left + gaps;
+ int y = mons[mon].y + mons[mon].reserve_top + gaps;
+ int w = mons[mon].w - mons[mon].reserve_left - mons[mon].reserve_right - 2 * gaps;
+ int h = mons[mon].h - mons[mon].reserve_top - mons[mon].reserve_bottom - 2 * gaps;
+
+ XWindowChanges wc = {
+ .x = x,
+ .y = y,
+ .width = MAX(1, w - 2 * border_width),
+ .height = MAX(1, h - 2 * border_width),
+ .border_width = border_width
+ };
+ XConfigureWindow(dpy, c->win,
+ CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
+ XRaiseWindow(dpy, c->win);
+
+ c->x = wc.x;
+ c->y = wc.y;
+ c->w = wc.width;
+ c->h = wc.height;
+ }
+
+ update_borders();
+ return;
+ }
+
for (int m = 0; m < n_mons; m++) {
int mon_x = mons[m].x + mons[m].reserve_left;
int mon_y = mons[m].y + mons[m].reserve_top;
@@ -2912,6 +2950,16 @@ void toggle_fullscreen(void)
apply_fullscreen(focused, !focused->fullscreen);
}
+void toggle_monocle(void)
+{
+ monocle = !monocle;
+ tile();
+ update_borders();
+ if (focused) {
+ set_input_focus(focused, True, True);
+ }
+}
+
void toggle_scratchpad(int n)
{
if (n < 0 || n >= MAX_SCRATCHPADS || scratchpads[n].client == NULL) {