X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=730f23f7c00307567e19dcf0650d6776d5236793;hb=b01dd0b20fedb27681ceda53deb8c7f2f83eabc3;hp=f8f0a6bcd3cf1898492e7a5b5e97e431bf0f6f1b;hpb=e2ddfaf9fff1fb9dd6ebdc1a95f2b228d6baedb2;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index f8f0a6bc..730f23f7 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -77,7 +77,7 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, guint show_from, ObClient *client) XSetWindowAttributes attr; self = g_new0(ObMenuFrame, 1); - self->type = Window_Menu; + self->obwin.type = OB_WINDOW_CLASS_MENUFRAME; self->menu = menu; self->selected = NULL; self->client = client; @@ -85,17 +85,17 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, guint show_from, ObClient *client) self->show_from = show_from; attr.event_mask = FRAME_EVENTMASK; - self->window = createWindow(RootWindow(obt_display, ob_screen), + self->window = createWindow(obt_root(ob_screen), CWEventMask, &attr); XSetWindowBorderWidth(obt_display, self->window, ob_rr_theme->mbwidth); XSetWindowBorder(obt_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)); + window_add(&self->window, MENUFRAME_AS_WINDOW(self)); + stacking_add(MENUFRAME_AS_WINDOW(self)); return self; } @@ -108,12 +108,12 @@ void menu_frame_free(ObMenuFrame *self) self->entries = g_list_delete_link(self->entries, self->entries); } - stacking_remove(MENU_AS_WINDOW(self)); - - XDestroyWindow(obt_display, self->window); + stacking_remove(MENUFRAME_AS_WINDOW(self)); + window_remove(self->window); RrAppearanceFree(self->a_items); - RrAppearanceFree(self->a_title); + + XDestroyWindow(obt_display, self->window); g_free(self); } @@ -148,36 +148,7 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, XMapWindow(obt_display, self->window); XMapWindow(obt_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); + window_add(&self->window, MENUFRAME_AS_WINDOW(self->frame)); return self; } @@ -187,6 +158,8 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self) if (self) { menu_entry_unref(self->entry); + window_remove(self->window); + XDestroyWindow(obt_display, self->text); XDestroyWindow(obt_display, self->window); g_hash_table_remove(menu_frame_map, &self->text); @@ -200,22 +173,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); } } @@ -297,23 +254,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, @@ -361,24 +319,27 @@ 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; default: g_assert_not_reached(); } + RECT_SET_SIZE(self->area, self->frame->inner_w, th); XResizeWindow(obt_display, self->window, self->area.width, self->area.height); @@ -393,10 +354,12 @@ 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 || @@ -411,8 +374,8 @@ 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 || @@ -425,10 +388,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; } @@ -471,46 +437,53 @@ 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(obt_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; + RrAppearanceClearTextures(clear); + 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; } if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && - self->entry->data.normal.icon_data) + self->entry->data.normal.icon) { + RrAppearance *clear; + XMoveResizeWindow(obt_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 = - self->entry->data.normal.icon_width; - self->a_icon->texture[0].data.rgba.height = - self->entry->data.normal.icon_height; - self->a_icon->texture[0].data.rgba.alpha = + + clear = ob_rr_theme->a_clear_tex; + RrAppearanceClearTextures(clear); + clear->texture[0].type = RR_TEXTURE_IMAGE; + clear->texture[0].data.image.image = + self->entry->data.normal.icon; + clear->texture[0].data.image.alpha = self->entry->data.normal.icon_alpha; - self->a_icon->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 @@ -520,6 +493,7 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) self->entry->data.normal.mask) { RrColor *c; + RrAppearance *clear; XMoveResizeWindow(obt_display, self->icon, PADDING, frame->item_margin.top, @@ -527,7 +501,11 @@ 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; + RrAppearanceClearTextures(clear); + 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 && @@ -540,12 +518,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 @@ -562,8 +540,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; @@ -639,31 +617,31 @@ void menu_frame_render(ObMenuFrame *self) gint l, t, r, b; e = self->entries->data; - e->a_text_normal->texture[0].data.text.string = ""; - tw = RrMinWidth(e->a_text_normal); + 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), @@ -704,10 +682,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; @@ -715,7 +695,7 @@ void menu_frame_render(ObMenuFrame *self) tw = MIN(tw, MAX_MENU_WIDTH); th = ob_rr_theme->menu_font_height; - if (e->entry->data.normal.icon_data || + if (e->entry->data.normal.icon || e->entry->data.normal.mask) has_icon = TRUE; break; @@ -726,7 +706,7 @@ void menu_frame_render(ObMenuFrame *self) tw = MIN(tw, MAX_MENU_WIDTH); th = ob_rr_theme->menu_font_height; - if (e->entry->data.normal.icon_data || + if (e->entry->data.normal.icon || e->entry->data.normal.mask) has_icon = TRUE; @@ -734,9 +714,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;