From ac1bd7e0981222bf340ce7defb2bb8307d42a0a2 Mon Sep 17 00:00:00 2001 From: Mark Tiefenbruck <mark@fluxbox.org> Date: Fri, 4 Jan 2008 17:39:19 -0800 Subject: update code to use ThemeProxy --- src/AlphaMenu.cc | 4 +- src/AlphaMenu.hh | 4 +- src/ButtonTheme.hh | 4 +- src/ButtonTool.cc | 26 +++++----- src/ButtonTool.hh | 3 +- src/ClockTool.cc | 28 +++++------ src/ClockTool.hh | 6 ++- src/CommandDialog.cc | 12 ++--- src/Ewmh.cc | 10 ++-- src/FbMenu.cc | 4 +- src/FbMenu.hh | 2 +- src/FbTk/Menu.cc | 124 +++++++++++++++++++++++----------------------- src/FbTk/Menu.hh | 9 ++-- src/FbTk/MenuItem.cc | 103 +++++++++++++++++++------------------- src/FbTk/MenuItem.hh | 11 ++-- src/FbTk/MenuSeparator.cc | 12 ++--- src/FbTk/MenuSeparator.hh | 2 +- src/FbTk/MenuTheme.hh | 4 +- src/FbTk/Theme.hh | 6 ++- src/FbWinFrame.cc | 104 +++++++++++++++++++------------------- src/FbWinFrame.hh | 8 +-- src/FbWinFrameTheme.hh | 4 +- src/GenericTool.cc | 2 +- src/GenericTool.hh | 8 +-- src/IconButton.cc | 38 +++++++------- src/IconButton.hh | 10 ++-- src/IconbarTheme.hh | 4 +- src/IconbarTool.cc | 11 ++-- src/IconbarTool.hh | 5 +- src/LayerMenu.cc | 3 +- src/LayerMenu.hh | 3 +- src/RootTheme.hh | 4 +- src/Screen.cc | 72 ++++++++++++--------------- src/Screen.hh | 20 ++++---- src/Slit.cc | 12 ++--- src/Slit.hh | 7 ++- src/SlitTheme.hh | 4 +- src/SystemTray.cc | 17 ++++--- src/SystemTray.hh | 9 +++- src/ToggleMenu.hh | 7 +-- src/ToolFactory.cc | 4 +- src/ToolTheme.hh | 4 +- src/Toolbar.cc | 36 +++++++------- src/Toolbar.hh | 4 +- src/ToolbarTheme.hh | 4 +- src/WinButton.cc | 56 ++++++++++----------- src/WinButton.hh | 5 +- src/WinButtonTheme.cc | 11 ++-- src/WinButtonTheme.hh | 9 ++-- src/Window.cc | 66 ++++++++++++------------ src/Window.hh | 3 +- src/WorkspaceNameTheme.hh | 4 +- src/WorkspaceNameTool.cc | 26 +++++----- src/WorkspaceNameTool.hh | 8 ++- src/Xinerama.hh | 11 ++-- 55 files changed, 503 insertions(+), 474 deletions(-) diff --git a/src/AlphaMenu.cc b/src/AlphaMenu.cc index 00c9033..ef67956 100644 --- a/src/AlphaMenu.cc +++ b/src/AlphaMenu.cc @@ -34,8 +34,8 @@ #include "FbTk/I18n.hh" #include "Window.hh" -AlphaMenu::AlphaMenu(FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer): +AlphaMenu::AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): ToggleMenu(tm, imgctrl, layer) { diff --git a/src/AlphaMenu.hh b/src/AlphaMenu.hh index 8539176..41580c3 100644 --- a/src/AlphaMenu.hh +++ b/src/AlphaMenu.hh @@ -29,8 +29,8 @@ class AlphaMenu : public ToggleMenu { public: - AlphaMenu(FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer); + AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer); // we override these to update the menu when the active window changes void move(int x, int y); diff --git a/src/ButtonTheme.hh b/src/ButtonTheme.hh index 7f43eb9..95a4e32 100644 --- a/src/ButtonTheme.hh +++ b/src/ButtonTheme.hh @@ -46,8 +46,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual ButtonTheme *operator ->() { return this; } - virtual const ButtonTheme *operator ->() const { return this; } + virtual ButtonTheme &operator *() { return *this; } + virtual const ButtonTheme &operator *() const { return *this; } private: FbTk::ThemeItem<FbTk::Color> m_pic_color; diff --git a/src/ButtonTool.cc b/src/ButtonTool.cc index a88e47b..0e11733 100644 --- a/src/ButtonTool.cc +++ b/src/ButtonTool.cc @@ -26,9 +26,9 @@ ButtonTool::ButtonTool(FbTk::Button *button, ToolbarItem::Type type, - ButtonTheme &theme, + FbTk::ThemeProxy<ButtonTheme> &theme, FbTk::ImageControl &img_ctrl): - GenericTool(button, type, theme), + GenericTool(button, type, dynamic_cast<FbTk::ThemeProxy<ToolTheme> &>(theme)), m_cache_pm(0), m_cache_pressed_pm(0), m_image_ctrl(img_ctrl) { @@ -46,37 +46,37 @@ ButtonTool::~ButtonTool() { void ButtonTool::updateSizing() { FbTk::Button &btn = static_cast<FbTk::Button &>(window()); - btn.setBorderWidth(theme().border().width()); + btn.setBorderWidth(theme()->border().width()); } void ButtonTool::renderTheme(unsigned char alpha) { FbTk::Button &btn = static_cast<FbTk::Button &>(window()); - btn.setGC(static_cast<const ButtonTheme &>(theme()).gc()); - btn.setBorderColor(theme().border().color()); - btn.setBorderWidth(theme().border().width()); + btn.setGC(static_cast<const ButtonTheme &>(*theme()).gc()); + btn.setBorderColor(theme()->border().color()); + btn.setBorderWidth(theme()->border().width()); btn.setAlpha(alpha); - btn.updateTheme(static_cast<const FbTk::Theme &>(theme())); + btn.updateTheme(*theme()); Pixmap old_pm = m_cache_pm; - if (!theme().texture().usePixmap()) { + if (!theme()->texture().usePixmap()) { m_cache_pm = 0; - btn.setBackgroundColor(theme().texture().color()); + btn.setBackgroundColor(theme()->texture().color()); } else { m_cache_pm = m_image_ctrl.renderImage(width(), height(), - theme().texture(), orientation()); + theme()->texture(), orientation()); btn.setBackgroundPixmap(m_cache_pm); } if (old_pm) m_image_ctrl.removeImage(old_pm); old_pm = m_cache_pressed_pm; - if (! static_cast<const ButtonTheme &>(theme()).pressed().usePixmap()) { + if (! static_cast<const ButtonTheme &>(*theme()).pressed().usePixmap()) { m_cache_pressed_pm = 0; - btn.setPressedColor(static_cast<const ButtonTheme &>(theme()).pressed().color()); + btn.setPressedColor(static_cast<const ButtonTheme &>(*theme()).pressed().color()); } else { m_cache_pressed_pm = m_image_ctrl.renderImage(width(), height(), - static_cast<const ButtonTheme &>(theme()).pressed(), orientation()); + static_cast<const ButtonTheme &>(*theme()).pressed(), orientation()); btn.setPressedPixmap(m_cache_pressed_pm); } diff --git a/src/ButtonTool.hh b/src/ButtonTool.hh index f4f535a..4339722 100644 --- a/src/ButtonTool.hh +++ b/src/ButtonTool.hh @@ -36,7 +36,8 @@ class ImageControl; class ButtonTool: public GenericTool { public: ButtonTool(FbTk::Button *button, ToolbarItem::Type type, - ButtonTheme &theme, FbTk::ImageControl &img_ctrl); + FbTk::ThemeProxy<ButtonTheme> &theme, + FbTk::ImageControl &img_ctrl); virtual ~ButtonTool(); protected: diff --git a/src/ClockTool.cc b/src/ClockTool.cc index d106408..adc6adc 100644 --- a/src/ClockTool.cc +++ b/src/ClockTool.cc @@ -134,9 +134,10 @@ public: }; ClockTool::ClockTool(const FbTk::FbWindow &parent, - ToolTheme &theme, BScreen &screen, FbTk::Menu &menu): + FbTk::ThemeProxy<ToolTheme> &theme, BScreen &screen, + FbTk::Menu &menu): ToolbarItem(ToolbarItem::FIXED), - m_button(parent, theme.font(), ""), + m_button(parent, theme->font(), ""), m_theme(theme), m_screen(screen), m_pixmap(0), @@ -164,7 +165,7 @@ ClockTool::ClockTool(const FbTk::FbWindow &parent, m_timer.setCommand(update_graphic); m_timer.start(); - m_button.setGC(m_theme.textGC()); + m_button.setGC(m_theme->textGC()); // setup menu FbTk::RefCount<FbTk::Command> saverc(FbTk::ObjectRegistry<FbTk::Command>::instance().parse("saverc")); @@ -233,16 +234,13 @@ void ClockTool::update(FbTk::Subject *subj) { unsigned int new_width = m_button.width(); unsigned int new_height = m_button.height(); translateSize(orientation(), new_width, new_height); - new_width = m_theme.font().textWidth(text.c_str(), text.size()); + new_width = m_theme->font().textWidth(text.c_str(), text.size()); translateSize(orientation(), new_width, new_height); if (new_width != m_button.width() || new_height != m_button.height()) { resize(new_width, new_height); resizeSig().notify(); } - if (subj != 0 && typeid(*subj) == typeid(ToolTheme)) - renderTheme(m_button.alpha()); - } unsigned int ClockTool::borderWidth() const { @@ -280,7 +278,7 @@ void ClockTool::updateTime() { m_button.setText(text); - unsigned int new_width = m_theme.font().textWidth(time_string, time_string_len) + 2; + unsigned int new_width = m_theme->font().textWidth(time_string, time_string_len) + 2; if (new_width > m_button.width()) { resize(new_width, m_button.height()); resizeSig().notify(); @@ -293,7 +291,7 @@ void ClockTool::updateTime() { // Just change things that affect the size void ClockTool::updateSizing() { - m_button.setBorderWidth(m_theme.border().width()); + m_button.setBorderWidth(m_theme->border().width()); // resizes if new timeformat update(0); } @@ -302,25 +300,25 @@ void ClockTool::reRender() { if (m_pixmap) m_screen.imageControl().removeImage(m_pixmap); - if (m_theme.texture().usePixmap()) { + if (m_theme->texture().usePixmap()) { m_pixmap = m_screen.imageControl().renderImage(width(), height(), - m_theme.texture(), orientation()); + m_theme->texture(), orientation()); m_button.setBackgroundPixmap(m_pixmap); } else { m_pixmap = 0; - m_button.setBackgroundColor(m_theme.texture().color()); + m_button.setBackgroundColor(m_theme->texture().color()); } } void ClockTool::renderTheme(unsigned char alpha) { m_button.setAlpha(alpha); - m_button.setJustify(m_theme.justify()); + m_button.setJustify(m_theme->justify()); reRender(); - m_button.setBorderWidth(m_theme.border().width()); - m_button.setBorderColor(m_theme.border().color()); + m_button.setBorderWidth(m_theme->border().width()); + m_button.setBorderColor(m_theme->border().color()); m_button.clear(); } diff --git a/src/ClockTool.hh b/src/ClockTool.hh index 4b1a62c..cbc676f 100644 --- a/src/ClockTool.hh +++ b/src/ClockTool.hh @@ -39,11 +39,13 @@ namespace FbTk { class ImageControl; class Subject; class Menu; +template <class T> class ThemeProxy; } class ClockTool:public ToolbarItem, public FbTk::Observer { public: - ClockTool(const FbTk::FbWindow &parent, ToolTheme &theme, BScreen &screen, FbTk::Menu &menu); + ClockTool(const FbTk::FbWindow &parent, FbTk::ThemeProxy<ToolTheme> &theme, + BScreen &screen, FbTk::Menu &menu); virtual ~ClockTool(); void move(int x, int y); @@ -73,7 +75,7 @@ private: FbTk::TextButton m_button; - const ToolTheme &m_theme; + const FbTk::ThemeProxy<ToolTheme> &m_theme; BScreen &m_screen; Pixmap m_pixmap; FbTk::Timer m_timer; diff --git a/src/CommandDialog.cc b/src/CommandDialog.cc index fb184e7..d88d755 100644 --- a/src/CommandDialog.cc +++ b/src/CommandDialog.cc @@ -50,8 +50,8 @@ using std::out_of_range; CommandDialog::CommandDialog(BScreen &screen, const string &title, const string precommand) : FbTk::FbWindow(screen.rootWindow().screenNumber(), 0, 0, 200, 1, ExposureMask), - m_textbox(*this, screen.winFrameTheme().font(), ""), - m_label(*this, screen.winFrameTheme().font(), title), + m_textbox(*this, screen.winFrameTheme()->font(), ""), + m_label(*this, screen.winFrameTheme()->font(), title), m_gc(m_textbox), m_screen(screen), m_move_x(0), @@ -190,12 +190,12 @@ void CommandDialog::tabComplete() { void CommandDialog::render() { Pixmap tmp = m_pixmap; - if (!m_screen.winFrameTheme().iconbarTheme().focusedTexture().usePixmap()) { - m_label.setBackgroundColor(m_screen.winFrameTheme().iconbarTheme().focusedTexture().color()); + if (!m_screen.winFrameTheme()->iconbarTheme().focusedTexture().usePixmap()) { + m_label.setBackgroundColor(m_screen.winFrameTheme()->iconbarTheme().focusedTexture().color()); m_pixmap = 0; } else { m_pixmap = m_screen.imageControl().renderImage(m_label.width(), m_label.height(), - m_screen.winFrameTheme().iconbarTheme().focusedTexture()); + m_screen.winFrameTheme()->iconbarTheme().focusedTexture()); m_label.setBackgroundPixmap(m_pixmap); } @@ -210,7 +210,7 @@ void CommandDialog::init() { // setup label // we listen to motion notify too m_label.setEventMask(m_label.eventMask() | ButtonPressMask | ButtonMotionMask); - m_label.setGC(m_screen.winFrameTheme().iconbarTheme().focusedText().textGC()); + m_label.setGC(m_screen.winFrameTheme()->iconbarTheme().focusedText().textGC()); m_label.show(); // setup text box diff --git a/src/Ewmh.cc b/src/Ewmh.cc index 07d4e3c..f0b23b3 100644 --- a/src/Ewmh.cc +++ b/src/Ewmh.cc @@ -974,11 +974,11 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce, } else if (ce.message_type == m_net->request_frame_extents) { if (!screen) return true; - FbWinFrameTheme &theme = screen->winFrameTheme(); - unsigned int bw = theme.border(true).width(); - long title_h = theme.titleHeight() || - theme.font().height() + 2*theme.bevelWidth() + 2 + 2*bw; - long handle_h = theme.handleWidth() + 2*bw; + FbTk::ThemeProxy<FbWinFrameTheme> &theme = screen->winFrameTheme(); + unsigned int bw = theme->border(true).width(); + long title_h = theme->titleHeight() || + theme->font().height() + 2*theme->bevelWidth() + 2 + 2*bw; + long handle_h = theme->handleWidth() + 2*bw; long extents[4]; // our frames currently don't protrude from left/right extents[0] = bw; diff --git a/src/FbMenu.cc b/src/FbMenu.cc index 3ec9a29..54b6c4a 100644 --- a/src/FbMenu.cc +++ b/src/FbMenu.cc @@ -24,8 +24,8 @@ #include "fluxbox.hh" #include "Screen.hh" -FbMenu::FbMenu(FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer): +FbMenu::FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): FbTk::Menu(tm, imgctrl), m_layeritem(fbwindow(), layer) { diff --git a/src/FbMenu.hh b/src/FbMenu.hh index 62edc7f..9114192 100644 --- a/src/FbMenu.hh +++ b/src/FbMenu.hh @@ -32,7 +32,7 @@ class MenuTheme; /// a layered and shaped menu class FbMenu:public FbTk::Menu { public: - FbMenu(FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, + FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, FbTk::ImageControl &imgctrl, FbTk::XLayer &layer); virtual ~FbMenu() { } void raise() { m_layeritem.raise(); } diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc index 48dd4d9..51fca9d 100644 --- a/src/FbTk/Menu.cc +++ b/src/FbTk/Menu.cc @@ -81,17 +81,17 @@ Menu *Menu::shown = 0; Menu *Menu::s_focused = 0; -Menu::Menu(MenuTheme &tm, ImageControl &imgctrl): +Menu::Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl): m_theme(tm), m_parent(0), m_image_ctrl(imgctrl), m_screen_x(0), m_screen_y(0), - m_screen_width(DisplayWidth(FbTk::App::instance()->display(), tm.screenNum())), - m_screen_height(DisplayHeight(FbTk::App::instance()->display(), tm.screenNum())), + m_screen_width(DisplayWidth(FbTk::App::instance()->display(), tm->screenNum())), + m_screen_height(DisplayHeight(FbTk::App::instance()->display(), tm->screenNum())), m_alignment(ALIGNDONTCARE), m_active_index(-1), - m_shape(new Shape(fbwindow(), tm.shapePlaces())), + m_shape(new Shape(fbwindow(), tm->shapePlaces())), m_need_update(true) { // setup timers @@ -128,7 +128,7 @@ Menu::Menu(MenuTheme &tm, ImageControl &imgctrl): menu.hilite_pixmap = None; menu.item_w = menu.frame_h = - theme().titleFont().height() + theme().bevelWidth() * 2; + theme()->titleFont().height() + theme()->bevelWidth() * 2; menu.sublevels = menu.persub = @@ -137,7 +137,7 @@ Menu::Menu(MenuTheme &tm, ImageControl &imgctrl): long event_mask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | KeyPressMask | ExposureMask | FocusChangeMask; // create menu window - menu.window = FbTk::FbWindow(tm.screenNum(), + menu.window = FbTk::FbWindow(tm->screenNum(), 0, 0, 10, 10, event_mask, true, // override redirect @@ -153,7 +153,7 @@ Menu::Menu(MenuTheme &tm, ImageControl &imgctrl): event_mask |= EnterWindowMask | LeaveWindowMask; //create menu title menu.title = FbTk::FbWindow(menu.window, // parent - 0, 0, width(), theme().titleHeight(), // pos and size + 0, 0, width(), theme()->titleHeight(), // pos and size event_mask, // mask false, // override redirect true); // save under @@ -163,7 +163,7 @@ Menu::Menu(MenuTheme &tm, ImageControl &imgctrl): event_mask |= PointerMotionMask; menu.frame = FbTk::FbWindow(menu.window, // parent - 0, theme().titleHeight(), // pos + 0, theme()->titleHeight(), // pos width(), menu.frame_h ? menu.frame_h : 1, // size event_mask, // mask false, // override redirect @@ -366,9 +366,9 @@ void Menu::enableTitle() { void Menu::updateMenu(int active_index) { if (m_title_vis) { - menu.item_w = theme().titleFont().textWidth(menu.label, + menu.item_w = theme()->titleFont().textWidth(menu.label, menu.label.size()); - menu.item_w += (theme().bevelWidth() * 2); + menu.item_w += (theme()->bevelWidth() * 2); } else menu.item_w = 1; @@ -386,8 +386,8 @@ void Menu::updateMenu(int active_index) { if (!menuitems.empty()) { menu.sublevels = 1; - while (theme().itemHeight() * (menuitems.size() + 1) / menu.sublevels + - theme().titleHeight() + theme().borderWidth() > m_screen_height) { + while (theme()->itemHeight() * (menuitems.size() + 1) / menu.sublevels + + theme()->titleHeight() + theme()->borderWidth() > m_screen_height) { menu.sublevels++; } @@ -401,14 +401,14 @@ void Menu::updateMenu(int active_index) { menu.persub = 0; } - int itmp = (theme().itemHeight() * menu.persub); + int itmp = (theme()->itemHeight() * menu.persub); menu.frame_h = itmp < 1 ? 1 : itmp; unsigned int new_width = (menu.sublevels * menu.item_w); unsigned int new_height = menu.frame_h; if (m_title_vis) - new_height += theme().titleHeight() + ((menu.frame_h > 0)?menu.title.borderWidth():0); + new_height += theme()->titleHeight() + ((menu.frame_h > 0)?menu.title.borderWidth():0); if (new_width == 0) @@ -431,29 +431,29 @@ void Menu::updateMenu(int active_index) { menu.frame.setAlpha(alpha()); Pixmap tmp = menu.hilite_pixmap; - const FbTk::Texture &hilite_tex = theme().hiliteTexture(); + const FbTk::Texture &hilite_tex = theme()->hiliteTexture(); if (!hilite_tex.usePixmap()) { menu.hilite_pixmap = None; } else menu.hilite_pixmap = - m_image_ctrl.renderImage(menu.item_w, theme().itemHeight(), hilite_tex); + m_image_ctrl.renderImage(menu.item_w, theme()->itemHeight(), hilite_tex); if (tmp) m_image_ctrl.removeImage(tmp); - if (!theme().selectedPixmap().pixmap().drawable()) { - int hw = theme().itemHeight() / 2; - m_theme.setSelectedPixmap(m_image_ctrl.renderImage(hw, hw, theme().hiliteTexture()), true); + if (!theme()->selectedPixmap().pixmap().drawable()) { + int hw = theme()->itemHeight() / 2; + theme()->setSelectedPixmap(m_image_ctrl.renderImage(hw, hw, theme()->hiliteTexture()), true); - if (!theme().highlightSelectedPixmap().pixmap().drawable()) { - int hw = theme().itemHeight() / 2; - m_theme.setHighlightSelectedPixmap(m_image_ctrl.renderImage(hw, hw, theme().frameTexture()), true); + if (!theme()->highlightSelectedPixmap().pixmap().drawable()) { + int hw = theme()->itemHeight() / 2; + theme()->setHighlightSelectedPixmap(m_image_ctrl.renderImage(hw, hw, theme()->frameTexture()), true); } } if (m_title_vis) { menu.title.moveResize(-menu.title.borderWidth(), -menu.title.borderWidth(), - width() + menu.title.borderWidth(), theme().titleHeight()); + width() + menu.title.borderWidth(), theme()->titleHeight()); } menu.frame.moveResize(0, ((m_title_vis) ? menu.title.y() + menu.title.height() + @@ -462,13 +462,13 @@ void Menu::updateMenu(int active_index) { if (m_title_vis && m_need_update) { tmp = menu.title_pixmap; - const FbTk::Texture &tex = theme().titleTexture(); + const FbTk::Texture &tex = theme()->titleTexture(); if (!tex.usePixmap()) { menu.title_pixmap = None; menu.title.setBackgroundColor(tex.color()); } else { menu.title_pixmap = - m_image_ctrl.renderImage(width(), theme().titleHeight(), tex); + m_image_ctrl.renderImage(width(), theme()->titleHeight(), tex); // set pixmap that we have as real face to the user menu.title.setBackgroundPixmap(menu.title_pixmap); } @@ -478,7 +478,7 @@ void Menu::updateMenu(int active_index) { } tmp = menu.frame_pixmap; - const FbTk::Texture &frame_tex = theme().frameTexture(); + const FbTk::Texture &frame_tex = theme()->frameTexture(); if (m_need_update) { if (!frame_tex.usePixmap()) { menu.frame_pixmap = None; @@ -630,12 +630,12 @@ void Menu::move(int x, int y) { void Menu::redrawTitle(FbDrawable &drawable) { - const FbTk::Font &font = theme().titleFont(); - int dx = theme().bevelWidth(); + const FbTk::Font &font = theme()->titleFont(); + int dx = theme()->bevelWidth(); size_t len = menu.label.size(); - unsigned int l = font.textWidth(menu.label, len) + theme().bevelWidth()*2; + unsigned int l = font.textWidth(menu.label, len) + theme()->bevelWidth()*2; - switch (theme().titleFontJustify()) { + switch (theme()->titleFontJustify()) { case FbTk::RIGHT: dx += width() - l; break; @@ -648,12 +648,12 @@ void Menu::redrawTitle(FbDrawable &drawable) { } // difference between height based on font, and style-set height - int height_offset = theme().titleHeight() - (font.height() + 2*theme().bevelWidth()); + int height_offset = theme()->titleHeight() - (font.height() + 2*theme()->bevelWidth()); font.drawText(drawable, // drawable screenNumber(), - theme().titleTextGC().gc(), // graphic context + theme()->titleTextGC().gc(), // graphic context menu.label, len, // text string with length - dx, font.ascent() + theme().bevelWidth() + height_offset/2); // position + dx, font.ascent() + theme()->bevelWidth() + height_offset/2); // position } @@ -683,14 +683,14 @@ void Menu::drawSubmenu(unsigned int index) { int new_y; if (m_alignment == ALIGNTOP) { - new_y = (y() + ((m_title_vis) ? theme().titleHeight() + menu.title.borderWidth() : 0) - + new_y = (y() + ((m_title_vis) ? theme()->titleHeight() + menu.title.borderWidth() : 0) - ((item->submenu()->m_title_vis) ? - item->submenu()->theme().titleHeight() + menu.window.borderWidth() : 0)); + item->submenu()->theme()->titleHeight() + menu.window.borderWidth() : 0)); } else { - new_y = (y() + (theme().itemHeight() * i) + - ((m_title_vis) ? theme().titleHeight() + menu.window.borderWidth() : 0) - + new_y = (y() + (theme()->itemHeight() * i) + + ((m_title_vis) ? theme()->titleHeight() + menu.window.borderWidth() : 0) - ((item->submenu()->m_title_vis) ? - item->submenu()->theme().titleHeight() + menu.window.borderWidth() : 0)); + item->submenu()->theme()->titleHeight() + menu.window.borderWidth() : 0)); } if (m_alignment == ALIGNBOTTOM && @@ -745,7 +745,7 @@ int Menu::drawItem(FbDrawable &drawable, unsigned int index, if (! item) return 0; int sbl = index / menu.persub, i = index - (sbl * menu.persub); - int item_x = (sbl * menu.item_w), item_y = (i * theme().itemHeight()); + int item_x = (sbl * menu.item_w), item_y = (i * theme()->itemHeight()); if (exclusive_drawable) item_x = item_y = 0; @@ -753,7 +753,7 @@ int Menu::drawItem(FbDrawable &drawable, unsigned int index, item->draw(drawable, theme(), highlight, exclusive_drawable, true, // draw fg, draw bg item_x, item_y, - menu.item_w, theme().itemHeight()); + menu.item_w, theme()->itemHeight()); return item_y; } @@ -845,7 +845,7 @@ void Menu::buttonPressEvent(XButtonEvent &be) { if (be.window == menu.frame && menu.item_w != 0) { - int sbl = (be.x / menu.item_w), i = (be.y / theme().itemHeight()); + int sbl = (be.x / menu.item_w), i = (be.y / theme()->itemHeight()); int w = (sbl * menu.persub) + i; if (validIndex(w) && isItemSelectable(static_cast<unsigned int>(w))) { @@ -885,14 +885,14 @@ void Menu::buttonReleaseEvent(XButtonEvent &re) { } else if (re.window == menu.frame) { - int sbl = (re.x / menu.item_w), i = (re.y / theme().itemHeight()), - ix = sbl * menu.item_w, iy = i * theme().itemHeight(), + int sbl = (re.x / menu.item_w), i = (re.y / theme()->itemHeight()), + ix = sbl * menu.item_w, iy = i * theme()->itemHeight(), w = (sbl * menu.persub) + i; if (validIndex(w) && isItemSelectable(static_cast<unsigned int>(w))) { if (m_active_index == w && isItemEnabled(w) && re.x > ix && re.x < (signed) (ix + menu.item_w) && - re.y > iy && re.y < (signed) (iy + theme().itemHeight())) { + re.y > iy && re.y < (signed) (iy + theme()->itemHeight())) { menuitems[w]->click(re.button, re.time, re.state); } else { int old = m_active_index; @@ -930,7 +930,7 @@ void Menu::motionNotifyEvent(XMotionEvent &me) { } else if (!(me.state & Button1Mask) && me.window == menu.frame) { stopHide(); int sbl = (me.x / menu.item_w), - i = (me.y / theme().itemHeight()), + i = (me.y / theme()->itemHeight()), w = (sbl * menu.persub) + i; if (w == m_active_index || !validIndex(w)) @@ -960,11 +960,11 @@ void Menu::motionNotifyEvent(XMotionEvent &me) { } - if (itmp->submenu() && theme().menuMode() == MenuTheme::DELAY_OPEN) { + if (itmp->submenu() && theme()->menuMode() == MenuTheme::DELAY_OPEN) { // start submenu open delay timeval timeout; timeout.tv_sec = 0; - timeout.tv_usec = theme().delayOpen() * 1000; // transformed to usec + timeout.tv_usec = theme()->delayOpen() * 1000; // transformed to usec m_submenu_timer.setTimeout(timeout); m_submenu_timer.start(); } else if (isItemSelectable(w)){ @@ -986,11 +986,11 @@ void Menu::exposeEvent(XExposeEvent &ee) { // first... we see in which sub level the expose starts... and how many // items down in that sublevel - int sbl = (ee.x / menu.item_w), id = (ee.y / theme().itemHeight()), + int sbl = (ee.x / menu.item_w), id = (ee.y / theme()->itemHeight()), // next... figure out how many sublevels over the redrawspans sbl_d = ((ee.x + ee.width) / menu.item_w), // then we see how many items down to redraw - id_d = ((ee.y + ee.height) / theme().itemHeight()); + id_d = ((ee.y + ee.height) / theme()->itemHeight()); if (id_d > menu.persub) id_d = menu.persub; // draw the sublevels and the number of items the exposure spans @@ -1093,7 +1093,7 @@ void Menu::keyPressEvent(XKeyEvent &event) { void Menu::reconfigure() { - m_shape->setPlaces(theme().shapePlaces()); + m_shape->setPlaces(theme()->shapePlaces()); if (FbTk::Transparent::haveComposite()) { menu.window.setOpaque(alpha()); @@ -1107,12 +1107,12 @@ void Menu::reconfigure() { m_need_update = true; // redraw items - menu.window.setBorderColor(theme().borderColor()); - menu.title.setBorderColor(theme().borderColor()); - menu.frame.setBorderColor(theme().borderColor()); + menu.window.setBorderColor(theme()->borderColor()); + menu.title.setBorderColor(theme()->borderColor()); + menu.frame.setBorderColor(theme()->borderColor()); - menu.window.setBorderWidth(theme().borderWidth()); - menu.title.setBorderWidth(theme().borderWidth()); + menu.window.setBorderWidth(theme()->borderWidth()); + menu.title.setBorderWidth(theme()->borderWidth()); updateMenu(); } @@ -1145,7 +1145,7 @@ void Menu::closeMenu() { void Menu::startHide() { timeval timeout; timeout.tv_sec = 0; - timeout.tv_usec = theme().delayClose() * 1000; // transformed to usec + timeout.tv_usec = theme()->delayClose() * 1000; // transformed to usec m_hide_timer.setTimeout(timeout); m_hide_timer.start(); } @@ -1192,7 +1192,7 @@ void Menu::clearItem(int index, bool clear, int search_index) { return; int sbl = index / menu.persub, i = index - (sbl * menu.persub); - unsigned int item_w = menu.item_w, item_h = theme().itemHeight(); + unsigned int item_w = menu.item_w, item_h = theme()->itemHeight(); int item_x = (sbl * item_w), item_y = (i * item_h); bool highlight = (index == m_active_index && isItemSelectable(index)); @@ -1224,7 +1224,7 @@ void Menu::clearItem(int index, bool clear, int search_index) { // Area must have been cleared before calling highlight void Menu::highlightItem(int index) { int sbl = index / menu.persub, i = index - (sbl * menu.persub); - unsigned int item_w = menu.item_w, item_h = theme().itemHeight(); + unsigned int item_w = menu.item_w, item_h = theme()->itemHeight(); int item_x = (sbl * menu.item_w), item_y = (i * item_h); FbPixmap buffer = FbPixmap(menu.frame, item_w, item_h, menu.frame.depth()); @@ -1234,18 +1234,18 @@ void Menu::highlightItem(int index) { int pixmap_x = parent_rel ? item_x : 0, pixmap_y = parent_rel ? item_y : 0; if (pixmap) { buffer.copyArea(pixmap, - theme().hiliteGC().gc(), pixmap_x, pixmap_y, + theme()->hiliteGC().gc(), pixmap_x, pixmap_y, 0, 0, item_w, item_h); } else { - buffer.fillRectangle(theme().hiliteGC().gc(), + buffer.fillRectangle(theme()->hiliteGC().gc(), 0, 0, item_w, item_h); } menu.frame.updateTransparent(item_x, item_y, item_w, item_h, buffer.drawable(), true); drawItem(buffer, index, true, true); - menu.frame.copyArea(buffer.drawable(), theme().hiliteGC().gc(), + menu.frame.copyArea(buffer.drawable(), theme()->hiliteGC().gc(), 0, 0, item_x, item_y, item_w, item_h); @@ -1278,7 +1278,7 @@ void Menu::drawLine(int index, int size){ return; int sbl = index / menu.persub, i = index - (sbl * menu.persub); - int item_x = (sbl * menu.item_w), item_y = (i * theme().itemHeight()); + int item_x = (sbl * menu.item_w), item_y = (i * theme()->itemHeight()); FbTk::MenuItem *item = find(index); item->drawLine(menu.frame, theme(), size, item_x, item_y, menu.item_w); diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh index e719053..2f37234 100644 --- a/src/FbTk/Menu.hh +++ b/src/FbTk/Menu.hh @@ -55,7 +55,7 @@ public: */ enum { EMPTY = 0, SQUARE, TRIANGLE, DIAMOND }; - Menu(MenuTheme &tm, ImageControl &imgctrl); + Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl); virtual ~Menu(); /** @@ -151,8 +151,9 @@ public: bool isItemSelected(unsigned int index) const; bool isItemEnabled(unsigned int index) const; bool isItemSelectable(unsigned int index) const; - const MenuTheme &theme() const { return m_theme; } - unsigned char alpha() const { return theme().alpha(); } + FbTk::ThemeProxy<MenuTheme> &theme() { return m_theme; } + const FbTk::ThemeProxy<MenuTheme> &theme() const { return m_theme; } + unsigned char alpha() const { return theme()->alpha(); } static Menu *shownMenu() { return shown; } static Menu *focused() { return s_focused; } static void hideShownMenu(); @@ -198,7 +199,7 @@ private: void startHide(); void stopHide(); - MenuTheme &m_theme; + FbTk::ThemeProxy<MenuTheme> &m_theme; Menu *m_parent; ImageControl &m_image_ctrl; diff --git a/src/FbTk/MenuItem.cc b/src/FbTk/MenuItem.cc index ce3846a..1e8c8e9 100644 --- a/src/FbTk/MenuItem.cc +++ b/src/FbTk/MenuItem.cc @@ -42,26 +42,27 @@ void MenuItem::click(int button, int time, unsigned int mods) { } } -void MenuItem::drawLine(FbDrawable &draw, const MenuTheme &theme, size_t size, +void MenuItem::drawLine(FbDrawable &draw, + const FbTk::ThemeProxy<MenuTheme> &theme, size_t size, int text_x, int text_y, unsigned int width) const { - unsigned int height = theme.itemHeight(); - int bevelW = theme.bevelWidth(); + unsigned int height = theme->itemHeight(); + int bevelW = theme->bevelWidth(); - int font_top = (height - theme.frameFont().height())/2; - int underline_height = font_top + theme.frameFont().ascent() + 2; + int font_top = (height - theme->frameFont().height())/2; + int underline_height = font_top + theme->frameFont().ascent() + 2; int bottom = height - bevelW - 1; text_y += bottom > underline_height ? underline_height : bottom; - int text_w = theme.frameFont().textWidth(m_label.c_str(), m_label.size()); + int text_w = theme->frameFont().textWidth(m_label.c_str(), m_label.size()); // width of the searchstring size = size > m_label.length() ? m_label.length() : size; std::string search_string = m_label.substr(0,size); - int search_string_w = theme.frameFont().textWidth(search_string.c_str(), size); + int search_string_w = theme->frameFont().textWidth(search_string.c_str(), size); // pay attention to the text justification - switch(theme.frameFontJustify()) { + switch(theme->frameFontJustify()) { case FbTk::LEFT: text_x += bevelW + height + 1; break; @@ -75,13 +76,13 @@ void MenuItem::drawLine(FbDrawable &draw, const MenuTheme &theme, size_t size, // avoid drawing an ugly dot if (size != 0) - draw.drawLine(theme.frameUnderlineGC().gc(), + draw.drawLine(theme->frameUnderlineGC().gc(), text_x, text_y, text_x + search_string_w, text_y); } void MenuItem::draw(FbDrawable &draw, - const MenuTheme &theme, + const FbTk::ThemeProxy<MenuTheme> &theme, bool highlight, bool draw_foreground, bool draw_background, int x, int y, unsigned int width, unsigned int height) const { @@ -101,16 +102,16 @@ void MenuItem::draw(FbDrawable &draw, tmp_mask.copy(icon()->mask()); // scale pixmap to right size - if (height - 2*theme.bevelWidth() != tmp_pixmap.height()) { - unsigned int scale_size = height - 2*theme.bevelWidth(); + if (height - 2*theme->bevelWidth() != tmp_pixmap.height()) { + unsigned int scale_size = height - 2*theme->bevelWidth(); tmp_pixmap.scale(scale_size, scale_size); tmp_mask.scale(scale_size, scale_size); } if (tmp_pixmap.drawable() != 0) { - GC gc = theme.frameTextGC().gc(); - int icon_x = x + theme.bevelWidth(); - int icon_y = y + theme.bevelWidth(); + GC gc = theme->frameTextGC().gc(); + int icon_x = x + theme->bevelWidth(); + int icon_y = y + theme->bevelWidth(); // enable clip mask XSetClipMask(disp, gc, tmp_mask.drawable()); XSetClipOrigin(disp, gc, icon_x, icon_y); @@ -126,9 +127,9 @@ void MenuItem::draw(FbDrawable &draw, XGetGCValues(draw.display(), gc, GCForeground|GCBackground, &backup); XSetForeground(draw.display(), gc, - Color("black", theme.screenNum()).pixel()); + Color("black", theme->screenNum()).pixel()); XSetBackground(draw.display(), gc, - Color("white", theme.screenNum()).pixel()); + Color("white", theme->screenNum()).pixel()); XCopyPlane(draw.display(), tmp_pixmap.drawable(), draw.drawable(), gc, 0, 0, tmp_pixmap.width(), tmp_pixmap.height(), @@ -149,46 +150,46 @@ void MenuItem::draw(FbDrawable &draw, // text is background if (draw_background) { const GContext &tgc = - (highlight ? theme.hiliteTextGC() : - (isEnabled() ? theme.frameTextGC() : theme.disableTextGC() ) ); + (highlight ? theme->hiliteTextGC() : + (isEnabled() ? theme->frameTextGC() : theme->disableTextGC() ) ); // // Text // int text_y = y, text_x = x; - int text_w = theme.frameFont().textWidth(label().c_str(), label().size()); + int text_w = theme->frameFont().textWidth(label().c_str(), label().size()); - int height_offset = theme.itemHeight() - (theme.frameFont().height() + 2*theme.bevelWidth()); - text_y = y + theme.bevelWidth() + theme.frameFont().ascent() + height_offset/2; + int height_offset = theme->itemHeight() - (theme->frameFont().height() + 2*theme->bevelWidth()); + text_y = y + theme->bevelWidth() + theme->frameFont().ascent() + height_offset/2; - switch(theme.frameFontJustify()) { + switch(theme->frameFontJustify()) { case FbTk::LEFT: - text_x = x + theme.bevelWidth() + height + 1; + text_x = x + theme->bevelWidth() + height + 1; break; case FbTk::RIGHT: - text_x = x + width - (height + theme.bevelWidth() + text_w); + text_x = x + width - (height + theme->bevelWidth() + text_w); break; default: //center text_x = x + ((width + 1 - text_w) / 2); break; } - theme.frameFont().drawText(draw, // drawable - theme.screenNum(), + theme->frameFont().drawText(draw, // drawable + theme->screenNum(), tgc.gc(), label().c_str(), label().size(), // text string and lenght text_x, text_y); // position } - GC gc = (highlight) ? theme.hiliteTextGC().gc() : - theme.frameTextGC().gc(); + GC gc = (highlight) ? theme->hiliteTextGC().gc() : + theme->frameTextGC().gc(); int sel_x = x; int sel_y = y; - unsigned int item_pm_height = theme.itemHeight(); + unsigned int item_pm_height = theme->itemHeight(); - if (theme.bulletPos() == FbTk::RIGHT) - sel_x += width - height - theme.bevelWidth(); + if (theme->bulletPos() == FbTk::RIGHT) + sel_x += width - height - theme->bevelWidth(); // selected pixmap is foreground if (draw_foreground && isToggleItem()) { @@ -199,15 +200,15 @@ void MenuItem::draw(FbDrawable &draw, const PixmapWithMask *pm = 0; if (isSelected()) { - if (highlight && theme.highlightSelectedPixmap().pixmap().drawable() != 0) - pm = &theme.highlightSelectedPixmap(); + if (highlight && theme->highlightSelectedPixmap().pixmap().drawable() != 0) + pm = &theme->highlightSelectedPixmap(); else - pm = &theme.selectedPixmap(); + pm = &theme->selectedPixmap(); } else { - if (highlight && theme.highlightUnselectedPixmap().pixmap().drawable() != 0) - pm = &theme.highlightUnselectedPixmap(); + if (highlight && theme->highlightUnselectedPixmap().pixmap().drawable() != 0) + pm = &theme->highlightUnselectedPixmap(); else - pm = &theme.unselectedPixmap(); + pm = &theme->unselectedPixmap(); } if (pm != 0 && pm->pixmap().drawable() != 0) { unsigned int selw = pm->width(); @@ -231,7 +232,7 @@ void MenuItem::draw(FbDrawable &draw, // disable clip mask XSetClipMask(disp, gc, None); } else if (isSelected()) { - draw.fillRectangle(theme.hiliteGC().gc(), + draw.fillRectangle(theme->hiliteGC().gc(), sel_x+item_pm_height/4, sel_y+item_pm_height/4, item_pm_height/2, item_pm_height/2); } } @@ -243,10 +244,10 @@ void MenuItem::draw(FbDrawable &draw, const PixmapWithMask *pm = 0; - if (highlight && theme.highlightBulletPixmap().pixmap().drawable() != 0) - pm = &theme.highlightBulletPixmap(); + if (highlight && theme->highlightBulletPixmap().pixmap().drawable() != 0) + pm = &theme->highlightBulletPixmap(); else - pm = &theme.bulletPixmap(); + pm = &theme->bulletPixmap(); if (pm && pm->pixmap().drawable() != 0) { unsigned int selw = pm->width(); @@ -273,13 +274,13 @@ void MenuItem::draw(FbDrawable &draw, } else { unsigned int half_w = item_pm_height / 2, quarter_w = item_pm_height / 4; - switch (theme.bullet()) { + switch (theme->bullet()) { case MenuTheme::SQUARE: draw.drawRectangle(gc, sel_x+quarter_w, y+quarter_w, half_w, half_w); break; case MenuTheme::TRIANGLE: - draw.drawTriangle(gc, ((theme.bulletPos() == FbTk::RIGHT)? + draw.drawTriangle(gc, ((theme->bulletPos() == FbTk::RIGHT)? FbTk::FbDrawable::RIGHT: FbTk::FbDrawable::LEFT), sel_x, sel_y, @@ -327,23 +328,23 @@ void MenuItem::setIcon(const std::string &filename, int screen_num) { screen_num)); } -unsigned int MenuItem::height(const MenuTheme &theme) const { - return std::max(theme.frameFont().height() + 2*theme.bevelWidth(), theme.itemHeight()); +unsigned int MenuItem::height(const FbTk::ThemeProxy<MenuTheme> &theme) const { + return std::max(theme->frameFont().height() + 2*theme->bevelWidth(), theme->itemHeight()); } -unsigned int MenuItem::width(const MenuTheme &theme) const { +unsigned int MenuItem::width(const FbTk::ThemeProxy<MenuTheme> &theme) const { // textwidth + bevel width on each side of the text const unsigned int icon_width = height(theme); - const unsigned int normal = theme.frameFont().textWidth(label(), label().size()) + - 2 * (theme.bevelWidth() + icon_width); + const unsigned int normal = theme->frameFont().textWidth(label(), label().size()) + + 2 * (theme->bevelWidth() + icon_width); return m_icon.get() == 0 ? normal : normal + icon_width; } -void MenuItem::updateTheme(const MenuTheme &theme) { +void MenuItem::updateTheme(const FbTk::ThemeProxy<MenuTheme> &theme) { if (m_icon.get() == 0) return; - m_icon->pixmap.reset(Image::load(m_icon->filename.c_str(), theme.screenNum())); + m_icon->pixmap.reset(Image::load(m_icon->filename.c_str(), theme->screenNum())); } diff --git a/src/FbTk/MenuItem.hh b/src/FbTk/MenuItem.hh index d858340..8c73036 100644 --- a/src/FbTk/MenuItem.hh +++ b/src/FbTk/MenuItem.hh @@ -35,6 +35,7 @@ namespace FbTk { class Menu; class MenuTheme; class FbDrawable; +template <class T> class ThemeProxy; /// An interface for a menu item in Menu class MenuItem : public FbTk::ITypeAheadable { @@ -116,21 +117,21 @@ public: virtual int getIndex() { return m_index; } const std::string &iTypeString() const { return m_label; } virtual void drawLine(FbDrawable &draw, - const MenuTheme &theme, + const FbTk::ThemeProxy<MenuTheme> &theme, size_t size, int text_x, int text_y, unsigned int width) const; - virtual unsigned int width(const MenuTheme &theme) const; - virtual unsigned int height(const MenuTheme &theme) const; + virtual unsigned int width(const FbTk::ThemeProxy<MenuTheme> &theme) const; + virtual unsigned int height(const FbTk::ThemeProxy<MenuTheme> &theme) const; virtual void draw(FbDrawable &drawable, - const MenuTheme &theme, + const FbTk::ThemeProxy<MenuTheme> &theme, bool highlight, // "foreground" is the transient bits - more likely to change bool draw_foreground, bool draw_background, int x, int y, unsigned int width, unsigned int height) const; - virtual void updateTheme(const MenuTheme &theme); + virtual void updateTheme(const FbTk::ThemeProxy<MenuTheme> &theme); /** Called when the item was clicked with a specific button @param button the button number diff --git a/src/FbTk/MenuSeparator.cc b/src/FbTk/MenuSeparator.cc index 928fe77..ea73a0c 100644 --- a/src/FbTk/MenuSeparator.cc +++ b/src/FbTk/MenuSeparator.cc @@ -29,7 +29,7 @@ namespace FbTk { void MenuSeparator::draw(FbDrawable &drawable, - const MenuTheme &theme, + const FbTk::ThemeProxy<MenuTheme> &theme, bool highlight, bool draw_foreground, bool draw_background, int x, int y, unsigned int width, unsigned int height) const { @@ -37,13 +37,13 @@ void MenuSeparator::draw(FbDrawable &drawable, if (draw_background) { const GContext &tgc = // its a separator, it shouldn't be highlighted! or shown as disabled -// (highlight ? theme.hiliteTextGC() : -// (isEnabled() ? theme.frameTextGC() : theme.disableTextGC() ) ); - theme.frameTextGC(); +// (highlight ? theme->hiliteTextGC() : +// (isEnabled() ? theme->frameTextGC() : theme->disableTextGC() ) ); + theme->frameTextGC(); drawable.drawRectangle(tgc.gc(), - x + theme.bevelWidth() + height + 1, y + height / 2, - width - ((theme.bevelWidth() + height) * 2) - 1, 0); + x + theme->bevelWidth() + height + 1, y + height / 2, + width - ((theme->bevelWidth() + height) * 2) - 1, 0); } } diff --git a/src/FbTk/MenuSeparator.hh b/src/FbTk/MenuSeparator.hh index fd4ddbd..a2b0af7 100644 --- a/src/FbTk/MenuSeparator.hh +++ b/src/FbTk/MenuSeparator.hh @@ -30,7 +30,7 @@ namespace FbTk { class MenuSeparator: public MenuItem { public: virtual void draw(FbDrawable &drawable, - const MenuTheme &theme, + const FbTk::ThemeProxy<MenuTheme> &theme, bool highlight, bool draw_foreground, bool draw_background, int x, int y, unsigned int width, unsigned int height) const; diff --git a/src/FbTk/MenuTheme.hh b/src/FbTk/MenuTheme.hh index 017e4f3..273104c 100644 --- a/src/FbTk/MenuTheme.hh +++ b/src/FbTk/MenuTheme.hh @@ -143,8 +143,8 @@ public: virtual Subject &reconfigSig() { return Theme::reconfigSig(); } virtual const Subject &reconfigSig() const { return Theme::reconfigSig(); } - virtual MenuTheme *operator ->() { return this; } - virtual const MenuTheme *operator ->() const { return this; } + virtual MenuTheme &operator *() { return *this; } + virtual const MenuTheme &operator *() const { return *this; } private: ThemeItem<Color> t_text, f_text, h_text, d_text, u_text; diff --git a/src/FbTk/Theme.hh b/src/FbTk/Theme.hh index 1ae3387..c331ba5 100644 --- a/src/FbTk/Theme.hh +++ b/src/FbTk/Theme.hh @@ -127,8 +127,10 @@ public: virtual Subject &reconfigSig() = 0; virtual const Subject &reconfigSig() const = 0; - virtual BaseTheme *operator ->() = 0; - virtual const BaseTheme *operator ->() const = 0; + virtual BaseTheme &operator *() = 0; + virtual const BaseTheme &operator *() const = 0; + virtual BaseTheme *operator ->() { return &(**this); } + virtual const BaseTheme *operator ->() const { return &(**this); } }; /// Singleton theme manager diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 9056d54..36bf251 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc @@ -39,14 +39,16 @@ using std::mem_fun; using std::string; -FbWinFrame::FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageControl &imgctrl, +FbWinFrame::FbWinFrame(BScreen &screen, + FbTk::ThemeProxy<FbWinFrameTheme> &theme, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, int x, int y, unsigned int width, unsigned int height): m_screen(screen), m_theme(theme), m_imagectrl(imgctrl), - m_window(theme.screenNum(), x, y, width, height, + m_window(theme->screenNum(), x, y, width, height, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask, true), @@ -56,7 +58,7 @@ FbWinFrame::FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageContr ButtonMotionMask | ExposureMask | EnterWindowMask | LeaveWindowMask), m_tab_container(m_titlebar), - m_label(m_titlebar, m_theme.font(), ""), + m_label(m_titlebar, m_theme->font(), ""), m_handle(m_window, 0, 0, 100, 5, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ExposureMask | @@ -88,9 +90,9 @@ FbWinFrame::FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageContr m_button_size(1), m_height_before_shade(1), m_shaded(false), - m_focused_alpha(AlphaAcc(theme, &FbWinFrameTheme::focusedAlpha)), - m_unfocused_alpha(AlphaAcc(theme, &FbWinFrameTheme::unfocusedAlpha)), - m_shape(m_window, theme.shapePlace()), + m_focused_alpha(AlphaAcc(*theme, &FbWinFrameTheme::focusedAlpha)), + m_unfocused_alpha(AlphaAcc(*theme, &FbWinFrameTheme::unfocusedAlpha)), + m_shape(m_window, theme->shapePlace()), m_disable_themeshape(false) { init(); } @@ -117,7 +119,7 @@ bool FbWinFrame::setTabMode(TabMode tabmode) { if (tabmode == EXTERNAL) { m_label.show(); m_tab_container.setBorderWidth(m_window.borderWidth()); - m_tab_container.setBorderColor(theme().border(m_focused).color()); + m_tab_container.setBorderColor(theme()->border(m_focused).color()); m_tab_container.setEventMask( ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | ExposureMask | @@ -484,10 +486,10 @@ void FbWinFrame::setFocus(bool newvalue) { } if (m_decoration_mask & DECORM_BORDER && - (theme().border(true).width() != theme().border(false).width() || - theme().border(true).color().pixel() != - theme().border(false).color().pixel())) - setBorderWidth(theme().border(newvalue).width()); + (theme()->border(true).width() != theme()->border(false).width() || + theme()->border(true).color().pixel() != + theme()->border(false).color().pixel())) + setBorderWidth(theme()->border(newvalue).width()); applyAll(); clearAll(); @@ -562,7 +564,7 @@ void FbWinFrame::removeAllButtons() { } IconButton *FbWinFrame::createTab(Focusable &client) { - IconButton *button = new IconButton(m_tab_container, theme().iconbarTheme(), + IconButton *button = new IconButton(m_tab_container, theme()->iconbarTheme(), client); button->show(); @@ -742,7 +744,7 @@ bool FbWinFrame::hideHandle() { } bool FbWinFrame::showHandle() { - if (m_use_handle || theme().handleWidth() == 0) + if (m_use_handle || theme()->handleWidth() == 0) return false; m_use_handle = true; @@ -870,19 +872,19 @@ void FbWinFrame::reconfigure() { // negate gravity gravityTranslate(grav_x, grav_y, -m_active_gravity, m_active_orig_client_bw, false); - m_bevel = theme().bevelWidth(); + m_bevel = theme()->bevelWidth(); // reconfigure can't set borderwidth, as it doesn't know // if it's meant to be borderless or not unsigned int orig_handle_h = handle().height(); - if (m_use_handle && orig_handle_h != theme().handleWidth()) + if (m_use_handle && orig_handle_h != theme()->handleWidth()) m_window.resize(m_window.width(), m_window.height() - - orig_handle_h + theme().handleWidth()); + orig_handle_h + theme()->handleWidth()); handle().resize(handle().width(), - theme().handleWidth()); + theme()->handleWidth()); gripLeft().resize(buttonHeight(), - theme().handleWidth()); + theme()->handleWidth()); gripRight().resize(gripLeft().width(), gripLeft().height()); @@ -988,7 +990,7 @@ void FbWinFrame::reconfigure() { if (m_disable_themeshape) m_shape.setPlaces(FbTk::Shape::NONE); else - m_shape.setPlaces(theme().shapePlace()); + m_shape.setPlaces(theme()->shapePlace()); m_shape.setShapeOffsets(0, titlebarHeight()); @@ -1001,7 +1003,7 @@ void FbWinFrame::setUseShape(bool value) { if (m_disable_themeshape) m_shape.setPlaces(FbTk::Shape::NONE); else - m_shape.setPlaces(theme().shapePlace()); + m_shape.setPlaces(theme()->shapePlace()); } @@ -1038,10 +1040,10 @@ void FbWinFrame::reconfigureTitlebar() { int orig_height = m_titlebar.height(); // resize titlebar to window size with font height - int title_height = m_theme.font().height() == 0 ? 16 : - m_theme.font().height() + m_bevel*2 + 2; - if (m_theme.titleHeight() != 0) - title_height = m_theme.titleHeight(); + int title_height = theme()->font().height() == 0 ? 16 : + theme()->font().height() + m_bevel*2 + 2; + if (theme()->titleHeight() != 0) + title_height = theme()->titleHeight(); // if the titlebar grows in size, make sure the whole window does too if (orig_height != title_height) @@ -1128,21 +1130,21 @@ void FbWinFrame::renderTitlebar() { } // render pixmaps - render(m_theme.titleFocusTexture(), m_title_focused_color, + render(theme()->titleFocusTexture(), m_title_focused_color, m_title_focused_pm, m_titlebar.width(), m_titlebar.height()); - render(m_theme.titleUnfocusTexture(), m_title_unfocused_color, + render(theme()->titleUnfocusTexture(), m_title_unfocused_color, m_title_unfocused_pm, m_titlebar.width(), m_titlebar.height()); //!! TODO: don't render label if internal tabs - render(m_theme.iconbarTheme().focusedTexture(), m_label_focused_color, + render(theme()->iconbarTheme()->focusedTexture(), m_label_focused_color, m_label_focused_pm, m_label.width(), m_label.height()); - render(m_theme.iconbarTheme().unfocusedTexture(), m_label_unfocused_color, + render(theme()->iconbarTheme()->unfocusedTexture(), m_label_unfocused_color, m_label_unfocused_pm, m_label.width(), m_label.height()); @@ -1154,13 +1156,13 @@ void FbWinFrame::renderTabContainer() { return; } - const FbTk::Texture *tc_focused = &m_theme.iconbarTheme().focusedTexture(); - const FbTk::Texture *tc_unfocused = &m_theme.iconbarTheme().unfocusedTexture(); + const FbTk::Texture *tc_focused = &theme()->iconbarTheme()->focusedTexture(); + const FbTk::Texture *tc_unfocused = &theme()->iconbarTheme()->unfocusedTexture(); if (m_tabmode == EXTERNAL && tc_focused->type() & FbTk::Texture::PARENTRELATIVE) - tc_focused = &m_theme.titleFocusTexture(); + tc_focused = &theme()->titleFocusTexture(); if (m_tabmode == EXTERNAL && tc_unfocused->type() & FbTk::Texture::PARENTRELATIVE) - tc_unfocused = &m_theme.titleUnfocusTexture(); + tc_unfocused = &theme()->titleUnfocusTexture(); render(*tc_focused, m_tabcontainer_focused_color, m_tabcontainer_focused_pm, @@ -1190,11 +1192,11 @@ void FbWinFrame::applyTitlebar() { if (m_tabmode != INTERNAL) { m_label.setGC(m_focused ? - theme().iconbarTheme().focusedText().textGC() : - theme().iconbarTheme().unfocusedText().textGC()); + theme()->iconbarTheme()->focusedText().textGC() : + theme()->iconbarTheme()->unfocusedText().textGC()); m_label.setJustify(m_focused ? - theme().iconbarTheme().focusedText().justify() : - theme().iconbarTheme().unfocusedText().justify()); + theme()->iconbarTheme()->focusedText().justify() : + theme()->iconbarTheme()->unfocusedText().justify()); if (label_pm != 0) m_label.setBackgroundPixmap(label_pm); @@ -1220,18 +1222,18 @@ void FbWinFrame::renderHandles() { return; } - render(m_theme.handleFocusTexture(), m_handle_focused_color, + render(theme()->handleFocusTexture(), m_handle_focused_color, m_handle_focused_pm, m_handle.width(), m_handle.height()); - render(m_theme.handleUnfocusTexture(), m_handle_unfocused_color, + render(theme()->handleUnfocusTexture(), m_handle_unfocused_color, m_handle_unfocused_pm, m_handle.width(), m_handle.height()); - render(m_theme.gripFocusTexture(), m_grip_focused_color, m_grip_focused_pm, + render(theme()->gripFocusTexture(), m_grip_focused_color, m_grip_focused_pm, m_grip_left.width(), m_grip_left.height()); - render(m_theme.gripUnfocusTexture(), m_grip_unfocused_color, + render(theme()->gripUnfocusTexture(), m_grip_unfocused_color, m_grip_unfocused_pm, m_grip_left.width(), m_grip_left.height()); @@ -1286,15 +1288,15 @@ void FbWinFrame::renderButtons() { return; } - render(m_theme.buttonFocusTexture(), m_button_color, + render(theme()->buttonFocusTexture(), m_button_color, m_button_pm, m_button_size, m_button_size); - render(m_theme.buttonUnfocusTexture(), m_button_unfocused_color, + render(theme()->buttonUnfocusTexture(), m_button_unfocused_color, m_button_unfocused_pm, m_button_size, m_button_size); - render(m_theme.buttonPressedTexture(), m_button_pressed_color, + render(theme()->buttonPressedTexture(), m_button_pressed_color, m_button_pressed_pm, m_button_size, m_button_size); } @@ -1310,7 +1312,7 @@ void FbWinFrame::applyButtons() { void FbWinFrame::init() { - if (theme().handleWidth() == 0) + if (theme()->handleWidth() == 0) m_use_handle = false; m_disable_themeshape = false; @@ -1357,7 +1359,7 @@ void FbWinFrame::applyButton(FbTk::Button &btn) { if (focused()) { // focused btn.setAlpha(getAlpha(true)); - btn.setGC(m_theme.buttonPicFocusGC()); + btn.setGC(theme()->buttonPicFocusGC()); if (m_button_pm) btn.setBackgroundPixmap(m_button_pm); else @@ -1365,7 +1367,7 @@ void FbWinFrame::applyButton(FbTk::Button &btn) { } else { // unfocused btn.setAlpha(getAlpha(false)); - btn.setGC(m_theme.buttonPicUnfocusGC()); + btn.setGC(theme()->buttonPicUnfocusGC()); if (m_button_unfocused_pm) btn.setBackgroundPixmap(m_button_unfocused_pm); else @@ -1463,21 +1465,21 @@ void FbWinFrame::setBorderWidth(unsigned int border_width) { bw_changes += static_cast<signed>(border_width - handle().borderWidth()); window().setBorderWidth(border_width); - window().setBorderColor(theme().border(m_focused).color()); + window().setBorderColor(theme()->border(m_focused).color()); setTabMode(NOTSET); titlebar().setBorderWidth(border_width); - titlebar().setBorderColor(theme().border(m_focused).color()); + titlebar().setBorderColor(theme()->border(m_focused).color()); handle().setBorderWidth(border_width); - handle().setBorderColor(theme().border(m_focused).color()); + handle().setBorderColor(theme()->border(m_focused).color()); gripLeft().setBorderWidth(border_width); - gripLeft().setBorderColor(theme().border(m_focused).color()); + gripLeft().setBorderColor(theme()->border(m_focused).color()); gripRight().setBorderWidth(border_width); - gripRight().setBorderColor(theme().border(m_focused).color()); + gripRight().setBorderColor(theme()->border(m_focused).color()); if (bw_changes != 0) resize(width(), height() + bw_changes); diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh index 5d81dba..82c33dc 100644 --- a/src/FbWinFrame.hh +++ b/src/FbWinFrame.hh @@ -46,6 +46,7 @@ class ImageControl; class Command; class Texture; class XLayer; +template <class T> class ThemeProxy; } /// holds a window frame with a client window @@ -95,7 +96,8 @@ public: }; /// create a top level window - FbWinFrame(BScreen &screen, FbWinFrameTheme &theme, FbTk::ImageControl &imgctrl, + FbWinFrame(BScreen &screen, FbTk::ThemeProxy<FbWinFrameTheme> &theme, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, int x, int y, unsigned int width, unsigned int height); @@ -254,7 +256,7 @@ public: const IconButton *currentLabel() const { return m_current_label; } bool focused() const { return m_focused; } bool isShaded() const { return m_shaded; } - FbWinFrameTheme &theme() const { return m_theme; } + FbTk::ThemeProxy<FbWinFrameTheme> &theme() const { return m_theme; } /// @return titlebar height unsigned int titlebarHeight() const { return (m_use_titlebar?m_titlebar.height()+m_window.borderWidth():0); } unsigned int handleHeight() const { return (m_use_handle?m_handle.height()+m_window.borderWidth():0); } @@ -313,7 +315,7 @@ private: BScreen &m_screen; - FbWinFrameTheme &m_theme; ///< theme to be used + FbTk::ThemeProxy<FbWinFrameTheme> &m_theme; ///< theme to be used FbTk::ImageControl &m_imagectrl; ///< Image control for rendering /** @name windows diff --git a/src/FbWinFrameTheme.hh b/src/FbWinFrameTheme.hh index e72d6f5..66448b6 100644 --- a/src/FbWinFrameTheme.hh +++ b/src/FbWinFrameTheme.hh @@ -97,8 +97,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual FbWinFrameTheme *operator ->() { return this; } - virtual const FbWinFrameTheme *operator ->() const { return this; } + virtual FbWinFrameTheme &operator *() { return *this; } + virtual const FbWinFrameTheme &operator *() const { return *this; } private: FbTk::ThemeItem<FbTk::Texture> m_title_focus, m_title_unfocus; diff --git a/src/GenericTool.cc b/src/GenericTool.cc index 92f8e32..67d737f 100644 --- a/src/GenericTool.cc +++ b/src/GenericTool.cc @@ -26,7 +26,7 @@ #include <string> GenericTool::GenericTool(FbTk::FbWindow *new_window, ToolbarItem::Type type, - ToolTheme &theme): + FbTk::ThemeProxy<ToolTheme> &theme): ToolbarItem(type), m_window(new_window), m_theme(theme) { diff --git a/src/GenericTool.hh b/src/GenericTool.hh index 8f565a5..b64edcf 100644 --- a/src/GenericTool.hh +++ b/src/GenericTool.hh @@ -33,12 +33,14 @@ class ToolTheme; namespace FbTk { class FbWindow; +template <class T> class ThemeProxy; } /// helper class for simple tools, i.e buttons etc class GenericTool: public ToolbarItem, public FbTk::Observer, private FbTk::NotCopyable { public: - GenericTool(FbTk::FbWindow *new_window, ToolbarItem::Type type, ToolTheme &theme); + GenericTool(FbTk::FbWindow *new_window, ToolbarItem::Type type, + FbTk::ThemeProxy<ToolTheme> &theme); virtual ~GenericTool(); void move(int x, int y); void resize(unsigned int x, unsigned int y); @@ -53,7 +55,7 @@ public: void parentMoved(); - const ToolTheme &theme() const { return m_theme; } + const FbTk::ThemeProxy<ToolTheme> &theme() const { return m_theme; } FbTk::FbWindow &window() { return *m_window; } const FbTk::FbWindow &window() const { return *m_window; } @@ -64,7 +66,7 @@ private: void update(FbTk::Subject *subj); std::auto_ptr<FbTk::FbWindow> m_window; - ToolTheme &m_theme; + FbTk::ThemeProxy<ToolTheme> &m_theme; }; #endif // GENERICTOOL_HH diff --git a/src/IconButton.cc b/src/IconButton.cc index 456312b..d64e23c 100644 --- a/src/IconButton.cc +++ b/src/IconButton.cc @@ -46,9 +46,9 @@ #endif // SHAPE -IconButton::IconButton(const FbTk::FbWindow &parent, IconbarTheme &theme, - Focusable &win): - FbTk::TextButton(parent, theme.focusedText().font(), win.title()), +IconButton::IconButton(const FbTk::FbWindow &parent, + FbTk::ThemeProxy<IconbarTheme> &theme, Focusable &win): + FbTk::TextButton(parent, theme->focusedText().font(), win.title()), m_win(win), m_icon_window(*this, 1, 1, 1, 1, ExposureMask | ButtonPressMask | ButtonReleaseMask), @@ -118,16 +118,16 @@ void IconButton::setPixmap(bool use) { void IconButton::reconfigTheme() { - if (m_theme.focusedTexture().usePixmap()) + if (m_theme->focusedTexture().usePixmap()) m_focused_pm.reset(m_win.screen().imageControl().renderImage( - width(), height(), m_theme.focusedTexture(), + width(), height(), m_theme->focusedTexture(), orientation())); else m_focused_pm.reset(0); - if (m_theme.unfocusedTexture().usePixmap()) + if (m_theme->unfocusedTexture().usePixmap()) m_unfocused_pm.reset(m_win.screen().imageControl().renderImage( - width(), height(), m_theme.unfocusedTexture(), + width(), height(), m_theme->unfocusedTexture(), orientation())); else m_unfocused_pm.reset(0); @@ -138,25 +138,25 @@ void IconButton::reconfigTheme() { if (m_focused_pm != 0) setBackgroundPixmap(m_focused_pm); else - setBackgroundColor(m_theme.focusedTexture().color()); + setBackgroundColor(m_theme->focusedTexture().color()); - setGC(m_theme.focusedText().textGC()); - setFont(m_theme.focusedText().font()); - setJustify(m_theme.focusedText().justify()); - setBorderWidth(m_theme.focusedBorder().width()); - setBorderColor(m_theme.focusedBorder().color()); + setGC(m_theme->focusedText().textGC()); + setFont(m_theme->focusedText().font()); + setJustify(m_theme->focusedText().justify()); + setBorderWidth(m_theme->focusedBorder().width()); + setBorderColor(m_theme->focusedBorder().color()); } else { if (m_unfocused_pm != 0) setBackgroundPixmap(m_unfocused_pm); else - setBackgroundColor(m_theme.unfocusedTexture().color()); + setBackgroundColor(m_theme->unfocusedTexture().color()); - setGC(m_theme.unfocusedText().textGC()); - setFont(m_theme.unfocusedText().font()); - setJustify(m_theme.unfocusedText().justify()); - setBorderWidth(m_theme.unfocusedBorder().width()); - setBorderColor(m_theme.unfocusedBorder().color()); + setGC(m_theme->unfocusedText().textGC()); + setFont(m_theme->unfocusedText().font()); + setJustify(m_theme->unfocusedText().justify()); + setBorderWidth(m_theme->unfocusedBorder().width()); + setBorderColor(m_theme->unfocusedBorder().color()); } diff --git a/src/IconButton.hh b/src/IconButton.hh index fdec547..a0cd82e 100644 --- a/src/IconButton.hh +++ b/src/IconButton.hh @@ -31,10 +31,14 @@ class Focusable; class IconbarTheme; +namespace FbTk { +template <class T> class ThemeProxy; +} + class IconButton: public FbTk::TextButton, public FbTk::Observer { public: - IconButton(const FbTk::FbWindow &parent, IconbarTheme &theme, - Focusable &window); + IconButton(const FbTk::FbWindow &parent, + FbTk::ThemeProxy<IconbarTheme> &theme, Focusable &window); virtual ~IconButton(); void exposeEvent(XExposeEvent &event); @@ -67,7 +71,7 @@ private: FbTk::FbPixmap m_icon_mask; bool m_use_pixmap; - IconbarTheme &m_theme; + FbTk::ThemeProxy<IconbarTheme> &m_theme; // cached pixmaps FbTk::CachedPixmap m_focused_pm, m_unfocused_pm; }; diff --git a/src/IconbarTheme.hh b/src/IconbarTheme.hh index 3a56eb8..4dc5f32 100644 --- a/src/IconbarTheme.hh +++ b/src/IconbarTheme.hh @@ -50,8 +50,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual IconbarTheme *operator ->() { return this; } - virtual const IconbarTheme *operator ->() const { return this; } + virtual IconbarTheme &operator *() { return *this; } + virtual const IconbarTheme &operator *() const { return *this; } private: FbTk::ThemeItem<FbTk::Texture> m_focused_texture, m_unfocused_texture, m_empty_texture; diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc index 76f6035..3984b52 100644 --- a/src/IconbarTool.cc +++ b/src/IconbarTool.cc @@ -252,7 +252,8 @@ private: }; // end anonymous namespace -IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, +IconbarTool::IconbarTool(const FbTk::FbWindow &parent, + FbTk::ThemeProxy<IconbarTheme> &theme, BScreen &screen, FbTk::Menu &menu): ToolbarItem(ToolbarItem::RELATIVE), m_screen(screen), @@ -467,7 +468,7 @@ void IconbarTool::reset() { } void IconbarTool::updateSizing() { - m_icon_container.setBorderWidth(m_theme.border().width()); + m_icon_container.setBorderWidth(m_theme->border().width()); IconMap::iterator icon_it = m_icons.begin(); const IconMap::iterator icon_it_end = m_icons.end(); @@ -488,14 +489,14 @@ void IconbarTool::renderTheme() { updateSizing(); // if we dont have any icons then we should render empty texture - if (!m_theme.emptyTexture().usePixmap()) { + if (!m_theme->emptyTexture().usePixmap()) { m_empty_pm.reset( 0 ); - m_icon_container.setBackgroundColor(m_theme.emptyTexture().color()); + m_icon_container.setBackgroundColor(m_theme->emptyTexture().color()); } else { m_empty_pm.reset(m_screen.imageControl(). renderImage(m_icon_container.width(), m_icon_container.height(), - m_theme.emptyTexture(), orientation())); + m_theme->emptyTexture(), orientation())); m_icon_container.setBackgroundPixmap(m_empty_pm); } diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh index 4ff962d..36609cc 100644 --- a/src/IconbarTool.hh +++ b/src/IconbarTool.hh @@ -43,7 +43,8 @@ class IconbarTool: public ToolbarItem, public FbTk::Observer { public: typedef std::map<Focusable *, IconButton *> IconMap; - IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, + IconbarTool(const FbTk::FbWindow &parent, + FbTk::ThemeProxy<IconbarTheme> &theme, BScreen &screen, FbTk::Menu &menu); ~IconbarTool(); @@ -95,7 +96,7 @@ private: BScreen &m_screen; FbTk::Container m_icon_container; - IconbarTheme &m_theme; + FbTk::ThemeProxy<IconbarTheme> &m_theme; FbTk::CachedPixmap m_empty_pm; ///< pixmap for empty container diff --git a/src/LayerMenu.cc b/src/LayerMenu.cc index 40ee09f..1a52f04 100644 --- a/src/LayerMenu.cc +++ b/src/LayerMenu.cc @@ -28,7 +28,8 @@ #include "FbTk/SimpleCommand.hh" #include "FbTk/I18n.hh" -LayerMenu::LayerMenu(FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, +LayerMenu::LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, LayerObject *object, bool save_rc): ToggleMenu(tm, imgctrl, layer) { _FB_USES_NLS; diff --git a/src/LayerMenu.hh b/src/LayerMenu.hh index 4113137..68b8dec 100644 --- a/src/LayerMenu.hh +++ b/src/LayerMenu.hh @@ -62,7 +62,8 @@ private: /// Create a layer menu inside from the given menu class LayerMenu : public ToggleMenu { public: - LayerMenu(class FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, + LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, LayerObject *item, bool save_rc); void show(); }; diff --git a/src/RootTheme.hh b/src/RootTheme.hh index 1e37cfe..5ae5165 100644 --- a/src/RootTheme.hh +++ b/src/RootTheme.hh @@ -57,8 +57,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual RootTheme *operator ->() { return this; } - virtual const RootTheme *operator ->() const { return this; } + virtual RootTheme &operator *() { return *this; } + virtual const RootTheme &operator *() const { return *this; } private: BackgroundItem *m_background;///< background image/texture diff --git a/src/Screen.cc b/src/Screen.cc index 7deab8b..5edbcaf 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -34,12 +34,6 @@ #include "FocusControl.hh" #include "ScreenPlacement.hh" -// themes -#include "FbWinFrameTheme.hh" -#include "RootTheme.hh" -#include "WinButtonTheme.hh" -#include "SlitTheme.hh" - // menu items #include "FbTk/BoolMenuItem.hh" #include "FbTk/IntMenuItem.hh" @@ -451,7 +445,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm, imageControl().setDither(*resource.image_dither); - winFrameTheme().reconfigSig().attach(this);// for geom window + winFrameTheme()->reconfigSig().attach(this);// for geom window geom_visible = false; @@ -1799,13 +1793,13 @@ void BScreen::showPosition(int x, int y) { m_pos_window.clear(); - winFrameTheme().font().drawText(m_pos_window, + winFrameTheme()->font().drawText(m_pos_window, screenNumber(), - winFrameTheme().iconbarTheme().focusedText().textGC(), + winFrameTheme()->iconbarTheme().focusedText().textGC(), label, strlen(label), - winFrameTheme().bevelWidth(), - winFrameTheme().bevelWidth() + - winFrameTheme().font().ascent()); + winFrameTheme()->bevelWidth(), + winFrameTheme()->bevelWidth() + + winFrameTheme()->font().ascent()); } @@ -1851,13 +1845,13 @@ void BScreen::showGeometry(int gx, int gy) { m_geom_window.clear(); //!! TODO: geom window again?! repeated - winFrameTheme().font().drawText(m_geom_window, + winFrameTheme()->font().drawText(m_geom_window, screenNumber(), - winFrameTheme().iconbarTheme().focusedText().textGC(), + winFrameTheme()->iconbarTheme().focusedText().textGC(), label, strlen(label), - winFrameTheme().bevelWidth(), - winFrameTheme().bevelWidth() + - winFrameTheme().font().ascent()); + winFrameTheme()->bevelWidth(), + winFrameTheme()->bevelWidth() + + winFrameTheme()->font().ascent()); } @@ -1914,32 +1908,32 @@ void BScreen::renderGeomWindow() { "W: %04d x H: %04d", "Representative maximum sized text for width and height dialog").c_str(), 0, 0); - int geom_h = winFrameTheme().font().height() + winFrameTheme().bevelWidth()*2; - int geom_w = winFrameTheme().font().textWidth(label, strlen(label)) + winFrameTheme().bevelWidth()*2; + int geom_h = winFrameTheme()->font().height() + winFrameTheme()->bevelWidth()*2; + int geom_w = winFrameTheme()->font().textWidth(label, strlen(label)) + winFrameTheme()->bevelWidth()*2; m_geom_window.resize(geom_w, geom_h); - m_geom_window.setBorderWidth(winFrameTheme().border(true).width()); - m_geom_window.setBorderColor(winFrameTheme().border(true).color()); + m_geom_window.setBorderWidth(winFrameTheme()->border(true).width()); + m_geom_window.setBorderColor(winFrameTheme()->border(true).color()); Pixmap tmp = geom_pixmap; - if (winFrameTheme().iconbarTheme().focusedTexture().type() & FbTk::Texture::PARENTRELATIVE) { - if (!winFrameTheme().titleFocusTexture().usePixmap()) { + if (winFrameTheme()->iconbarTheme().focusedTexture().type() & FbTk::Texture::PARENTRELATIVE) { + if (!winFrameTheme()->titleFocusTexture().usePixmap()) { geom_pixmap = None; - m_geom_window.setBackgroundColor(winFrameTheme().titleFocusTexture().color()); + m_geom_window.setBackgroundColor(winFrameTheme()->titleFocusTexture().color()); } else { geom_pixmap = imageControl().renderImage(m_geom_window.width(), m_geom_window.height(), - winFrameTheme().titleFocusTexture()); + winFrameTheme()->titleFocusTexture()); m_geom_window.setBackgroundPixmap(geom_pixmap); } } else { - if (!winFrameTheme().iconbarTheme().focusedTexture().usePixmap()) { + if (!winFrameTheme()->iconbarTheme().focusedTexture().usePixmap()) { geom_pixmap = None; - m_geom_window.setBackgroundColor(winFrameTheme().iconbarTheme().focusedTexture().color()); + m_geom_window.setBackgroundColor(winFrameTheme()->iconbarTheme().focusedTexture().color()); } else { geom_pixmap = imageControl().renderImage(m_geom_window.width(), m_geom_window.height(), - winFrameTheme().iconbarTheme().focusedTexture()); + winFrameTheme()->iconbarTheme().focusedTexture()); m_geom_window.setBackgroundPixmap(geom_pixmap); } } @@ -1952,32 +1946,32 @@ void BScreen::renderGeomWindow() { void BScreen::renderPosWindow() { - int pos_h = winFrameTheme().font().height() + winFrameTheme().bevelWidth()*2; - int pos_w = winFrameTheme().font().textWidth("0:00000 x 0:00000", 17) + winFrameTheme().bevelWidth()*2; + int pos_h = winFrameTheme()->font().height() + winFrameTheme()->bevelWidth()*2; + int pos_w = winFrameTheme()->font().textWidth("0:00000 x 0:00000", 17) + winFrameTheme()->bevelWidth()*2; m_pos_window.resize(pos_w, pos_h); - m_pos_window.setBorderWidth(winFrameTheme().border(true).width()); - m_pos_window.setBorderColor(winFrameTheme().border(true).color()); + m_pos_window.setBorderWidth(winFrameTheme()->border(true).width()); + m_pos_window.setBorderColor(winFrameTheme()->border(true).color()); Pixmap tmp = pos_pixmap; - if (winFrameTheme().iconbarTheme().focusedTexture().type() & FbTk::Texture::PARENTRELATIVE) { - if (!winFrameTheme().titleFocusTexture().usePixmap()) { + if (winFrameTheme()->iconbarTheme().focusedTexture().type() & FbTk::Texture::PARENTRELATIVE) { + if (!winFrameTheme()->titleFocusTexture().usePixmap()) { pos_pixmap = None; - m_pos_window.setBackgroundColor(winFrameTheme().titleFocusTexture().color()); + m_pos_window.setBackgroundColor(winFrameTheme()->titleFocusTexture().color()); } else { pos_pixmap = imageControl().renderImage(m_pos_window.width(), m_pos_window.height(), - winFrameTheme().titleFocusTexture()); + winFrameTheme()->titleFocusTexture()); m_pos_window.setBackgroundPixmap(pos_pixmap); } } else { - if (!winFrameTheme().iconbarTheme().focusedTexture().usePixmap()) { + if (!winFrameTheme()->iconbarTheme().focusedTexture().usePixmap()) { pos_pixmap = None; - m_pos_window.setBackgroundColor(winFrameTheme().iconbarTheme().focusedTexture().color()); + m_pos_window.setBackgroundColor(winFrameTheme()->iconbarTheme().focusedTexture().color()); } else { pos_pixmap = imageControl().renderImage(m_pos_window.width(), m_pos_window.height(), - winFrameTheme().iconbarTheme().focusedTexture()); + winFrameTheme()->iconbarTheme().focusedTexture()); m_pos_window.setBackgroundPixmap(pos_pixmap); } } diff --git a/src/Screen.hh b/src/Screen.hh index 651cdd6..deb51b8 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -27,6 +27,9 @@ #include "FbWinFrame.hh" #include "FbRootWindow.hh" +#include "RootTheme.hh" +#include "WinButtonTheme.hh" +#include "FbWinFrameTheme.hh" #include "FbTk/MenuTheme.hh" #include "FbTk/EventHandler.hh" @@ -52,9 +55,6 @@ class ClientPattern; class Focusable; class FluxboxWindow; -class FbWinFrameTheme; -class RootTheme; -class WinButtonTheme; class WinClient; class Workspace; class Strut; @@ -273,13 +273,13 @@ public: void saveMenu(FbTk::Menu &menu) { m_rootmenu_list.push_back(&menu); } - FbWinFrameTheme &winFrameTheme() { return *m_windowtheme.get(); } - const FbWinFrameTheme &winFrameTheme() const { return *m_windowtheme.get(); } - FbTk::MenuTheme &menuTheme() { return *m_menutheme.get(); } - const FbTk::MenuTheme &menuTheme() const { return *m_menutheme.get(); } - const RootTheme &rootTheme() const { return *m_root_theme.get(); } - WinButtonTheme &winButtonTheme() { return *m_winbutton_theme.get(); } - const WinButtonTheme &winButtonTheme() const { return *m_winbutton_theme.get(); } + FbTk::ThemeProxy<FbWinFrameTheme> &winFrameTheme() { return *m_windowtheme.get(); } + const FbTk::ThemeProxy<FbWinFrameTheme> &winFrameTheme() const { return *m_windowtheme.get(); } + FbTk::ThemeProxy<FbTk::MenuTheme> &menuTheme() { return *m_menutheme.get(); } + const FbTk::ThemeProxy<FbTk::MenuTheme> &menuTheme() const { return *m_menutheme.get(); } + const FbTk::ThemeProxy<RootTheme> &rootTheme() const { return *m_root_theme.get(); } + FbTk::ThemeProxy<WinButtonTheme> &winButtonTheme() { return *m_winbutton_theme.get(); } + const FbTk::ThemeProxy<WinButtonTheme> &winButtonTheme() const { return *m_winbutton_theme.get(); } FbRootWindow &rootWindow() { return m_root_window; } const FbRootWindow &rootWindow() const { return m_root_window; } diff --git a/src/Slit.cc b/src/Slit.cc index fcbfe62..b412eec 100644 --- a/src/Slit.cc +++ b/src/Slit.cc @@ -304,7 +304,7 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename) _FB_USES_NLS; // attach to theme and root window change signal - m_slit_theme->reconfigSig().attach(this); + theme().reconfigSig().attach(this); scr.resizeSig().attach(this); scr.bgChangeSig().attach(this); scr.reconfigureSig().attach(this); // if alpha changed (we disablethis signal when we get theme change sig) @@ -634,7 +634,7 @@ void Slit::reconfigure() { // Need to count windows because not all client list entries // actually correspond to mapped windows. int num_windows = 0; - const int bevel_width = theme().bevelWidth(); + const int bevel_width = theme()->bevelWidth(); // determine width or height increase bool height_inc = false; switch (direction()) { @@ -686,8 +686,8 @@ void Slit::reconfigure() { Display *disp = FbTk::App::instance()->display(); - frame.window.setBorderWidth(theme().borderWidth()); - frame.window.setBorderColor(theme().borderColor()); + frame.window.setBorderWidth(theme()->borderWidth()); + frame.window.setBorderColor(theme()->borderColor()); Pixmap tmp = frame.pixmap; FbTk::ImageControl &image_ctrl = screen().imageControl(); @@ -817,8 +817,8 @@ void Slit::reposition() { head_h = screen().height(); } - int border_width = theme().borderWidth(); - int bevel_width = theme().bevelWidth(); + int border_width = theme()->borderWidth(); + int bevel_width = theme()->bevelWidth(); // make sure at leaste one pixel is visible if (border_width >= bevel_width) bevel_width = border_width + 1; diff --git a/src/Slit.hh b/src/Slit.hh index 984a4c6..64ae6b4 100644 --- a/src/Slit.hh +++ b/src/Slit.hh @@ -25,7 +25,7 @@ #ifndef SLIT_HH #define SLIT_HH - +#include "SlitTheme.hh" #include "LayerMenu.hh" #include "Layer.hh" @@ -40,7 +40,6 @@ #include <list> #include <memory> -class SlitTheme; class SlitClient; class BScreen; class FbMenu; @@ -102,8 +101,8 @@ public: BScreen &screen() { return m_screen; } const BScreen &screen() const { return m_screen; } - SlitTheme &theme() { return *m_slit_theme.get(); } - const SlitTheme &theme() const { return *m_slit_theme.get(); } + FbTk::ThemeProxy<SlitTheme> &theme() { return *m_slit_theme.get(); } + const FbTk::ThemeProxy<SlitTheme> &theme() const { return *m_slit_theme.get(); } int layerNumber() const { return m_layeritem->getLayerNum(); } diff --git a/src/SlitTheme.hh b/src/SlitTheme.hh index 20be862..d6b410b 100644 --- a/src/SlitTheme.hh +++ b/src/SlitTheme.hh @@ -41,8 +41,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual SlitTheme *operator ->() { return this; } - virtual const SlitTheme *operator ->() const { return this; } + virtual SlitTheme &operator *() { return *this; } + virtual const SlitTheme &operator *() const { return *this; } private: FbTk::ThemeItem<FbTk::Texture> m_texture; diff --git a/src/SystemTray.cc b/src/SystemTray.cc index 85f0fba..5ba89c3 100644 --- a/src/SystemTray.cc +++ b/src/SystemTray.cc @@ -153,7 +153,8 @@ private: SystemTray &m_tray; }; -SystemTray::SystemTray(const FbTk::FbWindow& parent, ButtonTheme& theme, BScreen& screen): +SystemTray::SystemTray(const FbTk::FbWindow& parent, + FbTk::ThemeProxy<ButtonTheme> &theme, BScreen& screen): ToolbarItem(ToolbarItem::FIXED), m_window(parent, 0, 0, 1, 1, ExposureMask | ButtonPressMask | ButtonReleaseMask | SubstructureNotifyMask | SubstructureRedirectMask), @@ -164,7 +165,7 @@ SystemTray::SystemTray(const FbTk::FbWindow& parent, ButtonTheme& theme, BScreen FbTk::EventManager::instance()->add(*this, m_window); FbTk::EventManager::instance()->add(*this, m_selection_owner); - m_theme.reconfigSig().attach(this); + m_theme->reconfigSig().attach(this); screen.bgChangeSig().attach(this); Fluxbox* fluxbox = Fluxbox::instance(); @@ -282,14 +283,14 @@ unsigned int SystemTray::width() const { if (orientation() == FbTk::ROT90 || orientation() == FbTk::ROT270) return m_window.width(); - return m_num_visible_clients * (height() - 2 * m_theme.border().width()); + return m_num_visible_clients * (height() - 2 * m_theme->border().width()); } unsigned int SystemTray::height() const { if (orientation() == FbTk::ROT0 || orientation() == FbTk::ROT180) return m_window.height(); - return m_num_visible_clients * (width() - 2 * m_theme.border().width()); + return m_num_visible_clients * (width() - 2 * m_theme->border().width()); } unsigned int SystemTray::borderWidth() const { @@ -463,7 +464,7 @@ void SystemTray::handleEvent(XEvent &event) { void SystemTray::rearrangeClients() { unsigned int w_rot0 = width(), h_rot0 = height(); - const unsigned int bw = m_theme.border().width(); + const unsigned int bw = m_theme->border().width(); FbTk::translateSize(orientation(), w_rot0, h_rot0); unsigned int trayw = m_num_visible_clients*h_rot0 + bw, trayh = h_rot0; FbTk::translateSize(orientation(), trayw, trayh); @@ -529,14 +530,14 @@ void SystemTray::showClient(TrayWindow *traywin) { void SystemTray::update(FbTk::Subject* subject) { - if (!m_theme.texture().usePixmap()) { - m_window.setBackgroundColor(m_theme.texture().color()); + if (!m_theme->texture().usePixmap()) { + m_window.setBackgroundColor(m_theme->texture().color()); } else { if(m_pixmap) m_screen.imageControl().removeImage(m_pixmap); m_pixmap = m_screen.imageControl().renderImage(width(), height(), - m_theme.texture(), orientation()); + m_theme->texture(), orientation()); m_window.setBackgroundPixmap(m_pixmap); } diff --git a/src/SystemTray.hh b/src/SystemTray.hh index e06f7f9..2e3a4ea 100644 --- a/src/SystemTray.hh +++ b/src/SystemTray.hh @@ -36,10 +36,15 @@ class ButtonTheme; class TrayWindow; class AtomHandler; +namespace FbTk { +template <class T> class ThemeProxy; +} + class SystemTray: public ToolbarItem, public FbTk::EventHandler, public FbTk::Observer { public: - explicit SystemTray(const FbTk::FbWindow &parent, ButtonTheme &theme, BScreen& screen); + explicit SystemTray(const FbTk::FbWindow &parent, + FbTk::ThemeProxy<ButtonTheme> &theme, BScreen& screen); virtual ~SystemTray(); void move(int x, int y); @@ -85,7 +90,7 @@ private: void showClient(TrayWindow *traywin); FbTk::FbWindow m_window; - ButtonTheme& m_theme; + FbTk::ThemeProxy<ButtonTheme> &m_theme; BScreen& m_screen; Pixmap m_pixmap; diff --git a/src/ToggleMenu.hh b/src/ToggleMenu.hh index c47462d..e7c0ad0 100644 --- a/src/ToggleMenu.hh +++ b/src/ToggleMenu.hh @@ -30,9 +30,10 @@ */ class ToggleMenu: public FbMenu { public: - ToggleMenu(class FbTk::MenuTheme &tm, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer):FbMenu(tm, imgctrl, layer) - {} + ToggleMenu(class FbTk::ThemeProxy<FbTk::MenuTheme> &tm, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): + FbMenu(tm, imgctrl, layer) { } + virtual ~ToggleMenu() {} void buttonReleaseEvent(XButtonEvent &ev) { diff --git a/src/ToolFactory.cc b/src/ToolFactory.cc index 38c9ce2..cee0d93 100644 --- a/src/ToolFactory.cc +++ b/src/ToolFactory.cc @@ -84,8 +84,8 @@ ToolbarItem *ToolFactory::create(const std::string &name, const FbTk::FbWindow & ToolbarItem * item = 0; unsigned int button_size = 24; - if (tbar.theme().buttonSize() > 0) - button_size = tbar.theme().buttonSize(); + if (tbar.theme()->buttonSize() > 0) + button_size = tbar.theme()->buttonSize(); if (name == "workspacename") { WorkspaceNameTool *witem = new WorkspaceNameTool(parent, diff --git a/src/ToolTheme.hh b/src/ToolTheme.hh index 552e8f8..9c34114 100644 --- a/src/ToolTheme.hh +++ b/src/ToolTheme.hh @@ -47,8 +47,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual ToolTheme *operator ->() { return this; } - virtual const ToolTheme *operator ->() const { return this; } + virtual ToolTheme &operator *() { return *this; } + virtual const ToolTheme &operator *() const { return *this; } protected: FbTk::ThemeItem<FbTk::Texture> &textureTheme() { return m_texture; } diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 7ade11a..24bc66d 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -328,22 +328,22 @@ void Toolbar::updateStrut() { case TOPLEFT: case TOPCENTER: case TOPRIGHT: - top = height() + 2 * theme().border().width(); + top = height() + 2 * theme()->border().width(); break; case BOTTOMLEFT: case BOTTOMCENTER: case BOTTOMRIGHT: - bottom = height() + 2 * theme().border().width(); + bottom = height() + 2 * theme()->border().width(); break; case RIGHTTOP: case RIGHTCENTER: case RIGHTBOTTOM: - right = width() + 2 * theme().border().width(); + right = width() + 2 * theme()->border().width(); break; case LEFTTOP: case LEFTCENTER: case LEFTBOTTOM: - left = width() + 2 * theme().border().width(); + left = width() + 2 * theme()->border().width(); break; }; m_strut = screen().requestStrut(getOnHead(), left, right, top, bottom); @@ -442,12 +442,12 @@ void Toolbar::reconfigure() { if (doAutoHide()) m_hide_timer.start(); - frame.bevel_w = theme().bevelWidth(); + frame.bevel_w = theme()->bevelWidth(); // destroy shape if the theme wasn't specified with one, // or create one - if (theme().shape() == false && m_shape.get()) + if (theme()->shape() == false && m_shape.get()) m_shape.reset(0); - else if (theme().shape() && m_shape.get() == 0) { + else if (theme()->shape() && m_shape.get() == 0) { m_shape.reset(new FbTk::Shape(frame.window, 0)); } @@ -464,9 +464,9 @@ void Toolbar::reconfigure() { // render frame window Pixmap tmp = m_window_pm; - if (!theme().toolbar().usePixmap()) { + if (!theme()->toolbar().usePixmap()) { m_window_pm = 0; - frame.window.setBackgroundColor(theme().toolbar().color()); + frame.window.setBackgroundColor(theme()->toolbar().color()); } else { FbTk::Orientation orient = FbTk::ROT0; Toolbar::Placement where = *m_rc_placement; @@ -477,14 +477,14 @@ void Toolbar::reconfigure() { m_window_pm = screen().imageControl().renderImage( frame.window.width(), frame.window.height(), - theme().toolbar(), orient); + theme()->toolbar(), orient); frame.window.setBackgroundPixmap(m_window_pm); } if (tmp) screen().imageControl().removeImage(tmp); - frame.window.setBorderColor(theme().border().color()); - frame.window.setBorderWidth(theme().border().width()); + frame.window.setBorderColor(theme()->border().color()); + frame.window.setBorderWidth(theme()->border().width()); bool have_composite = FbTk::Transparent::haveComposite(); // have_composite could have changed, so we need to change both @@ -497,7 +497,7 @@ void Toolbar::reconfigure() { } frame.window.clear(); - if (theme().shape() && m_shape.get()) + if (theme()->shape() && m_shape.get()) m_shape->update(); ItemList::iterator item_it = m_item_list.begin(); @@ -637,16 +637,16 @@ void Toolbar::setPlacement(Toolbar::Placement where) { head_h = screen().getHeadHeight(head); } - int bevel_width = theme().bevelWidth(); - int border_width = theme().border().width(); + int bevel_width = theme()->bevelWidth(); + int border_width = theme()->border().width(); frame.width = (head_w - 2*border_width) * (*m_rc_width_percent) / 100; //!! TODO: change this // max height of each toolbar items font... unsigned int max_height = m_tool_factory.maxFontHeight() + 2; - if (theme().height() > 0) - max_height = theme().height(); + if (theme()->height() > 0) + max_height = theme()->height(); if (*m_rc_height > 0 && *m_rc_height < 100) max_height = *m_rc_height; @@ -971,7 +971,7 @@ void Toolbar::rearrangeItems() { // calculate size for fixed items ItemList::iterator item_it = m_item_list.begin(); ItemList::iterator item_it_end = m_item_list.end(); - int bevel_width = theme().bevelWidth(); + int bevel_width = theme()->bevelWidth(); int fixed_width = bevel_width; // combined size of all fixed items int relative_items = 0; int last_bw = 0; // we show the largest border of adjoining items diff --git a/src/Toolbar.hh b/src/Toolbar.hh index ae143f0..c528102 100644 --- a/src/Toolbar.hh +++ b/src/Toolbar.hh @@ -121,8 +121,8 @@ public: int y() const { return isHidden() ? frame.y_hidden : frame.y; } Placement placement() const { return *m_rc_placement; } /// @return pointer to iconbar if it got one, else 0 - const ToolbarTheme &theme() const { return m_theme; } - ToolbarTheme &theme() { return m_theme; } + const FbTk::ThemeProxy<ToolbarTheme> &theme() const { return m_theme; } + FbTk::ThemeProxy<ToolbarTheme> &theme() { return m_theme; } bool isVertical() const; int getOnHead() const { return *m_rc_on_head; } diff --git a/src/ToolbarTheme.hh b/src/ToolbarTheme.hh index 1a183e2..077198f 100644 --- a/src/ToolbarTheme.hh +++ b/src/ToolbarTheme.hh @@ -47,8 +47,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual ToolbarTheme *operator ->() { return this; } - virtual const ToolbarTheme *operator ->() const { return this; } + virtual ToolbarTheme &operator *() { return *this; } + virtual const ToolbarTheme &operator *() const { return *this; } private: FbTk::ThemeItem<FbTk::Texture> m_toolbar; diff --git a/src/WinButton.cc b/src/WinButton.cc index 39540db..5c6c99c 100644 --- a/src/WinButton.cc +++ b/src/WinButton.cc @@ -33,7 +33,7 @@ WinButton::WinButton(const FluxboxWindow &listen_to, - WinButtonTheme &theme, + FbTk::ThemeProxy<WinButtonTheme> &theme, Type buttontype, const FbTk::FbWindow &parent, int x, int y, unsigned int width, unsigned int height): @@ -112,59 +112,59 @@ Pixmap WinButton::getBackgroundPixmap() const { switch(m_type) { case MAXIMIZE: if (focused) - return m_theme.maximizePixmap().pixmap().drawable(); + return m_theme->maximizePixmap().pixmap().drawable(); else - return m_theme.maximizeUnfocusPixmap().pixmap().drawable(); + return m_theme->maximizeUnfocusPixmap().pixmap().drawable(); break; case MINIMIZE: if (focused) - return m_theme.iconifyPixmap().pixmap().drawable(); + return m_theme->iconifyPixmap().pixmap().drawable(); else - return m_theme.iconifyUnfocusPixmap().pixmap().drawable(); + return m_theme->iconifyUnfocusPixmap().pixmap().drawable(); break; case STICK: if (m_listen_to.isStuck()) { if (focused) - return m_theme.stuckPixmap().pixmap().drawable(); + return m_theme->stuckPixmap().pixmap().drawable(); else - return m_theme.stuckUnfocusPixmap().pixmap().drawable(); + return m_theme->stuckUnfocusPixmap().pixmap().drawable(); } else { if (focused) - return m_theme.stickPixmap().pixmap().drawable(); + return m_theme->stickPixmap().pixmap().drawable(); else - return m_theme.stickUnfocusPixmap().pixmap().drawable(); + return m_theme->stickUnfocusPixmap().pixmap().drawable(); } break; case CLOSE: if (focused) - return m_theme.closePixmap().pixmap().drawable(); + return m_theme->closePixmap().pixmap().drawable(); else - return m_theme.closeUnfocusPixmap().pixmap().drawable(); + return m_theme->closeUnfocusPixmap().pixmap().drawable(); break; case SHADE: if (m_listen_to.isShaded()) { if (focused) - return m_theme.unshadePixmap().pixmap().drawable(); + return m_theme->unshadePixmap().pixmap().drawable(); else - return m_theme.unshadeUnfocusPixmap().pixmap().drawable(); + return m_theme->unshadeUnfocusPixmap().pixmap().drawable(); } else { if (focused) - return m_theme.shadePixmap().pixmap().drawable(); + return m_theme->shadePixmap().pixmap().drawable(); else - return m_theme.shadeUnfocusPixmap().pixmap().drawable(); + return m_theme->shadeUnfocusPixmap().pixmap().drawable(); } break; case MENUICON: if (m_icon_pixmap.drawable()) { if (focused) - return m_theme.titleFocusPixmap().pixmap().drawable(); + return m_theme->titleFocusPixmap().pixmap().drawable(); else - return m_theme.titleUnfocusPixmap().pixmap().drawable(); + return m_theme->titleUnfocusPixmap().pixmap().drawable(); } else { if (focused) - return m_theme.menuiconPixmap().pixmap().drawable(); + return m_theme->menuiconPixmap().pixmap().drawable(); else - return m_theme.menuiconUnfocusPixmap().pixmap().drawable(); + return m_theme->menuiconUnfocusPixmap().pixmap().drawable(); } break; } @@ -174,26 +174,26 @@ Pixmap WinButton::getBackgroundPixmap() const { Pixmap WinButton::getPressedPixmap() const { switch(m_type) { case MAXIMIZE: - return m_theme.maximizePressedPixmap().pixmap().drawable(); + return m_theme->maximizePressedPixmap().pixmap().drawable(); case MINIMIZE: - return m_theme.iconifyPressedPixmap().pixmap().drawable(); + return m_theme->iconifyPressedPixmap().pixmap().drawable(); case STICK: - return m_theme.stickPressedPixmap().pixmap().drawable(); + return m_theme->stickPressedPixmap().pixmap().drawable(); case CLOSE: - return m_theme.closePressedPixmap().pixmap().drawable(); + return m_theme->closePressedPixmap().pixmap().drawable(); case SHADE: if (m_listen_to.isShaded()) - return m_theme.unshadePressedPixmap().pixmap().drawable(); + return m_theme->unshadePressedPixmap().pixmap().drawable(); else - return m_theme.shadePressedPixmap().pixmap().drawable(); + return m_theme->shadePressedPixmap().pixmap().drawable(); case MENUICON: if (m_icon_pixmap.drawable()) if (m_listen_to.isFocused()) - return m_theme.titleFocusPixmap().pixmap().drawable(); + return m_theme->titleFocusPixmap().pixmap().drawable(); else - return m_theme.titleUnfocusPixmap().pixmap().drawable(); + return m_theme->titleUnfocusPixmap().pixmap().drawable(); else - return m_theme.menuiconPressedPixmap().pixmap().drawable(); + return m_theme->menuiconPressedPixmap().pixmap().drawable(); } return None; } diff --git a/src/WinButton.hh b/src/WinButton.hh index d6f84e6..c493491 100644 --- a/src/WinButton.hh +++ b/src/WinButton.hh @@ -31,6 +31,7 @@ class WinButtonTheme; namespace FbTk{ class Color; +template <class T> class ThemeProxy; } /// draws and handles basic window button graphic @@ -39,7 +40,7 @@ public: /// draw type for the button enum Type {MAXIMIZE, MINIMIZE, SHADE, STICK, CLOSE, MENUICON}; WinButton(const FluxboxWindow &listen_to, - WinButtonTheme &theme, + FbTk::ThemeProxy<WinButtonTheme> &theme, Type buttontype, const FbTk::FbWindow &parent, int x, int y, unsigned int width, unsigned int height); /// override for drawing @@ -59,7 +60,7 @@ private: void drawType(); Type m_type; ///< the button type const FluxboxWindow &m_listen_to; - WinButtonTheme &m_theme; + FbTk::ThemeProxy<WinButtonTheme> &m_theme; FbTk::FbPixmap m_icon_pixmap; FbTk::FbPixmap m_icon_mask; diff --git a/src/WinButtonTheme.cc b/src/WinButtonTheme.cc index b724817..d58af35 100644 --- a/src/WinButtonTheme.cc +++ b/src/WinButtonTheme.cc @@ -27,7 +27,8 @@ #include "FbWinFrameTheme.hh" -WinButtonTheme::WinButtonTheme(int screen_num, FbWinFrameTheme &frame_theme): +WinButtonTheme::WinButtonTheme(int screen_num, + FbTk::ThemeProxy<FbWinFrameTheme> &frame_theme): FbTk::Theme(screen_num), m_close_pm(*this, "window.close.pixmap", "Window.Close.Pixmap"), m_close_unfocus_pm(*this, "window.close.unfocus.pixmap", "Window.Close.Unfocus.Pixmap"), @@ -66,11 +67,11 @@ WinButtonTheme::~WinButtonTheme() { void WinButtonTheme::reconfigTheme() { // rescale the pixmaps to match frame theme height - unsigned int size = m_frame_theme.titleHeight() - - 2 * m_frame_theme.bevelWidth(); - if (m_frame_theme.titleHeight() == 0) { + unsigned int size = m_frame_theme->titleHeight() + - 2 * m_frame_theme->bevelWidth(); + if (m_frame_theme->titleHeight() == 0) { // calculate height from font and border width to scale pixmaps - size = m_frame_theme.font().height() + 2; + size = m_frame_theme->font().height() + 2; } // else use specified height to scale pixmaps diff --git a/src/WinButtonTheme.hh b/src/WinButtonTheme.hh index 7d00e1e..5d3e3fe 100644 --- a/src/WinButtonTheme.hh +++ b/src/WinButtonTheme.hh @@ -30,7 +30,8 @@ class FbWinFrameTheme; class WinButtonTheme: public FbTk::Theme, public FbTk::ThemeProxy<WinButtonTheme> { public: - WinButtonTheme(int screen_num, FbWinFrameTheme &frame_theme); + WinButtonTheme(int screen_num, + FbTk::ThemeProxy<FbWinFrameTheme> &frame_theme); ~WinButtonTheme(); void reconfigTheme(); @@ -88,8 +89,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual WinButtonTheme *operator ->() { return this; } - virtual const WinButtonTheme *operator ->() const { return this; } + virtual WinButtonTheme &operator *() { return *this; } + virtual const WinButtonTheme &operator *() const { return *this; } private: @@ -104,7 +105,7 @@ private: FbTk::ThemeItem<FbTk::PixmapWithMask> m_stick_pm, m_stick_unfocus_pm, m_stick_pressed_pm; FbTk::ThemeItem<FbTk::PixmapWithMask> m_stuck_pm, m_stuck_unfocus_pm; - FbWinFrameTheme &m_frame_theme; + FbTk::ThemeProxy<FbWinFrameTheme> &m_frame_theme; }; #endif // WINBUTTONTHEME_HH diff --git a/src/Window.cc b/src/Window.cc index 7f14ee8..a2a256e 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -261,8 +261,8 @@ private: int FluxboxWindow::s_num_grabs = 0; -FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, - FbTk::XLayer &layer): +FluxboxWindow::FluxboxWindow(WinClient &client, + FbTk::ThemeProxy<FbWinFrameTheme> &tm, FbTk::XLayer &layer): Focusable(client.screen(), this), oplock(false), m_hintsig(*this), @@ -401,8 +401,8 @@ void FluxboxWindow::init() { Fluxbox &fluxbox = *Fluxbox::instance(); // setup cursors for resize grips - frame().gripLeft().setCursor(frame().theme().lowerLeftAngleCursor()); - frame().gripRight().setCursor(frame().theme().lowerRightAngleCursor()); + frame().gripLeft().setCursor(frame().theme()->lowerLeftAngleCursor()); + frame().gripRight().setCursor(frame().theme()->lowerRightAngleCursor()); associateClient(*m_client); @@ -2777,12 +2777,12 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { doSnapping(dx, dy); if (! screen().doOpaqueMove()) { - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), dx, dy, frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); @@ -2874,13 +2874,13 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { old_resize_h != m_last_resize_h ) { // draw over old rect - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), old_resize_x, old_resize_y, old_resize_w - 1 + 2 * frame().window().borderWidth(), old_resize_h - 1 + 2 * frame().window().borderWidth()); // draw resize rectangle - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_resize_x, m_last_resize_y, m_last_resize_w - 1 + 2 * frame().window().borderWidth(), m_last_resize_h - 1 + 2 * frame().window().borderWidth()); @@ -2897,10 +2897,10 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { // so we update drag'n'drop-rectangle int dx = me.x_root - m_button_grab_x, dy = me.y_root - m_button_grab_y; - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, m_last_resize_w, m_last_resize_h); - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), dx, dy, m_last_resize_w, m_last_resize_h); @@ -3010,7 +3010,7 @@ void FluxboxWindow::update(FbTk::Subject *subj) { if (FocusControl::focusedFbWindow()) setFullscreenLayer(); } - } else if (subj == &frame().theme().reconfigSig()) { + } else if (subj == &frame().theme()->reconfigSig()) { reconfigTheme(); frame().reconfigure(); } @@ -3022,7 +3022,7 @@ void FluxboxWindow::applyDecorations(bool initial) { unsigned int border_width = 0; if (decorations.border) - border_width = frame().theme().border(m_focused).width(); + border_width = frame().theme()->border(m_focused).width(); bool client_move = false; @@ -3165,7 +3165,7 @@ void FluxboxWindow::startMoving(int x, int y) { // freely map and unmap the window we're moving. grabPointer(screen().rootWindow().window(), False, ButtonMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - screen().rootWindow().window(), frame().theme().moveCursor(), CurrentTime); + screen().rootWindow().window(), frame().theme()->moveCursor(), CurrentTime); if (menu().isVisible()) menu().hide(); @@ -3176,7 +3176,7 @@ void FluxboxWindow::startMoving(int x, int y) { m_last_move_y = frame().y(); if (! screen().doOpaqueMove()) { fluxbox->grab(); - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), frame().x(), frame().y(), frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); @@ -3200,7 +3200,7 @@ void FluxboxWindow::stopMoving(bool interrupted) { if (! screen().doOpaqueMove()) { - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); @@ -3230,7 +3230,7 @@ void FluxboxWindow::pauseMoving() { return; } - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); @@ -3250,7 +3250,7 @@ void FluxboxWindow::resumeMoving() { FbTk::App::instance()->sync(false); - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, frame().width() + 2*frame().window().borderWidth()-1, frame().height() + 2*frame().window().borderWidth()-1); @@ -3463,14 +3463,14 @@ void FluxboxWindow::startResizing(int x, int y, ResizeDirection dir) { resizing = true; maximized = MAX_NONE; - const Cursor& cursor = (m_resize_corner == LEFTTOP) ? frame().theme().upperLeftAngleCursor() : - (m_resize_corner == RIGHTTOP) ? frame().theme().upperRightAngleCursor() : - (m_resize_corner == RIGHTBOTTOM) ? frame().theme().lowerRightAngleCursor() : - (m_resize_corner == LEFT) ? frame().theme().leftSideCursor() : - (m_resize_corner == RIGHT) ? frame().theme().rightSideCursor() : - (m_resize_corner == TOP) ? frame().theme().topSideCursor() : - (m_resize_corner == BOTTOM) ? frame().theme().bottomSideCursor() : - frame().theme().lowerLeftAngleCursor(); + const Cursor& cursor = (m_resize_corner == LEFTTOP) ? frame().theme()->upperLeftAngleCursor() : + (m_resize_corner == RIGHTTOP) ? frame().theme()->upperRightAngleCursor() : + (m_resize_corner == RIGHTBOTTOM) ? frame().theme()->lowerRightAngleCursor() : + (m_resize_corner == LEFT) ? frame().theme()->leftSideCursor() : + (m_resize_corner == RIGHT) ? frame().theme()->rightSideCursor() : + (m_resize_corner == TOP) ? frame().theme()->topSideCursor() : + (m_resize_corner == BOTTOM) ? frame().theme()->bottomSideCursor() : + frame().theme()->lowerLeftAngleCursor(); grabPointer(fbWindow().window(), false, ButtonMotionMask | ButtonReleaseMask, @@ -3488,7 +3488,7 @@ void FluxboxWindow::startResizing(int x, int y, ResizeDirection dir) { screen().showGeometry(gx, gy); - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_resize_x, m_last_resize_y, m_last_resize_w - 1 + 2 * frame().window().borderWidth(), m_last_resize_h - 1 + 2 * frame().window().borderWidth()); @@ -3497,7 +3497,7 @@ void FluxboxWindow::startResizing(int x, int y, ResizeDirection dir) { void FluxboxWindow::stopResizing(bool interrupted) { resizing = false; - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_resize_x, m_last_resize_y, m_last_resize_w - 1 + 2 * frame().window().borderWidth(), m_last_resize_h - 1 + 2 * frame().window().borderWidth()); @@ -3533,7 +3533,7 @@ void FluxboxWindow::startTabbing(const XButtonEvent &be) { // start drag'n'drop for tab grabPointer(be.window, False, ButtonMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - None, frame().theme().moveCursor(), CurrentTime); + None, frame().theme()->moveCursor(), CurrentTime); // relative position on the button m_button_grab_x = be.x; @@ -3558,7 +3558,7 @@ void FluxboxWindow::startTabbing(const XButtonEvent &be) { m_last_resize_h = frame().height() + bw; } - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, m_last_resize_w, m_last_resize_h); @@ -3569,7 +3569,7 @@ void FluxboxWindow::attachTo(int x, int y, bool interrupted) { if (m_attaching_tab == 0) return; - parent().drawRectangle(screen().rootTheme().opGC(), + parent().drawRectangle(screen().rootTheme()->opGC(), m_last_move_x, m_last_move_y, m_last_resize_w, m_last_resize_h); @@ -3978,7 +3978,7 @@ void FluxboxWindow::updateButtons() { CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); - WinButtonTheme &winbutton_theme = screen().winButtonTheme(); + FbTk::ThemeProxy<WinButtonTheme> &winbutton_theme = screen().winButtonTheme(); for (size_t c = 0; c < 2 ; c++) { // get titlebar configuration for current side @@ -4073,8 +4073,8 @@ void FluxboxWindow::updateButtons() { void FluxboxWindow::reconfigTheme() { m_frame.setBorderWidth(decorations.border ? - frame().theme().border(m_focused).width() : 0); - if (decorations.handle && frame().theme().handleWidth() != 0) + frame().theme()->border(m_focused).width() : 0); + if (decorations.handle && frame().theme()->handleWidth() != 0) frame().showHandle(); else frame().hideHandle(); diff --git a/src/Window.hh b/src/Window.hh index 8d0c6f1..a4c0fa2 100644 --- a/src/Window.hh +++ b/src/Window.hh @@ -151,8 +151,7 @@ public: /// create a window from a client FluxboxWindow(WinClient &client, - FbWinFrameTheme &tm, - FbTk::XLayer &layer); + FbTk::ThemeProxy<FbWinFrameTheme> &tm, FbTk::XLayer &layer); virtual ~FluxboxWindow(); diff --git a/src/WorkspaceNameTheme.hh b/src/WorkspaceNameTheme.hh index 860f6ec..e4f426f 100644 --- a/src/WorkspaceNameTheme.hh +++ b/src/WorkspaceNameTheme.hh @@ -49,8 +49,8 @@ public: virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } - virtual WorkspaceNameTheme *operator ->() { return this; } - virtual const WorkspaceNameTheme *operator ->() const { return this; } + virtual WorkspaceNameTheme &operator *() { return *this; } + virtual const WorkspaceNameTheme &operator *() const { return *this; } }; diff --git a/src/WorkspaceNameTool.cc b/src/WorkspaceNameTool.cc index b261423..79ac724 100644 --- a/src/WorkspaceNameTool.cc +++ b/src/WorkspaceNameTool.cc @@ -31,14 +31,14 @@ #include <algorithm> WorkspaceNameTool::WorkspaceNameTool(const FbTk::FbWindow &parent, - ToolTheme &theme, BScreen &screen): + FbTk::ThemeProxy<ToolTheme> &theme, BScreen &screen): ToolbarItem(ToolbarItem::FIXED), - m_button(parent, theme.font(), "a workspace name"), + m_button(parent, theme->font(), "a workspace name"), m_theme(theme), m_screen(screen), m_pixmap(0) { // set text - m_button.setGC(m_theme.textGC()); + m_button.setGC(m_theme->textGC()); m_button.setText(m_screen.currentWorkspace()->name()); // setup signals @@ -88,7 +88,7 @@ unsigned int WorkspaceNameTool::width() const { BScreen::Workspaces::const_iterator it; for (it = workspaces.begin(); it != workspaces.end(); it++) { const std::string &name = (*it)->name(); - max_size = std::max(m_theme.font().textWidth(name, name.size()), + max_size = std::max(m_theme->font().textWidth(name, name.size()), max_size); } // so align text dont cut the last character @@ -106,7 +106,7 @@ unsigned int WorkspaceNameTool::height() const { BScreen::Workspaces::const_iterator it; for (it = workspaces.begin(); it != workspaces.end(); it++) { const std::string &name = (*it)->name(); - max_size = std::max(m_theme.font().textWidth(name, name.size()), + max_size = std::max(m_theme->font().textWidth(name, name.size()), max_size); } // so align text dont cut the last character @@ -128,31 +128,31 @@ void WorkspaceNameTool::hide() { } void WorkspaceNameTool::updateSizing() { - m_button.setBorderWidth(m_theme.border().width()); + m_button.setBorderWidth(m_theme->border().width()); } void WorkspaceNameTool::reRender() { - if (m_theme.texture().usePixmap()) { + if (m_theme->texture().usePixmap()) { if (m_pixmap) m_screen.imageControl().removeImage(m_pixmap); m_pixmap = m_screen.imageControl().renderImage(width(), height(), - m_theme.texture(), orientation()); + m_theme->texture(), orientation()); m_button.setBackgroundPixmap(m_pixmap); } } void WorkspaceNameTool::renderTheme(unsigned char alpha) { - m_button.setJustify(m_theme.justify()); - m_button.setBorderWidth(m_theme.border().width()); - m_button.setBorderColor(m_theme.border().color()); + m_button.setJustify(m_theme->justify()); + m_button.setBorderWidth(m_theme->border().width()); + m_button.setBorderColor(m_theme->border().color()); m_button.setAlpha(alpha); - if (!m_theme.texture().usePixmap()) { + if (!m_theme->texture().usePixmap()) { if (m_pixmap) m_screen.imageControl().removeImage(m_pixmap); m_pixmap = 0; - m_button.setBackgroundColor(m_theme.texture().color()); + m_button.setBackgroundColor(m_theme->texture().color()); } else { reRender(); } diff --git a/src/WorkspaceNameTool.hh b/src/WorkspaceNameTool.hh index 4af9136..0bdb528 100644 --- a/src/WorkspaceNameTool.hh +++ b/src/WorkspaceNameTool.hh @@ -31,9 +31,13 @@ class BScreen; class ToolTheme; +namespace FbTk { +template <class T> class ThemeProxy; +} + class WorkspaceNameTool: public ToolbarItem, public FbTk::Observer { public: - WorkspaceNameTool(const FbTk::FbWindow &parent, ToolTheme &theme, BScreen &screen); + WorkspaceNameTool(const FbTk::FbWindow &parent, FbTk::ThemeProxy<ToolTheme> &theme, BScreen &screen); virtual ~WorkspaceNameTool(); void move(int x, int y); @@ -59,7 +63,7 @@ private: void reRender(); void updateSizing(); FbTk::TextButton m_button; - const ToolTheme &m_theme; + const FbTk::ThemeProxy<ToolTheme> &m_theme; BScreen &m_screen; Pixmap m_pixmap; }; diff --git a/src/Xinerama.hh b/src/Xinerama.hh index dfc0d86..4e7d06f 100644 --- a/src/Xinerama.hh +++ b/src/Xinerama.hh @@ -61,8 +61,9 @@ private: template <typename ItemType> class XineramaHeadMenu : public FbMenu { public: - XineramaHeadMenu(FbTk::MenuTheme &tm, BScreen &screen, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer, ItemType &item, const FbTk::FbString & title = ""); + XineramaHeadMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, + ItemType &item, const FbTk::FbString & title = ""); private: ItemType &m_object; @@ -70,8 +71,10 @@ private: template <typename ItemType> -XineramaHeadMenu<ItemType>::XineramaHeadMenu(FbTk::MenuTheme &tm, BScreen &screen, FbTk::ImageControl &imgctrl, - FbTk::XLayer &layer, ItemType &item, const FbTk::FbString & title): +XineramaHeadMenu<ItemType>::XineramaHeadMenu( + FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen, + FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, ItemType &item, + const FbTk::FbString & title): FbMenu(tm, imgctrl, layer), m_object(item) { -- cgit v0.11.2