X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=b908ad4ff0a6be146562d62a0265c0c6ef24d26f;hb=96fbc0c6229ff2f13a102da603339472c176bc0b;hp=461a2f2a3727948d76f7a4786b0d25ab0430b2d6;hpb=26fc54c9a3d7ef92ef3748b7d4d57e57a71ea798;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 461a2f2a..b908ad4f 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -43,9 +43,9 @@ GList *menu_frame_visible; static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, ObMenuFrame *frame); static void menu_entry_frame_free(ObMenuEntryFrame *self); -static void menu_frame_render(ObMenuFrame *self); static void menu_frame_update(ObMenuFrame *self); static gboolean menu_entry_frame_submenu_timeout(gpointer data); +static void menu_frame_hide(ObMenuFrame *self); static Window createWindow(Window parent, gulong mask, XSetWindowAttributes *attrib) @@ -90,7 +90,7 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, guint show_from, ObClient *client) XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth); XSetWindowBorder(ob_display, self->window, - RrColorPixel(ob_rr_theme->menu_b_color)); + RrColorPixel(ob_rr_theme->menu_border_color)); self->a_title = RrAppearanceCopy(ob_rr_theme->a_menu_title); self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu); @@ -616,7 +616,7 @@ static gint menu_entry_frame_get_height(ObMenuEntryFrame *self, return h; } -static void menu_frame_render(ObMenuFrame *self) +void menu_frame_render(ObMenuFrame *self) { gint w = 0, h = 0; gint tw, th; /* temps */ @@ -690,7 +690,7 @@ static void menu_frame_render(ObMenuFrame *self) XMoveWindow(ob_display, e->window, e->area.x-e->border, e->area.y-e->border); XSetWindowBorderWidth(ob_display, e->window, e->border); XSetWindowBorder(ob_display, e->window, - RrColorPixel(ob_rr_theme->menu_b_color)); + RrColorPixel(ob_rr_theme->menu_border_color)); text_a = (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && @@ -729,7 +729,7 @@ static void menu_frame_render(ObMenuFrame *self) if (e->entry->data.separator.label != NULL) { e->a_text_title->texture[0].data.text.string = e->entry->data.separator.label; - tw = RrMinWidth(text_a); + tw = RrMinWidth(e->a_text_title); tw = MIN(tw, MAX_MENU_WIDTH); th = ob_rr_theme->menu_title_height + (ob_rr_theme->mbwidth - PADDING) *2; @@ -912,10 +912,13 @@ static gboolean menu_frame_show(ObMenuFrame *self) if (menu_frame_visible == NULL) { /* no menus shown yet */ + + /* grab the pointer in such a way as to pass through "owner events" + so that we can get enter/leave notifies in the menu. */ if (!grab_pointer(TRUE, FALSE, OB_CURSOR_POINTER)) return FALSE; - if (!grab_keyboard(TRUE)) { - grab_pointer(FALSE, FALSE, OB_CURSOR_POINTER); + if (!grab_keyboard()) { + ungrab_pointer(); return FALSE; } } @@ -933,6 +936,7 @@ static gboolean menu_frame_show(ObMenuFrame *self) gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, gint button) { + gint px, py; guint i; if (menu_frame_is_visible(self)) @@ -958,14 +962,20 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y, XMapWindow(ob_display, self->window); + if (screen_pointer_pos(&px, &py)) { + ObMenuEntryFrame *e = menu_entry_frame_under(px, py); + if (e && e->frame == self) + e->ignore_enters++; + } + return TRUE; } gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, ObMenuEntryFrame *parent_entry) { - ObMenuEntryFrame *e; gint x, y, dx, dy; + gint px, py; if (menu_frame_is_visible(self)) return TRUE; @@ -995,14 +1005,16 @@ gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, XMapWindow(ob_display, self->window); - if (screen_pointer_pos(&dx, &dy) && (e = menu_entry_frame_under(dx, dy)) && - e->frame == self) - ++e->ignore_enters; + if (screen_pointer_pos(&px, &py)) { + ObMenuEntryFrame *e = menu_entry_frame_under(px, py); + if (e && e->frame == self) + e->ignore_enters++; + } return TRUE; } -void menu_frame_hide(ObMenuFrame *self) +static void menu_frame_hide(ObMenuFrame *self) { GList *it = g_list_find(menu_frame_visible, self); @@ -1024,8 +1036,8 @@ void menu_frame_hide(ObMenuFrame *self) if (menu_frame_visible == NULL) { /* last menu shown */ - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); - grab_keyboard(FALSE); + ungrab_pointer(); + ungrab_keyboard(); } XUnmapWindow(ob_display, self->window); @@ -1087,7 +1099,7 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y) ObMenuEntryFrame *e = it->data; if (RECT_CONTAINS(e->area, x, y)) { - ret = e; + ret = e; break; } } @@ -1170,13 +1182,16 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time) gpointer data = self->frame->menu->data; GSList *acts = self->entry->data.normal.actions; ObClient *client = self->frame->client; + ObMenuFrame *frame = self->frame; /* release grabs before executing the shit */ - if (!(state & ControlMask)) + if (!(state & ControlMask)) { menu_frame_hide_all(); + frame = NULL; + } if (func) - func(entry, state, data, time); + func(entry, frame, client, state, data, time); else action_run(acts, client, state, time); }