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:
Mikael Magnusson 2014-10-06 20:15:08 +02:00
parent 1b3afcff1f
commit d3359676e4
5 changed files with 17 additions and 8 deletions

View file

@ -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;
}

View file

@ -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) {

View file

@ -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 */

View file

@ -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);

View file

@ -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);