|  |  |  | @ -1,8 +1,52 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <wlr/backend/multi.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include <wlr/backend/session.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include "sway/input/seat.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "sway/input/keyboard.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "sway/input/input-manager.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "log.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /**
 | 
			
		
	
		
			
				
					|  |  |  |  |  * Execute a built-in, hardcoded compositor binding. These are triggered from a | 
			
		
	
		
			
				
					|  |  |  |  |  * single keysym. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * Returns true if the keysym was handled by a binding and false if the event | 
			
		
	
		
			
				
					|  |  |  |  |  * should be propagated to clients. | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (keysym >= XKB_KEY_XF86Switch_VT_1 && | 
			
		
	
		
			
				
					|  |  |  |  | 			keysym <= XKB_KEY_XF86Switch_VT_12) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (wlr_backend_is_multi(server.backend)) { | 
			
		
	
		
			
				
					|  |  |  |  | 			struct wlr_session *session = | 
			
		
	
		
			
				
					|  |  |  |  | 				wlr_multi_get_session(server.backend); | 
			
		
	
		
			
				
					|  |  |  |  | 			if (session) { | 
			
		
	
		
			
				
					|  |  |  |  | 				unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1; | 
			
		
	
		
			
				
					|  |  |  |  | 				wlr_session_change_vt(session, vt); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return true; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return false; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /**
 | 
			
		
	
		
			
				
					|  |  |  |  |  * Execute keyboard bindings. These include compositor bindings and user-defined | 
			
		
	
		
			
				
					|  |  |  |  |  * bindings. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * Returns true if the keysym was handled by a binding and false if the event | 
			
		
	
		
			
				
					|  |  |  |  |  * should be propagated to clients. | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | static bool keyboard_execute_binding(struct sway_keyboard *keyboard, | 
			
		
	
		
			
				
					|  |  |  |  | 		xkb_keysym_t *pressed_keysyms, uint32_t modifiers, | 
			
		
	
		
			
				
					|  |  |  |  | 		const xkb_keysym_t *keysyms, size_t keysyms_len) { | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0; i < keysyms_len; ++i) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (keyboard_execute_compositor_binding(keysyms[i])) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return true; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	return false; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /*
 | 
			
		
	
		
			
				
					|  |  |  |  |  * Get keysyms and modifiers from the keyboard as xkb sees them. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
	
		
			
				
					|  |  |  | @ -138,7 +182,9 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	pressed_keysyms_update(keyboard->pressed_keysyms_translated, keysyms, | 
			
		
	
		
			
				
					|  |  |  |  | 		keysyms_len, event->state); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (event->state == WLR_KEY_PRESSED) { | 
			
		
	
		
			
				
					|  |  |  |  | 		// TODO execute binding
 | 
			
		
	
		
			
				
					|  |  |  |  | 		handled = keyboard_execute_binding(keyboard, | 
			
		
	
		
			
				
					|  |  |  |  | 			keyboard->pressed_keysyms_translated, modifiers, keysyms, | 
			
		
	
		
			
				
					|  |  |  |  | 			keysyms_len); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Handle raw keysyms
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -146,7 +192,8 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, keysyms_len, | 
			
		
	
		
			
				
					|  |  |  |  | 		event->state); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (event->state == WLR_KEY_PRESSED && !handled) { | 
			
		
	
		
			
				
					|  |  |  |  | 		// TODO execute binding
 | 
			
		
	
		
			
				
					|  |  |  |  | 		handled = keyboard_execute_binding(keyboard, | 
			
		
	
		
			
				
					|  |  |  |  | 			keyboard->pressed_keysyms_raw, modifiers, keysyms, keysyms_len); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!handled) { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |