X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fmenu.c;h=582b7a36d71cf7b10ee63cf9a491c96bb30b83b4;hb=e4be1f860bc579fd4a0d9dee6a6ca590030a791e;hp=8f7c8b6cb301277a81c96e31806a67c3da57ca63;hpb=7af1c6a9c3a57f3ded34fad3f9f4a30fe377a65e;p=chaz%2Fopenbox diff --git a/openbox/menu.c b/openbox/menu.c index 8f7c8b6c..582b7a36 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -61,7 +61,7 @@ parse_menu_fail: g_free(title); } -void menu_control_show(Menu *self, int x, int y, Client *client); +void menu_control_show(Menu *self, int x, int y, ObClient *client); void menu_destroy_hash_key(Menu *menu) { @@ -288,7 +288,7 @@ void menu_add_entry(Menu *menu, MenuEntry *entry) g_hash_table_insert(window_map, &entry->item, menu); } -void menu_show(char *name, int x, int y, Client *client) +void menu_show(char *name, int x, int y, ObClient *client) { Menu *self; @@ -302,7 +302,7 @@ void menu_show(char *name, int x, int y, Client *client) menu_show_full(self, x, y, client); } -void menu_show_full(Menu *self, int x, int y, Client *client) +void menu_show_full(Menu *self, int x, int y, ObClient *client) { g_assert(self != NULL); @@ -311,8 +311,6 @@ void menu_show_full(Menu *self, int x, int y, Client *client) self->client = client; if (!self->shown) { - GSList *it; - if (!self->parent) { grab_pointer(TRUE, None); grab_keyboard(TRUE); @@ -399,12 +397,23 @@ void menu_entry_fire(MenuEntry *self) Default menu controller action for showing. */ -void menu_control_show(Menu *self, int x, int y, Client *client) { +void menu_control_show(Menu *self, int x, int y, ObClient *client) { + guint i; + Rect *a = NULL; + g_assert(!self->invalid); - POINT_SET(self->location, - MIN(x, screen_physical_size.width - self->size.width), - MIN(y, screen_physical_size.height - self->size.height)); + for (i = 0; i < screen_num_monitors; ++i) { + a = screen_physical_area_monitor(i); + if (RECT_CONTAINS(*a, x, y)) + break; + } + g_assert(a != NULL); + self->xin_area = i; + + POINT_SET(self->location, + MIN(x, a->x + a->width - 1 - self->size.width), + MIN(y, a->y + a->height - 1 - self->size.height)); XMoveWindow(ob_display, self->frame, self->location.x, self->location.y); if (!self->shown) { @@ -418,6 +427,8 @@ void menu_control_show(Menu *self, int x, int y, Client *client) { void menu_control_mouseover(MenuEntry *self, gboolean enter) { int x; + Rect *a; + self->hilite = enter; if (enter) { @@ -425,7 +436,7 @@ void menu_control_mouseover(MenuEntry *self, gboolean enter) { != self->parent->open_submenu) menu_hide(self->parent->open_submenu); - if (self->submenu) { + if (self->submenu && self->parent->open_submenu != self->submenu) { self->parent->open_submenu = self->submenu; /* shouldn't be invalid since it must be displayed */ @@ -438,7 +449,9 @@ void menu_control_mouseover(MenuEntry *self, gboolean enter) { /* need to get the width. is this bad?*/ menu_render(self->submenu); - if (self->submenu->size.width + x >= screen_physical_size.width) + a = screen_physical_area_monitor(self->parent->xin_area); + + if (self->submenu->size.width + x >= a->x + a->width) x = self->parent->location.x - self->submenu->size.width - ob_rr_theme->bwidth;