diff options
| author | Abhinav Prasai <abhinav.prsai@gmail.com> | 2025-10-06 14:04:45 +0100 |
|---|---|---|
| committer | Abhinav Prasai <abhinav.prsai@gmail.com> | 2025-10-06 14:05:54 +0100 |
| commit | 28116a2dd7101340c029f29fcbd445ec41ea5445 (patch) | |
| tree | ceaeefc04cea1af4970a41076f04ee12e02a6477 | |
| parent | ffade58f2df2a67135a564308e57118d6db22f52 (diff) | |
add window moving + resizing option from keyboard
window resizing + moving by keyboard
| -rw-r--r-- | default_sxwmrc | 13 | ||||
| -rw-r--r-- | src/defs.h | 10 | ||||
| -rw-r--r-- | src/parser.c | 60 | ||||
| -rw-r--r-- | src/sxwm.c | 111 |
4 files changed, 161 insertions, 33 deletions
diff --git a/default_sxwmrc b/default_sxwmrc index 64959a7..264f8da 100644 --- a/default_sxwmrc +++ b/default_sxwmrc @@ -9,6 +9,8 @@ border_width : 1 master_width : 60 # Percentage of screen width resize_master_amount : 1 resize_stack_amt : 20 +move_window_amount : 50 +resize_window_amount : 50 snap_distance : 5 motion_throttle : 60 # Set to screen refresh rate for smoothest motions should_float : "pcmanfm", "obs" @@ -59,6 +61,17 @@ call : mod + h : master_decrease call : mod + ctrl + l : stack_increase call : mod + ctrl + h : stack_decrease +# Keyboard Window Management +call : mod + Up : move_win_up +call : mod + Down : move_win_down +call : mod + Left : move_win_left +call : mod + Right : move_win_right + +call : mod + shift + Up : resize_win_up +call : mod + shift + Down : resize_win_down +call : mod + shift + Left : resize_win_left +call : mod + shift + Right : resize_win_right + # Gaps call : mod + equal : increase_gaps call : mod + minus : decrease_gaps @@ -101,6 +101,8 @@ typedef struct { int resize_stack_amt; int snap_distance; int n_binds; + int move_window_amt; + int resize_window_amt; Bool new_win_focus; Bool warp_cursor; Bool new_win_master; @@ -143,6 +145,10 @@ extern void move_prev_mon(void); extern void inc_gaps(void); extern void move_master_next(void); extern void move_master_prev(void); +extern void move_win_down(void); +extern void move_win_left(void); +extern void move_win_right(void); +extern void move_win_up(void); extern long parse_col(const char *hex); extern void quit(void); extern void reload_config(void); @@ -150,6 +156,10 @@ extern void resize_master_add(void); extern void resize_master_sub(void); extern void resize_stack_add(void); extern void resize_stack_sub(void); +extern void resize_win_down(void); +extern void resize_win_left(void); +extern void resize_win_right(void); +extern void resize_win_up(void); extern void toggle_floating(void); extern void toggle_floating_global(void); extern void toggle_fullscreen(void); diff --git a/src/parser.c b/src/parser.c index adda1b5..d48f084 100644 --- a/src/parser.c +++ b/src/parser.c @@ -18,28 +18,38 @@ #include "parser.h" #include "defs.h" -static const CommandEntry call_table[] = {{"close_window", close_focused}, - {"decrease_gaps", dec_gaps}, - {"focus_next", focus_next}, - {"focus_prev", focus_prev}, - {"focus_next_mon", focus_next_mon}, - {"focus_prev_mon", focus_prev_mon}, - {"increase_gaps", inc_gaps}, - {"master_next", move_master_next}, - {"master_prev", move_master_prev}, - {"move_next_mon", move_next_mon}, - {"move_prev_mon", move_prev_mon}, - {"quit", quit}, - {"reload_config", reload_config}, - {"master_increase", resize_master_add}, - {"master_decrease", resize_master_sub}, - {"stack_increase", resize_stack_add}, - {"stack_decrease", resize_stack_sub}, - {"toggle_floating", toggle_floating}, - {"global_floating", toggle_floating_global}, - {"fullscreen", toggle_fullscreen}, - {"centre_window", centre_window}, - {NULL, NULL}}; +static const CommandEntry call_table[] = { + {"close_window", close_focused}, + {"decrease_gaps", dec_gaps}, + {"focus_next", focus_next}, + {"focus_prev", focus_prev}, + {"focus_next_mon", focus_next_mon}, + {"focus_prev_mon", focus_prev_mon}, + {"increase_gaps", inc_gaps}, + {"master_next", move_master_next}, + {"master_prev", move_master_prev}, + {"move_next_mon", move_next_mon}, + {"move_prev_mon", move_prev_mon}, + {"move_win_up", move_win_up}, + {"move_win_down", move_win_down}, + {"move_win_left", move_win_left}, + {"move_win_right", move_win_right}, + {"resize_win_up", resize_win_up}, + {"resize_win_down", resize_win_down}, + {"resize_win_left", resize_win_left}, + {"resize_win_right", resize_win_right}, + {"quit", quit}, + {"reload_config", reload_config}, + {"master_increase", resize_master_add}, + {"master_decrease", resize_master_sub}, + {"stack_increase", resize_stack_add}, + {"stack_decrease", resize_stack_sub}, + {"toggle_floating", toggle_floating}, + {"global_floating", toggle_floating_global}, + {"fullscreen", toggle_fullscreen}, + {"centre_window", centre_window}, + {NULL, NULL} +}; static void remap_and_dedupe_binds(Config *cfg) { @@ -264,6 +274,12 @@ found: else if (!strcmp(key, "resize_stack_amount")) { cfg->resize_stack_amt = atoi(rest); } + else if (!strcmp(key, "move_window_amount")) { + cfg->move_window_amt = atoi(rest); + } + else if (!strcmp(key, "resize_window_amount")) { + cfg->resize_window_amt = atoi(rest); + } else if (!strcmp(key, "snap_distance")) { cfg->snap_distance = atoi(rest); } @@ -81,6 +81,10 @@ Bool is_child_proc(pid_t pid1, pid_t pid2); /* void move_next_mon(void); */ /* void move_prev_mon(void); */ void move_to_workspace(int ws); +/* void move_win_down(void); */ +/* void move_win_left(void); */ +/* void move_win_right(void); */ +/* void move_win_up(void); */ void other_wm(void); int other_wm_err(Display *d, XErrorEvent *ee); /* long parse_col(const char *hex); */ @@ -91,6 +95,10 @@ void remove_scratchpad(int n); /* void resize_master_sub(void); */ /* void resize_stack_add(void); */ /* void resize_stack_sub(void); */ +/* void resize_win_down(void); */ +/* void resize_win_left(void); */ +/* void resize_win_right(void); */ +/* void resize_win_up(void); */ void run(void); void reset_opacity(Window w); void scan_existing_windows(void); @@ -580,7 +588,7 @@ void focus_next(void) /* loop until we find a mapped client or return to start */ do { c = c->next ? c->next : workspaces[current_ws]; - } while (( !c->mapped || c->mon != current_mon ) && c != start); + } while (( !c->mapped || c->mon != current_mon ) && c != start); /* if we return to start: */ if (!c->mapped || c->mon != current_mon) { @@ -620,7 +628,7 @@ void focus_prev(void) p = p->next; c = p; } - } while (( !c->mapped || c->mon != current_mon ) && c != start); + } while (( !c->mapped || c->mon != current_mon ) && c != start); /* this stops invisible windows being detected or focused */ if (!c->mapped || c->mon != current_mon) { @@ -1543,6 +1551,8 @@ void init_defaults(void) default_config.border_foc_col = parse_col("#c0cbff"); default_config.border_ufoc_col = parse_col("#555555"); default_config.border_swap_col = parse_col("#fff4c0"); + default_config.move_window_amt = 10; + default_config.resize_window_amt = 10; for (int i = 0; i < MAX_MONITORS; i++) { default_config.master_width[i] = 50 / 100.0f; @@ -1802,6 +1812,42 @@ void move_to_workspace(int ws) } } +void move_win_down(void) +{ + if (!focused || !focused->floating) { + return; + } + focused->y += user_config.move_window_amt; + XMoveWindow(dpy, focused->win, focused->x, focused->y); +} + +void move_win_left(void) +{ + if (!focused || !focused->floating) { + return; + } + focused->x -= user_config.move_window_amt; + XMoveWindow(dpy, focused->win, focused->x, focused->y); +} + +void move_win_right(void) +{ + if (!focused || !focused->floating) { + return; + } + focused->x += user_config.move_window_amt; + XMoveWindow(dpy, focused->win, focused->x, focused->y); +} + +void move_win_up(void) +{ + if (!focused || !focused->floating) { + return; + } + focused->y -= user_config.move_window_amt; + XMoveWindow(dpy, focused->win, focused->x, focused->y); +} + void other_wm(void) { XSetErrorHandler(other_wm_err); @@ -2050,6 +2096,52 @@ void resize_stack_sub(void) tile(); } +void resize_win_down(void) +{ + if (!focused || !focused->floating) { + return; + } + + int new_h = focused->h + user_config.resize_stack_amt; + int max_h = mons[focused->mon].h - (focused->y - mons[focused->mon].y); + focused->h = CLAMP(new_h, MIN_WINDOW_SIZE, max_h); + XResizeWindow(dpy, focused->win, focused->w, focused->h); +} + +void resize_win_up(void) +{ + if (!focused || !focused->floating) { + return; + } + + int new_h = focused->h - user_config.resize_stack_amt; + focused->h = CLAMP(new_h, MIN_WINDOW_SIZE, focused->h); + XResizeWindow(dpy, focused->win, focused->w, focused->h); +} + +void resize_win_right(void) +{ + if (!focused || !focused->floating) { + return; + } + + int new_w = focused->w + user_config.resize_stack_amt; + int max_w = mons[focused->mon].w - (focused->x - mons[focused->mon].x); + focused->w = CLAMP(new_w, MIN_WINDOW_SIZE, max_w); + XResizeWindow(dpy, focused->win, focused->w, focused->h); +} + +void resize_win_left(void) +{ + if (!focused || !focused->floating) { + return; + } + + int new_w = focused->w - user_config.resize_stack_amt; + focused->w = CLAMP(new_w, MIN_WINDOW_SIZE, focused->w); + XResizeWindow(dpy, focused->win, focused->w, focused->h); +} + void run(void) { running = True; @@ -3010,8 +3102,7 @@ void update_struts(void) Atom *types = NULL; if (XGetWindowProperty(dpy, w, _NET_WM_WINDOW_TYPE, 0, 4, False, XA_ATOM, &actual_type, &actual_format, - &n_items, &bytes_after, (unsigned char **)&types) != Success || - !types) { + &n_items, &bytes_after, (unsigned char **)&types) != Success || !types) { continue; } @@ -3033,9 +3124,7 @@ void update_struts(void) unsigned long len, rem; if (XGetWindowProperty(dpy, w, _NET_WM_STRUT_PARTIAL, 0, 12, False, XA_CARDINAL, &actual, &sfmt, &len, &rem, - (unsigned char **)&str) == Success && - str && len >= 4) { - + (unsigned char **)&str) == Success && str && len >= 4) { XWindowAttributes wa; if (XGetWindowAttributes(dpy, w, &wa)) { /* find the monitor this dock belongs to */ @@ -3201,10 +3290,10 @@ int xerr(Display *d, XErrorEvent *ee) const struct { int req, code; } ignore[] = { - {0, BadWindow}, - {X_GetGeometry, BadDrawable}, - {X_SetInputFocus, BadMatch}, - {X_ConfigureWindow, BadMatch}, + {0, BadWindow}, + {X_GetGeometry, BadDrawable}, + {X_SetInputFocus, BadMatch}, + {X_ConfigureWindow, BadMatch}, }; for (size_t i = 0; i < sizeof(ignore) / sizeof(ignore[0]); i++) { |
