diff options
author | Sergey Udaltsov <svu@gnome.org> | 2009-04-24 22:10:19 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2009-04-24 22:10:19 +0000 |
commit | 8bdf755fc41292b4988a0eacd1ad816eb5aa17a4 (patch) | |
tree | 22b3d1436ed060735a6d9447c95cccd192e226e2 | |
parent | 1fafd406c9c5574acc61d6d57c70bf1ba482978d (diff) | |
download | libxklavier-8bdf755fc41292b4988a0eacd1ad816eb5aa17a4.tar.gz |
crash BadWindow fixed, thanks to Federico, b.fd.o#21365
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | libxklavier/xklavier.c | 3 | ||||
-rw-r--r-- | libxklavier/xklavier_evt.c | 5 | ||||
-rw-r--r-- | libxklavier/xklavier_private.h | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_xkb.c | 6 |
5 files changed, 24 insertions, 8 deletions
@@ -1,3 +1,19 @@ +2009-04-23 Federico Mena Quintero <federico@novell.com> + + https://bugs.freedesktop.org/show_bug.cgi?id=21365 - Make sure + libxklavier's X error handler still runs, even if the XKB + extension is not present. + * libxklavier/xklavier_evt.c (xkl_process_error): Fix the + prototype to match XErrorHandler, so that we don't have to use + casts when using XSetErrorHandler(). + * libxklavier/xklavier_xkb.c (xkl_xkb_init): In case XKB is not + present, do not reset the X error handler here... + * libxklavier/xklavier.c (xkl_engine_constructor): ... but do it + here instead in case neither the XKB nor xmodmap modules can be + initialized. This way if either succeeds, libxklavier will have + its own X error handler present, which is needed to filter out + "harmless" errors like BadWindow for disappearing windows. + 2009-04-06 svu * libxklavier/Makefile.am, tests/Makefile.am: adding -lX11 to .la diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index 412b0b1..f7026f1 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -631,7 +631,7 @@ xkl_engine_constructor(GType type, xkl_engine_priv(engine, display) = display; xkl_engine_priv(engine, default_error_handler) = - XSetErrorHandler((XErrorHandler) xkl_process_error); + XSetErrorHandler(xkl_process_error); scr = DefaultScreen(display); xkl_engine_priv(engine, root_window) = RootWindow(display, scr); @@ -671,6 +671,7 @@ xkl_engine_constructor(GType type, xkl_engine_get_backend_name(engine)); } else { xkl_debug(0, "All backends failed, last result: %d\n", rv); + XSetErrorHandler(xkl_engine_priv(engine, default_error_handler)); xkl_engine_priv(engine, display) = NULL; g_object_unref(G_OBJECT(engine)); return NULL; diff --git a/libxklavier/xklavier_evt.c b/libxklavier/xklavier_evt.c index fbe98c9..918a5f8 100644 --- a/libxklavier/xklavier_evt.c +++ b/libxklavier/xklavier_evt.c @@ -465,7 +465,7 @@ xkl_engine_process_create_window_evt(XklEngine * engine, * This handler can be called in the middle of the engine initialization - * so it is not fair to assume that the engine is available */ -void +int xkl_process_error(Display * dpy, XErrorEvent * evt) { char buf[128] = ""; @@ -504,6 +504,9 @@ xkl_process_error(Display * dpy, XErrorEvent * evt) (engine, default_error_handler)) (dpy, evt); } + + /* X ignores this return value anyway */ + return 0; } /* diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index 228412c..7e1b4a8 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -261,7 +261,7 @@ extern void xkl_engine_process_property_evt(XklEngine * engine, extern void xkl_engine_process_create_window_evt(XklEngine * engine, XCreateWindowEvent * cev); -extern void xkl_process_error(Display * dpy, XErrorEvent * evt); +extern int xkl_process_error(Display * dpy, XErrorEvent * evt); extern void xkl_engine_process_state_modification(XklEngine * engine, XklEngineStateChange diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index 9a1d5ba..e445797 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -590,12 +590,8 @@ xkl_xkb_init(XklEngine * engine) XklXkb, error_code), NULL, NULL); - if (!xkl_xkb_ext_present) { - XSetErrorHandler((XErrorHandler) - xkl_engine_priv(engine, - default_error_handler)); + if (!xkl_xkb_ext_present) return -1; - } xkl_debug(160, "xkbEvenType: %X, xkbError: %X, display: %p, root: " |