Let the menu placement code know if the position was user specified
This way, it can avoid running the code that moves it to a good position relative to a mouse that isn't there
This commit is contained in:
parent
1b3afcff1f
commit
d3359676e4
5 changed files with 17 additions and 8 deletions
|
@ -115,7 +115,8 @@ static gboolean run_func(ObActionsData *data, gpointer options)
|
|||
|
||||
/* you cannot call ShowMenu from inside a menu */
|
||||
if (data->uact != OB_USER_ACTION_MENU_SELECTION && o->name)
|
||||
menu_show(o->name, position, monitor, data->button != 0, data->client);
|
||||
menu_show(o->name, position, monitor,
|
||||
data->button != 0, o->use_position, data->client);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -458,7 +458,7 @@ static gboolean menu_hide_delay_func(gpointer data)
|
|||
}
|
||||
|
||||
void menu_show(gchar *name, GravityPoint pos, gint monitor,
|
||||
gboolean mouse, ObClient *client)
|
||||
gboolean mouse, gboolean user_positioned, ObClient *client)
|
||||
{
|
||||
ObMenu *self;
|
||||
ObMenuFrame *frame;
|
||||
|
@ -480,7 +480,7 @@ void menu_show(gchar *name, GravityPoint pos, gint monitor,
|
|||
menu_clear_pipe_caches();
|
||||
|
||||
frame = menu_frame_new(self, 0, client);
|
||||
if (!menu_frame_show_topmenu(frame, pos, monitor, mouse))
|
||||
if (!menu_frame_show_topmenu(frame, pos, monitor, mouse, user_positioned))
|
||||
menu_frame_free(frame);
|
||||
else {
|
||||
if (!mouse) {
|
||||
|
|
|
@ -182,7 +182,8 @@ void menu_clear_pipe_caches(void);
|
|||
void menu_show_all_shortcuts(ObMenu *self, gboolean show);
|
||||
|
||||
void menu_show(gchar *name, GravityPoint pos, gint monitor,
|
||||
gboolean mouse, struct _ObClient *client);
|
||||
gboolean mouse, gboolean user_positioned,
|
||||
struct _ObClient *client);
|
||||
gboolean menu_hide_delay_reached(void);
|
||||
|
||||
/*! The show function is called right after a menu is shown */
|
||||
|
|
|
@ -233,13 +233,17 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y)
|
|||
}
|
||||
|
||||
static void menu_frame_place_topmenu(ObMenuFrame *self, GravityPoint *pos,
|
||||
gint *x, gint *y, gint monitor)
|
||||
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;
|
||||
|
||||
|
@ -994,7 +998,8 @@ static gboolean menu_frame_show(ObMenuFrame *self)
|
|||
}
|
||||
|
||||
gboolean menu_frame_show_topmenu(ObMenuFrame *self, GravityPoint pos,
|
||||
gint monitor, gboolean mouse)
|
||||
gint monitor, gboolean mouse,
|
||||
gboolean user_positioned)
|
||||
{
|
||||
gint px, py;
|
||||
gint x, y;
|
||||
|
@ -1009,7 +1014,8 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, GravityPoint pos,
|
|||
y = pos.y.pos;
|
||||
self->menu->place_func(self, &x, &y, mouse, self->menu->data);
|
||||
} else {
|
||||
menu_frame_place_topmenu(self, &pos, &x, &y, monitor);
|
||||
menu_frame_place_topmenu(self, &pos, &x, &y, monitor,
|
||||
user_positioned);
|
||||
}
|
||||
|
||||
menu_frame_move(self, x, y);
|
||||
|
|
|
@ -121,7 +121,8 @@ void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y,
|
|||
gint *dx, gint *dy);
|
||||
|
||||
gboolean menu_frame_show_topmenu(ObMenuFrame *self, GravityPoint pos,
|
||||
gint monitor, gboolean mouse);
|
||||
gint monitor, gboolean mouse,
|
||||
gboolean user_positioned);
|
||||
gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent,
|
||||
ObMenuEntryFrame *parent_entry);
|
||||
|
||||
|
|
Loading…
Reference in a new issue