X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=d7c80949c87d7944a5d5250fb99ca4988335b398;hb=cb3aaab102035e227c6d64c7b5c319ed3b13cef2;hp=dda1d2272aa504005e22464eef04e765aaa21dbe;hpb=030fabad14e994d575feba9894a0412e5266f0bb;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index dda1d227..d7c80949 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -24,10 +24,6 @@ #include #include -#ifdef USE_LIBSN -# include -#endif - #ifdef HAVE_SYS_SELECT_H # include #endif @@ -46,6 +42,9 @@ static void event_handle_dock(ObDock *s, XEvent *e); static void event_handle_dockapp(ObDockApp *app, XEvent *e); static void event_handle_client(ObClient *c, XEvent *e); +static gboolean focus_delay_func(gpointer data); +static void focus_delay_client_dest(gpointer data); + #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \ (e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail > NotifyNonlinearVirtual) @@ -69,6 +68,8 @@ static const int mask_table[] = { }; static int mask_table_size; +static ObClient *focus_delay_client; + #ifdef USE_SM static void ice_handler(int fd, gpointer conn) { @@ -91,18 +92,10 @@ static void ice_watch(IceConn conn, IcePointer data, Bool opening, } #endif -#ifdef USE_LIBSN -static void sn_handler(const XEvent *e, gpointer display) +void event_startup(gboolean reconfig) { - XEvent ec; - ec = *e; - sn_display_process_event(display, &ec); -} -#endif - + if (reconfig) return; -void event_startup() -{ mask_table_size = sizeof(mask_table) / sizeof(mask_table[0]); /* get lock masks that are defined by the display (not constant) */ @@ -134,13 +127,14 @@ void event_startup() IceAddConnectionWatch(ice_watch, NULL); #endif -#ifdef USE_LIBSN - ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL); -#endif + client_add_destructor(focus_delay_client_dest); } -void event_shutdown() +void event_shutdown(gboolean reconfig) { + if (reconfig) return; + + client_remove_destructor(focus_delay_client_dest); XFreeModifiermap(modmap); } @@ -648,6 +642,15 @@ static void event_handle_client(ObClient *client, XEvent *e) client->frame->close_hover = FALSE; 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) { + ob_main_loop_timeout_remove_data(ob_main_loop, + focus_delay_func, + focus_delay_client); + focus_delay_client = NULL; + } default: break; } @@ -690,7 +693,14 @@ static void event_handle_client(ObClient *client, XEvent *e) ob_debug("EnterNotify on %lx, focusing window\n", client->window); #endif - client_focus(client); + if (config_focus_delay) { + ob_main_loop_timeout_add(ob_main_loop, + config_focus_delay, + focus_delay_func, + client, NULL); + focus_delay_client = client; + } else + client_focus(client); } } break; @@ -1157,3 +1167,19 @@ static void event_handle_menu(XEvent *ev) break; } } + +static gboolean focus_delay_func(gpointer data) +{ + client_focus(focus_delay_client); + return FALSE; /* no repeat */ +} + +static void focus_delay_client_dest(gpointer data) +{ + ObClient *c = data; + if (c == focus_delay_client) { + ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, + focus_delay_client); + focus_delay_client = NULL; + } +}