"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>
This commit is contained in:
Tomas Janousek 2007-08-06 00:36:12 +02:00
parent b405d36151
commit 4faf1bf5c3
5 changed files with 44 additions and 12 deletions

View file

@ -48,10 +48,6 @@
#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 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
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::exposeEvent(XExposeEvent &ev) {
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 @@ void Slit::setupMenu() {
#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(),

View file

@ -29,6 +29,10 @@
#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 @@ private:
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 {

View file

@ -35,10 +35,6 @@
#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 @@ Toolbar::Toolbar(BScreen &scrn, FbTk::XLayer &layer, size_t width):
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 @@ void Toolbar::update(FbTk::Subject *subj) {
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 @@ void Toolbar::setupMenus(bool skip_new_placement) {
#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(),

View file

@ -31,6 +31,10 @@
#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 @@ private:
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

View file

@ -25,6 +25,7 @@
#include "FbMenu.hh"
#include "fluxbox.hh"
#include "Screen.hh"
#include "FbTk/RefCount.hh"
#include "FbTk/SimpleCommand.hh"
@ -59,14 +60,16 @@ private:
/// 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()->