X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=67afabc994a6d222895625d3569c3c04f270c86b;hb=8612fcfb99f4ed97f49c3617fd2ae291877c8c8e;hp=b9f04e4d5c7ecd43d90bc47061386f3a87d942fa;hpb=3f2d342de80d819f5a40b6af1e4cc5478429e6be;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index b9f04e4d..67afabc9 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -64,6 +64,12 @@ typedef struct gboolean ignored; } ObEventData; +typedef struct +{ + ObClient *client; + Time time; +} ObFocusDelayData; + static void event_process(const XEvent *e, gpointer data); static void event_client_dest(ObClient *client, gpointer data); static void event_handle_root(XEvent *e); @@ -98,6 +104,11 @@ static guint ignore_enter_focus = 0; static gboolean menu_can_hide; +static ObFocusDelayData focus_delay_data = { .client = NULL, + .time = CurrentTime }; + + + #ifdef USE_SM static void ice_handler(gint fd, gpointer conn) { @@ -387,9 +398,7 @@ static gboolean event_ignore(XEvent *e, ObClient *client) switch(e->type) { case EnterNotify: case LeaveNotify: - if (e->xcrossing.detail == NotifyInferior) - return TRUE; - break; + return keyboard_interactively_grabbed(); case FocusIn: case FocusOut: /* I don't think this should ever happen with our event masks, but @@ -473,7 +482,13 @@ static void event_process(const XEvent *ec, gpointer data) ed->ignored = FALSE; /* deal with it in the kernel */ - if (group) + + if (menu_frame_visible && + (e->type == EnterNotify || e->type == LeaveNotify)) + { + /* crossing events for menu */ + event_handle_menu(e); + } else if (group) event_handle_group(group, e); else if (client) event_handle_client(client, e); @@ -613,12 +628,19 @@ void event_enter_client(ObClient *client) if (client_normal(client) && client_can_focus(client)) { if (config_focus_delay) { ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); + + focus_delay_data.client = client; + focus_delay_data.time = event_curtime; + ob_main_loop_timeout_add(ob_main_loop, config_focus_delay, focus_delay_func, - client, NULL); - } else - focus_delay_func(client); + NULL, NULL); + } else { + focus_delay_data.client = client; + focus_delay_data.time = event_curtime; + focus_delay_func(NULL); + } } } @@ -738,10 +760,11 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (config_focus_follow && config_focus_delay) - ob_main_loop_timeout_remove_data(ob_main_loop, - focus_delay_func, - client, TRUE); + if (config_focus_follow && config_focus_delay && + focus_delay_data.client == client) + { + event_halt_focus_delay(); + } break; default: break; @@ -1262,25 +1285,25 @@ static void event_handle_menu(XEvent *ev) menu_frame_hide_all(); } break; - case MotionNotify: - if ((f = menu_frame_under(ev->xmotion.x_root, - ev->xmotion.y_root))) { - if ((e = menu_entry_frame_under(ev->xmotion.x_root, - ev->xmotion.y_root))) { - /* XXX menu_frame_entry_move_on_screen(f); */ - menu_frame_select(f, e); - } + case EnterNotify: + if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) { + if (e->ignore_enters) + --e->ignore_enters; + else + menu_frame_select(e->frame, e); } + break; + case LeaveNotify: + if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window)) && + (f = find_active_menu()) && f->selected == e && + e->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU) { - ObMenuFrame *a; - - a = find_active_menu(); - if (a && a != f && - a->selected->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU) - { - menu_frame_select(a, NULL); - } + menu_frame_select(e->frame, NULL); } + case MotionNotify: + if ((e = menu_entry_frame_under(ev->xmotion.x_root, + ev->xmotion.y_root))) + menu_frame_select(e->frame, e); break; case KeyPress: if (ev->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) @@ -1319,19 +1342,20 @@ static gboolean menu_hide_delay_func(gpointer data) static gboolean focus_delay_func(gpointer data) { - ObClient *c = data; - - if (focus_client != c) { - if (client_focus(c) && config_focus_raise) - client_raise(c); + Time old = event_curtime; + event_curtime = focus_delay_data.time; + if (focus_client != focus_delay_data.client) { + if (client_focus(focus_delay_data.client) && config_focus_raise) + client_raise(focus_delay_data.client); } + event_curtime = old; return FALSE; /* no repeat */ } static void focus_delay_client_dest(ObClient *client, gpointer data) { - ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, - client, TRUE); + if (focus_delay_data.client == client) + event_halt_focus_delay(); } static void event_client_dest(ObClient *client, gpointer data) @@ -1342,6 +1366,7 @@ static void event_client_dest(ObClient *client, gpointer data) void event_halt_focus_delay() { + focus_delay_data.client = NULL; ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); }