X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=0510dab29e9f7d2ad912c3294966071bec2caaf3;hb=aae074a11affd5c8bbe22b326ddbec323bb85677;hp=00036b48c83ed8b228bd5c2bbfe03c453b208776;hpb=418095b48ea33dfce904a0250f1659a6a0feeb78;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 00036b48..0510dab2 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -72,6 +72,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) { @@ -104,8 +106,10 @@ static void sn_handler(const XEvent *e, gpointer display) #endif -void event_startup() +void event_startup(gboolean reconfig) { + if (reconfig) return; + mask_table_size = sizeof(mask_table) / sizeof(mask_table[0]); /* get lock masks that are defined by the display (not constant) */ @@ -144,8 +148,10 @@ void event_startup() 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); } @@ -657,8 +663,10 @@ static void event_handle_client(ObClient *client, XEvent *e) case OB_FRAME_CONTEXT_FRAME: /* XXX if doing a 'reconfigure' make sure you kill this timer, maybe all timers.. */ - if (config_focus_delay) + if (config_focus_delay) { + focus_delay_client = NULL; ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + } default: break; } @@ -705,8 +713,8 @@ static void event_handle_client(ObClient *client, XEvent *e) ob_main_loop_timeout_add(ob_main_loop, config_focus_delay, focus_delay_func, - client, - NULL); + NULL, NULL); + focus_delay_client = client; } else client_focus(client); } @@ -1178,12 +1186,15 @@ static void event_handle_menu(XEvent *ev) static gboolean focus_delay_func(gpointer data) { - ObClient *c = data; - client_focus(c); + client_focus(focus_delay_client); return FALSE; /* no repeat */ } static void focus_delay_client_dest(gpointer data) { - ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + ObClient *c = data; + if (c == focus_delay_client) { + focus_delay_client = NULL; + ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + } }