diff options
Diffstat (limited to 'openbox/menuframe.c')
| -rw-r--r-- | openbox/menuframe.c | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 3252bb3c..c37fdcc5 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -203,8 +203,6 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, static void menu_entry_frame_free(ObMenuEntryFrame *self) { if (self) { - menu_entry_unref(self->entry); - window_remove(self->window); XDestroyWindow(obt_display, self->text); @@ -221,6 +219,7 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self) g_hash_table_remove(menu_frame_map, &self->bullet); } + menu_entry_unref(self->entry); g_slice_free(ObMenuEntryFrame, self); } } @@ -232,10 +231,18 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y) XMoveWindow(obt_display, self->window, self->area.x, self->area.y); } -static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y) +static void menu_frame_place_topmenu(ObMenuFrame *self, const GravityPoint *pos, + gint *x, gint *y, gint monitor, + gboolean user_positioned) { gint dx, dy; + screen_apply_gravity_point(x, y, self->area.width, self->area.height, + pos, screen_physical_area_monitor(monitor)); + + if (user_positioned) + return; + if (config_menu_middle) { gint myx; @@ -989,20 +996,26 @@ static gboolean menu_frame_show(ObMenuFrame *self) return TRUE; } -gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, - gboolean mouse) +gboolean menu_frame_show_topmenu(ObMenuFrame *self, const GravityPoint *pos, + gint monitor, gboolean mouse, + gboolean user_positioned) { gint px, py; + gint x, y; if (menu_frame_is_visible(self)) return TRUE; if (!menu_frame_show(self)) return FALSE; - if (self->menu->place_func) + if (self->menu->place_func) { + x = pos->x.pos; + y = pos->y.pos; self->menu->place_func(self, &x, &y, mouse, self->menu->data); - else - menu_frame_place_topmenu(self, &x, &y); + } else { + menu_frame_place_topmenu(self, pos, &x, &y, monitor, + user_positioned); + } menu_frame_move(self, x, y); @@ -1023,7 +1036,6 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, static void remove_submenu_hide_timeout(ObMenuFrame *child) { if (submenu_hide_timer) g_source_remove(submenu_hide_timer); - submenu_hide_timer = 0; } gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, @@ -1121,11 +1133,9 @@ void menu_frame_hide_all(void) { GList *it; - if (config_submenu_show_delay) { + if (config_submenu_show_delay && submenu_show_timer) /* remove any submenu open requests */ - if (submenu_show_timer) g_source_remove(submenu_show_timer); - submenu_show_timer = 0; - } + g_source_remove(submenu_show_timer); if ((it = g_list_last(menu_frame_visible))) menu_frame_hide(it->data); } @@ -1175,6 +1185,11 @@ static gboolean submenu_show_timeout(gpointer data) return FALSE; } +static void submenu_show_dest(gpointer data) +{ + submenu_show_timer = 0; +} + static gboolean submenu_hide_timeout(gpointer data) { g_assert(menu_frame_visible); @@ -1182,6 +1197,11 @@ static gboolean submenu_hide_timeout(gpointer data) return FALSE; } +static void submenu_hide_dest(gpointer data) +{ + submenu_hide_timer = 0; +} + void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, gboolean immediate) { @@ -1203,11 +1223,9 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, if (!entry && oldchild_entry) entry = oldchild_entry; - if (config_submenu_show_delay) { + if (config_submenu_show_delay && submenu_show_timer) /* remove any submenu open requests */ - if (submenu_show_timer) g_source_remove(submenu_show_timer); - submenu_show_timer = 0; - } + g_source_remove(submenu_show_timer); self->selected = entry; @@ -1231,7 +1249,7 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, submenu_hide_timer = g_timeout_add_full(G_PRIORITY_DEFAULT, config_submenu_hide_delay, - submenu_hide_timeout, oldchild, NULL); + submenu_hide_timeout, oldchild, submenu_hide_dest); } } } @@ -1251,7 +1269,7 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, g_timeout_add_full(G_PRIORITY_DEFAULT, config_submenu_show_delay, submenu_show_timeout, - self->selected, NULL); + self->selected, submenu_show_dest); } } /* hide the grandchildren of this menu. and move the cursor to |
