diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Screen.cc | 5 | ||||
-rw-r--r-- | src/Screen.hh | 5 | ||||
-rw-r--r-- | src/SendToMenu.cc | 8 | ||||
-rw-r--r-- | src/SendToMenu.hh | 9 | ||||
-rw-r--r-- | src/WorkspaceMenu.cc | 50 | ||||
-rw-r--r-- | src/WorkspaceMenu.hh | 6 | ||||
-rw-r--r-- | src/fluxbox.cc | 21 | ||||
-rw-r--r-- | src/fluxbox.hh | 8 |
8 files changed, 74 insertions, 38 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index 23bc417..83bc92e 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -341,7 +341,6 @@ BScreen::BScreen(FbTk::ResourceManager &rm, | |||
341 | int scrn, int num_layers) : | 341 | int scrn, int num_layers) : |
342 | m_clientlist_sig(*this), // client signal | 342 | m_clientlist_sig(*this), // client signal |
343 | m_iconlist_sig(*this), // icon list signal | 343 | m_iconlist_sig(*this), // icon list signal |
344 | m_workspacecount_sig(*this), // workspace count signal | ||
345 | m_workspacenames_sig(*this), // workspace names signal | 344 | m_workspacenames_sig(*this), // workspace names signal |
346 | m_workspace_area_sig(*this), // workspace area signal | 345 | m_workspace_area_sig(*this), // workspace area signal |
347 | m_currentworkspace_sig(*this), // current workspace signal | 346 | m_currentworkspace_sig(*this), // current workspace signal |
@@ -1110,7 +1109,7 @@ int BScreen::addWorkspace() { | |||
1110 | } | 1109 | } |
1111 | 1110 | ||
1112 | saveWorkspaces(m_workspaces_list.size()); | 1111 | saveWorkspaces(m_workspaces_list.size()); |
1113 | workspaceCountSig().notify(); | 1112 | workspaceCountSig().emit( *this ); |
1114 | 1113 | ||
1115 | return m_workspaces_list.size(); | 1114 | return m_workspaces_list.size(); |
1116 | 1115 | ||
@@ -1140,7 +1139,7 @@ int BScreen::removeLastWorkspace() { | |||
1140 | m_workspaces_list.pop_back(); | 1139 | m_workspaces_list.pop_back(); |
1141 | 1140 | ||
1142 | saveWorkspaces(m_workspaces_list.size()); | 1141 | saveWorkspaces(m_workspaces_list.size()); |
1143 | workspaceCountSig().notify(); | 1142 | workspaceCountSig().emit( *this ); |
1144 | // must be deleted after we send notify!! | 1143 | // must be deleted after we send notify!! |
1145 | // so we dont get bad pointers somewhere | 1144 | // so we dont get bad pointers somewhere |
1146 | // while processing the notify signal | 1145 | // while processing the notify signal |
diff --git a/src/Screen.hh b/src/Screen.hh index 038570e..3f57c22 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -39,6 +39,7 @@ | |||
39 | #include "FbTk/MultLayers.hh" | 39 | #include "FbTk/MultLayers.hh" |
40 | #include "FbTk/NotCopyable.hh" | 40 | #include "FbTk/NotCopyable.hh" |
41 | #include "FbTk/Observer.hh" | 41 | #include "FbTk/Observer.hh" |
42 | #include "FbTk/Signal.hh" | ||
42 | 43 | ||
43 | #include <X11/Xresource.h> | 44 | #include <X11/Xresource.h> |
44 | 45 | ||
@@ -213,7 +214,7 @@ public: | |||
213 | /// icon list sig | 214 | /// icon list sig |
214 | FbTk::Subject &iconListSig() { return m_iconlist_sig; } | 215 | FbTk::Subject &iconListSig() { return m_iconlist_sig; } |
215 | /// workspace count signal | 216 | /// workspace count signal |
216 | FbTk::Subject &workspaceCountSig() { return m_workspacecount_sig; } | 217 | FbTk::Signal<void, BScreen&> &workspaceCountSig() { return m_workspacecount_sig; } |
217 | /// workspace names signal | 218 | /// workspace names signal |
218 | FbTk::Subject &workspaceNamesSig() { return m_workspacenames_sig; } | 219 | FbTk::Subject &workspaceNamesSig() { return m_workspacenames_sig; } |
219 | /// workspace area signal | 220 | /// workspace area signal |
@@ -493,7 +494,6 @@ private: | |||
493 | ScreenSubject | 494 | ScreenSubject |
494 | m_clientlist_sig, ///< client signal | 495 | m_clientlist_sig, ///< client signal |
495 | m_iconlist_sig, ///< notify if a window gets iconified/deiconified | 496 | m_iconlist_sig, ///< notify if a window gets iconified/deiconified |
496 | m_workspacecount_sig, ///< workspace count signal | ||
497 | m_workspacenames_sig, ///< workspace names signal | 497 | m_workspacenames_sig, ///< workspace names signal |
498 | m_workspace_area_sig, ///< workspace area changed signal | 498 | m_workspace_area_sig, ///< workspace area changed signal |
499 | m_currentworkspace_sig, ///< current workspace signal | 499 | m_currentworkspace_sig, ///< current workspace signal |
@@ -502,6 +502,7 @@ private: | |||
502 | m_resize_sig, ///< resize signal | 502 | m_resize_sig, ///< resize signal |
503 | m_bg_change_sig; ///< background change signal | 503 | m_bg_change_sig; ///< background change signal |
504 | 504 | ||
505 | FbTk::Signal<void, BScreen&> m_workspacecount_sig; ///< workspace count signal | ||
505 | FbTk::MultLayers m_layermanager; | 506 | FbTk::MultLayers m_layermanager; |
506 | 507 | ||
507 | bool root_colormap_installed, managed; | 508 | bool root_colormap_installed, managed; |
diff --git a/src/SendToMenu.cc b/src/SendToMenu.cc index 2362eb2..397ec81 100644 --- a/src/SendToMenu.cc +++ b/src/SendToMenu.cc | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "FbTk/MultiButtonMenuItem.hh" | 31 | #include "FbTk/MultiButtonMenuItem.hh" |
32 | #include "FbTk/Command.hh" | 32 | #include "FbTk/Command.hh" |
33 | #include "FbTk/SimpleObserver.hh" | 33 | #include "FbTk/SimpleObserver.hh" |
34 | #include "FbTk/MemFun.hh" | ||
34 | 35 | ||
35 | class SendToCmd: public FbTk::Command<void> { | 36 | class SendToCmd: public FbTk::Command<void> { |
36 | public: | 37 | public: |
@@ -55,9 +56,14 @@ SendToMenu::SendToMenu(BScreen &screen): | |||
55 | // workspace names signal | 56 | // workspace names signal |
56 | // current workspace signal | 57 | // current workspace signal |
57 | m_rebuildObs = makeObserver(*this, &SendToMenu::rebuildMenu); | 58 | m_rebuildObs = makeObserver(*this, &SendToMenu::rebuildMenu); |
58 | screen.workspaceCountSig().attach(m_rebuildObs); | 59 | |
59 | screen.workspaceNamesSig().attach(m_rebuildObs); | 60 | screen.workspaceNamesSig().attach(m_rebuildObs); |
60 | screen.currentWorkspaceSig().attach(m_rebuildObs); | 61 | screen.currentWorkspaceSig().attach(m_rebuildObs); |
62 | |||
63 | // setup new signal system | ||
64 | join( screen.workspaceCountSig(), | ||
65 | FbTk::MemFun(*this, &SendToMenu::workspaceCountChange) ); | ||
66 | |||
61 | // no title for this menu, it should be a submenu in the window menu. | 67 | // no title for this menu, it should be a submenu in the window menu. |
62 | disableTitle(); | 68 | disableTitle(); |
63 | // setup menu items | 69 | // setup menu items |
diff --git a/src/SendToMenu.hh b/src/SendToMenu.hh index 0f668a9..1582dd5 100644 --- a/src/SendToMenu.hh +++ b/src/SendToMenu.hh | |||
@@ -25,6 +25,8 @@ | |||
25 | 25 | ||
26 | #include "FbMenu.hh" | 26 | #include "FbMenu.hh" |
27 | 27 | ||
28 | #include "FbTk/Signal.hh" | ||
29 | |||
28 | namespace FbTk { | 30 | namespace FbTk { |
29 | class Observer; | 31 | class Observer; |
30 | } | 32 | } |
@@ -35,7 +37,7 @@ class BScreen; | |||
35 | * Creates the "send to menu". | 37 | * Creates the "send to menu". |
36 | * Displays all the workspaces for which the current window can be sent to. | 38 | * Displays all the workspaces for which the current window can be sent to. |
37 | */ | 39 | */ |
38 | class SendToMenu:public FbMenu { | 40 | class SendToMenu:public FbMenu, private FbTk::SignalTracker { |
39 | public: | 41 | public: |
40 | /// @param screen the screen on which this menu should be created on. | 42 | /// @param screen the screen on which this menu should be created on. |
41 | explicit SendToMenu(BScreen &screen); | 43 | explicit SendToMenu(BScreen &screen); |
@@ -43,6 +45,11 @@ public: | |||
43 | /// @see FbTk::Menu | 45 | /// @see FbTk::Menu |
44 | void show(); | 46 | void show(); |
45 | private: | 47 | private: |
48 | /// workspace count changed on screen | ||
49 | void workspaceCountChange( BScreen& screen ) { | ||
50 | rebuildMenu(); | ||
51 | } | ||
52 | |||
46 | /// Rebuild the menu from scratch. | 53 | /// Rebuild the menu from scratch. |
47 | void rebuildMenu(); | 54 | void rebuildMenu(); |
48 | /// listens to signals that makes this instance need to rebuild menu | 55 | /// listens to signals that makes this instance need to rebuild menu |
diff --git a/src/WorkspaceMenu.cc b/src/WorkspaceMenu.cc index 3bef2b6..33cfb7f 100644 --- a/src/WorkspaceMenu.cc +++ b/src/WorkspaceMenu.cc | |||
@@ -36,6 +36,7 @@ | |||
36 | #include "FbTk/MenuItem.hh" | 36 | #include "FbTk/MenuItem.hh" |
37 | #include "FbTk/MenuSeparator.hh" | 37 | #include "FbTk/MenuSeparator.hh" |
38 | #include "FbTk/MultiButtonMenuItem.hh" | 38 | #include "FbTk/MultiButtonMenuItem.hh" |
39 | #include "FbTk/MemFun.hh" | ||
39 | 40 | ||
40 | #include <typeinfo> | 41 | #include <typeinfo> |
41 | 42 | ||
@@ -61,6 +62,27 @@ WorkspaceMenu::WorkspaceMenu(BScreen &screen): | |||
61 | init(screen); | 62 | init(screen); |
62 | } | 63 | } |
63 | 64 | ||
65 | void WorkspaceMenu::workspaceInfoChanged( BScreen& screen ) { | ||
66 | while (numberOfItems() > NR_STATIC_ITEMS) { | ||
67 | remove(IDX_AFTER_ICONS); | ||
68 | } | ||
69 | // for each workspace add workspace name and it's menu | ||
70 | // to our workspace menu | ||
71 | for (size_t workspace = 0; workspace < screen.numberOfWorkspaces(); | ||
72 | ++workspace) { | ||
73 | Workspace *wkspc = screen.getWorkspace(workspace); | ||
74 | wkspc->menu().setInternalMenu(); | ||
75 | FbTk::MultiButtonMenuItem* mb_menu = new FbTk::MultiButtonMenuItem(5, | ||
76 | wkspc->name().c_str(), | ||
77 | &wkspc->menu()); | ||
78 | FbTk::RefCount<FbTk::Command<void> > jump_cmd(new JumpToWorkspaceCmd(wkspc->workspaceID())); | ||
79 | mb_menu->setCommand(3, jump_cmd); | ||
80 | insert(mb_menu, workspace + IDX_AFTER_ICONS); | ||
81 | } | ||
82 | |||
83 | updateMenu(-1); | ||
84 | } | ||
85 | |||
64 | void WorkspaceMenu::update(FbTk::Subject *subj) { | 86 | void WorkspaceMenu::update(FbTk::Subject *subj) { |
65 | 87 | ||
66 | if (subj != 0 && typeid(*subj) == typeid(BScreen::ScreenSubject)) { | 88 | if (subj != 0 && typeid(*subj) == typeid(BScreen::ScreenSubject)) { |
@@ -78,26 +100,8 @@ void WorkspaceMenu::update(FbTk::Subject *subj) { | |||
78 | } | 100 | } |
79 | setItemSelected(screen.currentWorkspace()->workspaceID() + IDX_AFTER_ICONS, true); | 101 | setItemSelected(screen.currentWorkspace()->workspaceID() + IDX_AFTER_ICONS, true); |
80 | updateMenu(screen.currentWorkspace()->workspaceID() + IDX_AFTER_ICONS); | 102 | updateMenu(screen.currentWorkspace()->workspaceID() + IDX_AFTER_ICONS); |
81 | } else if (subj == &screen.workspaceCountSig() || | 103 | } else if ( subj == &screen.workspaceNamesSig() ) { |
82 | subj == &screen.workspaceNamesSig()) { | 104 | workspaceInfoChanged( screen ); |
83 | while (numberOfItems() > NR_STATIC_ITEMS) { | ||
84 | remove(IDX_AFTER_ICONS); | ||
85 | } | ||
86 | // for each workspace add workspace name and it's menu | ||
87 | // to our workspace menu | ||
88 | for (size_t workspace = 0; workspace < screen.numberOfWorkspaces(); | ||
89 | ++workspace) { | ||
90 | Workspace *wkspc = screen.getWorkspace(workspace); | ||
91 | wkspc->menu().setInternalMenu(); | ||
92 | FbTk::MultiButtonMenuItem* mb_menu = new FbTk::MultiButtonMenuItem(5, | ||
93 | wkspc->name().c_str(), | ||
94 | &wkspc->menu()); | ||
95 | FbTk::RefCount<FbTk::Command<void> > jump_cmd(new JumpToWorkspaceCmd(wkspc->workspaceID())); | ||
96 | mb_menu->setCommand(3, jump_cmd); | ||
97 | insert(mb_menu, workspace + IDX_AFTER_ICONS); | ||
98 | } | ||
99 | |||
100 | updateMenu(-1); | ||
101 | } | 105 | } |
102 | } else { | 106 | } else { |
103 | FbTk::Menu::update(subj); | 107 | FbTk::Menu::update(subj); |
@@ -106,8 +110,12 @@ void WorkspaceMenu::update(FbTk::Subject *subj) { | |||
106 | 110 | ||
107 | void WorkspaceMenu::init(BScreen &screen) { | 111 | void WorkspaceMenu::init(BScreen &screen) { |
108 | screen.currentWorkspaceSig().attach(this); | 112 | screen.currentWorkspaceSig().attach(this); |
109 | screen.workspaceCountSig().attach(this); | 113 | |
110 | screen.workspaceNamesSig().attach(this); | 114 | screen.workspaceNamesSig().attach(this); |
115 | |||
116 | join( screen.workspaceCountSig(), | ||
117 | FbTk::MemFun( *this, &WorkspaceMenu::workspaceInfoChanged ) ); | ||
118 | |||
111 | using namespace FbTk; | 119 | using namespace FbTk; |
112 | _FB_USES_NLS; | 120 | _FB_USES_NLS; |
113 | 121 | ||
diff --git a/src/WorkspaceMenu.hh b/src/WorkspaceMenu.hh index 8591a65..e8a671d 100644 --- a/src/WorkspaceMenu.hh +++ b/src/WorkspaceMenu.hh | |||
@@ -23,6 +23,7 @@ | |||
23 | #define WORKSPACEMENU_HH | 23 | #define WORKSPACEMENU_HH |
24 | 24 | ||
25 | #include "FbMenu.hh" | 25 | #include "FbMenu.hh" |
26 | #include "FbTk/Signal.hh" | ||
26 | 27 | ||
27 | class BScreen; | 28 | class BScreen; |
28 | 29 | ||
@@ -33,7 +34,7 @@ class BScreen; | |||
33 | * workspace name. | 34 | * workspace name. |
34 | * It also contains client menus for all clients. | 35 | * It also contains client menus for all clients. |
35 | */ | 36 | */ |
36 | class WorkspaceMenu: public FbMenu { | 37 | class WorkspaceMenu: public FbMenu, private FbTk::SignalTracker { |
37 | public: | 38 | public: |
38 | explicit WorkspaceMenu(BScreen &screen); | 39 | explicit WorkspaceMenu(BScreen &screen); |
39 | virtual ~WorkspaceMenu() { } | 40 | virtual ~WorkspaceMenu() { } |
@@ -42,6 +43,9 @@ public: | |||
42 | private: | 43 | private: |
43 | /// initialize menu for the screen | 44 | /// initialize menu for the screen |
44 | void init(BScreen &screen); | 45 | void init(BScreen &screen); |
46 | /// Called when workspace info was changed | ||
47 | /// ( number of workspace, workspace names etc ) | ||
48 | void workspaceInfoChanged( BScreen& screen ); | ||
45 | }; | 49 | }; |
46 | 50 | ||
47 | #endif // WORKSPACEMENU_HH | 51 | #endif // WORKSPACEMENU_HH |
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index 4a223f9..4a7c68d 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.cc | |||
@@ -53,6 +53,7 @@ | |||
53 | #include "FbTk/Select2nd.hh" | 53 | #include "FbTk/Select2nd.hh" |
54 | #include "FbTk/Compose.hh" | 54 | #include "FbTk/Compose.hh" |
55 | #include "FbTk/KeyUtil.hh" | 55 | #include "FbTk/KeyUtil.hh" |
56 | #include "FbTk/MemFun.hh" | ||
56 | 57 | ||
57 | //Use GNU extensions | 58 | //Use GNU extensions |
58 | #ifndef _GNU_SOURCE | 59 | #ifndef _GNU_SOURCE |
@@ -452,11 +453,13 @@ void Fluxbox::initScreen(BScreen *screen) { | |||
452 | // attach screen signals to this | 453 | // attach screen signals to this |
453 | screen->currentWorkspaceSig().attach(this); | 454 | screen->currentWorkspaceSig().attach(this); |
454 | screen->focusedWindowSig().attach(this); | 455 | screen->focusedWindowSig().attach(this); |
455 | screen->workspaceCountSig().attach(this); | ||
456 | screen->workspaceNamesSig().attach(this); | 456 | screen->workspaceNamesSig().attach(this); |
457 | screen->workspaceAreaSig().attach(this); | 457 | screen->workspaceAreaSig().attach(this); |
458 | screen->clientListSig().attach(this); | 458 | screen->clientListSig().attach(this); |
459 | 459 | ||
460 | join( screen->workspaceCountSig(), | ||
461 | FbTk::MemFun( *this, &Fluxbox::workspaceCountChanged ) ); | ||
462 | |||
460 | // initiate atomhandler for screen specific stuff | 463 | // initiate atomhandler for screen specific stuff |
461 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); | 464 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); |
462 | it != m_atomhandler.end(); | 465 | it != m_atomhandler.end(); |
@@ -1095,13 +1098,7 @@ void Fluxbox::update(FbTk::Subject *changedsub) { | |||
1095 | } else if (typeid(*changedsub) == typeid(BScreen::ScreenSubject)) { | 1098 | } else if (typeid(*changedsub) == typeid(BScreen::ScreenSubject)) { |
1096 | BScreen::ScreenSubject *subj = dynamic_cast<BScreen::ScreenSubject *>(changedsub); | 1099 | BScreen::ScreenSubject *subj = dynamic_cast<BScreen::ScreenSubject *>(changedsub); |
1097 | BScreen &screen = subj->screen(); | 1100 | BScreen &screen = subj->screen(); |
1098 | if ((&(screen.workspaceCountSig())) == changedsub) { | 1101 | if ((&(screen.workspaceNamesSig())) == changedsub) { |
1099 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); | ||
1100 | it != m_atomhandler.end(); ++it) { | ||
1101 | if ((*it).first->update()) | ||
1102 | (*it).first->updateWorkspaceCount(screen); | ||
1103 | } | ||
1104 | } else if ((&(screen.workspaceNamesSig())) == changedsub) { | ||
1105 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); | 1102 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); |
1106 | it != m_atomhandler.end(); ++it) { | 1103 | it != m_atomhandler.end(); ++it) { |
1107 | if ((*it).first->update()) | 1104 | if ((*it).first->update()) |
@@ -1519,3 +1516,11 @@ void Fluxbox::updateFrameExtents(FluxboxWindow &win) { | |||
1519 | (*it).first->updateFrameExtents(win); | 1516 | (*it).first->updateFrameExtents(win); |
1520 | } | 1517 | } |
1521 | } | 1518 | } |
1519 | |||
1520 | void Fluxbox::workspaceCountChanged( BScreen& screen ) { | ||
1521 | for (AtomHandlerContainerIt it= m_atomhandler.begin(); | ||
1522 | it != m_atomhandler.end(); ++it) { | ||
1523 | if ((*it).first->update()) | ||
1524 | (*it).first->updateWorkspaceCount(screen); | ||
1525 | } | ||
1526 | } | ||
diff --git a/src/fluxbox.hh b/src/fluxbox.hh index a6c0b2f..8478833 100644 --- a/src/fluxbox.hh +++ b/src/fluxbox.hh | |||
@@ -30,6 +30,8 @@ | |||
30 | #include "FbTk/Timer.hh" | 30 | #include "FbTk/Timer.hh" |
31 | #include "FbTk/Observer.hh" | 31 | #include "FbTk/Observer.hh" |
32 | #include "FbTk/SignalHandler.hh" | 32 | #include "FbTk/SignalHandler.hh" |
33 | #include "FbTk/Signal.hh" | ||
34 | |||
33 | #include "AttentionNoticeHandler.hh" | 35 | #include "AttentionNoticeHandler.hh" |
34 | 36 | ||
35 | #include <X11/Xresource.h> | 37 | #include <X11/Xresource.h> |
@@ -74,7 +76,8 @@ class FbAtoms; | |||
74 | */ | 76 | */ |
75 | class Fluxbox : public FbTk::App, | 77 | class Fluxbox : public FbTk::App, |
76 | public FbTk::SignalEventHandler, | 78 | public FbTk::SignalEventHandler, |
77 | public FbTk::Observer { | 79 | public FbTk::Observer, |
80 | private FbTk::SignalTracker { | ||
78 | public: | 81 | public: |
79 | Fluxbox(int argc, char **argv, const char * dpy_name= 0, | 82 | Fluxbox(int argc, char **argv, const char * dpy_name= 0, |
80 | const char *rcfilename = 0, bool xsync = false); | 83 | const char *rcfilename = 0, bool xsync = false); |
@@ -198,6 +201,9 @@ private: | |||
198 | void handleUnmapNotify(XUnmapEvent &ue); | 201 | void handleUnmapNotify(XUnmapEvent &ue); |
199 | void handleClientMessage(XClientMessageEvent &ce); | 202 | void handleClientMessage(XClientMessageEvent &ce); |
200 | 203 | ||
204 | /// Called when workspace count on a specific screen changed. | ||
205 | void workspaceCountChanged( BScreen& screen ); | ||
206 | |||
201 | std::auto_ptr<FbAtoms> m_fbatoms; | 207 | std::auto_ptr<FbAtoms> m_fbatoms; |
202 | 208 | ||
203 | FbTk::ResourceManager m_resourcemanager, &m_screen_rm; | 209 | FbTk::ResourceManager m_resourcemanager, &m_screen_rm; |