diff options
author | Pavel Labath <pavelo@centrum.sk> | 2011-07-02 15:21:24 (GMT) |
---|---|---|
committer | Paul Tagliamonte <paultag@fluxbox.org> | 2012-04-07 02:11:29 (GMT) |
commit | 34649e86c5cbe9c9f231c049a0844afdda5a7db9 (patch) | |
tree | 6e9696e36565e993185c9d265ca6542b77788fd9 /src/MenuCreator.cc | |
parent | 0b0ee8dc504016ffad85ec1dd35875d273cf0179 (diff) | |
download | fluxbox_paul-34649e86c5cbe9c9f231c049a0844afdda5a7db9.zip fluxbox_paul-34649e86c5cbe9c9f231c049a0844afdda5a7db9.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/MenuCreator.cc')
-rw-r--r-- | src/MenuCreator.cc | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/src/MenuCreator.cc b/src/MenuCreator.cc index 6a6accc..46f233d 100644 --- a/src/MenuCreator.cc +++ b/src/MenuCreator.cc | |||
@@ -66,10 +66,10 @@ using FbTk::AutoReloadHelper; | |||
66 | 66 | ||
67 | namespace { | 67 | namespace { |
68 | 68 | ||
69 | std::auto_ptr<FbMenu> createStyleMenu(int screen_number, const string &label, | 69 | FbTk::RefCount<FbTk::Menu> createStyleMenu(int screen_number, const string &label, |
70 | AutoReloadHelper *reloader, const string &directory) { | 70 | AutoReloadHelper *reloader, const string &directory) { |
71 | 71 | ||
72 | std::auto_ptr<FbMenu> menu(MenuCreator::createMenu(label, screen_number)); | 72 | FbTk::RefCount<FbMenu> menu(MenuCreator::createMenu(label, screen_number)); |
73 | 73 | ||
74 | // perform shell style ~ home directory expansion | 74 | // perform shell style ~ home directory expansion |
75 | string stylesdir(FbTk::StringUtil::expandFilename(directory)); | 75 | string stylesdir(FbTk::StringUtil::expandFilename(directory)); |
@@ -107,11 +107,11 @@ std::auto_ptr<FbMenu> createStyleMenu(int screen_number, const string &label, | |||
107 | return menu; | 107 | return menu; |
108 | } | 108 | } |
109 | 109 | ||
110 | std::auto_ptr<FbMenu> createRootCmdMenu(int screen_number, const string &label, | 110 | FbTk::RefCount<FbTk::Menu> createRootCmdMenu(int screen_number, const string &label, |
111 | const string &directory, AutoReloadHelper *reloader, | 111 | const string &directory, AutoReloadHelper *reloader, |
112 | const string &cmd) { | 112 | const string &cmd) { |
113 | 113 | ||
114 | std::auto_ptr<FbMenu> menu(MenuCreator::createMenu(label, screen_number)); | 114 | FbTk::RefCount<FbMenu> menu(MenuCreator::createMenu(label, screen_number)); |
115 | 115 | ||
116 | // perform shell style ~ home directory expansion | 116 | // perform shell style ~ home directory expansion |
117 | string rootcmddir(FbTk::StringUtil::expandFilename(directory)); | 117 | string rootcmddir(FbTk::StringUtil::expandFilename(directory)); |
@@ -267,8 +267,8 @@ insertMenuItem(lua::state &l, FbTk::Menu &menu, FbTk::StringConvertor &parent_co | |||
267 | int size = menu.insert(str_label); | 267 | int size = menu.insert(str_label); |
268 | menu.setItemEnabled(size-1, false); | 268 | menu.setItemEnabled(size-1, false); |
269 | } else if(str_key == "icons") { | 269 | } else if(str_key == "icons") { |
270 | FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", screen_number); | 270 | FbTk::RefCount<FbTk::Menu> submenu = MenuCreator::createMenuType("iconmenu", screen_number); |
271 | if (submenu == 0) | 271 | if (! submenu) |
272 | return; | 272 | return; |
273 | if (str_label.empty()) | 273 | if (str_label.empty()) |
274 | menu.insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"), submenu); | 274 | menu.insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"), submenu); |
@@ -281,12 +281,12 @@ insertMenuItem(lua::state &l, FbTk::Menu &menu, FbTk::StringConvertor &parent_co | |||
281 | else | 281 | else |
282 | menu.insert(str_label, exit_cmd); | 282 | menu.insert(str_label, exit_cmd); |
283 | } else if (str_key == "config") { | 283 | } else if (str_key == "config") { |
284 | menu.insert(str_label, &screen->configMenu()); | 284 | menu.insert(str_label, FbTk::RefCount<FbTk::Menu>(screen->configMenu()) ); |
285 | } else if(str_key == "menu") { | 285 | } else if(str_key == "menu") { |
286 | std::auto_ptr<FbMenu> t(MenuCreator::createMenu("", screen_number)); | 286 | FbTk::RefCount<FbTk::Menu> t(MenuCreator::createMenu("", screen_number)); |
287 | l.pushvalue(-1); | 287 | l.pushvalue(-1); |
288 | createMenu_(*t, l, *conv, reloader); | 288 | createMenu_(*t, l, *conv, reloader); |
289 | menu.insert(str_label, t.release()); | 289 | menu.insert(str_label, t); |
290 | } else { | 290 | } else { |
291 | // items that have a parameter | 291 | // items that have a parameter |
292 | const string &str_cmd = getField(l, -1, "param"); | 292 | const string &str_cmd = getField(l, -1, "param"); |
@@ -301,16 +301,15 @@ insertMenuItem(lua::state &l, FbTk::Menu &menu, FbTk::StringConvertor &parent_co | |||
301 | menu.insert(new StyleMenuItem(str_label, str_cmd)); | 301 | menu.insert(new StyleMenuItem(str_label, str_cmd)); |
302 | else if (str_key == "stylesdir") | 302 | else if (str_key == "stylesdir") |
303 | menu.insert(str_label, | 303 | menu.insert(str_label, |
304 | createStyleMenu(screen_number, str_label, reloader, str_cmd).release()); | 304 | createStyleMenu(screen_number, str_label, reloader, str_cmd)); |
305 | else if (str_key == "wallpapers") { | 305 | else if (str_key == "wallpapers") { |
306 | string program = getField(l, -1, "program"); | 306 | string program = getField(l, -1, "program"); |
307 | if(program.empty()) | 307 | if(program.empty()) |
308 | program = realProgramName("fbsetbg"); | 308 | program = realProgramName("fbsetbg"); |
309 | menu.insert(str_label, createRootCmdMenu(screen_number, str_label, str_cmd, | 309 | menu.insert(str_label, createRootCmdMenu(screen_number, str_label, str_cmd, |
310 | reloader, program).release() ); | 310 | reloader, program) ); |
311 | } else if (str_key == "workspaces") { | 311 | } else if (str_key == "workspaces") { |
312 | screen->workspaceMenu().setInternalMenu(); | 312 | menu.insert(str_label, FbTk::RefCount<FbTk::Menu>(screen->workspaceMenu()) ); |
313 | menu.insert(str_label, &screen->workspaceMenu()); | ||
314 | } else { | 313 | } else { |
315 | // finally, try window-related commands | 314 | // finally, try window-related commands |
316 | MenuCreator::createWindowMenuItem(str_key, str_label, menu); | 315 | MenuCreator::createWindowMenuItem(str_key, str_label, menu); |
@@ -396,17 +395,17 @@ void MenuCreator::createFromFile(const string &filename, | |||
396 | createMenu(inject_into, l, reloader); | 395 | createMenu(inject_into, l, reloader); |
397 | } | 396 | } |
398 | 397 | ||
399 | FbMenu *MenuCreator::createMenuType(const string &type, int screen_num) { | 398 | FbTk::RefCount<FbMenu> MenuCreator::createMenuType(const string &type, int screen_num) { |
399 | FbTk::RefCount<FbMenu> menu; | ||
400 | BScreen *screen = Fluxbox::instance()->findScreen(screen_num); | 400 | BScreen *screen = Fluxbox::instance()->findScreen(screen_num); |
401 | if (screen == 0) | 401 | |
402 | return 0; | ||
403 | if (type == "iconmenu") | 402 | if (type == "iconmenu") |
404 | return new ClientMenu(*screen, screen->iconList(), | 403 | menu.reset(new ClientMenu(*screen, screen->iconList(), |
405 | true); // listen to icon list changes | 404 | true)); // listen to icon list changes |
406 | else if (type == "workspacemenu") | 405 | else if (type == "workspacemenu") |
407 | return new WorkspaceMenu(*screen); | 406 | menu.reset(new WorkspaceMenu(*screen)); |
408 | 407 | ||
409 | return 0; | 408 | return menu; |
410 | } | 409 | } |
411 | 410 | ||
412 | bool MenuCreator::createWindowMenuItem(const string &type, | 411 | bool MenuCreator::createWindowMenuItem(const string &type, |
@@ -494,10 +493,9 @@ bool MenuCreator::createWindowMenuItem(const string &type, | |||
494 | if (screen == 0) | 493 | if (screen == 0) |
495 | return false; | 494 | return false; |
496 | 495 | ||
497 | FbTk::Menu *submenu = | 496 | FbTk::RefCount<FbTk::Menu> submenu( new AlphaMenu(screen->menuTheme(), |
498 | new AlphaMenu(screen->menuTheme(), | ||
499 | screen->imageControl(), | 497 | screen->imageControl(), |
500 | *screen->layerManager().getLayer(ResourceLayer::MENU)); | 498 | *screen->layerManager().getLayer(ResourceLayer::MENU)) ); |
501 | submenu->disableTitle(); | 499 | submenu->disableTitle(); |
502 | menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency", | 500 | menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency", |
503 | "Menu containing various transparency options"): label, | 501 | "Menu containing various transparency options"): label, |
@@ -515,17 +513,17 @@ bool MenuCreator::createWindowMenuItem(const string &type, | |||
515 | 513 | ||
516 | } else if (type == "sendto") { | 514 | } else if (type == "sendto") { |
517 | menu.insert(label.empty() ? _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"): | 515 | menu.insert(label.empty() ? _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"): |
518 | label, new SendToMenu(*Fluxbox::instance()->findScreen(menu.screenNumber()))); | 516 | label, FbTk::RefCount<FbTk::Menu>(new SendToMenu(*Fluxbox::instance()->findScreen(menu.screenNumber()))) ); |
519 | } else if (type == "layer") { | 517 | } else if (type == "layer") { |
520 | BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); | 518 | BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); |
521 | if (screen == 0) | 519 | if (screen == 0) |
522 | return false; | 520 | return false; |
523 | 521 | ||
524 | FbTk::Menu *submenu = new LayerMenu(screen->menuTheme(), | 522 | FbTk::RefCount<FbTk::Menu> submenu( new LayerMenu(screen->menuTheme(), |
525 | screen->imageControl(), | 523 | screen->imageControl(), |
526 | *screen->layerManager().getLayer(ResourceLayer::MENU), | 524 | *screen->layerManager().getLayer(ResourceLayer::MENU), |
527 | &context, | 525 | &context, |
528 | false); | 526 | false) ); |
529 | submenu->disableTitle(); | 527 | submenu->disableTitle(); |
530 | menu.insert(label.empty()?_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"):label, submenu); | 528 | menu.insert(label.empty()?_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"):label, submenu); |
531 | 529 | ||