mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	keyboard: cancel repeat when handling key-bind
<keybind key="W-d">
  <action name="Execute">
    <command>dmenu_run</command>
  </action>
</keybind>
When using the keybind above (in rc.xml), on the first execution of W-d
all is okay, but the second time, a "d" pressed event is sent to dmenu
resulting in a continuous "ddddddd...") which has to be stopped pressing a
key.
This behaviour started in commit 7e57b7f because release events associated
with keybinds are no longer sent to clients (before that commit, the
release event for the “d” would have been passed to dmenu, thus cancelling
the repeat).
Solves issue #176
Helped-by: @spectrum70
			
			
This commit is contained in:
		
							parent
							
								
									70845643af
								
							
						
					
					
						commit
						e62bb51bfb
					
				
					 3 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -5,6 +5,8 @@
 | 
			
		|||
void key_state_set_pressed(uint32_t keycode, bool ispressed);
 | 
			
		||||
void key_state_store_pressed_keys_as_bound(void);
 | 
			
		||||
bool key_state_corresponding_press_event_was_bound(uint32_t keycode);
 | 
			
		||||
void key_state_bound_key_remove(uint32_t keycode);
 | 
			
		||||
 | 
			
		||||
/* returns numbers of keys still pressed in a consumed key combination */
 | 
			
		||||
int key_state_bound_key_remove(uint32_t keycode);
 | 
			
		||||
 | 
			
		||||
#endif /* __LABWC_KEY_STATE_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,8 +63,9 @@ key_state_corresponding_press_event_was_bound(uint32_t keycode)
 | 
			
		|||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
int
 | 
			
		||||
key_state_bound_key_remove(uint32_t keycode)
 | 
			
		||||
{
 | 
			
		||||
	remove_key(&bound, keycode);
 | 
			
		||||
	return bound.nr_keys;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,12 +59,14 @@ static bool
 | 
			
		|||
handle_keybinding(struct server *server, uint32_t modifiers, xkb_keysym_t sym)
 | 
			
		||||
{
 | 
			
		||||
	struct keybind *keybind;
 | 
			
		||||
	struct wlr_keyboard *kb = &server->seat.keyboard_group->keyboard;
 | 
			
		||||
	wl_list_for_each_reverse (keybind, &rc.keybinds, link) {
 | 
			
		||||
		if (modifiers ^ keybind->modifiers) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		for (size_t i = 0; i < keybind->keysyms_len; i++) {
 | 
			
		||||
			if (xkb_keysym_to_lower(sym) == keybind->keysyms[i]) {
 | 
			
		||||
				wlr_keyboard_set_repeat_info(kb, 0, 0);
 | 
			
		||||
				action(NULL, server, keybind->action,
 | 
			
		||||
				       keybind->command, 0);
 | 
			
		||||
				return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +113,11 @@ handle_compositor_keybindings(struct wl_listener *listener,
 | 
			
		|||
	 */
 | 
			
		||||
	if (key_state_corresponding_press_event_was_bound(keycode)
 | 
			
		||||
			&& event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
 | 
			
		||||
		key_state_bound_key_remove(keycode);
 | 
			
		||||
		int nr_bound_keys = key_state_bound_key_remove(keycode);
 | 
			
		||||
		if (!nr_bound_keys) {
 | 
			
		||||
			wlr_keyboard_set_repeat_info(device->keyboard,
 | 
			
		||||
				rc.repeat_rate, rc.repeat_delay);
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue