X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=3bbf1be2ebbf83c53b64e6a835391d78c63fe4c7;hb=8186a81fe0095a46c2a65e252268f19d5798095a;hp=2abd87073190cb39065cb909128a0d1062d57617;hpb=d642be361fde438e2b29b7374b4d6465f47ad9e9;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 2abd8707..3bbf1be2 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -93,7 +93,6 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, guint show_from, ObClient *client) XSetWindowBorder(ob_display, self->window, 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); stacking_add(MENU_AS_WINDOW(self)); @@ -111,10 +110,9 @@ void menu_frame_free(ObMenuFrame *self) stacking_remove(MENU_AS_WINDOW(self)); - XDestroyWindow(ob_display, self->window); - RrAppearanceFree(self->a_items); - RrAppearanceFree(self->a_title); + + XDestroyWindow(ob_display, self->window); g_free(self); } @@ -149,37 +147,6 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, XMapWindow(ob_display, self->window); XMapWindow(ob_display, self->text); - self->a_normal = RrAppearanceCopy(ob_rr_theme->a_menu_normal); - self->a_selected = RrAppearanceCopy(ob_rr_theme->a_menu_selected); - self->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled); - self->a_disabled_selected = - RrAppearanceCopy(ob_rr_theme->a_menu_disabled_selected); - - if (entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) { - self->a_separator = RrAppearanceCopy(ob_rr_theme->a_clear_tex); - self->a_separator->texture[0].type = RR_TEXTURE_LINE_ART; - } else { - self->a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex); - self->a_icon->texture[0].type = RR_TEXTURE_RGBA; - self->a_mask = RrAppearanceCopy(ob_rr_theme->a_clear_tex); - self->a_mask->texture[0].type = RR_TEXTURE_MASK; - self->a_bullet_normal = - RrAppearanceCopy(ob_rr_theme->a_menu_bullet_normal); - self->a_bullet_selected = - RrAppearanceCopy(ob_rr_theme->a_menu_bullet_selected); - } - - self->a_text_normal = - RrAppearanceCopy(ob_rr_theme->a_menu_text_normal); - self->a_text_selected = - RrAppearanceCopy(ob_rr_theme->a_menu_text_selected); - self->a_text_disabled = - RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled); - self->a_text_disabled_selected = - RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled_selected); - self->a_text_title = - RrAppearanceCopy(ob_rr_theme->a_menu_text_title); - return self; } @@ -201,22 +168,6 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self) g_hash_table_remove(menu_frame_map, &self->bullet); } - RrAppearanceFree(self->a_normal); - RrAppearanceFree(self->a_selected); - RrAppearanceFree(self->a_disabled); - RrAppearanceFree(self->a_disabled_selected); - - RrAppearanceFree(self->a_separator); - RrAppearanceFree(self->a_icon); - RrAppearanceFree(self->a_mask); - RrAppearanceFree(self->a_text_normal); - RrAppearanceFree(self->a_text_selected); - RrAppearanceFree(self->a_text_disabled); - RrAppearanceFree(self->a_text_disabled_selected); - RrAppearanceFree(self->a_text_title); - RrAppearanceFree(self->a_bullet_normal); - RrAppearanceFree(self->a_bullet_selected); - g_free(self); } } @@ -298,23 +249,24 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y) static void menu_frame_place_submenu(ObMenuFrame *self, gint *x, gint *y) { - gint overlap; + gint overlapx, overlapy; gint bwidth; - overlap = ob_rr_theme->menu_overlap; + overlapx = ob_rr_theme->menu_overlap_x; + overlapy = ob_rr_theme->menu_overlap_y; bwidth = ob_rr_theme->mbwidth; if (self->direction_right) *x = self->parent->area.x + self->parent->area.width - - overlap - bwidth; + overlapx - bwidth; else - *x = self->parent->area.x - self->area.width + overlap + bwidth; + *x = self->parent->area.x - self->area.width + overlapx + bwidth; *y = self->parent->area.y + self->parent_entry->area.y; if (config_menu_middle) *y -= (self->area.height - (bwidth * 2) - ITEM_HEIGHT) / 2; else - *y += overlap; + *y += overlapy; } void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y, @@ -362,18 +314,20 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) !self->entry->data.normal.enabled ? /* disabled */ (self == self->frame->selected ? - self->a_disabled_selected : self->a_disabled) : + ob_rr_theme->a_menu_disabled_selected : + ob_rr_theme->a_menu_disabled) : /* enabled */ (self == self->frame->selected ? - self->a_selected : self->a_normal)); + ob_rr_theme->a_menu_selected : + ob_rr_theme->a_menu_normal)); th = ITEM_HEIGHT; break; case OB_MENU_ENTRY_TYPE_SEPARATOR: if (self->entry->data.separator.label) { - item_a = self->frame->a_title; + item_a = ob_rr_theme->a_menu_title; th = ob_rr_theme->menu_title_height; } else { - item_a = self->a_normal; + item_a = ob_rr_theme->a_menu_normal; th = SEPARATOR_HEIGHT + 2*PADDING; } break; @@ -394,13 +348,16 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) !self->entry->data.normal.enabled ? /* disabled */ (self == self->frame->selected ? - self->a_text_disabled_selected : self->a_text_disabled) : + ob_rr_theme->a_menu_text_disabled_selected : + ob_rr_theme->a_menu_text_disabled) : /* enabled */ (self == self->frame->selected ? - self->a_text_selected : self->a_text_normal)); + ob_rr_theme->a_menu_text_selected : + ob_rr_theme->a_menu_text_normal)); text_a->texture[0].data.text.string = self->entry->data.normal.label; if (self->entry->data.normal.shortcut && (self->frame->menu->show_all_shortcuts || + self->entry->data.normal.shortcut_always_show || self->entry->data.normal.shortcut_position > 0)) { text_a->texture[0].data.text.shortcut = TRUE; @@ -411,11 +368,12 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) break; case OB_MENU_ENTRY_TYPE_SUBMENU: text_a = (self == self->frame->selected ? - self->a_text_selected : - self->a_text_normal); + ob_rr_theme->a_menu_text_selected : + ob_rr_theme->a_menu_text_normal); sub = self->entry->data.submenu.submenu; text_a->texture[0].data.text.string = sub ? sub->title : ""; if (sub->shortcut && (self->frame->menu->show_all_shortcuts || + sub->shortcut_always_show || sub->shortcut_position > 0)) { text_a->texture[0].data.text.shortcut = TRUE; @@ -424,10 +382,13 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) text_a->texture[0].data.text.shortcut = FALSE; break; case OB_MENU_ENTRY_TYPE_SEPARATOR: - if (self->entry->data.separator.label != NULL) - text_a = self->a_text_title; + if (self->entry->data.separator.label != NULL) { + text_a = ob_rr_theme->a_menu_text_title; + text_a->texture[0].data.text.string = + self->entry->data.separator.label; + } else - text_a = self->a_text_normal; + text_a = ob_rr_theme->a_menu_text_normal; break; } @@ -470,20 +431,24 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) ob_rr_theme->menu_title_height - 2*ob_rr_theme->paddingy); } else { + RrAppearance *clear; + /* unlabeled separaator */ XMoveResizeWindow(ob_display, self->text, PADDING, PADDING, self->area.width - 2*PADDING, SEPARATOR_HEIGHT); - self->a_separator->surface.parent = item_a; - self->a_separator->surface.parentx = PADDING; - self->a_separator->surface.parenty = PADDING; - self->a_separator->texture[0].data.lineart.color = + + clear = ob_rr_theme->a_clear_tex; + clear->texture[0].type = RR_TEXTURE_LINE_ART; + clear->surface.parent = item_a; + clear->surface.parentx = PADDING; + clear->surface.parenty = PADDING; + clear->texture[0].data.lineart.color = text_a->texture[0].data.text.color; - self->a_separator->texture[0].data.lineart.x1 = 2*PADDING; - self->a_separator->texture[0].data.lineart.y1 = SEPARATOR_HEIGHT/2; - self->a_separator->texture[0].data.lineart.x2 = - self->area.width - 4*PADDING; - self->a_separator->texture[0].data.lineart.y2 = SEPARATOR_HEIGHT/2; - RrPaint(self->a_separator, self->text, + clear->texture[0].data.lineart.x1 = 2*PADDING; + clear->texture[0].data.lineart.y1 = SEPARATOR_HEIGHT/2; + clear->texture[0].data.lineart.x2 = self->area.width - 4*PADDING; + clear->texture[0].data.lineart.y2 = SEPARATOR_HEIGHT/2; + RrPaint(clear, self->text, self->area.width - 2*PADDING, SEPARATOR_HEIGHT); } break; @@ -492,24 +457,29 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && self->entry->data.normal.icon_data) { + RrAppearance *clear; + XMoveResizeWindow(ob_display, self->icon, PADDING, frame->item_margin.top, ITEM_HEIGHT - frame->item_margin.top - frame->item_margin.bottom, ITEM_HEIGHT - frame->item_margin.top - frame->item_margin.bottom); - self->a_icon->texture[0].data.rgba.width = + + clear = ob_rr_theme->a_clear_tex; + clear->texture[0].type = RR_TEXTURE_RGBA; + clear->texture[0].data.rgba.width = self->entry->data.normal.icon_width; - self->a_icon->texture[0].data.rgba.height = + clear->texture[0].data.rgba.height = self->entry->data.normal.icon_height; - self->a_icon->texture[0].data.rgba.alpha = + clear->texture[0].data.rgba.alpha = self->entry->data.normal.icon_alpha; - self->a_icon->texture[0].data.rgba.data = + clear->texture[0].data.rgba.data = self->entry->data.normal.icon_data; - self->a_icon->surface.parent = item_a; - self->a_icon->surface.parentx = PADDING; - self->a_icon->surface.parenty = frame->item_margin.top; - RrPaint(self->a_icon, self->icon, + clear->surface.parent = item_a; + clear->surface.parentx = PADDING; + clear->surface.parenty = frame->item_margin.top; + RrPaint(clear, self->icon, ITEM_HEIGHT - frame->item_margin.top - frame->item_margin.bottom, ITEM_HEIGHT - frame->item_margin.top @@ -519,6 +489,7 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) self->entry->data.normal.mask) { RrColor *c; + RrAppearance *clear; XMoveResizeWindow(ob_display, self->icon, PADDING, frame->item_margin.top, @@ -526,7 +497,10 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) - frame->item_margin.bottom, ITEM_HEIGHT - frame->item_margin.top - frame->item_margin.bottom); - self->a_mask->texture[0].data.mask.mask = + + clear = ob_rr_theme->a_clear_tex; + clear->texture[0].type = RR_TEXTURE_MASK; + clear->texture[0].data.mask.mask = self->entry->data.normal.mask; c = (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && @@ -539,12 +513,12 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) (self == self->frame->selected ? self->entry->data.normal.mask_selected_color : self->entry->data.normal.mask_normal_color)); - self->a_mask->texture[0].data.mask.color = c; + clear->texture[0].data.mask.color = c; - self->a_mask->surface.parent = item_a; - self->a_mask->surface.parentx = PADDING; - self->a_mask->surface.parenty = frame->item_margin.top; - RrPaint(self->a_mask, self->icon, + clear->surface.parent = item_a; + clear->surface.parentx = PADDING; + clear->surface.parenty = frame->item_margin.top; + RrPaint(clear, self->icon, ITEM_HEIGHT - frame->item_margin.top - frame->item_margin.bottom, ITEM_HEIGHT - frame->item_margin.top @@ -561,8 +535,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) ITEM_HEIGHT - 2*PADDING, ITEM_HEIGHT - 2*PADDING); bullet_a = (self == self->frame->selected ? - self->a_bullet_selected : - self->a_bullet_normal); + ob_rr_theme->a_menu_bullet_selected : + ob_rr_theme->a_menu_bullet_normal); bullet_a->surface.parent = item_a; bullet_a->surface.parentx = self->frame->text_x + self->frame->text_w - ITEM_HEIGHT + PADDING; @@ -603,7 +577,7 @@ static gint menu_entry_frame_get_height(ObMenuEntryFrame *self, if (self->entry->data.separator.label != NULL) { h += ob_rr_theme->menu_title_height + (ob_rr_theme->mbwidth - PADDING) * 2; - + /* if the first entry is a labeled separator, then make its border overlap with the menu's outside border */ if (first_entry) @@ -635,34 +609,34 @@ void menu_frame_render(ObMenuFrame *self) STRUT_SET(self->item_margin, 0, 0, 0, 0); if (self->entries) { - ObMenuEntryFrame *e = self->entries->data; gint l, t, r, b; - e->a_text_normal->texture[0].data.text.string = ""; - tw = RrMinWidth(e->a_text_normal); + e = self->entries->data; + ob_rr_theme->a_menu_text_normal->texture[0].data.text.string = ""; + tw = RrMinWidth(ob_rr_theme->a_menu_text_normal); tw += 2*PADDING; th = ITEM_HEIGHT; - RrMargins(e->a_normal, &l, &t, &r, &b); + RrMargins(ob_rr_theme->a_menu_normal, &l, &t, &r, &b); STRUT_SET(self->item_margin, MAX(self->item_margin.left, l), MAX(self->item_margin.top, t), MAX(self->item_margin.right, r), MAX(self->item_margin.bottom, b)); - RrMargins(e->a_selected, &l, &t, &r, &b); + RrMargins(ob_rr_theme->a_menu_selected, &l, &t, &r, &b); STRUT_SET(self->item_margin, MAX(self->item_margin.left, l), MAX(self->item_margin.top, t), MAX(self->item_margin.right, r), MAX(self->item_margin.bottom, b)); - RrMargins(e->a_disabled, &l, &t, &r, &b); + RrMargins(ob_rr_theme->a_menu_disabled, &l, &t, &r, &b); STRUT_SET(self->item_margin, MAX(self->item_margin.left, l), MAX(self->item_margin.top, t), MAX(self->item_margin.right, r), MAX(self->item_margin.bottom, b)); - RrMargins(e->a_disabled_selected, &l, &t, &r, &b); + RrMargins(ob_rr_theme->a_menu_disabled_selected, &l, &t, &r, &b); STRUT_SET(self->item_margin, MAX(self->item_margin.left, l), MAX(self->item_margin.top, t), @@ -692,7 +666,8 @@ void menu_frame_render(ObMenuFrame *self) } RECT_SET_POINT(e->area, 0, h+e->border); - XMoveWindow(ob_display, e->window, e->area.x-e->border, e->area.y-e->border); + 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_border_color)); @@ -702,10 +677,12 @@ void menu_frame_render(ObMenuFrame *self) !e->entry->data.normal.enabled ? /* disabled */ (e == self->selected ? - e->a_text_disabled_selected : e->a_text_disabled) : + ob_rr_theme->a_menu_text_disabled_selected : + ob_rr_theme->a_menu_text_disabled) : /* enabled */ (e == self->selected ? - e->a_text_selected : e->a_text_normal)); + ob_rr_theme->a_menu_text_selected : + ob_rr_theme->a_menu_text_normal)); switch (e->entry->type) { case OB_MENU_ENTRY_TYPE_NORMAL: text_a->texture[0].data.text.string = e->entry->data.normal.label; @@ -732,9 +709,10 @@ void menu_frame_render(ObMenuFrame *self) break; case OB_MENU_ENTRY_TYPE_SEPARATOR: if (e->entry->data.separator.label != NULL) { - e->a_text_title->texture[0].data.text.string = + ob_rr_theme->a_menu_text_title->texture[0].data.text.string = e->entry->data.separator.label; - tw = RrMinWidth(e->a_text_title) + 2*ob_rr_theme->paddingx; + tw = RrMinWidth(ob_rr_theme->a_menu_text_title) + + 2*ob_rr_theme->paddingx; tw = MIN(tw, MAX_MENU_WIDTH); th = ob_rr_theme->menu_title_height + (ob_rr_theme->mbwidth - PADDING) *2; @@ -885,7 +863,7 @@ static void menu_frame_update(ObMenuFrame *self) more_frame = menu_entry_frame_new(more_entry, self); /* make it get deleted when the menu frame goes away */ menu_entry_unref(more_entry); - + /* add our More... entry to the frame */ self->entries = g_list_append(self->entries, more_frame); } @@ -1054,7 +1032,7 @@ static void menu_frame_hide(ObMenuFrame *self) menu_frame_free(self); } -void menu_frame_hide_all() +void menu_frame_hide_all(void) { GList *it; @@ -1072,8 +1050,14 @@ void menu_frame_hide_all_client(ObClient *client) GList *it = g_list_last(menu_frame_visible); if (it) { ObMenuFrame *f = it->data; - if (f->client == client) + if (f->client == client) { + if (config_submenu_show_delay) { + /* remove any submenu open requests */ + ob_main_loop_timeout_remove(ob_main_loop, + menu_entry_frame_submenu_timeout); + } menu_frame_hide(f); + } } } @@ -1118,6 +1102,7 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y) static gboolean menu_entry_frame_submenu_timeout(gpointer data) { + g_assert(menu_frame_visible); menu_entry_frame_show_submenu((ObMenuEntryFrame*)data); return FALSE; } @@ -1132,8 +1117,8 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry, entry = old; if (old == entry) return; - - if (config_submenu_show_delay) { + + if (config_submenu_show_delay) { /* remove any submenu open requests */ ob_main_loop_timeout_remove(ob_main_loop, menu_entry_frame_submenu_timeout);