mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Update modifier state on focus in and out.
This commit is contained in:
		
							parent
							
								
									3c38fa0c3e
								
							
						
					
					
						commit
						99f090db3e
					
				
					 1 changed files with 32 additions and 17 deletions
				
			
		
							
								
								
									
										49
									
								
								window.c
									
										
									
									
									
								
							
							
						
						
									
										49
									
								
								window.c
									
										
									
									
									
								
							| 
						 | 
					@ -436,15 +436,9 @@ struct key {
 | 
				
			||||||
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
 | 
					#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
window_handle_key(void *data, struct wl_input_device *input_device,
 | 
					window_update_modifiers(struct window *window, uint32_t key, uint32_t state)
 | 
				
			||||||
		  uint32_t key, uint32_t state)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct window *window = data;
 | 
					 | 
				
			||||||
	uint32_t mod = 0;
 | 
						uint32_t mod = 0;
 | 
				
			||||||
	uint32_t unicode = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (window->keyboard_device != input_device)
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (key) {
 | 
						switch (key) {
 | 
				
			||||||
	case KEY_LEFTSHIFT:
 | 
						case KEY_LEFTSHIFT:
 | 
				
			||||||
| 
						 | 
					@ -459,22 +453,34 @@ window_handle_key(void *data, struct wl_input_device *input_device,
 | 
				
			||||||
	case KEY_RIGHTALT:
 | 
						case KEY_RIGHTALT:
 | 
				
			||||||
		mod = WINDOW_MODIFIER_ALT;
 | 
							mod = WINDOW_MODIFIER_ALT;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		if (key < ARRAY_LENGTH(evdev_keymap)) {
 | 
					 | 
				
			||||||
			if (window->modifiers & WINDOW_MODIFIER_CONTROL)
 | 
					 | 
				
			||||||
				unicode = evdev_keymap[key].code[2];
 | 
					 | 
				
			||||||
			else if (window->modifiers & WINDOW_MODIFIER_SHIFT)
 | 
					 | 
				
			||||||
				unicode = evdev_keymap[key].code[1];
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				unicode = evdev_keymap[key].code[0];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (state)
 | 
						if (state)
 | 
				
			||||||
		window->modifiers |= mod;
 | 
							window->modifiers |= mod;
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		window->modifiers &= ~mod;
 | 
							window->modifiers &= ~mod;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					window_handle_key(void *data, struct wl_input_device *input_device,
 | 
				
			||||||
 | 
							  uint32_t key, uint32_t state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct window *window = data;
 | 
				
			||||||
 | 
						uint32_t unicode = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (window->keyboard_device != input_device)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						window_update_modifiers(window, key, state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (key < ARRAY_LENGTH(evdev_keymap)) {
 | 
				
			||||||
 | 
							if (window->modifiers & WINDOW_MODIFIER_CONTROL)
 | 
				
			||||||
 | 
								unicode = evdev_keymap[key].code[2];
 | 
				
			||||||
 | 
							else if (window->modifiers & WINDOW_MODIFIER_SHIFT)
 | 
				
			||||||
 | 
								unicode = evdev_keymap[key].code[1];
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								unicode = evdev_keymap[key].code[0];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (window->key_handler)
 | 
						if (window->key_handler)
 | 
				
			||||||
		(*window->key_handler)(window, key, unicode,
 | 
							(*window->key_handler)(window, key, unicode,
 | 
				
			||||||
| 
						 | 
					@ -495,6 +501,7 @@ window_handle_keyboard_focus(void *data,
 | 
				
			||||||
			     struct wl_array *keys)
 | 
								     struct wl_array *keys)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct window *window = data;
 | 
						struct window *window = data;
 | 
				
			||||||
 | 
						uint32_t *k, *end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (window->keyboard_device == input_device && surface != window->surface)
 | 
						if (window->keyboard_device == input_device && surface != window->surface)
 | 
				
			||||||
		window->keyboard_device = NULL;
 | 
							window->keyboard_device = NULL;
 | 
				
			||||||
| 
						 | 
					@ -503,6 +510,14 @@ window_handle_keyboard_focus(void *data,
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (window->keyboard_device) {
 | 
				
			||||||
 | 
							end = keys->data + keys->size;
 | 
				
			||||||
 | 
							for (k = keys->data; k < end; k++)
 | 
				
			||||||
 | 
								window_update_modifiers(window, *k, 1);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							window->modifiers = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (window->keyboard_focus_handler)
 | 
						if (window->keyboard_focus_handler)
 | 
				
			||||||
		(*window->keyboard_focus_handler)(window,
 | 
							(*window->keyboard_focus_handler)(window,
 | 
				
			||||||
						  window->keyboard_device,
 | 
											  window->keyboard_device,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue