From 2b80e4e8ef56bb4fba614139601e750344418e5b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 11 Jan 2008 18:13:12 -0500 Subject: [PATCH] ignore mouse clicks on override-redirect windows that aren't owned by openbox --- openbox/event.c | 48 +++++++++++++++++++++++++++++++++---- openbox/focus_cycle_popup.c | 2 ++ openbox/popup.c | 2 ++ openbox/window.h | 3 ++- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index 03229117..cd562599 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -694,12 +694,50 @@ static void event_process(const XEvent *ec, gpointer data) } #endif - if (e->type == ButtonPress || e->type == ButtonRelease || - e->type == MotionNotify || e->type == KeyPress || - e->type == KeyRelease) - { - event_handle_user_input(client, e); + if (e->type == ButtonPress || e->type == ButtonRelease) { + /* If the button press was on some non-root window, or was physically + on the root window, the process it */ + if (window != RootWindow(ob_display, ob_screen) || + e->xbutton.subwindow == None) + { + event_handle_user_input(client, e); + } + /* Otherwise only process it if it was physically on an openbox + internal window */ + else { + Window target, parent, root, *children; + unsigned int nchildren; + ObWindow *w; + + /* Find the top level ancestor of the subwindow, besides the + root */ + target = e->xbutton.subwindow; + ob_debug("subwindow 0x%x\n", target); + while (XQueryTree(ob_display, target, &root, &parent, &children, + &nchildren) != 0) + { + XFree(children); + if (parent == root) { + ob_debug("parent is root\n"); + break; + } + target = parent; + } + ob_debug("toplevel 0x%x\n", target); + + w = g_hash_table_lookup(window_map, &target); + ob_debug("w 0x%x\n", w); + + if ((w = g_hash_table_lookup(window_map, &target)) && + WINDOW_IS_INTERNAL(w)) + { + event_handle_user_input(client, e); + } + } } + else if (e->type == KeyPress || e->type == KeyRelease || + e->type == MotionNotify) + event_handle_user_input(client, e); /* if something happens and it's not from an XEvent, then we don't know the time */ diff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c index 028fa45d..9a6f2420 100644 --- a/openbox/focus_cycle_popup.c +++ b/openbox/focus_cycle_popup.c @@ -128,12 +128,14 @@ void focus_cycle_popup_startup(gboolean reconfig) XMapWindow(ob_display, popup.text); stacking_add(INTERNAL_AS_WINDOW(&popup)); + g_hash_table_insert(window_map, &popup.bg, &popup); } void focus_cycle_popup_shutdown(gboolean reconfig) { icon_popup_free(single_popup); + g_hash_table_remove(window_map, &popup.bg); stacking_remove(INTERNAL_AS_WINDOW(&popup)); while(popup.targets) { diff --git a/openbox/popup.c b/openbox/popup.c index 071f5b62..283348e7 100644 --- a/openbox/popup.c +++ b/openbox/popup.c @@ -58,6 +58,7 @@ ObPopup *popup_new(void) XMapWindow(ob_display, self->text); stacking_add(INTERNAL_AS_WINDOW(self)); + g_hash_table_insert(window_map, &self->bg, self); return self; } @@ -68,6 +69,7 @@ void popup_free(ObPopup *self) XDestroyWindow(ob_display, self->text); RrAppearanceFree(self->a_bg); RrAppearanceFree(self->a_text); + g_hash_table_remove(window_map, &self->bg); stacking_remove(self); g_free(self); } diff --git a/openbox/window.h b/openbox/window.h index aaf83995..a172cfce 100644 --- a/openbox/window.h +++ b/openbox/window.h @@ -32,7 +32,8 @@ typedef enum { Window_Dock, Window_DockApp, /* used for events but not stacking */ Window_Client, - Window_Internal /* used for stacking but not events */ + Window_Internal /* used for stacking but not events (except to filter + events on the root window) */ } Window_InternalType; struct _ObWindow -- 2.45.2