summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2009-04-24 22:10:19 +0000
committerSergey Udaltsov <svu@gnome.org>2009-04-24 22:10:19 +0000
commit8bdf755fc41292b4988a0eacd1ad816eb5aa17a4 (patch)
tree22b3d1436ed060735a6d9447c95cccd192e226e2
parent1fafd406c9c5574acc61d6d57c70bf1ba482978d (diff)
downloadlibxklavier-8bdf755fc41292b4988a0eacd1ad816eb5aa17a4.tar.gz
crash BadWindow fixed, thanks to Federico, b.fd.o#21365
-rw-r--r--ChangeLog16
-rw-r--r--libxklavier/xklavier.c3
-rw-r--r--libxklavier/xklavier_evt.c5
-rw-r--r--libxklavier/xklavier_private.h2
-rw-r--r--libxklavier/xklavier_xkb.c6
5 files changed, 24 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 68be74f..614b1d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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: "