X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=41bcd350b3b9cfd01fba02dda297b06546f62c45;hb=5a468756c07a43e0ee7fa4e406847c86db09834a;hp=62778bce829fb6264c0dc22d714409b4f85dbd7b;hpb=6593261f30d611ff3b71abdb9fd043851fdd2ca9;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 62778bce..41bcd350 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -489,7 +489,7 @@ static void event_process(const XEvent *ec, gpointer data) focus_left_screen = FALSE; - focus_fallback(FALSE, config_focus_under_mouse, TRUE); + focus_fallback(FALSE, config_focus_under_mouse, TRUE, TRUE); /* We don't get a FocusOut for this case, because it's just moving from our Inferior up to us. This happens when iconifying a @@ -498,10 +498,10 @@ static void event_process(const XEvent *ec, gpointer data) /* focus_set_client(NULL) has already been called */ client_calc_layer(client); } - if (e->xfocus.detail == NotifyPointerRoot || - e->xfocus.detail == NotifyDetailNone || - e->xfocus.detail == NotifyInferior || - e->xfocus.detail == NotifyNonlinear) + else if (e->xfocus.detail == NotifyPointerRoot || + e->xfocus.detail == NotifyDetailNone || + e->xfocus.detail == NotifyInferior || + e->xfocus.detail == NotifyNonlinear) { XEvent ce; @@ -541,7 +541,8 @@ static void event_process(const XEvent *ec, gpointer data) */ if (!focus_left_screen) - focus_fallback(FALSE, config_focus_under_mouse, TRUE); + focus_fallback(FALSE, config_focus_under_mouse, + TRUE, TRUE); } } else if (!client) @@ -597,7 +598,7 @@ static void event_process(const XEvent *ec, gpointer data) ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an unmanaged window 0x%x !\n", ce.xfocus.window); - focus_fallback(TRUE, config_focus_under_mouse, TRUE); + focus_fallback(TRUE, config_focus_under_mouse, TRUE, TRUE); } } @@ -618,6 +619,11 @@ static void event_process(const XEvent *ec, gpointer data) event_handle_root(e); else if (e->type == MapRequest) client_manage(window); + else if (e->type == MappingNotify) { + /* keyboard layout changes, reconfigure openbox. need to restart the + modkeys system, but also to reload the key bindings. */ + ob_reconfigure(); + } else if (e->type == ClientMessage) { /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for windows that are not managed yet. */ @@ -717,6 +723,8 @@ static void event_handle_root(XEvent *e) ob_reconfigure(); else if (e->xclient.data.l[0] == 2) ob_restart(); + else if (e->xclient.data.l[0] == 3) + ob_exit(0); } break; case PropertyNotify: @@ -753,7 +761,7 @@ void event_enter_client(ObClient *client) data->time = event_curtime; ob_main_loop_timeout_add(ob_main_loop, - config_focus_delay, + config_focus_delay * 1000, focus_delay_func, data, focus_delay_cmp, focus_delay_dest); } else { @@ -1504,7 +1512,8 @@ static void event_handle_client(ObClient *client, XEvent *e) } else if (msgtype == prop_atoms.net_wm_user_time) { guint32 t; - if (PROP_GET32(client->window, net_wm_user_time, cardinal, &t) && + if (client == focus_client && + PROP_GET32(client->window, net_wm_user_time, cardinal, &t) && t && !event_time_after(t, e->xproperty.time) && (!event_last_user_time || event_time_after(t, event_last_user_time))) @@ -1577,7 +1586,7 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e) } } -static ObMenuFrame* find_active_menu() +static ObMenuFrame* find_active_menu(void) { GList *it; ObMenuFrame *ret = NULL; @@ -1591,7 +1600,7 @@ static ObMenuFrame* find_active_menu() return ret; } -static ObMenuFrame* find_active_or_last_menu() +static ObMenuFrame* find_active_or_last_menu(void) { ObMenuFrame *ret = NULL; @@ -1837,6 +1846,9 @@ static gboolean focus_delay_func(gpointer data) ObFocusDelayData *d = data; Time old = event_curtime; + /* don't move focus and kill the menu or the move/resize */ + if (menu_frame_visible || moveresize_in_progress) return FALSE; + event_curtime = d->time; if (focus_client != d->client) { if (client_focus(d->client) && config_focus_raise) @@ -1852,12 +1864,14 @@ static void focus_delay_client_dest(ObClient *client, gpointer data) client, FALSE); } -void event_halt_focus_delay() +void event_halt_focus_delay(void) { + /* ignore all enter events up till now */ + event_end_ignore_all_enters(1); ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); } -gulong event_start_ignore_all_enters() +gulong event_start_ignore_all_enters(void) { XSync(ob_display, FALSE); return LastKnownRequestProcessed(ob_display); @@ -1904,7 +1918,7 @@ static gboolean is_enter_focus_event_ignored(XEvent *e) return FALSE; } -void event_cancel_all_key_grabs() +void event_cancel_all_key_grabs(void) { if (actions_interactive_act_running()) { actions_interactive_cancel_act(); @@ -1951,7 +1965,7 @@ gboolean event_time_after(Time t1, Time t2) return t1 >= t2 && t1 < (t2 + TIME_HALF); } -Time event_get_server_time() +Time event_get_server_time(void) { /* Generate a timestamp */ XEvent event;