diff options
Diffstat (limited to '')
| -rw-r--r-- | config.h | 7 | ||||
| -rw-r--r-- | dwl.c | 64 | 
2 files changed, 50 insertions, 21 deletions
| @@ -5,3 +5,10 @@ static const struct xkb_rule_names xkb_rules = {  	.variant = NULL,  	.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} }, +}; @@ -94,6 +94,23 @@ struct dwl_keyboard {  	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"  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);  } -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  	 * processing keys, rather than passing them on to the client for its own  	 * processing. -	 * -	 * This function assumes Alt is held down.  	 */  	switch (sym) {  	case XKB_KEY_Escape: -		wl_display_terminate(server->wl_display); +		quit(server, NULL);  		break;  	case XKB_KEY_F1: -		/* Cycle to the next view */ -		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); +		focusnext(server, NULL);  		break;  	default:  		return false; @@ -200,12 +223,11 @@ static void keyboard_handle_key(  			keyboard->device->keyboard->xkb_state, keycode, &syms);  	bool handled = false; -	uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard); -	if ((modifiers & WLR_MODIFIER_ALT) && event->state == WLR_KEY_PRESSED) { -		/* If alt is held down and this button was _pressed_, we attempt to -		 * process it as a compositor keybinding. */ +	uint32_t mods = wlr_keyboard_get_modifiers(keyboard->device->keyboard); +	if (event->state == WLR_KEY_PRESSED) { +		/* On _press_, attempt to process a compositor keybinding. */  		for (int i = 0; i < nsyms; i++) { -			handled = handle_keybinding(server, syms[i]); +			handled = handle_keybinding(server, mods, syms[i]) || handled;  		}  	} | 
