mirror of
				https://codeberg.org/dwl/dwl-patches.git
				synced 2025-10-27 02:04:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From ac1fa09172a401427cabbda045688903bdd3cbe7 Mon Sep 17 00:00:00 2001
 | |
| From: Rutherther <rutherther@proton.me>
 | |
| Date: Wed, 12 Jun 2024 20:05:40 +0200
 | |
| Subject: [PATCH] feat: apply keyboard shortcuts inhibit patch
 | |
| 
 | |
| ---
 | |
|  dwl.c | 22 +++++++++++++++++++++-
 | |
|  1 file changed, 21 insertions(+), 1 deletion(-)
 | |
| 
 | |
| diff --git a/dwl.c b/dwl.c
 | |
| index 6f041a0..8cab9e0 100644
 | |
| --- a/dwl.c
 | |
| +++ b/dwl.c
 | |
| @@ -29,6 +29,7 @@
 | |
|  #include <wlr/types/wlr_input_device.h>
 | |
|  #include <wlr/types/wlr_keyboard.h>
 | |
|  #include <wlr/types/wlr_keyboard_group.h>
 | |
| +#include <wlr/types/wlr_keyboard_shortcuts_inhibit_v1.h>
 | |
|  #include <wlr/types/wlr_layer_shell_v1.h>
 | |
|  #include <wlr/types/wlr_linux_dmabuf_v1.h>
 | |
|  #include <wlr/types/wlr_output.h>
 | |
| @@ -267,6 +268,7 @@ static void createnotify(struct wl_listener *listener, void *data);
 | |
|  static void createpointer(struct wlr_pointer *pointer);
 | |
|  static void createpointerconstraint(struct wl_listener *listener, void *data);
 | |
|  static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint);
 | |
| +static void createshortcutsinhibitor(struct wl_listener *listener, void *data);
 | |
|  static void cursorframe(struct wl_listener *listener, void *data);
 | |
|  static void cursorwarptohint(void);
 | |
|  static void destroydecoration(struct wl_listener *listener, void *data);
 | |
| @@ -280,6 +282,7 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data);
 | |
|  static void destroysessionlock(struct wl_listener *listener, void *data);
 | |
|  static void destroysessionmgr(struct wl_listener *listener, void *data);
 | |
|  static void destroykeyboardgroup(struct wl_listener *listener, void *data);
 | |
| +static void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data);
 | |
|  static Monitor *dirtomon(enum wlr_direction dir);
 | |
|  static void focusclient(Client *c, int lift);
 | |
|  static void focusmon(const Arg *arg);
 | |
| @@ -375,6 +378,7 @@ static struct wl_list clients; /* tiling order */
 | |
|  static struct wl_list fstack;  /* focus order */
 | |
|  static struct wlr_idle_notifier_v1 *idle_notifier;
 | |
|  static struct wlr_idle_inhibit_manager_v1 *idle_inhibit_mgr;
 | |
| +static struct wlr_keyboard_shortcuts_inhibit_manager_v1 *shortcuts_inhibit_mgr;
 | |
|  static struct wlr_layer_shell_v1 *layer_shell;
 | |
|  static struct wlr_output_manager_v1 *output_mgr;
 | |
|  static struct wlr_gamma_control_manager_v1 *gamma_control_mgr;
 | |
| @@ -394,6 +398,7 @@ static struct wlr_session_lock_manager_v1 *session_lock_mgr;
 | |
|  static struct wlr_scene_rect *locked_bg;
 | |
|  static struct wlr_session_lock_v1 *cur_lock;
 | |
|  static struct wl_listener lock_listener = {.notify = locksession};
 | |
| +static struct wl_listener new_shortcuts_inhibitor = {.notify = createshortcutsinhibitor};
 | |
|  
 | |
|  static struct wlr_seat *seat;
 | |
|  static KeyboardGroup *kb_group;
 | |
| @@ -1083,6 +1088,10 @@ createpointer(struct wlr_pointer *pointer)
 | |
|  	wlr_cursor_attach_input_device(cursor, &pointer->base);
 | |
|  }
 | |
|  
 | |
| +void createshortcutsinhibitor(struct wl_listener *listener, void *data) {
 | |
| +    wlr_keyboard_shortcuts_inhibitor_v1_activate(data);
 | |
| +}
 | |
| +
 | |
|  void
 | |
|  createpointerconstraint(struct wl_listener *listener, void *data)
 | |
|  {
 | |
| @@ -1280,6 +1289,11 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
 | |
|  	free(group);
 | |
|  }
 | |
|  
 | |
| +void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data) {
 | |
| +    wl_list_remove(&new_shortcuts_inhibitor.link);
 | |
| +    wl_list_remove(&listener->link);
 | |
| +}
 | |
| +
 | |
|  Monitor *
 | |
|  dirtomon(enum wlr_direction dir)
 | |
|  {
 | |
| @@ -1531,7 +1545,9 @@ keypress(struct wl_listener *listener, void *data)
 | |
|  
 | |
|  	/* On _press_ if there is no active screen locker,
 | |
|  	 * attempt to process a compositor keybinding. */
 | |
| -	if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
 | |
| +	if (!locked
 | |
| +		&& event->state == WL_KEYBOARD_KEY_STATE_PRESSED
 | |
| +		&& wl_list_empty(&shortcuts_inhibit_mgr->inhibitors)) {
 | |
|  		for (i = 0; i < nsyms; i++)
 | |
|  			handled = keybinding(mods, syms[i]) || handled;
 | |
|  	}
 | |
| @@ -2450,6 +2466,10 @@ setup(void)
 | |
|  			(float [4]){0.1f, 0.1f, 0.1f, 1.0f});
 | |
|  	wlr_scene_node_set_enabled(&locked_bg->node, 0);
 | |
|  
 | |
| +    shortcuts_inhibit_mgr = wlr_keyboard_shortcuts_inhibit_v1_create(dpy);
 | |
| +    wl_signal_add(&shortcuts_inhibit_mgr->events.new_inhibitor, &new_shortcuts_inhibitor);
 | |
| +    LISTEN_STATIC(&shortcuts_inhibit_mgr->events.destroy, destroyshortcutsinhibitmgr);
 | |
| +
 | |
|  	/* Use decoration protocols to negotiate server-side decorations */
 | |
|  	wlr_server_decoration_manager_set_default_mode(
 | |
|  			wlr_server_decoration_manager_create(dpy),
 | |
| -- 
 | |
| 2.44.1
 | |
| 
 | 
