#define FRAME_EVENTMASK (ButtonPressMask |ButtonMotionMask | EnterWindowMask |\
LeaveWindowMask)
#define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
- ButtonPressMask | ButtonReleaseMask)
+ ButtonPressMask | ButtonReleaseMask | \
+ PointerMotionMask)
GList *menu_frame_visible;
GHashTable *menu_frame_map;
static void menu_entry_frame_free(ObMenuEntryFrame *self)
{
if (self) {
- menu_entry_unref(self->entry);
-
window_remove(self->window);
XDestroyWindow(obt_display, self->text);
g_hash_table_remove(menu_frame_map, &self->bullet);
}
+ menu_entry_unref(self->entry);
g_slice_free(ObMenuEntryFrame, self);
}
}
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;
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);
parent->child_entry = parent_entry;
}
- if (!menu_frame_show(self))
+ if (!menu_frame_show(self)) {
+ parent->child = NULL;
+ parent->child_entry = NULL;
return FALSE;
+ }
menu_frame_place_submenu(self, &x, &y);
menu_frame_move_on_screen(self, x, y, &dx, &dy);
if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
/* only show if the submenu isn't already showing */
if (oldchild_entry != self->selected) {
- if (immediate || config_submenu_hide_delay == 0)
+ if (immediate || config_submenu_show_delay == 0)
menu_entry_frame_show_submenu(self->selected);
- else if (config_submenu_hide_delay > 0) {
+ else if (config_submenu_show_delay > 0) {
if (submenu_show_timer)
g_source_remove(submenu_show_timer);
submenu_show_timer =
/* pass our direction on to our child */
f->direction_right = self->frame->direction_right;
- menu_frame_show_submenu(f, self->frame, self);
+ if (!menu_frame_show_submenu(f, self->frame, self))
+ menu_frame_free(f);
}
void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state)