summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/event.c48
-rw-r--r--openbox/focus_cycle_popup.c2
-rw-r--r--openbox/popup.c2
-rw-r--r--openbox/window.h3
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