diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 84914a5..766418d 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -717,6 +717,9 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, } else if (strcmp(func_name, "exchange_client") == 0) { func = exchange_client; (*arg).i = parse_direction(arg_value); + } else if (strcmp(func_name, "exchange_stack_client") == 0) { + func = exchange_stack_client; + (*arg).i = parse_circle_direction(arg_value); } else if (strcmp(func_name, "toggleglobal") == 0) { func = toggleglobal; } else if (strcmp(func_name, "toggleoverview") == 0) { diff --git a/src/dispatch/bind_declare.h b/src/dispatch/bind_declare.h index 2fe6298..fd23bec 100644 --- a/src/dispatch/bind_declare.h +++ b/src/dispatch/bind_declare.h @@ -30,6 +30,7 @@ void setsmfact(const Arg *arg); void quit(const Arg *arg); void moveresize(const Arg *arg); void exchange_client(const Arg *arg); +void exchange_stack_client(const Arg *arg); void killclient(const Arg *arg); void toggleglobal(const Arg *arg); void incnmaster(const Arg *arg); diff --git a/src/dispatch/bind_define.h b/src/dispatch/bind_define.h index ff2ef86..4729fb9 100644 --- a/src/dispatch/bind_define.h +++ b/src/dispatch/bind_define.h @@ -73,6 +73,20 @@ void exchange_client(const Arg *arg) { exchange_two_client(c, direction_select(arg)); } +void exchange_stack_client(const Arg *arg) { + Client *c = selmon->sel; + Client *tc; + if (!c || c->isfloating || c->isfullscreen || c->ismaxmizescreen) + return; + if (arg->i > 0) { + tc = get_next_stack_client(c, false); + } else { + tc = get_next_stack_client(c, true); + } + if (tc) + exchange_two_client(c, tc); +} + void focusdir(const Arg *arg) { Client *c; c = direction_select(arg);