static void event_handle_dock(Dock *s, XEvent *e);
static void event_handle_dockapp(DockApp *app, XEvent *e);
static void event_handle_client(Client *c, XEvent *e);
-static void event_handle_menu(Menu *menu, XEvent *e);
+static void event_handle_menu(Menu *menu, Client *c, XEvent *e);
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
+ (e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
#define INVALID_FOCUSOUT(e) ((e)->xfocus.mode == NotifyGrab || \
(e)->xfocus.detail == NotifyInferior || \
g_message("found pending FocusIn");
#endif
/* is the focused window getting a FocusOut/In back to
- itself? */
+ itself?
+ */
if (fe.xfocus.window == e->xfocus.window &&
!event_ignore(&fe, client)) {
+ /*
+ if focus_client is not set, then we can't do
+ this. we need the FocusIn. This happens in the
+ case when the set_focus_client(NULL) in the
+ focus_fallback function fires and then
+ focus_fallback picks the currently focused
+ window (such as on a SendToDesktop-esque action.
+ */
+ if (focus_client) {
#ifdef DEBUG_FOCUS
- g_message("focused window got an Out/In back to "
- "itself IGNORED both");
+ g_message("focused window got an Out/In back to "
+ "itself IGNORED both");
#endif
- return TRUE;
+ return TRUE;
+ } else {
+ event_process(&fe);
+#ifdef DEBUG_FOCUS
+ g_message("focused window got an Out/In back to "
+ "itself but focus_client was null "
+ "IGNORED just the Out");
+#endif
+ return TRUE;
+ }
}
/* once all the FocusOut's have been dealt with, if there
/* deal with it in the kernel */
if (menu) {
- event_handle_menu(menu, e);
+ event_handle_menu(menu, client, e);
return;
} else if (client)
event_handle_client(client, e);
#ifdef DEBUG_FOCUS
g_message("FocusIn on client for %lx", client->window);
#endif
- focus_set_client(client);
- frame_adjust_focus(client->frame, TRUE);
+ if (client != focus_client) {
+ focus_set_client(client);
+ frame_adjust_focus(client->frame, TRUE);
+ }
break;
case FocusOut:
#ifdef DEBUG_FOCUS
}
else if (msgtype == prop_atoms.net_wm_strut)
client_update_strut(client);
- else if (msgtype == prop_atoms.net_wm_icon)
+ else if (msgtype == prop_atoms.net_wm_icon ||
+ msgtype == prop_atoms.kwm_win_icon)
client_update_icons(client);
- else if (msgtype == prop_atoms.kwm_win_icon)
- client_update_kwm_icon(client);
default:
;
#ifdef SHAPE
}
}
-static void event_handle_menu(Menu *menu, XEvent *e)
+static void event_handle_menu(Menu *menu, Client *client, XEvent *e)
{
MenuEntry *entry;
/* grab_pointer_window(FALSE, None, menu->frame);*/
- entry = menu_find_entry(menu, e->xbutton.window);
- if (entry) {
- int junk;
- Window wjunk;
- guint ujunk, b, w, h;
- XGetGeometry(ob_display, e->xbutton.window,
- &wjunk, &junk, &junk, &w, &h, &b, &ujunk);
- if (e->xbutton.x >= (signed)-b &&
- e->xbutton.y >= (signed)-b &&
- e->xbutton.x < (signed)(w+b) &&
- e->xbutton.y < (signed)(h+b)) {
- menu_entry_fire(entry);
+ if (e->xbutton.button == 1) {
+ entry = menu_find_entry(menu, e->xbutton.window);
+ if (entry) {
+ int junk;
+ Window wjunk;
+ guint ujunk, b, w, h;
+ XGetGeometry(ob_display, e->xbutton.window,
+ &wjunk, &junk, &junk, &w, &h, &b, &ujunk);
+ if (e->xbutton.x >= (signed)-b &&
+ e->xbutton.y >= (signed)-b &&
+ e->xbutton.x < (signed)(w+b) &&
+ e->xbutton.y < (signed)(h+b)) {
+ menu_entry_fire(entry);
+ }
}
}
switch (e->type) {
case ButtonPress:
stacking_raise(DOCK_AS_WINDOW(s));
+ break;
case EnterNotify:
dock_hide(FALSE);
break;