From bd983fab553f4971caaed945e0194e162fa49ae6 Mon Sep 17 00:00:00 2001 From: Mathias Gumz Date: Sat, 7 Feb 2015 17:59:37 +0100 Subject: Create buttons for titlebar with proper sizes Instead of creating the titlebar buttons with a size of 10x10 pixels and rely on resizing later on we now pick the correct dimensions right on. This fixes also bug #1125 ("Detaching a window from a tab-group renders app-icon to 1/2"); the problem also occurred on restart. I took the chance to refactor a little bit. --- src/Window.cc | 265 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 118 insertions(+), 147 deletions(-) diff --git a/src/Window.cc b/src/Window.cc index 9923a45..0f91a9e 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -253,6 +253,21 @@ struct TestCornerHelper { } }; +// used in FluxboxWindow::updateAll() and FluxboxWindow::Setu +typedef FbTk::Resource > WBR; + +// create a button ready to be used in the frame-titlebar +WinButton* makeButton(FluxboxWindow& win, FocusableTheme& btheme, WinButton::Type btype) { + + FbTk::ThemeProxy& theme = win.screen().pressedWinButtonTheme(); + FbWinFrame& frame = win.frame(); + FbTk::FbWindow& parent = frame.titlebar(); + const unsigned int h = frame.buttonHeight(); + const unsigned int w = h; + + return new WinButton(win, btheme, theme, btype, parent, 0, 0, w, h); +} + } @@ -3395,101 +3410,95 @@ void FluxboxWindow::kill() { } void FluxboxWindow::setupWindow() { + // sets up our window // we allow both to be done at once to share the commands - - using namespace FbTk; - typedef FbTk::Resource > WinButtonsResource; - - string titlebar_name[2]; - string titlebar_alt_name[2]; - titlebar_name[0] = screen().name() + ".titlebar.left"; - titlebar_alt_name[0] = screen().altName() + ".Titlebar.Left"; - titlebar_name[1] = screen().name() + ".titlebar.right"; - titlebar_alt_name[1] = screen().altName() + ".Titlebar.Right"; - - WinButtonsResource *titlebar_side[2]; - + FbTk::ResourceManager &rm = screen().resourceManager(); + + struct { + std::string name; + std::string alt_name; + size_t n_buttons; + WinButton::Type buttons[3]; + } side[2] = { + { + screen().name() + ".titlebar.left", + screen().name() + ".Titlebar.Left", + 1, { WinButton::STICK }, + }, + { + screen().name() + ".titlebar.right", + screen().name() + ".Titlebar.Right", + 3, { WinButton::MINIMIZE, WinButton::MAXIMIZE, WinButton::CLOSE }, + } + }; - ResourceManager &rm = screen().resourceManager(); - // create resource for titlebar - for (int i=0; i < 2; ++i) { - titlebar_side[i] = dynamic_cast( - rm.findResource( titlebar_name[i] ) ); + for (size_t i = 0; i < sizeof(side)/sizeof(side[0]); ++i) { - if (titlebar_side[i] != 0) + WBR* res = dynamic_cast(rm.findResource(side[i].name)); + if (res != 0) continue; // find next resource too - WinButton::Type titlebar_left[] = { - WinButton::STICK - }; - - WinButton::Type titlebar_right[] = { - WinButton::MINIMIZE, - WinButton::MAXIMIZE, - WinButton::CLOSE - }; - - WinButton::Type *begin = 0; - WinButton::Type *end = 0; - - if (i == 0) { - begin = titlebar_left; - end = titlebar_left + 1; - } else { - begin = titlebar_right; - end = titlebar_right + 3; - } - - titlebar_side[i] = - new WinButtonsResource(rm, - WinButtonsResource::Type(begin, end), - titlebar_name[i], titlebar_alt_name[i]); - - - screen().addManagedResource(titlebar_side[i]); + WinButton::Type* s = &side[i].buttons[0]; + WinButton::Type* e = s + side[i].n_buttons; + res = new WBR(rm, WBR::Type(s, e), side[i].name, side[i].alt_name); + screen().addManagedResource(res); } updateButtons(); - - // end setup frame - } + void FluxboxWindow::updateButtons() { - string titlebar_name[2]; - titlebar_name[0] = screen().name() + ".titlebar.left"; - titlebar_name[1] = screen().name() + ".titlebar.right"; - typedef FbTk::Resource > WinButtonsResource; - WinButtonsResource *titlebar_side[2]; ResourceManager &rm = screen().resourceManager(); - + size_t i; + size_t j; + struct { + std::string name; + WBR* res; + } sides[2] = { + { screen().name() + ".titlebar.left", 0 }, + { screen().name() + ".titlebar.right", 0 }, + }; + const size_t n_sides = sizeof(sides)/sizeof(sides[0]); bool need_update = false; - // get resource for titlebar - for (int i=0; i < 2; ++i) { - titlebar_side[i] = dynamic_cast( - rm.findResource( titlebar_name[i] ) ); + + + // get button resources for each titlebar and check if they differ + for (i = 0; i < n_sides; ++i) { + + sides[i].res = dynamic_cast(rm.findResource(sides[i].name)); + + if (sides[i].res == 0) { + if (!m_titlebar_buttons[i].empty()) { + need_update = true; + } + continue; + } // check if we need to update our buttons - size_t new_size = (*titlebar_side[i])->size(); - if (new_size != m_titlebar_buttons[i].size() || need_update) + const vector& buttons = *(*sides[i].res); + size_t s = buttons.size(); + + if (s != m_titlebar_buttons[i].size()) { need_update = true; - else { - for (size_t j=0; j < new_size && !need_update; j++) { - if ((*(*titlebar_side[i]))[j] != m_titlebar_buttons[i][j]) - need_update = true; - } + continue; } + for (j = 0; !need_update && j < s; j++) { + if (buttons[j] != m_titlebar_buttons[i][j]) { + need_update = true; + break; + } + } } if (!need_update) return; - // clear old buttons from frame frame().removeAllButtons(); using namespace FbTk; @@ -3505,129 +3514,91 @@ void FluxboxWindow::updateButtons() { CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); - for (size_t c = 0; c < 2 ; c++) { - // get titlebar configuration for current side - const vector &dir = *(*titlebar_side[c]); - m_titlebar_buttons[c] = dir; + for (i = 0; i < n_sides; i++) { + + if (sides[i].res == 0) { + continue; + } + + const vector& buttons = *(*sides[i].res); + m_titlebar_buttons[i] = buttons; + + for (j = 0; j < buttons.size(); ++j) { - for (size_t i=0; i < dir.size(); ++i) { - //create new buttons - WinButton *winbtn = 0; + WinButton* btn = 0; - switch (dir[i]) { + switch (buttons[j]) { case WinButton::MINIMIZE: if (isIconifiable() && (m_state.deco_mask & WindowState::DECORM_ICONIFY)) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - WinButton::MINIMIZE, - frame().titlebar(), - 0, 0, 10, 10); - winbtn->setOnClick(iconify_cmd); + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->setOnClick(iconify_cmd); } break; case WinButton::MAXIMIZE: if (isMaximizable() && (m_state.deco_mask & WindowState::DECORM_MAXIMIZE) ) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - winbtn->setOnClick(maximize_cmd, 1); - winbtn->setOnClick(maximize_horiz_cmd, 3); - winbtn->setOnClick(maximize_vert_cmd, 2); - + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->setOnClick(maximize_cmd, 1); + btn->setOnClick(maximize_horiz_cmd, 3); + btn->setOnClick(maximize_vert_cmd, 2); } break; case WinButton::CLOSE: if (m_client->isClosable() && (m_state.deco_mask & WindowState::DECORM_CLOSE)) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - - winbtn->setOnClick(close_cmd); - winbtn->join(stateSig(), - FbTk::MemFunIgnoreArgs(*winbtn, &WinButton::updateAll)); + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->setOnClick(close_cmd); + btn->join(stateSig(), FbTk::MemFunIgnoreArgs(*btn, &WinButton::updateAll)); } break; case WinButton::STICK: if (m_state.deco_mask & WindowState::DECORM_STICKY) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - - winbtn->join(stateSig(), - FbTk::MemFunIgnoreArgs(*winbtn, &WinButton::updateAll)); - winbtn->setOnClick(stick_cmd); + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->join(stateSig(), FbTk::MemFunIgnoreArgs(*btn, &WinButton::updateAll)); + btn->setOnClick(stick_cmd); } break; case WinButton::SHADE: if (m_state.deco_mask & WindowState::DECORM_SHADE) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - winbtn->join(stateSig(), - FbTk::MemFunIgnoreArgs(*winbtn, &WinButton::updateAll)); - winbtn->setOnClick(shade_cmd); + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->join(stateSig(), FbTk::MemFunIgnoreArgs(*btn, &WinButton::updateAll)); + btn->setOnClick(shade_cmd); } break; case WinButton::MENUICON: if (m_state.deco_mask & WindowState::DECORM_MENU) { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - winbtn->join(titleSig(), - FbTk::MemFunIgnoreArgs(*winbtn, &WinButton::updateAll)); - winbtn->setOnClick(show_menu_cmd); + btn = makeButton(*this, m_button_theme, buttons[j]); + btn->join(titleSig(), FbTk::MemFunIgnoreArgs(*btn, &WinButton::updateAll)); + btn->setOnClick(show_menu_cmd); } break; case WinButton::LEFT_HALF: { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); - + btn = makeButton(*this, m_button_theme, buttons[j]); CommandRef lhalf_cmd(FbTk::CommandParser::instance().parse("MacroCmd {MoveTo 0 0} {ResizeTo 50% 100%}")); - winbtn->setOnClick(lhalf_cmd); + btn->setOnClick(lhalf_cmd); } break; case WinButton::RIGHT_HALF: { - winbtn = new WinButton(*this, m_button_theme, - screen().pressedWinButtonTheme(), - dir[i], - frame().titlebar(), - 0, 0, 10, 10); + btn = makeButton(*this, m_button_theme, buttons[j]); CommandRef rhalf_cmd(FbTk::CommandParser::instance().parse("MacroCmd {MoveTo 50% 0} {ResizeTo 50% 100%}")); - winbtn->setOnClick(rhalf_cmd); + btn->setOnClick(rhalf_cmd); } break; } - if (winbtn != 0) { - winbtn->show(); - if (c == 0) - frame().addLeftButton(winbtn); + if (btn != 0) { + btn->show(); + if (i == 0) + frame().addLeftButton(btn); else - frame().addRightButton(winbtn); + frame().addRightButton(btn); } - } //end for i - - - } // end for c + } + } frame().reconfigure(); } -- cgit v0.11.2