X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=4f2a1513d746cdc1ee3fd90e32cc4b2ed2dceaad;hb=b07194a7aef3d0fbbef01a4e82fe7763f8c82720;hp=d3e5ad72d4d1ea44b8ffd0d44a29b5bfd3cdea30;hpb=3b1e518dbc2bf468db93ba6ea923c71c74b4b3cb;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index d3e5ad72..4f2a1513 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -16,7 +16,9 @@ See the COPYING file for a copy of the GNU General Public License. */ +#include "event.h" #include "debug.h" +#include "window.h" #include "openbox.h" #include "dock.h" #include "client.h" @@ -36,7 +38,6 @@ #include "group.h" #include "stacking.h" #include "extensions.h" -#include "event.h" #include #include @@ -95,6 +96,7 @@ static const int mask_table[] = { }; static int mask_table_size; +static guint ignore_enter_focus = 0; static ObClient *focus_delay_client; static gboolean menu_can_hide; @@ -420,34 +422,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } } - break; - case EnterNotify: - case LeaveNotify: - /* NotifyUngrab occurs when a mouse button is released and the event is - caused, like when lowering a window */ - /* NotifyVirtual and NotifyAncestor occurs when ungrabbing the - pointer (Ancestor happens when the pointer is on a window border) */ - if (e->xcrossing.mode == NotifyGrab || - e->xcrossing.detail == NotifyInferior || - (e->xcrossing.mode == NotifyUngrab && - (e->xcrossing.detail == NotifyAncestor || - e->xcrossing.detail == NotifyNonlinearVirtual || - e->xcrossing.detail == NotifyVirtual))) { -#ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); -#endif - return TRUE; - } -#ifdef DEBUG_FOCUS - ob_debug("%sNotify mode %d detail %d on %lx\n", - (e->type == EnterNotify ? "Enter" : "Leave"), - e->xcrossing.mode, - e->xcrossing.detail, client?client->window:0); -#endif - break; + break; } return FALSE; } @@ -719,9 +694,7 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - /* XXX if doing a 'reconfigure' make sure you kill this timer, - maybe all timers.. */ - if (config_focus_delay && client == focus_delay_client) { + if (client == focus_delay_client) { ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, focus_delay_client); @@ -732,6 +705,14 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case EnterNotify: + { + gboolean nofocus = FALSE; + + if (ignore_enter_focus) { + ignore_enter_focus--; + nofocus = TRUE; + } + con = frame_context(client, e->xcrossing.window); switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: @@ -755,11 +736,25 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (client_normal(client)) { - if (config_focus_follow) { + if (!nofocus && config_focus_follow && + client_normal(client) && client_can_focus(client)) { + if (e->xcrossing.mode == NotifyGrab || + e->xcrossing.detail == NotifyInferior || + e->xcrossing.mode == NotifyUngrab) + { +#ifdef DEBUG_FOCUS + ob_debug("%sNotify mode %d detail %d on %lx IGNORED\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); +#endif + } else { #ifdef DEBUG_FOCUS - ob_debug("EnterNotify on %lx, focusing window\n", - client->window); + ob_debug("%sNotify mode %d detail %d on %lx, " + "focusing window\n", + (e->type == EnterNotify ? "Enter" : "Leave"), + e->xcrossing.mode, + e->xcrossing.detail, client?client->window:0); #endif if (config_focus_delay) { ob_main_loop_timeout_add(ob_main_loop, @@ -767,8 +762,12 @@ static void event_handle_client(ObClient *client, XEvent *e) focus_delay_func, client, NULL); focus_delay_client = client; - } else + } else { client_focus(client); + if (config_focus_raise) + stacking_raise + (CLIENT_AS_WINDOW(focus_delay_client)); + } } } break; @@ -776,6 +775,7 @@ static void event_handle_client(ObClient *client, XEvent *e) break; } break; + } case ConfigureRequest: /* compress these */ while (XCheckTypedWindowEvent(ob_display, client->window, @@ -1252,7 +1252,11 @@ static gboolean menu_hide_delay_func(gpointer data) static gboolean focus_delay_func(gpointer data) { - client_focus(focus_delay_client); + if (data == focus_delay_client) { + client_focus(focus_delay_client); + if (config_focus_raise) + stacking_raise(CLIENT_AS_WINDOW(focus_delay_client)); + } return FALSE; /* no repeat */ } @@ -1265,3 +1269,8 @@ static void focus_delay_client_dest(gpointer data) focus_delay_client = NULL; } } + +void event_ignore_enter_focus(guint num) +{ + ignore_enter_focus += num; +}