ignore mouse clicks on override-redirect windows that aren't owned by openbox
This commit is contained in:
parent
6133bbd5f7
commit
2b80e4e8ef
4 changed files with 49 additions and 6 deletions
|
@ -694,12 +694,50 @@ static void event_process(const XEvent *ec, gpointer data)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (e->type == ButtonPress || e->type == ButtonRelease ||
|
if (e->type == ButtonPress || e->type == ButtonRelease) {
|
||||||
e->type == MotionNotify || e->type == KeyPress ||
|
/* If the button press was on some non-root window, or was physically
|
||||||
e->type == KeyRelease)
|
on the root window, the process it */
|
||||||
{
|
if (window != RootWindow(ob_display, ob_screen) ||
|
||||||
event_handle_user_input(client, e);
|
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
|
/* if something happens and it's not from an XEvent, then we don't know
|
||||||
the time */
|
the time */
|
||||||
|
|
|
@ -128,12 +128,14 @@ void focus_cycle_popup_startup(gboolean reconfig)
|
||||||
XMapWindow(ob_display, popup.text);
|
XMapWindow(ob_display, popup.text);
|
||||||
|
|
||||||
stacking_add(INTERNAL_AS_WINDOW(&popup));
|
stacking_add(INTERNAL_AS_WINDOW(&popup));
|
||||||
|
g_hash_table_insert(window_map, &popup.bg, &popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
void focus_cycle_popup_shutdown(gboolean reconfig)
|
void focus_cycle_popup_shutdown(gboolean reconfig)
|
||||||
{
|
{
|
||||||
icon_popup_free(single_popup);
|
icon_popup_free(single_popup);
|
||||||
|
|
||||||
|
g_hash_table_remove(window_map, &popup.bg);
|
||||||
stacking_remove(INTERNAL_AS_WINDOW(&popup));
|
stacking_remove(INTERNAL_AS_WINDOW(&popup));
|
||||||
|
|
||||||
while(popup.targets) {
|
while(popup.targets) {
|
||||||
|
|
|
@ -58,6 +58,7 @@ ObPopup *popup_new(void)
|
||||||
XMapWindow(ob_display, self->text);
|
XMapWindow(ob_display, self->text);
|
||||||
|
|
||||||
stacking_add(INTERNAL_AS_WINDOW(self));
|
stacking_add(INTERNAL_AS_WINDOW(self));
|
||||||
|
g_hash_table_insert(window_map, &self->bg, self);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ void popup_free(ObPopup *self)
|
||||||
XDestroyWindow(ob_display, self->text);
|
XDestroyWindow(ob_display, self->text);
|
||||||
RrAppearanceFree(self->a_bg);
|
RrAppearanceFree(self->a_bg);
|
||||||
RrAppearanceFree(self->a_text);
|
RrAppearanceFree(self->a_text);
|
||||||
|
g_hash_table_remove(window_map, &self->bg);
|
||||||
stacking_remove(self);
|
stacking_remove(self);
|
||||||
g_free(self);
|
g_free(self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,8 @@ typedef enum {
|
||||||
Window_Dock,
|
Window_Dock,
|
||||||
Window_DockApp, /* used for events but not stacking */
|
Window_DockApp, /* used for events but not stacking */
|
||||||
Window_Client,
|
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;
|
} Window_InternalType;
|
||||||
|
|
||||||
struct _ObWindow
|
struct _ObWindow
|
||||||
|
|
Loading…
Reference in a new issue