X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=b6126464ccb5119a1ce76e3f7cd33149e9ad05d6;hb=795d90c3bc57eaf2c98c447f3af5c1c9e7a52fa3;hp=900cb9438de372ae926eb535a50bdb08851f51e8;hpb=71d2605e1c24732e923333419d829f1c5f867fed;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 900cb943..b6126464 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -37,6 +37,7 @@ static void event_handle_client(Client *c, 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 || \ @@ -340,14 +341,33 @@ static gboolean event_ignore(XEvent *e, Client *client) 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 @@ -580,8 +600,10 @@ static void event_handle_client(Client *client, XEvent *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 @@ -931,18 +953,20 @@ static void event_handle_menu(Menu *menu, Client *client, XEvent *e) /* 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); + } } } @@ -1002,6 +1026,7 @@ static void event_handle_dock(Dock *s, XEvent *e) switch (e->type) { case ButtonPress: stacking_raise(DOCK_AS_WINDOW(s)); + break; case EnterNotify: dock_hide(FALSE); break;