summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAbhinav Prasai <abhinav.prsai@gmail.com>2025-10-06 14:04:45 +0100
committerAbhinav Prasai <abhinav.prsai@gmail.com>2025-10-06 14:05:54 +0100
commit28116a2dd7101340c029f29fcbd445ec41ea5445 (patch)
treeceaeefc04cea1af4970a41076f04ee12e02a6477 /src
parentffade58f2df2a67135a564308e57118d6db22f52 (diff)
add window moving + resizing option from keyboard
window resizing + moving by keyboard
Diffstat (limited to 'src')
-rw-r--r--src/defs.h10
-rw-r--r--src/parser.c60
-rw-r--r--src/sxwm.c111
3 files changed, 148 insertions, 33 deletions
diff --git a/src/defs.h b/src/defs.h
index 5750a05..20e419a 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -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);
}
diff --git a/src/sxwm.c b/src/sxwm.c
index b5a20e9..b36e3fd 100644
--- a/src/sxwm.c
+++ b/src/sxwm.c
@@ -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++) {