From 2be2a2b5cccefa775c3f6dd917da00984f99cc1a Mon Sep 17 00:00:00 2001 From: fluxgen Date: Wed, 27 Aug 2003 14:14:04 +0000 Subject: added pixmap for bullet and selected and unselected --- src/FbTk/Menu.cc | 270 ++++++++++++++++++++++++++++---------------------- src/FbTk/MenuTheme.cc | 75 +++++--------- 2 files changed, 176 insertions(+), 169 deletions(-) diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc index dcef424..62fff0c 100644 --- a/src/FbTk/Menu.cc +++ b/src/FbTk/Menu.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Menu.cc,v 1.35 2003/08/24 16:57:38 fluxgen Exp $ +// $Id: Menu.cc,v 1.36 2003/08/27 14:14:04 fluxgen Exp $ //use GNU extensions #ifndef _GNU_SOURCE @@ -658,20 +658,20 @@ void Menu::redrawTitle() { dx, font.ascent() + menu.bevel_w); // position /* if (m_trans.get()) { - if (m_trans->alpha() != 255) { - Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); + if (m_trans->alpha() != 255) { + Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); - if (m_root_pm != root_pm) { - m_trans->setSource(root_pm, menu.title.screenNumber()); - m_root_pm = root_pm; - } - m_trans->setDest(menu.title.window(), menu.title.screenNumber()); - m_trans->render(menu.window.x() + menu.title.x() + menu.window.borderWidth()*2, - menu.window.y() + menu.title.y() + menu.window.borderWidth()*2, - 0, 0, - menu.title.width(), menu.title.height()); - } - }*/ + if (m_root_pm != root_pm) { + m_trans->setSource(root_pm, menu.title.screenNumber()); + m_root_pm = root_pm; + } + m_trans->setDest(menu.title.window(), menu.title.screenNumber()); + m_trans->render(menu.window.x() + menu.title.x() + menu.window.borderWidth()*2, + menu.window.y() + menu.title.y() + menu.window.borderWidth()*2, + 0, 0, + menu.title.width(), menu.title.height()); + } + }*/ menu.title.updateTransparent(); } @@ -820,21 +820,18 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_ sel_y = item_y + quarter_w; if (clear) { - - GC def_gc = XCreateGC(m_display, menu.frame.window(), 0, 0); + FbTk::GContext def_gc(menu.frame.window()); if (menu.frame_pixmap == 0) { - - XSetForeground(m_display, def_gc, m_theme.frameTexture().color().pixel()); - m_frame_pm.fillRectangle(def_gc, item_x, item_y, menu.item_w, menu.item_h); + def_gc.setForeground(m_theme.frameTexture().color()); + m_frame_pm.fillRectangle(def_gc.gc(), item_x, item_y, menu.item_w, menu.item_h); } else { - m_frame_pm.copyArea(menu.frame_pixmap, def_gc, + m_frame_pm.copyArea(menu.frame_pixmap, def_gc.gc(), item_x, item_y, item_x, item_y, menu.item_w, menu.item_h); } - XFreeGC(m_display, def_gc); } else if (! (x == y && y == -1 && w == h && h == 0)) { // calculate the which part of the hilite to redraw if (! (std::max(item_x, x) <= (signed) std::min(item_x + menu.item_w, x + w) && @@ -861,7 +858,7 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_ dosel = false; } - + if (dohilite && highlight && (menu.hilite_pixmap != ParentRelative)) { if (menu.hilite_pixmap) { m_frame_pm.copyArea(menu.hilite_pixmap, @@ -875,21 +872,60 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_ } - if (dosel && item->isSelected() && - (menu.sel_pixmap != ParentRelative)) { - if (menu.sel_pixmap) { - m_frame_pm.copyArea(highlight ? menu.frame_pixmap : menu.sel_pixmap, - m_theme.hiliteGC(), - 0, 0, - sel_x, sel_y, - half_w, half_w); + + if (item->isToggleItem() && item->isSelected() && + menu.sel_pixmap != ParentRelative) { + if (m_theme.selectedPixmap().pixmap().drawable()) { + // enable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + m_theme.selectedPixmap().mask().drawable()); + XSetClipOrigin(FbTk::App::instance()->display(), + gc, sel_x, item_y); + // copy bullet pixmap to frame + m_frame_pm.copyArea(m_theme.selectedPixmap().pixmap().drawable(), + gc, + 0, 0, + sel_x, item_y, + m_theme.selectedPixmap().width(), + m_theme.selectedPixmap().height()); + // disable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + None); } else { - m_frame_pm.fillRectangle(m_theme.hiliteGC(), - sel_x, sel_y, half_w, half_w); + if (menu.sel_pixmap) { + m_frame_pm.copyArea(highlight ? menu.frame_pixmap : menu.sel_pixmap, + m_theme.hiliteGC(), + 0, 0, + sel_x, sel_y, + half_w, half_w); + } else { + m_frame_pm.fillRectangle(m_theme.hiliteGC(), + sel_x, sel_y, half_w, half_w); + } } + } else if (item->isToggleItem() && m_theme.unselectedPixmap().pixmap().drawable() != 0) { + // enable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + m_theme.unselectedPixmap().mask().drawable()); + XSetClipOrigin(FbTk::App::instance()->display(), + gc, sel_x, item_y); + // copy bullet pixmap to frame + m_frame_pm.copyArea(m_theme.unselectedPixmap().pixmap().drawable(), + gc, + 0, 0, + sel_x, item_y, + m_theme.unselectedPixmap().width(), + m_theme.unselectedPixmap().height()); + // disable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + None); } - + if (dotext && text) { m_theme.frameFont().drawText(m_frame_pm.drawable(), // drawable screenNumber(), @@ -899,51 +935,71 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_ } if (dosel && item->submenu()) { - switch (m_theme.bullet()) { - case MenuTheme::SQUARE: - m_frame_pm.drawRectangle(gc, sel_x, sel_y, half_w, half_w); - break; - - case MenuTheme::TRIANGLE: - XPoint tri[3]; - - if (m_theme.bulletPos() == FbTk::RIGHT) { - tri[0].x = sel_x + quarter_w - 2; - tri[0].y = sel_y + quarter_w - 2; - tri[1].x = 4; - tri[1].y = 2; - tri[2].x = -4; - tri[2].y = 2; - } else { - tri[0].x = sel_x + quarter_w - 2; - tri[0].y = item_y + half_w; - tri[1].x = 4; - tri[1].y = 2; - tri[2].x = 0; - tri[2].y = -4; - } + if (m_theme.bulletPixmap().pixmap().drawable() != 0) { + // enable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + m_theme.bulletPixmap().mask().drawable()); + XSetClipOrigin(FbTk::App::instance()->display(), + gc, sel_x, item_y); + // copy bullet pixmap to frame + m_frame_pm.copyArea(m_theme.bulletPixmap().pixmap().drawable(), + gc, + 0, 0, + sel_x, item_y, + m_theme.bulletPixmap().width(), + m_theme.bulletPixmap().height()); + // disable clip mask + XSetClipMask(FbTk::App::instance()->display(), + gc, + None); + } else { + switch (m_theme.bullet()) { + case MenuTheme::SQUARE: + m_frame_pm.drawRectangle(gc, sel_x, sel_y, half_w, half_w); + break; + + case MenuTheme::TRIANGLE: + XPoint tri[3]; + + if (m_theme.bulletPos() == FbTk::RIGHT) { + tri[0].x = sel_x + quarter_w - 2; + tri[0].y = sel_y + quarter_w - 2; + tri[1].x = 4; + tri[1].y = 2; + tri[2].x = -4; + tri[2].y = 2; + } else { + tri[0].x = sel_x + quarter_w - 2; + tri[0].y = item_y + half_w; + tri[1].x = 4; + tri[1].y = 2; + tri[2].x = 0; + tri[2].y = -4; + } - m_frame_pm.fillPolygon(gc, tri, 3, Convex, - CoordModePrevious); - break; + m_frame_pm.fillPolygon(gc, tri, 3, Convex, + CoordModePrevious); + break; - case MenuTheme::DIAMOND: - XPoint dia[4]; - - dia[0].x = sel_x + quarter_w - 3; - dia[0].y = item_y + half_w; - dia[1].x = 3; - dia[1].y = -3; - dia[2].x = 3; - dia[2].y = 3; - dia[3].x = -3; - dia[3].y = 3; - - m_frame_pm.fillPolygon(gc, dia, 4, Convex, - CoordModePrevious); - break; - default: - break; + case MenuTheme::DIAMOND: + XPoint dia[4]; + + dia[0].x = sel_x + quarter_w - 3; + dia[0].y = item_y + half_w; + dia[1].x = 3; + dia[1].y = -3; + dia[2].x = 3; + dia[2].y = 3; + dia[3].x = -3; + dia[3].y = 3; + + m_frame_pm.fillPolygon(gc, dia, 4, Convex, + CoordModePrevious); + break; + default: + break; + } } } @@ -951,38 +1007,12 @@ void Menu::drawItem(unsigned int index, bool highlight, bool clear, bool render_ item_x, item_y, menu.item_w, menu.item_h, False); - // if (m_trans->alpha() != alpha()) - // m_trans->setAlpha(alpha()); menu.title.setAlpha(alpha()); menu.frame.setAlpha(alpha()); menu.window.setAlpha(alpha()); menu.frame.updateTransparent(item_x, item_y, menu.item_w, menu.item_h); - - - /* - if (m_trans.get() && render_trans) { - - if (m_trans->alpha() != 255) { - Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); - - if (m_root_pm != root_pm) { - m_trans->setSource(root_pm, menu.window.screenNumber()); - m_root_pm = root_pm; - } - - m_trans->setDest(menu.frame.window(), menu.frame.screenNumber()); - m_trans->render(menu.window.x() + menu.frame.x() + item_x + - menu.window.borderWidth(), - menu.window.y() + menu.frame.y() + item_y + - menu.window.borderWidth(), - item_x, item_y, - menu.item_w, menu.item_h); - } - } - XSync(m_display, False); - */ } void Menu::setLabel(const char *labelstr) { @@ -1354,35 +1384,35 @@ void Menu::reconfigure() { menu.title.setAlpha(alpha()); menu.window.setAlpha(alpha()); /* - if (m_trans.get() && m_trans->alpha() != alpha()) - m_trans->setAlpha(alpha()); + if (m_trans.get() && m_trans->alpha() != alpha()) + m_trans->setAlpha(alpha()); */ update(); } void Menu::renderTransFrame() { /* if (m_trans.get() == 0 || moving) - return; + return; - if (m_trans->alpha() != alpha()) - m_trans->setAlpha(alpha()); + if (m_trans->alpha() != alpha()) + m_trans->setAlpha(alpha()); - if (m_trans->alpha() != 255) { + if (m_trans->alpha() != 255) { - Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); + Pixmap root_pm = getRootPixmap(menu.window.screenNumber()); - if (m_root_pm != root_pm) { - m_trans->setSource(root_pm, menu.window.screenNumber()); - m_root_pm = root_pm; - } - menu.frame.clear(); - m_trans->setDest(menu.frame.window(), menu.window.screenNumber()); - m_trans->render(menu.window.x() + menu.frame.x() + menu.window.borderWidth(), - menu.window.y() + menu.frame.y() + menu.window.borderWidth(), - 0, 0, - menu.frame.width(), menu.frame.height()); + if (m_root_pm != root_pm) { + m_trans->setSource(root_pm, menu.window.screenNumber()); + m_root_pm = root_pm; + } + menu.frame.clear(); + m_trans->setDest(menu.frame.window(), menu.window.screenNumber()); + m_trans->render(menu.window.x() + menu.frame.x() + menu.window.borderWidth(), + menu.window.y() + menu.frame.y() + menu.window.borderWidth(), + 0, 0, + menu.frame.width(), menu.frame.height()); - } + } */ menu.frame.clear(); menu.frame.updateTransparent(); diff --git a/src/FbTk/MenuTheme.cc b/src/FbTk/MenuTheme.cc index c83c480..2ecb38b 100644 --- a/src/FbTk/MenuTheme.cc +++ b/src/FbTk/MenuTheme.cc @@ -19,7 +19,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: MenuTheme.cc,v 1.9 2003/08/16 12:23:17 fluxgen Exp $ +// $Id: MenuTheme.cc,v 1.10 2003/08/27 14:12:45 fluxgen Exp $ #include "MenuTheme.hh" @@ -51,41 +51,33 @@ MenuTheme::MenuTheme(int screen_num): m_border_width(*this, "borderWidth", "BorderWidth"), m_bevel_width(*this, "bevelWidth", "BevelWidth"), m_border_color(*this, "borderColor", "BorderColor"), + m_bullet_pixmap(*this, "menu.submenu.pixmap", "Menu.Submenu.Pixmap"), + m_selected_pixmap(*this, "menu.selected.pixmap", "Menu.Selected.Pixmap"), + m_unselected_pixmap(*this, "menu.unselected.pixmap", "Menu.Unselected.Pixmap"), m_display(FbTk::App::instance()->display()), - m_alpha(255) -{ + t_text_gc(RootWindow(m_display, screen_num)), + f_text_gc(RootWindow(m_display, screen_num)), + h_text_gc(RootWindow(m_display, screen_num)), + d_text_gc(RootWindow(m_display, screen_num)), + hilite_gc(RootWindow(m_display, screen_num)), + m_alpha(255) { + // set default values *m_border_width = 0; *m_bevel_width = 0; Window rootwindow = RootWindow(m_display, screen_num); - XGCValues gcv; - unsigned long gc_value_mask = GCForeground; - gcv.foreground = t_text->pixel(); - - t_text_gc = XCreateGC(m_display, rootwindow, gc_value_mask, &gcv); - - gcv.foreground = f_text->pixel(); - - f_text_gc = XCreateGC(m_display, rootwindow, gc_value_mask, &gcv); + t_text_gc.setForeground(*t_text); + f_text_gc.setForeground(*f_text); + h_text_gc.setForeground(*h_text); + d_text_gc.setForeground(*d_text); + hilite_gc.setForeground(hilite->color()); - gcv.foreground = h_text->pixel(); - h_text_gc = XCreateGC(m_display, rootwindow, gc_value_mask, &gcv); - - gcv.foreground = d_text->pixel(); - d_text_gc = XCreateGC(m_display, rootwindow, gc_value_mask, &gcv); - - gcv.foreground = hilite->color().pixel(); - hilite_gc = XCreateGC(m_display, rootwindow, gc_value_mask, &gcv); } MenuTheme::~MenuTheme() { - XFreeGC(m_display, t_text_gc); - XFreeGC(m_display, f_text_gc); - XFreeGC(m_display, h_text_gc); - XFreeGC(m_display, d_text_gc); - XFreeGC(m_display, hilite_gc); + } void MenuTheme::reconfigTheme() { @@ -95,30 +87,15 @@ void MenuTheme::reconfigTheme() { if (*m_border_width > 20) *m_border_width = 20; - XGCValues gcv; - unsigned long gc_value_mask = GCForeground; - - gcv.foreground = t_text->pixel(); - - XChangeGC(m_display, t_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = f_text->pixel(); - - XChangeGC(m_display, f_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = h_text->pixel(); - XChangeGC(m_display, h_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = d_text->pixel(); - XChangeGC(m_display, d_text_gc, - gc_value_mask, &gcv); - - gcv.foreground = hilite->color().pixel(); - XChangeGC(m_display, hilite_gc, - gc_value_mask, &gcv); + m_bullet_pixmap->scale(frameFont().height(), frameFont().height()); + m_selected_pixmap->scale(frameFont().height(), frameFont().height()); + m_unselected_pixmap->scale(frameFont().height(), frameFont().height()); + + t_text_gc.setForeground(*t_text); + f_text_gc.setForeground(*f_text); + h_text_gc.setForeground(*h_text); + d_text_gc.setForeground(*d_text); + hilite_gc.setForeground(hilite->color()); // notify any listeners m_theme_change_sig.notify(); -- cgit v0.11.2