aboutsummaryrefslogtreecommitdiff
path: root/src/MenuCreator.cc
diff options
context:
space:
mode:
authorPavel Labath <pavelo@centrum.sk>2011-07-02 15:21:24 (GMT)
committerPavel Labath <pavelo@centrum.sk>2011-11-01 09:57:20 (GMT)
commitf2709b26d8af7292f750fc05525ac90ad0d99c41 (patch)
tree794903544922abe2b90af6250de24124cd94d546 /src/MenuCreator.cc
parent0584414d3845239202d5ea02da2ce6fb5b1b0cbb (diff)
downloadfluxbox_pavel-f2709b26d8af7292f750fc05525ac90ad0d99c41.zip
fluxbox_pavel-f2709b26d8af7292f750fc05525ac90ad0d99c41.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.cc50
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
67namespace { 67namespace {
68 68
69std::auto_ptr<FbMenu> createStyleMenu(int screen_number, const string &label, 69FbTk::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
110std::auto_ptr<FbMenu> createRootCmdMenu(int screen_number, const string &label, 110FbTk::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
399FbMenu *MenuCreator::createMenuType(const string &type, int screen_num) { 398FbTk::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
412bool MenuCreator::createWindowMenuItem(const string &type, 411bool 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