summaryrefslogtreecommitdiff
path: root/openbox/menuframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbox/menuframe.c')
-rw-r--r--openbox/menuframe.c56
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