forked from mirror/dwl
start factoring Key actions into functions
This commit is contained in:
parent
e385acf69d
commit
df1aaa4d15
2 changed files with 50 additions and 21 deletions
7
config.h
7
config.h
|
@ -5,3 +5,10 @@ static const struct xkb_rule_names xkb_rules = {
|
||||||
.variant = NULL,
|
.variant = NULL,
|
||||||
.options = "ctrl:nocaps,altwin:swap_lalt_lwin,terminate:ctrl_alt_bksp",
|
.options = "ctrl:nocaps,altwin:swap_lalt_lwin,terminate:ctrl_alt_bksp",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MODKEY WLR_MODIFIER_ALT
|
||||||
|
|
||||||
|
static const Key keys[] = {
|
||||||
|
{ MODKEY, XKB_KEY_Escape, quit, {0} },
|
||||||
|
{ MODKEY, XKB_KEY_F1, focusnext, {0} },
|
||||||
|
};
|
||||||
|
|
64
dwl.c
64
dwl.c
|
@ -94,6 +94,23 @@ struct dwl_keyboard {
|
||||||
struct wl_listener key;
|
struct wl_listener key;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
int i;
|
||||||
|
unsigned int ui;
|
||||||
|
float f;
|
||||||
|
const void *v;
|
||||||
|
} Arg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t mod;
|
||||||
|
xkb_keysym_t keysym;
|
||||||
|
void (*func)(struct dwl_server *, const Arg *);
|
||||||
|
const Arg arg;
|
||||||
|
} Key;
|
||||||
|
|
||||||
|
static void focusnext(struct dwl_server *, const Arg *);
|
||||||
|
static void quit(struct dwl_server *, const Arg *);
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
static void focus_view(struct dwl_view *view, struct wlr_surface *surface) {
|
static void focus_view(struct dwl_view *view, struct wlr_surface *surface) {
|
||||||
|
@ -151,31 +168,37 @@ static void keyboard_handle_modifiers(
|
||||||
&keyboard->device->keyboard->modifiers);
|
&keyboard->device->keyboard->modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool handle_keybinding(struct dwl_server *server, xkb_keysym_t sym) {
|
static void quit(struct dwl_server *server, const Arg *unused) {
|
||||||
|
wl_display_terminate(server->wl_display);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void focusnext(struct dwl_server *server, const Arg *unused) {
|
||||||
|
/* Cycle to the next view */
|
||||||
|
if (wl_list_length(&server->views) < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct dwl_view *current_view = wl_container_of(
|
||||||
|
server->views.next, current_view, link);
|
||||||
|
struct dwl_view *next_view = wl_container_of(
|
||||||
|
current_view->link.next, next_view, link);
|
||||||
|
focus_view(next_view, next_view->xdg_surface->surface);
|
||||||
|
/* Move the previous view to the end of the list */
|
||||||
|
wl_list_remove(¤t_view->link);
|
||||||
|
wl_list_insert(server->views.prev, ¤t_view->link);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool handle_keybinding(struct dwl_server *server, uint32_t mods, xkb_keysym_t sym) {
|
||||||
/*
|
/*
|
||||||
* Here we handle compositor keybindings. This is when the compositor is
|
* Here we handle compositor keybindings. This is when the compositor is
|
||||||
* processing keys, rather than passing them on to the client for its own
|
* processing keys, rather than passing them on to the client for its own
|
||||||
* processing.
|
* processing.
|
||||||
*
|
|
||||||
* This function assumes Alt is held down.
|
|
||||||
*/
|
*/
|
||||||
switch (sym) {
|
switch (sym) {
|
||||||
case XKB_KEY_Escape:
|
case XKB_KEY_Escape:
|
||||||
wl_display_terminate(server->wl_display);
|
quit(server, NULL);
|
||||||
break;
|
break;
|
||||||
case XKB_KEY_F1:
|
case XKB_KEY_F1:
|
||||||
/* Cycle to the next view */
|
focusnext(server, NULL);
|
||||||
if (wl_list_length(&server->views) < 2) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
struct dwl_view *current_view = wl_container_of(
|
|
||||||
server->views.next, current_view, link);
|
|
||||||
struct dwl_view *next_view = wl_container_of(
|
|
||||||
current_view->link.next, next_view, link);
|
|
||||||
focus_view(next_view, next_view->xdg_surface->surface);
|
|
||||||
/* Move the previous view to the end of the list */
|
|
||||||
wl_list_remove(¤t_view->link);
|
|
||||||
wl_list_insert(server->views.prev, ¤t_view->link);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -200,12 +223,11 @@ static void keyboard_handle_key(
|
||||||
keyboard->device->keyboard->xkb_state, keycode, &syms);
|
keyboard->device->keyboard->xkb_state, keycode, &syms);
|
||||||
|
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard);
|
uint32_t mods = wlr_keyboard_get_modifiers(keyboard->device->keyboard);
|
||||||
if ((modifiers & WLR_MODIFIER_ALT) && event->state == WLR_KEY_PRESSED) {
|
if (event->state == WLR_KEY_PRESSED) {
|
||||||
/* If alt is held down and this button was _pressed_, we attempt to
|
/* On _press_, attempt to process a compositor keybinding. */
|
||||||
* process it as a compositor keybinding. */
|
|
||||||
for (int i = 0; i < nsyms; i++) {
|
for (int i = 0; i < nsyms; i++) {
|
||||||
handled = handle_keybinding(server, syms[i]);
|
handled = handle_keybinding(server, mods, syms[i]) || handled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue