X(Un)grab wrapper with error handling
This commit is contained in:
		
							parent
							
								
									59cb3a5247
								
							
						
					
					
						commit
						2dbdc19e1f
					
				
							
								
								
									
										78
									
								
								dunst.c
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								dunst.c
									
									
									
									
									
								
							| @ -77,6 +77,7 @@ static dimension_t geometry; | |||||||
| static XScreenSaverInfo *screensaver_info; | static XScreenSaverInfo *screensaver_info; | ||||||
| static int font_h; | static int font_h; | ||||||
| 
 | 
 | ||||||
|  | int dunst_grab_key_errored = False; | ||||||
| 
 | 
 | ||||||
| int next_notification_id = 1; | int next_notification_id = 1; | ||||||
| 
 | 
 | ||||||
| @ -116,6 +117,56 @@ void init_shortcut(keyboard_shortcut * shortcut); | |||||||
| KeySym string_to_mask(char *str); | KeySym string_to_mask(char *str); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | static int GrabKeyXErrorHandler(Display *display, XErrorEvent *e) | ||||||
|  | { | ||||||
|  |         dunst_grab_key_errored = True; | ||||||
|  |         char err_buf[BUFSIZ]; | ||||||
|  |         XGetErrorText(display, e->error_code, err_buf, BUFSIZ); | ||||||
|  |         fputs(err_buf, stderr); | ||||||
|  |         fputs("\n", stderr); | ||||||
|  | 
 | ||||||
|  |         if (e->error_code != BadAccess) { | ||||||
|  |                 exit(EXIT_FAILURE); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     return 0 ; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int grab_key(keyboard_shortcut *ks) | ||||||
|  | { | ||||||
|  |         Window root; | ||||||
|  |         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); | ||||||
|  |         dunst_grab_key_errored = False; | ||||||
|  | 
 | ||||||
|  |         XFlush(dc->dpy); | ||||||
|  | 
 | ||||||
|  |         XErrorHandler old_handler = XSetErrorHandler(GrabKeyXErrorHandler); | ||||||
|  | 
 | ||||||
|  |         if (ks->is_valid) | ||||||
|  |                 XGrabKey(dc->dpy, ks->code, ks->mask, root, | ||||||
|  |                          True, GrabModeAsync, GrabModeAsync); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         XFlush(dc->dpy); | ||||||
|  |         XSync(dc->dpy, False); | ||||||
|  | 
 | ||||||
|  |         XSetErrorHandler(old_handler); | ||||||
|  | 
 | ||||||
|  |         if (dunst_grab_key_errored) { | ||||||
|  |                 fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str); | ||||||
|  |                 return 1; | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ungrab_key(keyboard_shortcut *ks) | ||||||
|  | { | ||||||
|  |         Window root; | ||||||
|  |         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); | ||||||
|  |         if (ks->is_valid) | ||||||
|  |                 XUngrabKey(dc->dpy, ks->code, ks->mask, root); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void warn(const char *text, int urg) | void warn(const char *text, int urg) | ||||||
| { | { | ||||||
|         notification *n = malloc(sizeof(notification)); |         notification *n = malloc(sizeof(notification)); | ||||||
| @ -917,14 +968,8 @@ void run(void) | |||||||
| 
 | 
 | ||||||
| void hide_win() | void hide_win() | ||||||
| { | { | ||||||
|         Window root; |         ungrab_key(&close_ks); | ||||||
|         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); |         ungrab_key(&close_all_ks); | ||||||
| 
 |  | ||||||
|         if (close_ks.is_valid) |  | ||||||
|                 XUngrabKey(dc->dpy, close_ks.code, close_ks.mask, root); |  | ||||||
| 
 |  | ||||||
|         if (close_all_ks.is_valid) |  | ||||||
|                 XUngrabKey(dc->dpy, close_all_ks.code, close_all_ks.mask, root); |  | ||||||
| 
 | 
 | ||||||
|         XUngrabButton(dc->dpy, AnyButton, AnyModifier, win); |         XUngrabButton(dc->dpy, AnyButton, AnyModifier, win); | ||||||
|         XUnmapWindow(dc->dpy, win); |         XUnmapWindow(dc->dpy, win); | ||||||
| @ -1063,10 +1108,7 @@ void setup(void) | |||||||
|                                                         DefaultScreen(dc->dpy)), |                                                         DefaultScreen(dc->dpy)), | ||||||
|                           CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); |                           CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | ||||||
| 
 | 
 | ||||||
|         /* grab keys */ |         grab_key(&history_ks); | ||||||
|         if (history_ks.is_valid) |  | ||||||
|                 XGrabKey(dc->dpy, history_ks.code, history_ks.mask, root, |  | ||||||
|                          True, GrabModeAsync, GrabModeAsync); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void map_win(void) | void map_win(void) | ||||||
| @ -1076,16 +1118,8 @@ void map_win(void) | |||||||
|                 return; |                 return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         Window root; |         grab_key(&close_ks); | ||||||
|         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); |         grab_key(&close_all_ks); | ||||||
| 
 |  | ||||||
|         if (close_ks.is_valid) |  | ||||||
|                 XGrabKey(dc->dpy, close_ks.code, close_ks.mask, root, True, |  | ||||||
|                          GrabModeAsync, GrabModeAsync); |  | ||||||
| 
 |  | ||||||
|         if (close_all_ks.is_valid) |  | ||||||
|                 XGrabKey(dc->dpy, close_all_ks.code, close_all_ks.mask, root, |  | ||||||
|                          True, GrabModeAsync, GrabModeAsync); |  | ||||||
| 
 | 
 | ||||||
|         update_screen_info(); |         update_screen_info(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Sascha Kruse
						Sascha Kruse