From d11aa42ace928efc3dd1eebc8988b6bbbc005b2b Mon Sep 17 00:00:00 2001 From: Mathias Gumz <akira at fluxbox dot org> Date: Tue, 22 Feb 2011 22:07:39 +0100 Subject: bugfix: consistent use of 'int' for alpha values (#3187373) WindowMenuAccessor returned strange alpha values if compiled with 'g++ -Os'; unholy black magic happens if template<int> faces functions returning only 'usigned char'. --- src/ButtonTool.cc | 2 +- src/ButtonTool.hh | 2 +- src/ClockTool.cc | 2 +- src/ClockTool.hh | 2 +- src/FbTk/Container.cc | 2 +- src/FbTk/Container.hh | 2 +- src/FbTk/FbWindow.cc | 8 ++++---- src/FbTk/FbWindow.hh | 6 +++--- src/FbTk/MenuTheme.hh | 4 ++-- src/FbTk/Transparent.cc | 10 +++++----- src/FbTk/Transparent.hh | 8 ++++---- src/FbWinFrame.cc | 22 ++++++++++++---------- src/FbWinFrame.hh | 10 +++++----- src/FbWinFrameTheme.hh | 6 +++--- src/FocusControl.cc | 2 +- src/GenericTool.cc | 2 +- src/GenericTool.hh | 2 +- src/IconbarTool.cc | 2 +- src/IconbarTool.hh | 4 ++-- src/SystemTray.hh | 2 +- src/ToolTheme.hh | 6 +++--- src/ToolbarItem.hh | 2 +- src/Window.hh | 10 +++++----- src/WindowMenuAccessor.hh | 4 +++- src/WorkspaceNameTool.cc | 2 +- src/WorkspaceNameTool.hh | 2 +- 26 files changed, 65 insertions(+), 61 deletions(-) diff --git a/src/ButtonTool.cc b/src/ButtonTool.cc index 0e11733..ad54534 100644 --- a/src/ButtonTool.cc +++ b/src/ButtonTool.cc @@ -49,7 +49,7 @@ void ButtonTool::updateSizing() { btn.setBorderWidth(theme()->border().width()); } -void ButtonTool::renderTheme(unsigned char alpha) { +void ButtonTool::renderTheme(int alpha) { FbTk::Button &btn = static_cast<FbTk::Button &>(window()); btn.setGC(static_cast<const ButtonTheme &>(*theme()).gc()); diff --git a/src/ButtonTool.hh b/src/ButtonTool.hh index 484fea6..ec74618 100644 --- a/src/ButtonTool.hh +++ b/src/ButtonTool.hh @@ -41,7 +41,7 @@ public: virtual ~ButtonTool(); protected: - void renderTheme(unsigned char alpha); + void renderTheme(int alpha); void updateSizing(); Pixmap m_cache_pm, m_cache_pressed_pm; FbTk::ImageControl &m_image_ctrl; diff --git a/src/ClockTool.cc b/src/ClockTool.cc index f6a9797..257058f 100644 --- a/src/ClockTool.cc +++ b/src/ClockTool.cc @@ -334,7 +334,7 @@ void ClockTool::reRender() { } -void ClockTool::renderTheme(unsigned char alpha) { +void ClockTool::renderTheme(int alpha) { m_button.setAlpha(alpha); m_button.setJustify(m_theme->justify()); diff --git a/src/ClockTool.hh b/src/ClockTool.hh index cbc676f..d2b9dca 100644 --- a/src/ClockTool.hh +++ b/src/ClockTool.hh @@ -69,7 +69,7 @@ public: private: void updateTime(); void update(FbTk::Subject *subj); - void renderTheme(unsigned char alpha); + void renderTheme(int alpha); void reRender(); void updateSizing(); diff --git a/src/FbTk/Container.cc b/src/FbTk/Container.cc index e1d2e07..b944c98 100644 --- a/src/FbTk/Container.cc +++ b/src/FbTk/Container.cc @@ -440,7 +440,7 @@ void Container::for_each(std::mem_fun_t<void, FbWindow> function) { std::for_each(begin(), end(), function); } -void Container::setAlpha(unsigned char alpha) { +void Container::setAlpha(int alpha) { FbWindow::setAlpha(alpha); STLUtil::forAll(m_item_list, std::bind2nd(std::mem_fun(&Button::setAlpha), alpha)); } diff --git a/src/FbTk/Container.hh b/src/FbTk/Container.hh index bd5e3aa..f3d9bac 100644 --- a/src/FbTk/Container.hh +++ b/src/FbTk/Container.hh @@ -91,7 +91,7 @@ public: bool updateLock() const { return m_update_lock; } void for_each(std::mem_fun_t<void, FbWindow> function); - void setAlpha(unsigned char alpha); // set alpha on all windows + void setAlpha(int alpha); // set alpha on all windows ItemList::iterator begin() { return m_item_list.begin(); } ItemList::iterator end() { return m_item_list.end(); } diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc index 5b52a03..00dde66 100644 --- a/src/FbTk/FbWindow.cc +++ b/src/FbTk/FbWindow.cc @@ -171,7 +171,7 @@ void FbWindow::invalidateBackground() { void FbWindow::updateBackground(bool only_if_alpha) { Pixmap newbg = m_lastbg_pm; - unsigned char alpha = 255; + int alpha = 255; bool free_newbg = false; if (m_lastbg_pm == None && !m_lastbg_color_set) @@ -344,7 +344,7 @@ void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, u #endif // HAVE_XRENDER } -void FbWindow::setAlpha(unsigned char alpha) { +void FbWindow::setAlpha(int alpha) { #ifdef HAVE_XRENDER if (FbTk::Transparent::haveComposite()) { if (m_transparent.get() != 0) { @@ -371,7 +371,7 @@ void FbWindow::setAlpha(unsigned char alpha) { #endif // HAVE_XRENDER } -unsigned char FbWindow::alpha() const { +int FbWindow::alpha() const { #ifdef HAVE_XRENDER if (m_transparent.get()) return m_transparent->alpha(); @@ -588,7 +588,7 @@ long FbWindow::eventMask() const { } -void FbWindow::setOpaque(unsigned char alpha) { +void FbWindow::setOpaque(int alpha) { #ifdef HAVE_XRENDER static Atom m_alphaatom = XInternAtom(display(), "_NET_WM_WINDOW_OPACITY", False); unsigned long opacity = alpha * 0x1010101; diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh index edeffe1..9e92923 100644 --- a/src/FbTk/FbWindow.hh +++ b/src/FbTk/FbWindow.hh @@ -88,7 +88,7 @@ public: unsigned int height = 0, Pixmap dest_override = None, bool override_is_offset = false); - void setAlpha(unsigned char alpha); + void setAlpha(int alpha); virtual FbWindow &operator = (const FbWindow &win); /// assign a new X window to this @@ -176,7 +176,7 @@ public: unsigned int borderWidth() const { return m_border_width; } unsigned long borderColor() const { return m_border_color; } unsigned int depth() const { return m_depth; } - unsigned char alpha() const; + int alpha() const; int screenNumber() const; long eventMask() const; @@ -188,7 +188,7 @@ public: bool operator != (const FbWindow &win) const { return m_window != win.m_window; } // used for composite - void setOpaque(unsigned char alpha); + void setOpaque(int alpha); void setRenderer(FbWindowRenderer &renderer) { m_renderer = &renderer; } void sendConfigureNotify(int x, int y, unsigned int width, diff --git a/src/FbTk/MenuTheme.hh b/src/FbTk/MenuTheme.hh index c10615b..eb19798 100644 --- a/src/FbTk/MenuTheme.hh +++ b/src/FbTk/MenuTheme.hh @@ -107,7 +107,7 @@ public: unsigned int bevelWidth() const { return *m_bevel_width; } unsigned char alpha() const { return m_alpha; } - void setAlpha(unsigned char alpha) { m_alpha = alpha; } + void setAlpha(int alpha) { m_alpha = alpha; } // this isn't actually a theme item // but we'll let it be here for now, until there's a better way to // get resources into menu @@ -154,7 +154,7 @@ private: Display *m_display; GContext t_text_gc, f_text_gc, u_text_gc, h_text_gc, d_text_gc, hilite_gc; - unsigned char m_alpha; + int m_alpha; unsigned int m_delay; ///< in msec unsigned int m_real_title_height; ///< the calculated item height (from font and menu.titleHeight) unsigned int m_real_item_height; ///< the calculated item height (from font and menu.itemHeight) diff --git a/src/FbTk/Transparent.cc b/src/FbTk/Transparent.cc index bf8a110..04fee67 100644 --- a/src/FbTk/Transparent.cc +++ b/src/FbTk/Transparent.cc @@ -43,7 +43,7 @@ using std::endl; namespace { #ifdef HAVE_XRENDER -Picture createAlphaPic(Window drawable, unsigned char alpha) { +Picture createAlphaPic(Window drawable, int alpha) { Display *disp = FbTk::App::instance()->display(); _FB_USES_NLS; @@ -149,7 +149,7 @@ bool Transparent::haveComposite(bool for_real) { return s_use_composite; } -Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int screen_num): +Transparent::Transparent(Drawable src, Drawable dest, int alpha, int screen_num): m_alpha_pic(0), m_src_pic(0), m_dest_pic(0), m_source(src), m_dest(dest), m_alpha(alpha) { @@ -196,7 +196,7 @@ Transparent::~Transparent() { #endif // HAVE_XRENDER } -void Transparent::setAlpha(unsigned char alpha) { +void Transparent::setAlpha(int alpha) { if (m_source == 0 || !s_render) return; @@ -254,7 +254,7 @@ void Transparent::setSource(Drawable source, int screen_num) { return; // save old alpha value so we can recreate new later // with the same value - unsigned char old_alpha = m_alpha; + int old_alpha = m_alpha; if (m_alpha_pic != 0) freeAlpha(); @@ -314,7 +314,7 @@ void Transparent::render(int src_x, int src_y, #endif // HAVE_XRENDER } -void Transparent::allocAlpha(unsigned char alpha) { +void Transparent::allocAlpha(int alpha) { #ifdef HAVE_XRENDER if (m_source == 0 || !s_render) return; diff --git a/src/FbTk/Transparent.hh b/src/FbTk/Transparent.hh index 154c223..8e9d9b9 100644 --- a/src/FbTk/Transparent.hh +++ b/src/FbTk/Transparent.hh @@ -29,10 +29,10 @@ namespace FbTk { /// renders to drawable together with an alpha mask class Transparent { public: - Transparent(Drawable source, Drawable dest, unsigned char alpha, int screen_num); + Transparent(Drawable source, Drawable dest, int alpha, int screen_num); ~Transparent(); /// sets alpha value - void setAlpha(unsigned char alpha); + void setAlpha(int alpha); /// sets source drawable void setSource(Drawable src, int screen_num); /// sets destination drawable @@ -45,7 +45,7 @@ public: int dest_x, int dest_y, unsigned int width, unsigned int height) const; - unsigned char alpha() const { return m_alpha; } + int alpha() const { return m_alpha; } Drawable dest() const { return m_dest; } Drawable source() const { return m_source; } @@ -55,7 +55,7 @@ public: private: void freeAlpha(); - void allocAlpha(unsigned char newval); + void allocAlpha(int newval); unsigned long m_alpha_pic; unsigned long m_src_pic; unsigned long m_dest_pic; diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 9c35925..d5b4b70 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc @@ -427,7 +427,7 @@ void FbWinFrame::alignTabs() { void FbWinFrame::notifyMoved(bool clear) { // not important if no alpha... - unsigned char alpha = getAlpha(m_state.focused); + int alpha = getAlpha(m_state.focused); if (alpha == 255) return; @@ -482,7 +482,7 @@ void FbWinFrame::setFocus(bool newvalue) { if (FbTk::Transparent::haveRender() && getAlpha(true) != getAlpha(false)) { // different alpha for focused and unfocused - unsigned char alpha = getAlpha(m_state.focused); + int alpha = getAlpha(m_state.focused); if (FbTk::Transparent::haveComposite()) { m_tab_container.setAlpha(255); m_window.setOpaque(alpha); @@ -536,7 +536,7 @@ void FbWinFrame::applyState() { frameExtentSig().notify(); } -void FbWinFrame::setAlpha(bool focused, unsigned char alpha) { +void FbWinFrame::setAlpha(bool focused, int alpha) { if (focused) m_focused_alpha = alpha; else @@ -547,7 +547,7 @@ void FbWinFrame::setAlpha(bool focused, unsigned char alpha) { } void FbWinFrame::applyAlpha() { - unsigned char alpha = getAlpha(m_state.focused); + int alpha = getAlpha(m_state.focused); if (FbTk::Transparent::haveComposite()) m_window.setOpaque(alpha); else { @@ -557,8 +557,11 @@ void FbWinFrame::applyAlpha() { } } -unsigned char FbWinFrame::getAlpha(bool focused) const { - return focused ? m_focused_alpha : m_unfocused_alpha; +int FbWinFrame::getAlpha(bool focused) const { + if (focused) + return m_focused_alpha; + else + return m_unfocused_alpha; } void FbWinFrame::setDefaultAlpha() { @@ -966,8 +969,7 @@ void FbWinFrame::reconfigure() { if (isVisible()) { // update transparency settings if (FbTk::Transparent::haveRender()) { - unsigned char alpha = - getAlpha(m_state.focused); + int alpha = getAlpha(m_state.focused); if (FbTk::Transparent::haveComposite()) { m_tab_container.setAlpha(255); m_window.setOpaque(alpha); @@ -1168,7 +1170,7 @@ void FbWinFrame::applyTitlebar() { getCurrentFocusPixmap(label_pm, title_pm, label_color, title_color); - unsigned char alpha = getAlpha (m_state.focused); + int alpha = getAlpha (m_state.focused); m_titlebar.setAlpha(alpha); m_label.setAlpha(alpha); @@ -1220,7 +1222,7 @@ void FbWinFrame::renderHandles() { void FbWinFrame::applyHandles() { - unsigned char alpha = getAlpha(m_state.focused); + int alpha = getAlpha(m_state.focused); m_handle.setAlpha(alpha); m_grip_left.setAlpha(alpha); m_grip_right.setAlpha(alpha); diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh index 7cdf9bb..162bf3d 100644 --- a/src/FbWinFrame.hh +++ b/src/FbWinFrame.hh @@ -121,9 +121,9 @@ public: void updateTabProperties() { alignTabs(); } /// Alpha settings - void setAlpha(bool focused, unsigned char value); + void setAlpha(bool focused, int value); void applyAlpha(); - unsigned char getAlpha(bool focused) const; + int getAlpha(bool focused) const; void setDefaultAlpha(); bool getUseDefaultAlpha() const; @@ -377,9 +377,9 @@ private: bool m_need_render; int m_button_size; ///< size for all titlebar buttons /// alpha values - typedef FbTk::ConstObjectAccessor<unsigned char, FbWinFrameTheme> AlphaAcc; - FbTk::DefaultValue<unsigned char, AlphaAcc> m_focused_alpha; - FbTk::DefaultValue<unsigned char, AlphaAcc> m_unfocused_alpha; + typedef FbTk::ConstObjectAccessor<int, FbWinFrameTheme> AlphaAcc; + FbTk::DefaultValue<int, AlphaAcc> m_focused_alpha; + FbTk::DefaultValue<int, AlphaAcc> m_unfocused_alpha; FbTk::Shape m_shape; }; diff --git a/src/FbWinFrameTheme.hh b/src/FbWinFrameTheme.hh index fd2a7e9..3c28cbd 100644 --- a/src/FbWinFrameTheme.hh +++ b/src/FbWinFrameTheme.hh @@ -74,8 +74,8 @@ public: unsigned int bevelWidth() const { return *m_bevel_width; } unsigned int handleWidth() const { return *m_handle_width; } - unsigned char alpha() const { return m_alpha; } - void setAlpha(unsigned char alpha) { m_alpha = alpha; } + int alpha() const { return m_alpha; } + void setAlpha(int alpha) { m_alpha = alpha; } IconbarTheme &iconbarTheme() { return m_iconbar_theme; } @@ -107,7 +107,7 @@ private: Cursor m_cursor_right_side; Cursor m_cursor_top_side; Cursor m_cursor_bottom_side; - unsigned char m_alpha; + int m_alpha; IconbarTheme m_iconbar_theme; }; diff --git a/src/FocusControl.cc b/src/FocusControl.cc index 341ad0d..9afa605 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc @@ -78,7 +78,7 @@ FocusControl::FocusControl(BScreen &screen): m_focused_list(screen), m_creation_order_list(screen), m_focused_win_list(screen), m_creation_order_win_list(screen), m_cycling_list(0), - m_was_iconic(false), + m_was_iconic(0), m_cycling_last(0), m_ignore_mouse_x(-1), m_ignore_mouse_y(-1) { diff --git a/src/GenericTool.cc b/src/GenericTool.cc index 67d737f..41388ce 100644 --- a/src/GenericTool.cc +++ b/src/GenericTool.cc @@ -75,7 +75,7 @@ unsigned int GenericTool::borderWidth() const { return m_window->borderWidth(); } -void GenericTool::renderTheme(unsigned char alpha) { +void GenericTool::renderTheme(int alpha) { m_window->setAlpha(alpha); m_window->clear(); } diff --git a/src/GenericTool.hh b/src/GenericTool.hh index b64edcf..5d7c8d4 100644 --- a/src/GenericTool.hh +++ b/src/GenericTool.hh @@ -60,7 +60,7 @@ public: const FbTk::FbWindow &window() const { return *m_window; } protected: - virtual void renderTheme(unsigned char alpha); + virtual void renderTheme(int alpha); private: void update(FbTk::Subject *subj); diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc index 503e04b..62eae0d 100644 --- a/src/IconbarTool.cc +++ b/src/IconbarTool.cc @@ -475,7 +475,7 @@ void IconbarTool::updateSizing() { } -void IconbarTool::renderTheme(unsigned char alpha) { +void IconbarTool::renderTheme(int alpha) { m_alpha = alpha; renderTheme(); diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh index efb4a1a..cb8304f 100644 --- a/src/IconbarTool.hh +++ b/src/IconbarTool.hh @@ -81,7 +81,7 @@ private: void renderButton(IconButton &button, bool clear = true); /// render all buttons void renderTheme(); - void renderTheme(unsigned char alpha); + void renderTheme(int alpha); /// destroy all icons void deleteIcons(); /// add or move a single window @@ -111,7 +111,7 @@ private: FbTk::Resource<unsigned int> m_rc_client_padding; ///< padding of the text FbTk::Resource<bool> m_rc_use_pixmap; ///< if iconbar should use win pixmap or not FbMenu m_menu; - unsigned char m_alpha; + int m_alpha; }; #endif // ICONBARTOOL_HH diff --git a/src/SystemTray.hh b/src/SystemTray.hh index 153220c..3209790 100644 --- a/src/SystemTray.hh +++ b/src/SystemTray.hh @@ -74,7 +74,7 @@ public: int numClients() const { return m_clients.size(); } const FbTk::FbWindow &window() const { return m_window; } - void renderTheme(unsigned char alpha) { + void renderTheme(int alpha) { m_window.setBorderWidth(m_theme->border().width()); m_window.setBorderColor(m_theme->border().color()); m_window.setAlpha(alpha); diff --git a/src/ToolTheme.hh b/src/ToolTheme.hh index 9c34114..693aac6 100644 --- a/src/ToolTheme.hh +++ b/src/ToolTheme.hh @@ -41,8 +41,8 @@ public: // textures const FbTk::Texture &texture() const { return *m_texture; } const FbTk::BorderTheme &border() const { return m_border; } - unsigned char alpha() const { return m_alpha; } - void setAlpha(unsigned char alpha) { m_alpha = alpha; } + int alpha() const { return m_alpha; } + void setAlpha(int alpha) { m_alpha = alpha; } virtual FbTk::Subject &reconfigSig() { return FbTk::Theme::reconfigSig(); } virtual const FbTk::Subject &reconfigSig() const { return FbTk::Theme::reconfigSig(); } @@ -56,7 +56,7 @@ protected: private: FbTk::ThemeItem<FbTk::Texture> m_texture; FbTk::BorderTheme m_border; - unsigned char m_alpha; + int m_alpha; }; #endif // TOOLTHEME_HH diff --git a/src/ToolbarItem.hh b/src/ToolbarItem.hh index 4a92c97..f5d1a2a 100644 --- a/src/ToolbarItem.hh +++ b/src/ToolbarItem.hh @@ -54,7 +54,7 @@ public: // Tools should NOT listen to theme changes - they'll get notified by // the toolbar instead. Otherwise there are ordering problems. - virtual void renderTheme(unsigned char alpha) = 0; + virtual void renderTheme(int alpha) = 0; // insist implemented, even if blank virtual void parentMoved() = 0; // called when moved from hiding diff --git a/src/Window.hh b/src/Window.hh index 8ce9563..fee2807 100644 --- a/src/Window.hh +++ b/src/Window.hh @@ -198,11 +198,11 @@ public: // ------------------ // Per window transparency addons - unsigned char getFocusedAlpha() const { return frame().getAlpha(true); } - unsigned char getUnfocusedAlpha() const { return frame().getAlpha(false); } - void setFocusedAlpha(unsigned char alpha) { frame().setAlpha(true, alpha); } - void setUnfocusedAlpha(unsigned char alpha) { frame().setAlpha(false, alpha); } - void updateAlpha(bool focused, unsigned char alpha) { frame().setAlpha(focused, alpha); } + int getFocusedAlpha() const { return frame().getAlpha(true); } + int getUnfocusedAlpha() const { return frame().getAlpha(false); } + void setFocusedAlpha(int alpha) { frame().setAlpha(true, alpha); } + void setUnfocusedAlpha(int alpha) { frame().setAlpha(false, alpha); } + void updateAlpha(bool focused, int alpha) { frame().setAlpha(focused, alpha); } bool getUseDefaultAlpha() const { return frame().getUseDefaultAlpha(); } void setDefaultAlpha() { frame().setDefaultAlpha(); } diff --git a/src/WindowMenuAccessor.hh b/src/WindowMenuAccessor.hh index 91994b9..383923b 100644 --- a/src/WindowMenuAccessor.hh +++ b/src/WindowMenuAccessor.hh @@ -37,7 +37,9 @@ public: operator Ret() const { FluxboxWindow *fbwin = FbMenu::window(); - return fbwin ? (fbwin->*m_getter)() : m_def; + if (fbwin) + return (Ret)(fbwin->*m_getter)(); + return m_def; } FbTk::Accessor<Ret> &operator =(const Ret &val) { FluxboxWindow *fbwin = FbMenu::window(); diff --git a/src/WorkspaceNameTool.cc b/src/WorkspaceNameTool.cc index fc944f9..3a4b275 100644 --- a/src/WorkspaceNameTool.cc +++ b/src/WorkspaceNameTool.cc @@ -147,7 +147,7 @@ void WorkspaceNameTool::reRender() { } } -void WorkspaceNameTool::renderTheme(unsigned char alpha) { +void WorkspaceNameTool::renderTheme(int alpha) { m_button.setJustify(m_theme->justify()); m_button.setBorderWidth(m_theme->border().width()); diff --git a/src/WorkspaceNameTool.hh b/src/WorkspaceNameTool.hh index bd034b7..de95663 100644 --- a/src/WorkspaceNameTool.hh +++ b/src/WorkspaceNameTool.hh @@ -64,7 +64,7 @@ private: /// Called when workspace changed on \c screen void updateForScreen(BScreen &screen); - void renderTheme(unsigned char alpha); + void renderTheme(int alpha); void reRender(); void updateSizing(); FbTk::TextButton m_button; -- cgit v0.11.2