diff --git a/include/config.h b/include/config.h index ad3582f..893fb33 100644 --- a/include/config.h +++ b/include/config.h @@ -49,6 +49,9 @@ static const absn_keybind keybinds[] = { { ALT, XKB_KEY_j, cycle_focus, { .i = +1 } }, { ALT, XKB_KEY_k, cycle_focus, { .i = -1 } }, + { ALT | SHIFT, XKB_KEY_j, swap_focus, { .i = +1 } }, + { ALT | SHIFT, XKB_KEY_k, swap_focus, { .i = -1 } }, + { ALT, XKB_KEY_f, toggle_fullscreen, { 0 } }, { ALT, XKB_KEY_h, increase_master_count, { .i = +1 } }, diff --git a/include/keybinds.h b/include/keybinds.h index 8ad4159..b481009 100644 --- a/include/keybinds.h +++ b/include/keybinds.h @@ -6,7 +6,10 @@ void run(absn_server *server, const absn_arg *arg); void kill_focus(absn_server *server, const absn_arg *arg); + void cycle_focus(absn_server *server, const absn_arg *arg); +void swap_focus(absn_server *server, const absn_arg *arg); + void toggle_fullscreen(absn_server *server, const absn_arg *arg); void increase_master_width(absn_server *server, const absn_arg *arg); diff --git a/src/keybinds.c b/src/keybinds.c index 6c3a029..f3cda91 100644 --- a/src/keybinds.c +++ b/src/keybinds.c @@ -5,6 +5,7 @@ #include "focus.h" #include "layout.h" +#include "output.h" #include "toplevel.h" #include "types.h" @@ -40,7 +41,7 @@ kill_focus(absn_server *server, const absn_arg *arg) void cycle_focus(absn_server *server, const absn_arg *arg) { - absn_toplevel *toplevel = focus_get_topmost(server); + absn_toplevel *toplevel = server->focused_toplevel; if (!toplevel || toplevel->fullscreen) return; @@ -48,16 +49,12 @@ cycle_focus(absn_server *server, const absn_arg *arg) if (arg->i > 0) { wl_list_for_each(new_focus, &toplevel->link, link) { - if (&new_focus->link == &toplevel->server->toplevels) - continue; if (toplevel->workspace == new_focus->workspace) break; } } else { wl_list_for_each_reverse(new_focus, &toplevel->link, link) { - if (&new_focus->link == &toplevel->server->toplevels) - continue; if (toplevel->workspace == new_focus->workspace) break; } @@ -65,6 +62,38 @@ cycle_focus(absn_server *server, const absn_arg *arg) focus_toplevel(new_focus); } +void +swap_focus(absn_server *server, const absn_arg *arg) +{ + + absn_toplevel *toplevel = server->focused_toplevel; + if (!toplevel || toplevel->fullscreen || toplevel->floating) + return; + + absn_toplevel *swapped; + if (arg->i > 0) { + wl_list_for_each(swapped, &toplevel->link, link) + { + if (toplevel->workspace == swapped->workspace) + break; + } + + wl_list_remove(&toplevel->link); + wl_list_insert(&swapped->link, &toplevel->link); + } else { + wl_list_for_each_reverse(swapped, &toplevel->link, link) + { + if (toplevel->workspace == swapped->workspace) + break; + } + + wl_list_remove(&swapped->link); + wl_list_insert(&toplevel->link, &swapped->link); + } + + layout_arrange(swapped->output); +} + void toggle_fullscreen(absn_server *server, const absn_arg *arg) { diff --git a/src/layout.c b/src/layout.c index 630161a..931b753 100644 --- a/src/layout.c +++ b/src/layout.c @@ -1,6 +1,7 @@ #include #include "config.h" +#include "output.h" #include "toplevel.h" #include "types.h"