feat: focusstack no wrap

This commit is contained in:
DreamMaoMao 2026-04-18 11:46:41 +08:00
parent eb51499ec7
commit 372899c361
4 changed files with 23 additions and 10 deletions

View file

@ -938,6 +938,7 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
if (strcmp(func_name, "focusstack") == 0) { if (strcmp(func_name, "focusstack") == 0) {
func = focusstack; func = focusstack;
(*arg).i = parse_circle_direction(arg_value); (*arg).i = parse_circle_direction(arg_value);
(*arg).i2 = atoi(arg_value2);
} else if (strcmp(func_name, "focusdir") == 0) { } else if (strcmp(func_name, "focusdir") == 0) {
func = focusdir; func = focusdir;
(*arg).i = parse_direction(arg_value); (*arg).i = parse_direction(arg_value);
@ -955,6 +956,7 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
} else if (strcmp(func_name, "exchange_stack_client") == 0) { } else if (strcmp(func_name, "exchange_stack_client") == 0) {
func = exchange_stack_client; func = exchange_stack_client;
(*arg).i = parse_circle_direction(arg_value); (*arg).i = parse_circle_direction(arg_value);
(*arg).i2 = atoi(arg_value2);
} else if (strcmp(func_name, "toggleglobal") == 0) { } else if (strcmp(func_name, "toggleglobal") == 0) {
func = toggleglobal; func = toggleglobal;
} else if (strcmp(func_name, "toggleoverview") == 0) { } else if (strcmp(func_name, "toggleoverview") == 0) {

View file

@ -122,12 +122,14 @@ int32_t exchange_stack_client(const Arg *arg) {
Client *c = selmon->sel; Client *c = selmon->sel;
Client *tc = NULL; Client *tc = NULL;
bool nowrap = arg->i2;
if (!c || c->isfloating || c->isfullscreen || c->ismaximizescreen) if (!c || c->isfloating || c->isfullscreen || c->ismaximizescreen)
return 0; return 0;
if (arg->i == NEXT) { if (arg->i == NEXT) {
tc = get_next_stack_client(c, false); tc = get_next_stack_client(c, false, nowrap);
} else { } else {
tc = get_next_stack_client(c, true); tc = get_next_stack_client(c, true, nowrap);
} }
if (tc) if (tc)
exchange_two_client(c, tc); exchange_two_client(c, tc);
@ -244,13 +246,14 @@ int32_t focusstack(const Arg *arg) {
/* Focus the next or previous client (in tiling order) on selmon */ /* Focus the next or previous client (in tiling order) on selmon */
Client *sel = focustop(selmon); Client *sel = focustop(selmon);
Client *tc = NULL; Client *tc = NULL;
bool nowrap = arg->i2;
if (!sel) if (!sel)
return 0; return 0;
if (arg->i == NEXT) { if (arg->i == NEXT) {
tc = get_next_stack_client(sel, false); tc = get_next_stack_client(sel, false, nowrap);
} else { } else {
tc = get_next_stack_client(sel, true); tc = get_next_stack_client(sel, true, nowrap);
} }
/* If only one client is visible on selmon, then c == sel */ /* If only one client is visible on selmon, then c == sel */

View file

@ -475,15 +475,19 @@ Client *focustop(Monitor *m) {
return NULL; return NULL;
} }
Client *get_next_stack_client(Client *c, bool reverse) { Client *get_next_stack_client(Client *c, bool reverse, bool nowrap) {
if (!c || !c->mon) if (!c || !c->mon)
return NULL; return NULL;
Client *next = NULL; Client *next = NULL;
if (reverse) { if (reverse) {
wl_list_for_each_reverse(next, &c->link, link) { wl_list_for_each_reverse(next, &c->link, link) {
if (&next->link == &clients) if (&next->link == &clients) {
continue; /* wrap past the sentinel node */ if (nowrap)
return NULL;
else
continue; /* wrap past the sentinel node */
}
if (next->isunglobal) if (next->isunglobal)
continue; continue;
@ -493,8 +497,12 @@ Client *get_next_stack_client(Client *c, bool reverse) {
} }
} else { } else {
wl_list_for_each(next, &c->link, link) { wl_list_for_each(next, &c->link, link) {
if (&next->link == &clients) if (&next->link == &clients) {
continue; /* wrap past the sentinel node */ if (nowrap)
return NULL;
else
continue; /* wrap past the sentinel node */
}
if (next->isunglobal) if (next->isunglobal)
continue; continue;

View file

@ -779,7 +779,7 @@ static bool switch_scratchpad_client_state(Client *c);
static bool check_trackpad_disabled(struct wlr_pointer *pointer); static bool check_trackpad_disabled(struct wlr_pointer *pointer);
static uint32_t get_tag_status(uint32_t tag, Monitor *m); static uint32_t get_tag_status(uint32_t tag, Monitor *m);
static void enable_adaptive_sync(Monitor *m, struct wlr_output_state *state); static void enable_adaptive_sync(Monitor *m, struct wlr_output_state *state);
static Client *get_next_stack_client(Client *c, bool reverse); static Client *get_next_stack_client(Client *c, bool reverse, bool nowrap);
static void set_float_malposition(Client *tc); static void set_float_malposition(Client *tc);
static void set_size_per(Monitor *m, Client *c); static void set_size_per(Monitor *m, Client *c);
static void resize_tile_client(Client *grabc, bool isdrag, int32_t offsetx, static void resize_tile_client(Client *grabc, bool isdrag, int32_t offsetx,