all repos — fluxbox @ 4faf1bf5c3fe07260b0a4c084db56b0bed12734a

custom fork of the fluxbox windowmanager

"On head" menu -- reloading and refreshing bugfix.

We should reload the contents of this menu on Xinerama layout change.

I switched it from FbMenu to ToggleMenu, because the selected head wasn't
being updated properly.

Signed-off-by: Tomas Janousek <tomi@nomi.cz>
Tomas Janousek tomi@nomi.cz
commit

4faf1bf5c3fe07260b0a4c084db56b0bed12734a

parent

b405d36151d3a6d3074eb6bafb541a1d6228d85e

5 files changed, 44 insertions(+), 12 deletions(-)

jump to
M src/Slit.ccsrc/Slit.cc

@@ -48,10 +48,6 @@ #include "XLayer.hh"

#include "RootTheme.hh" #include "FbMenu.hh" -#ifdef XINERAMA -#include "Xinerama.hh" -#endif // XINERAMA - #include "SlitTheme.hh" #include "SlitClient.hh" #include "Xutil.hh"

@@ -270,6 +266,9 @@ *scr.layerManager().getLayer(Layer::MENU)),

m_slitmenu(scr.menuTheme(), scr.imageControl(), *scr.layerManager().getLayer(Layer::MENU)), +#ifdef XINERAMA + m_xineramaheadmenu(0), +#endif // XINERAMA frame(scr.rootWindow()), //For KDE dock applets m_kwm1_dockwindow(XInternAtom(FbTk::App::instance()->display(),

@@ -1113,6 +1112,10 @@ }

void Slit::update(FbTk::Subject *subj) { reconfigure(); +#ifdef XINERAMA + if (subj == &m_screen.resizeSig() && m_xineramaheadmenu) + m_xineramaheadmenu->reloadHeads(); +#endif // XINERAMA } void Slit::clearWindow() {

@@ -1254,6 +1257,7 @@

#ifdef XINERAMA if (screen().hasXinerama()) { m_slitmenu.insert(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"), + m_xineramaheadmenu = new XineramaHeadMenu<Slit>( screen().menuTheme(), screen(),
M src/Slit.hhsrc/Slit.hh

@@ -29,6 +29,10 @@ #include "SlitTheme.hh"

#include "LayerMenu.hh" #include "Layer.hh" +#ifdef XINERAMA +#include "Xinerama.hh" +#endif // XINERAMA + #include "FbTk/Menu.hh" #include "FbTk/FbWindow.hh" #include "FbTk/Timer.hh"

@@ -144,6 +148,9 @@

SlitClients m_client_list; std::auto_ptr<LayerMenu> m_layermenu; FbMenu m_clientlist_menu, m_slitmenu; +#ifdef XINERAMA + XineramaHeadMenu<Slit> *m_xineramaheadmenu; +#endif // XINERAMA std::string m_filename; struct frame {
M src/Toolbar.ccsrc/Toolbar.cc

@@ -35,10 +35,6 @@ #include "Keys.hh"

#include "Screen.hh" #include "WindowCmd.hh" -#ifdef XINERAMA -#include "Xinerama.hh" -#endif // XINERAMA - #include "Strut.hh" #include "FbTk/CommandParser.hh" #include "Layer.hh"

@@ -216,6 +212,9 @@ *scrn.layerManager().getLayer(Layer::MENU)),

m_toolbarmenu(scrn.menuTheme(), scrn.imageControl(), *scrn.layerManager().getLayer(Layer::MENU)), +#ifdef XINERAMA + m_xineramaheadmenu(0), +#endif // XINERAMA m_theme(scrn.screenNumber()), m_tool_factory(scrn), m_strut(0),

@@ -629,6 +628,10 @@ rearrangeItems();

else reconfigure(); +#ifdef XINERAMA + if (subj == &m_screen.resizeSig() && m_xineramaheadmenu) + m_xineramaheadmenu->reloadHeads(); +#endif // XINERAMA } void Toolbar::setPlacement(Toolbar::Placement where) {

@@ -872,6 +875,7 @@ menu().insert(_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"), &layerMenu());

#ifdef XINERAMA if (screen().hasXinerama()) { menu().insert(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"), + m_xineramaheadmenu = new XineramaHeadMenu<Toolbar>(screen().menuTheme(), screen(), screen().imageControl(),
M src/Toolbar.hhsrc/Toolbar.hh

@@ -31,6 +31,10 @@ #include "ToolFactory.hh"

#include "ToolTheme.hh" #include "Layer.hh" +#ifdef XINERAMA +#include "Xinerama.hh" +#endif // XINERAMA + #include "FbTk/Timer.hh" #include "FbTk/Resource.hh" #include "FbTk/Observer.hh"

@@ -159,6 +163,9 @@

FbTk::XLayerItem m_layeritem; ///< layer item, must be declared before layermenu LayerMenu m_layermenu; FbMenu m_placementmenu, m_toolbarmenu; +#ifdef XINERAMA + XineramaHeadMenu<Toolbar> *m_xineramaheadmenu; +#endif // XINERAMA // themes
M src/Xinerama.hhsrc/Xinerama.hh

@@ -25,6 +25,7 @@ #define XINERAMA_HH

#include "FbMenu.hh" #include "fluxbox.hh" +#include "Screen.hh" #include "FbTk/RefCount.hh" #include "FbTk/SimpleCommand.hh"

@@ -59,14 +60,16 @@

/// Create a xinerama menu template <typename ItemType> -class XineramaHeadMenu : public FbMenu { +class XineramaHeadMenu : public ToggleMenu { public: XineramaHeadMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen, FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, ItemType &item, const FbTk::FbString & title = ""); + void reloadHeads(); private: ItemType &m_object; + BScreen &m_screen; };

@@ -75,15 +78,22 @@ 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) + ToggleMenu(tm, imgctrl, layer), + m_object(item), m_screen(screen) { setLabel(title); + reloadHeads(); +} + +template <typename ItemType> +void XineramaHeadMenu<ItemType>::reloadHeads() +{ + removeAll(); FbTk::RefCount<FbTk::Command<void> > saverc_cmd(new FbTk::SimpleCommand<Fluxbox>( *Fluxbox::instance(), &Fluxbox::save_rc)); char tname[128]; - for (int i=1; i <= screen.numHeads(); ++i) { + for (int i=1; i <= m_screen.numHeads(); ++i) { // TODO: nls /* sprintf(tname, I18n::instance()->