Add error handling to XGrabButton
This commit is contained in:
		
							parent
							
								
									a606b1b471
								
							
						
					
					
						commit
						b5a7dbee5a
					
				
							
								
								
									
										40
									
								
								dunst.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								dunst.c
									
									
									
									
									
								
							| @ -73,7 +73,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 dunst_grab_errored = False; | ||||||
| 
 | 
 | ||||||
| int next_notification_id = 1; | int next_notification_id = 1; | ||||||
| 
 | 
 | ||||||
| @ -112,9 +112,9 @@ void warn(const char *text, int urg); | |||||||
| void init_shortcut(keyboard_shortcut * shortcut); | 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) | static int GrabXErrorHandler(Display * display, XErrorEvent * e) | ||||||
| { | { | ||||||
|         dunst_grab_key_errored = True; |         dunst_grab_errored = True; | ||||||
|         char err_buf[BUFSIZ]; |         char err_buf[BUFSIZ]; | ||||||
|         XGetErrorText(display, e->error_code, err_buf, BUFSIZ); |         XGetErrorText(display, e->error_code, err_buf, BUFSIZ); | ||||||
|         fputs(err_buf, stderr); |         fputs(err_buf, stderr); | ||||||
| @ -127,26 +127,34 @@ static int GrabKeyXErrorHandler(Display * display, XErrorEvent * e) | |||||||
|         return 0; |         return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void setup_error_handler(void) | ||||||
|  | { | ||||||
|  |         dunst_grab_errored = False; | ||||||
|  | 
 | ||||||
|  |         XFlush(dc->dpy); | ||||||
|  |         XSetErrorHandler(GrabXErrorHandler); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int tear_down_error_handler(void) | ||||||
|  | { | ||||||
|  |         XFlush(dc->dpy); | ||||||
|  |         XSync(dc->dpy, False); | ||||||
|  |         XSetErrorHandler(NULL); | ||||||
|  |         return dunst_grab_errored; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int grab_key(keyboard_shortcut * ks) | int grab_key(keyboard_shortcut * ks) | ||||||
| { | { | ||||||
|         Window root; |         Window root; | ||||||
|         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); |         root = RootWindow(dc->dpy, DefaultScreen(dc->dpy)); | ||||||
|         dunst_grab_key_errored = False; |  | ||||||
| 
 | 
 | ||||||
|         XFlush(dc->dpy); |         setup_error_handler(); | ||||||
| 
 |  | ||||||
|         XErrorHandler old_handler = XSetErrorHandler(GrabKeyXErrorHandler); |  | ||||||
| 
 | 
 | ||||||
|         if (ks->is_valid) |         if (ks->is_valid) | ||||||
|                 XGrabKey(dc->dpy, ks->code, ks->mask, root, |                 XGrabKey(dc->dpy, ks->code, ks->mask, root, | ||||||
|                          True, GrabModeAsync, GrabModeAsync); |                          True, GrabModeAsync, GrabModeAsync); | ||||||
| 
 | 
 | ||||||
|         XFlush(dc->dpy); |         if (tear_down_error_handler()) { | ||||||
|         XSync(dc->dpy, False); |  | ||||||
| 
 |  | ||||||
|         XSetErrorHandler(old_handler); |  | ||||||
| 
 |  | ||||||
|         if (dunst_grab_key_errored) { |  | ||||||
|                 fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str); |                 fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str); | ||||||
|                 return 1; |                 return 1; | ||||||
|         } |         } | ||||||
| @ -1217,8 +1225,14 @@ void map_win(void) | |||||||
|         update_screen_info(); |         update_screen_info(); | ||||||
| 
 | 
 | ||||||
|         XMapRaised(dc->dpy, win); |         XMapRaised(dc->dpy, win); | ||||||
|  | 
 | ||||||
|  |         setup_error_handler(); | ||||||
|         XGrabButton(dc->dpy, AnyButton, AnyModifier, win, False, |         XGrabButton(dc->dpy, AnyButton, AnyModifier, win, False, | ||||||
|                     BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |                     BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); | ||||||
|  |         if (tear_down_error_handler()) { | ||||||
|  |                 fprintf(stderr, "Unable to grab mouse button(s)\n"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         XFlush(dc->dpy); |         XFlush(dc->dpy); | ||||||
|         draw_win(); |         draw_win(); | ||||||
|         visible = True; |         visible = True; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Sascha Kruse
						Sascha Kruse