diff options
author | Pavel Labath <pavelo@centrum.sk> | 2011-07-02 15:21:24 (GMT) |
---|---|---|
committer | Pavel Labath <pavelo@centrum.sk> | 2013-02-17 00:09:35 (GMT) |
commit | b9de0c5be3022db926e167fbe765dc222c1db828 (patch) | |
tree | 3af2cb3b644e2986d904f486fe73a5e158757009 /src/Screen.hh | |
parent | db435c66cce9644abf5599f62229426b1f09a9e3 (diff) | |
download | fluxbox_pavel-b9de0c5be3022db926e167fbe765dc222c1db828.zip fluxbox_pavel-b9de0c5be3022db926e167fbe765dc222c1db828.tar.bz2 |
Store menus if smart pointers (RefCount)
This was originally intended to be a bugfix for an memory error reported by valgrind (accessing
freed memory). While debugging it, I found the menu ownership semantics confusing
(setInternalMenu() et al.), so I decided to get rid of it and store it in smart pointers
everywhere.
Looking back, I'm not sure if this was worth all the trouble, but the good news is that the
valgrind error disappeared. :)
Diffstat (limited to 'src/Screen.hh')
-rw-r--r-- | src/Screen.hh | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/Screen.hh b/src/Screen.hh index 8c89ab2..3e062ac 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -25,6 +25,7 @@ | |||
25 | #ifndef SCREEN_HH | 25 | #ifndef SCREEN_HH |
26 | #define SCREEN_HH | 26 | #define SCREEN_HH |
27 | 27 | ||
28 | #include "FbMenu.hh" | ||
28 | #include "FbWinFrame.hh" | 29 | #include "FbWinFrame.hh" |
29 | #include "FbRootWindow.hh" | 30 | #include "FbRootWindow.hh" |
30 | #include "RootTheme.hh" | 31 | #include "RootTheme.hh" |
@@ -56,7 +57,6 @@ | |||
56 | #include <map> | 57 | #include <map> |
57 | 58 | ||
58 | class ClientPattern; | 59 | class ClientPattern; |
59 | class FbMenu; | ||
60 | class Focusable; | 60 | class Focusable; |
61 | class FluxboxWindow; | 61 | class FluxboxWindow; |
62 | class WinClient; | 62 | class WinClient; |
@@ -87,7 +87,7 @@ public: | |||
87 | 87 | ||
88 | typedef std::vector<Workspace *> Workspaces; | 88 | typedef std::vector<Workspace *> Workspaces; |
89 | typedef std::vector<std::string> WorkspaceNames; | 89 | typedef std::vector<std::string> WorkspaceNames; |
90 | typedef std::list<std::pair<FbTk::FbString, FbTk::Menu *> > ExtraMenus; | 90 | typedef std::list<std::pair<FbTk::FbString, FbTk::RefCount<FbTk::Menu> > > ExtraMenus; |
91 | 91 | ||
92 | BScreen(FbTk::ResourceManager_base &rm, | 92 | BScreen(FbTk::ResourceManager_base &rm, |
93 | const std::string &screenname, | 93 | const std::string &screenname, |
@@ -114,8 +114,8 @@ public: | |||
114 | // menus | 114 | // menus |
115 | const FbMenu &rootMenu() const { return *m_rootmenu.get(); } | 115 | const FbMenu &rootMenu() const { return *m_rootmenu.get(); } |
116 | FbMenu &rootMenu() { return *m_rootmenu.get(); } | 116 | FbMenu &rootMenu() { return *m_rootmenu.get(); } |
117 | const FbMenu &configMenu() const { return *m_configmenu.get(); } | 117 | FbTk::RefCount<const FbMenu> configMenu() const { return m_configmenu; } |
118 | FbMenu &configMenu() { return *m_configmenu.get(); } | 118 | const FbTk::RefCount<FbMenu> &configMenu() { return m_configmenu; } |
119 | const FbMenu &windowMenu() const { return *m_windowmenu.get(); } | 119 | const FbMenu &windowMenu() const { return *m_windowmenu.get(); } |
120 | FbMenu &windowMenu() { return *m_windowmenu.get(); } | 120 | FbMenu &windowMenu() { return *m_windowmenu.get(); } |
121 | ExtraMenus &extraWindowMenus() { return m_extramenus; } | 121 | ExtraMenus &extraWindowMenus() { return m_extramenus; } |
@@ -151,9 +151,9 @@ public: | |||
151 | Workspace *currentWorkspace() { return m_current_workspace; } | 151 | Workspace *currentWorkspace() { return m_current_workspace; } |
152 | const Workspace *currentWorkspace() const { return m_current_workspace; } | 152 | const Workspace *currentWorkspace() const { return m_current_workspace; } |
153 | /// @return the workspace menu | 153 | /// @return the workspace menu |
154 | const FbMenu &workspaceMenu() const { return *m_workspacemenu.get(); } | 154 | FbTk::RefCount<const FbMenu> workspaceMenu() const { return m_workspacemenu; } |
155 | /// @return the workspace menu | 155 | /// @return the workspace menu |
156 | FbMenu &workspaceMenu() { return *m_workspacemenu.get(); } | 156 | const FbTk::RefCount<FbMenu> &workspaceMenu() { return m_workspacemenu; } |
157 | /// @return focus control handler | 157 | /// @return focus control handler |
158 | const FocusControl &focusControl() const { return *m_focus_control; } | 158 | const FocusControl &focusControl() const { return *m_focus_control; } |
159 | /// @return focus control handler | 159 | /// @return focus control handler |
@@ -247,10 +247,8 @@ public: | |||
247 | 247 | ||
248 | /** | 248 | /** |
249 | * For extras to add menus. | 249 | * For extras to add menus. |
250 | * These menus will be marked internal, | ||
251 | * and deleted when the window dies (as opposed to Screen | ||
252 | */ | 250 | */ |
253 | void addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu); | 251 | void addExtraWindowMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu); |
254 | 252 | ||
255 | int getEdgeSnapThreshold() const { return *resource.edge_snap_threshold; } | 253 | int getEdgeSnapThreshold() const { return *resource.edge_snap_threshold; } |
256 | 254 | ||
@@ -444,8 +442,8 @@ public: | |||
444 | // for extras to add menus. These menus must be marked | 442 | // for extras to add menus. These menus must be marked |
445 | // internal for their safety, and __the extension__ must | 443 | // internal for their safety, and __the extension__ must |
446 | // delete and remove the menu itself (opposite to Window) | 444 | // delete and remove the menu itself (opposite to Window) |
447 | void addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu); | 445 | void addConfigMenu(const FbTk::FbString &label, const FbTk::RefCount<FbTk::Menu> &menu); |
448 | void removeConfigMenu(FbTk::Menu &menu); | 446 | void removeConfigMenu(const FbTk::RefCount<FbTk::Menu> &menu); |
449 | 447 | ||
450 | 448 | ||
451 | /// Adds a resource to managed resource list | 449 | /// Adds a resource to managed resource list |
@@ -495,11 +493,11 @@ private: | |||
495 | bool root_colormap_installed, managed; | 493 | bool root_colormap_installed, managed; |
496 | 494 | ||
497 | std::auto_ptr<FbTk::ImageControl> m_image_control; | 495 | std::auto_ptr<FbTk::ImageControl> m_image_control; |
498 | std::auto_ptr<FbMenu> m_configmenu, m_rootmenu, m_workspacemenu, m_windowmenu; | 496 | FbTk::RefCount<FbMenu> m_configmenu, m_rootmenu, m_workspacemenu, m_windowmenu; |
499 | 497 | ||
500 | ExtraMenus m_extramenus; | 498 | ExtraMenus m_extramenus; |
501 | 499 | ||
502 | typedef std::list<std::pair<FbTk::FbString, FbTk::Menu *> > Configmenus; | 500 | typedef std::list<std::pair<FbTk::FbString, FbTk::RefCount<FbTk::Menu> > > Configmenus; |
503 | 501 | ||
504 | 502 | ||
505 | Configmenus m_configmenu_list; | 503 | Configmenus m_configmenu_list; |