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