X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=fafc0f790c0185bc045ec0ff862019043d6d0e13;hb=1ffc0021325e30db7bb7f8b2a17ca7f5546b3324;hp=85f09519f3a8f91ce9c2c789263323cf66a271f2;hpb=d179d6428ae585a3b8a13479bfe4586e41de2ff9;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 85f09519..fafc0f79 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -44,6 +44,8 @@ GList *menu_frame_visible; GHashTable *menu_frame_map; static RrAppearance *a_sep; +static guint submenu_show_timer = 0; +static guint submenu_hide_timer = 0; static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, ObMenuFrame *frame); @@ -321,7 +323,7 @@ static void menu_frame_place_submenu(ObMenuFrame *self, gint *x, gint *y) void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y, gint *dx, gint *dy) { - Rect const *a = NULL; + const Rect *a = NULL; gint pos, half; *dx = *dy = 0; @@ -831,7 +833,7 @@ void menu_frame_render(ObMenuFrame *self) static void menu_frame_update(ObMenuFrame *self) { GList *mit, *fit; - Rect const *a; + const Rect *a; gint h; menu_pipe_execute(self->menu); @@ -1009,8 +1011,8 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, */ static void remove_submenu_hide_timeout(ObMenuFrame *child) { - obt_main_loop_timeout_remove_data(ob_main_loop, submenu_hide_timeout, - child, FALSE); + if (submenu_hide_timer) g_source_remove(submenu_hide_timer); + submenu_hide_timer = 0; } gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, @@ -1061,14 +1063,15 @@ gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, static void menu_frame_hide(ObMenuFrame *self) { + ObMenu *const menu = self->menu; GList *it = g_list_find(menu_frame_visible, self); gulong ignore_start; if (!it) return; - if (self->menu->hide_func) - self->menu->hide_func(self, self->menu->data); + if (menu->hide_func) + menu->hide_func(self, menu->data); if (self->child) menu_frame_hide(self->child); @@ -1095,6 +1098,9 @@ static void menu_frame_hide(ObMenuFrame *self) event_end_ignore_all_enters(ignore_start); menu_frame_free(self); + + if (menu->cleanup_func) + menu->cleanup_func(menu, menu->data); } void menu_frame_hide_all(void) @@ -1103,7 +1109,8 @@ void menu_frame_hide_all(void) if (config_submenu_show_delay) { /* remove any submenu open requests */ - obt_main_loop_timeout_remove(ob_main_loop, submenu_show_timeout); + if (submenu_show_timer) g_source_remove(submenu_show_timer); + submenu_show_timer = 0; } if ((it = g_list_last(menu_frame_visible))) menu_frame_hide(it->data); @@ -1151,6 +1158,7 @@ static gboolean submenu_show_timeout(gpointer data) { g_assert(menu_frame_visible); menu_entry_frame_show_submenu((ObMenuEntryFrame*)data); + XFlush(obt_display); return FALSE; } @@ -1158,6 +1166,7 @@ static gboolean submenu_hide_timeout(gpointer data) { g_assert(menu_frame_visible); menu_frame_hide((ObMenuFrame*)data); + XFlush(obt_display); return FALSE; } @@ -1184,7 +1193,8 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, if (config_submenu_show_delay) { /* remove any submenu open requests */ - obt_main_loop_timeout_remove(ob_main_loop, submenu_show_timeout); + if (submenu_show_timer) g_source_remove(submenu_show_timer); + submenu_show_timer = 0; } self->selected = entry; @@ -1204,12 +1214,13 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, submenu */ if (immediate || config_submenu_hide_delay == 0) menu_frame_hide(oldchild); - else if (config_submenu_hide_delay > 0) - obt_main_loop_timeout_add(ob_main_loop, - config_submenu_hide_delay * 1000, - submenu_hide_timeout, - oldchild, g_direct_equal, - NULL); + else if (config_submenu_hide_delay > 0) { + if (submenu_hide_timer) g_source_remove(submenu_hide_timer); + submenu_hide_timer = + g_timeout_add_full(G_PRIORITY_DEFAULT, + config_submenu_hide_delay, + submenu_hide_timeout, oldchild, NULL); + } } } @@ -1221,12 +1232,15 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, if (oldchild_entry != self->selected) { if (immediate || config_submenu_hide_delay == 0) menu_entry_frame_show_submenu(self->selected); - else if (config_submenu_hide_delay > 0) - obt_main_loop_timeout_add(ob_main_loop, - config_submenu_show_delay * 1000, - submenu_show_timeout, - self->selected, g_direct_equal, - NULL); + else if (config_submenu_hide_delay > 0) { + if (submenu_show_timer) + g_source_remove(submenu_show_timer); + submenu_show_timer = + g_timeout_add_full(G_PRIORITY_DEFAULT, + config_submenu_show_delay, + submenu_show_timeout, + self->selected, NULL); + } } /* hide the grandchildren of this menu. and move the cursor to the current menu */