X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fmenuframe.c;h=a2760aa17881ec8f6c2cf6d1b74043c728748543;hb=a76e91eb2a514dbd35ad9a9a81308acc7fc5bd89;hp=b04fda55a746579a7f75fbf1047fdcf2b63890ce;hpb=3905872982478e4e0ae05f4ce114a8025a2389ee;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index b04fda55..a2760aa1 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -43,7 +43,6 @@ 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); @@ -616,7 +615,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 */ @@ -824,13 +823,18 @@ static void menu_frame_update(ObMenuFrame *self) fit = n; } - menu_frame_render(self); + /* * make the menu fit on the screen */ - /* make the menu fit on the screen. at most we call render twice, at least - not like n times or sometime */ + /* calculate the height of the menu */ + h = 0; + for (fit = self->entries; fit; fit = g_list_next(fit)) + h += menu_entry_frame_get_height(fit->data, + fit == self->entries, + g_list_next(fit) == NULL); + /* add the border at the top and bottom */ + h += ob_rr_theme->mbwidth * 2; a = screen_physical_area_monitor(self->monitor); - h = self->area.height; if (h > a->height) { GList *flast, *tmp; @@ -854,8 +858,6 @@ static void menu_frame_update(ObMenuFrame *self) menu_entry_frame_free(tmp->data); self->entries = g_list_delete_link(self->entries, tmp); - menu_frame_render(self); - /* only the first one that we see is the last entry in the menu */ last_entry = FALSE; }; @@ -881,10 +883,9 @@ static void menu_frame_update(ObMenuFrame *self) /* add our More... entry to the frame */ self->entries = g_list_append(self->entries, more_frame); } - - /* render again */ - menu_frame_render(self); } + + menu_frame_render(self); } static gboolean menu_frame_is_visible(ObMenuFrame *self) @@ -922,6 +923,9 @@ static gboolean menu_frame_show(ObMenuFrame *self) menu_frame_visible = g_list_prepend(menu_frame_visible, self); + if (self->menu->show_func) + self->menu->show_func(self, self->menu->data); + return TRUE; } @@ -1004,6 +1008,9 @@ void menu_frame_hide(ObMenuFrame *self) if (!it) return; + if (self->menu->hide_func) + self->menu->hide_func(self, self->menu->data); + if (self->child) menu_frame_hide(self->child); @@ -1162,13 +1169,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); }