aboutsummaryrefslogtreecommitdiff
path: root/src/MenuCreator.cc
diff options
context:
space:
mode:
authorMathias Gumz <akira@fluxbox.org>2015-01-15 13:24:46 (GMT)
committerMathias Gumz <akira@fluxbox.org>2015-01-15 13:25:05 (GMT)
commit8387742c8860694777f7c2c62da0a90c9e836988 (patch)
treee5bd5a50c3e033ea73a9339474750287d06aeb3f /src/MenuCreator.cc
parentb4cd45549013e8b45f95bf3e123cd14684948e91 (diff)
downloadfluxbox-8387742c8860694777f7c2c62da0a90c9e836988.zip
fluxbox-8387742c8860694777f7c2c62da0a90c9e836988.tar.bz2
Refactor menu code: be more explicit and compact
This commit is a preparation step for some menu cleanup ahead. To make it easier to understand which types of MenuItems are added where and when, I converted the overloaded FbTk::Menu::insert() functions into explicit ones (Menu::insertSubmenu(), Menu::insertItem(), etc. ). This makes it possible to just grep for 'insertSubmenu()'. Side effect this commit: it trims down the very verbose creation of menu items in regards to how the labels are created. Minor: FbTk::Menu::shown and FbTk::Menu::s_focused are moved out of the class.
Diffstat (limited to 'src/MenuCreator.cc')
-rw-r--r--src/MenuCreator.cc188
1 files changed, 99 insertions, 89 deletions
diff --git a/src/MenuCreator.cc b/src/MenuCreator.cc
index 41dcf73..b2b15f5 100644
--- a/src/MenuCreator.cc
+++ b/src/MenuCreator.cc
@@ -71,6 +71,60 @@ FbTk::StringConvertor s_stringconvertor(FbTk::StringConvertor::ToFbString);
71list<string> s_encoding_stack; 71list<string> s_encoding_stack;
72list<size_t> s_stacksize_stack; 72list<size_t> s_stacksize_stack;
73 73
74
75
76enum {
77 L_SHADE = 0,
78 L_MAXIMIZE,
79 L_ICONIFY,
80 L_CLOSE,
81 L_KILL,
82 L_LOWER,
83 L_RAISE,
84 L_STICK,
85 L_TITLE,
86 L_SENDTO,
87 L_LAYER,
88
89 L_ALPHA,
90
91 L_MENU_EXIT,
92 L_MENU_ICONS,
93};
94
95// returns 'label' if not empty, otherwise a (translated) default
96// value based upon 'type'
97const FbTk::FbString& _l(const FbTk::FbString& label, size_t type) {
98
99 _FB_USES_NLS;
100 static const FbTk::FbString _default_labels[] = {
101 _FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"),
102 _FB_XTEXT(Windowmenu, Maximize, "Maximize", "Maximize the window"),
103 _FB_XTEXT(Windowmenu, Iconify, "Iconify", "Iconify the window"),
104 _FB_XTEXT(Windowmenu, Close, "Close", "Close the window"),
105 _FB_XTEXT(Windowmenu, Kill, "Kill", "Kill the window"),
106 _FB_XTEXT(Windowmenu, Lower, "Lower", "Lower the window"),
107 _FB_XTEXT(Windowmenu, Raise, "Raise", "Raise the window"),
108 _FB_XTEXT(Windowmenu, Stick, "Stick", "Stick the window"),
109 _FB_XTEXT(Windowmenu, SetTitle, "Set Title", "Change the title of the window"),
110 _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"),
111 _FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"),
112
113 _FB_XTEXT(Configmenu, Transparency, "Transparency", "Menu containing various transparency options"),
114
115 _FB_XTEXT(Menu, Exit, "Exit", "Exit Command"),
116 _FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"),
117 };
118
119 if (label.empty()) {
120 return _default_labels[type];
121 }
122
123 return label;
124}
125
126
127
74/** 128/**
75 * Push the encoding onto the stack, and make it active. 129 * Push the encoding onto the stack, and make it active.
76 */ 130 */
@@ -169,7 +223,7 @@ void createStyleMenu(FbTk::Menu &parent, const string &label,
169 (style[style.length() - 1] != '~')) || 223 (style[style.length() - 1] != '~')) ||
170 FbTk::FileUtil::isRegularFile((style + "/theme.cfg").c_str()) || 224 FbTk::FileUtil::isRegularFile((style + "/theme.cfg").c_str()) ||
171 FbTk::FileUtil::isRegularFile((style + "/style.cfg").c_str())) 225 FbTk::FileUtil::isRegularFile((style + "/style.cfg").c_str()))
172 parent.insert(new StyleMenuItem(filelist[file_index], style)); 226 parent.insertItem(new StyleMenuItem(filelist[file_index], style));
173 } 227 }
174 // update menu graphics 228 // update menu graphics
175 parent.updateMenu(); 229 parent.updateMenu();
@@ -208,7 +262,7 @@ void createRootCmdMenu(FbTk::Menu &parent, const string &label,
208 if ((FbTk::FileUtil::isRegularFile(rootcmd.c_str()) && 262 if ((FbTk::FileUtil::isRegularFile(rootcmd.c_str()) &&
209 (filelist[file_index][0] != '.') && 263 (filelist[file_index][0] != '.') &&
210 (rootcmd[rootcmd.length() - 1] != '~'))) 264 (rootcmd[rootcmd.length() - 1] != '~')))
211 parent.insert(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd)); 265 parent.insertItem(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd));
212 } 266 }
213 // update menu graphics 267 // update menu graphics
214 parent.updateMenu(); 268 parent.updateMenu();
@@ -289,29 +343,22 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
289 FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", menu.screenNumber()); 343 FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", menu.screenNumber());
290 if (submenu == 0) 344 if (submenu == 0)
291 return; 345 return;
292 if (str_label.empty()) 346 menu.insertSubmenu(_l(str_label, L_MENU_ICONS), submenu);
293 menu.insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"));
294 else
295 menu.insert(str_label, submenu);
296 } else if (str_key == "exit") { // exit 347 } else if (str_key == "exit") { // exit
297 FbTk::RefCount<FbTk::Command<void> > exit_cmd(FbTk::CommandParser<void>::instance().parse("exit")); 348 FbTk::RefCount<FbTk::Command<void> > exit_cmd(FbTk::CommandParser<void>::instance().parse("exit"));
298 if (str_label.empty()) 349 menu.insertCommand(_l(str_label, L_MENU_EXIT), exit_cmd);
299 menu.insert(_FB_XTEXT(Menu, Exit, "Exit", "Exit Command"), exit_cmd);
300 else
301 menu.insert(str_label, exit_cmd);
302 } else if (str_key == "exec") { 350 } else if (str_key == "exec") {
303 // execute and hide menu
304 FbTk::RefCount<FbTk::Command<void> > exec_cmd(FbTk::CommandParser<void>::instance().parse("exec " + str_cmd)); 351 FbTk::RefCount<FbTk::Command<void> > exec_cmd(FbTk::CommandParser<void>::instance().parse("exec " + str_cmd));
305 menu.insert(str_label, exec_cmd); 352 menu.insertCommand(str_label, exec_cmd);
306 } else if (str_key == "macrocmd") { 353 } else if (str_key == "macrocmd") {
307 FbTk::RefCount<FbTk::Command<void> > macro_cmd(FbTk::CommandParser<void>::instance().parse("macrocmd " + str_cmd)); 354 FbTk::RefCount<FbTk::Command<void> > macro_cmd(FbTk::CommandParser<void>::instance().parse("macrocmd " + str_cmd));
308 menu.insert(str_label, macro_cmd); 355 menu.insertCommand(str_label, macro_cmd);
309 } else if (str_key == "style") { // style 356 } else if (str_key == "style") {
310 menu.insert(new StyleMenuItem(str_label, str_cmd)); 357 menu.insertItem(new StyleMenuItem(str_label, str_cmd));
311 } else if (str_key == "config") { 358 } else if (str_key == "config") {
312 BScreen *screen = Fluxbox::instance()->findScreen(screen_number); 359 BScreen *screen = Fluxbox::instance()->findScreen(screen_number);
313 if (screen != 0) 360 if (screen != 0)
314 menu.insert(str_label, &screen->configMenu()); 361 menu.insertSubmenu(str_label, &screen->configMenu());
315 } // end of config 362 } // end of config
316 else if (str_key == "include") { // include 363 else if (str_key == "include") { // include
317 364
@@ -363,7 +410,7 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
363 410
364 parseMenu(parse, *submenu, labelconvertor, reloader); 411 parseMenu(parse, *submenu, labelconvertor, reloader);
365 submenu->updateMenu(); 412 submenu->updateMenu();
366 menu.insert(str_label, submenu); 413 menu.insertSubmenu(str_label, submenu);
367 414
368 } // end of submenu 415 } // end of submenu
369 else if (str_key == "stylesdir" || str_key == "stylesmenu") { 416 else if (str_key == "stylesdir" || str_key == "stylesmenu") {
@@ -383,10 +430,10 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
383 BScreen *screen = Fluxbox::instance()->findScreen(screen_number); 430 BScreen *screen = Fluxbox::instance()->findScreen(screen_number);
384 if (screen != 0) { 431 if (screen != 0) {
385 screen->workspaceMenu().setInternalMenu(); 432 screen->workspaceMenu().setInternalMenu();
386 menu.insert(str_label, &screen->workspaceMenu()); 433 menu.insertSubmenu(str_label, &screen->workspaceMenu());
387 } 434 }
388 } else if (str_key == "separator") { 435 } else if (str_key == "separator") {
389 menu.insert(new FbTk::MenuSeparator()); 436 menu.insertItem(new FbTk::MenuSeparator());
390 } else if (str_key == "encoding") { 437 } else if (str_key == "encoding") {
391 startEncoding(str_cmd); 438 startEncoding(str_cmd);
392 } else if (str_key == "endencoding") { 439 } else if (str_key == "endencoding") {
@@ -400,14 +447,14 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
400 // special NLS default labels 447 // special NLS default labels
401 if (str_label.empty()) { 448 if (str_label.empty()) {
402 if (str_key == "reconfig" || str_key == "reconfigure") { 449 if (str_key == "reconfig" || str_key == "reconfigure") {
403 menu.insert(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command); 450 menu.insertCommand(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command);
404 return; 451 return;
405 } else if (str_key == "restart") { 452 } else if (str_key == "restart") {
406 menu.insert(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command); 453 menu.insertCommand(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command);
407 return; 454 return;
408 } 455 }
409 } 456 }
410 menu.insert(str_label, command); 457 menu.insertCommand(str_label, command);
411 } 458 }
412 } 459 }
413 if (menu.numberOfItems() != 0) { 460 if (menu.numberOfItems() != 0) {
@@ -498,122 +545,85 @@ bool MenuCreator::createWindowMenuItem(const string &type,
498 _FB_USES_NLS; 545 _FB_USES_NLS;
499 546
500 static MenuContext context; 547 static MenuContext context;
548 int screen = menu.screenNumber();
501 549
502 if (type == "shade") { 550 if (type == "shade") {
503 static WindowMenuAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false); 551 static WindowMenuAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false);
504 menu.insert(new FbTk::BoolMenuItem( 552 menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_SHADE), res));
505 label.empty()?_FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"):label,
506 res));
507
508 } else if (type == "maximize") { 553 } else if (type == "maximize") {
509 RefCmd maximize_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeFull)); 554 RefCmd maximize_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeFull));
510 RefCmd maximize_vert_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeVertical)); 555 RefCmd maximize_vert_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeVertical));
511 RefCmd maximize_horiz_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeHorizontal)); 556 RefCmd maximize_horiz_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeHorizontal));
512 FbTk::MultiButtonMenuItem *maximize_item = 557 FbTk::MultiButtonMenuItem *maximize_item =
513 new FbTk::MultiButtonMenuItem(3, 558 new FbTk::MultiButtonMenuItem(3, _l(label, L_MAXIMIZE));
514 label.empty()?
515 _FB_XTEXT(Windowmenu, Maximize,
516 "Maximize", "Maximize the window"):
517 label);
518 // create maximize item with:
519 // button1: Maximize normal
520 // button2: Maximize Vertical
521 // button3: Maximize Horizontal
522 maximize_item->setCommand(1, maximize_cmd); 559 maximize_item->setCommand(1, maximize_cmd);
523 maximize_item->setCommand(2, maximize_vert_cmd); 560 maximize_item->setCommand(2, maximize_vert_cmd);
524 maximize_item->setCommand(3, maximize_horiz_cmd); 561 maximize_item->setCommand(3, maximize_horiz_cmd);
525 menu.insert(maximize_item); 562 menu.insertItem(maximize_item);
526 } else if (type == "iconify") { 563 } else if (type == "iconify") {
527 static WindowMenuAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false); 564 static WindowMenuAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false);
528 menu.insert(new FbTk::BoolMenuItem( 565 menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_ICONIFY), res));
529 label.empty() ?
530 _FB_XTEXT(Windowmenu, Iconify,
531 "Iconify", "Iconify the window") :
532 label, res));
533 } else if (type == "close") { 566 } else if (type == "close") {
534 RefCmd close_cmd(new WindowCmd<void>(&FluxboxWindow::close)); 567 RefCmd close_cmd(new WindowCmd<void>(&FluxboxWindow::close));
535 menu.insert(label.empty() ? 568 menu.insertCommand(_l(label, L_CLOSE), close_cmd);
536 _FB_XTEXT(Windowmenu, Close,
537 "Close", "Close the window") :
538 label, close_cmd);
539 } else if (type == "kill" || type == "killwindow") { 569 } else if (type == "kill" || type == "killwindow") {
540 RefCmd kill_cmd(new WindowCmd<void>(&FluxboxWindow::kill)); 570 RefCmd kill_cmd(new WindowCmd<void>(&FluxboxWindow::kill));
541 menu.insert(label.empty() ? 571 menu.insertCommand(_l(label, L_KILL), kill_cmd);
542 _FB_XTEXT(Windowmenu, Kill,
543 "Kill", "Kill the window"):
544 label, kill_cmd);
545 } else if (type == "lower") { 572 } else if (type == "lower") {
546 RefCmd lower_cmd(new WindowCmd<void>(&FluxboxWindow::lower)); 573 RefCmd lower_cmd(new WindowCmd<void>(&FluxboxWindow::lower));
547 menu.insert( label.empty() ? 574 menu.insertCommand(_l(label, L_LOWER), lower_cmd);
548 _FB_XTEXT(Windowmenu, Lower,
549 "Lower", "Lower the window"):
550 label, lower_cmd);
551 } else if (type == "raise") { 575 } else if (type == "raise") {
552 RefCmd raise_cmd(new WindowCmd<void>(&FluxboxWindow::raise)); 576 RefCmd raise_cmd(new WindowCmd<void>(&FluxboxWindow::raise));
553 menu.insert(label.empty() ? 577 menu.insertCommand(_l(label, L_RAISE), raise_cmd);
554 _FB_XTEXT(Windowmenu, Raise,
555 "Raise", "Raise the window"):
556 label, raise_cmd);
557
558 } else if (type == "stick") { 578 } else if (type == "stick") {
559 static WindowMenuAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false); 579 static WindowMenuAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false);
560 menu.insert(new FbTk::BoolMenuItem( 580 menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_STICK), res));
561 label.empty() ?
562 _FB_XTEXT(Windowmenu, Stick,
563 "Stick", "Stick the window"):
564 label, res));
565 } else if (type == "settitledialog") { 581 } else if (type == "settitledialog") {
566 RefCmd setname_cmd(new SetTitleDialogCmd()); 582 RefCmd setname_cmd(new SetTitleDialogCmd());
567 menu.insert(label.empty() ? 583 menu.insertCommand(_l(label, L_TITLE), setname_cmd);
568 _FB_XTEXT(Windowmenu, SetTitle,
569 "Set Title", "Change the title of the window"):
570 label, setname_cmd);
571#ifdef HAVE_XRENDER 584#ifdef HAVE_XRENDER
572 } else if (type == "alpha") { 585 } else if (type == "alpha") {
573 if (FbTk::Transparent::haveComposite() || 586 if (FbTk::Transparent::haveComposite() ||
574 FbTk::Transparent::haveRender()) { 587 FbTk::Transparent::haveRender()) {
575 BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); 588 BScreen* s = Fluxbox::instance()->findScreen(screen);
576 if (screen == 0) 589 if (s == 0)
577 return false; 590 return false;
578 591
579 FbTk::Menu *submenu = 592 FbTk::Menu *submenu =
580 new AlphaMenu(screen->menuTheme(), 593 new AlphaMenu(s->menuTheme(),
581 screen->imageControl(), 594 s->imageControl(),
582 *screen->layerManager().getLayer(ResourceLayer::MENU)); 595 *(s->layerManager()).getLayer(ResourceLayer::MENU));
583 submenu->disableTitle(); 596 submenu->disableTitle();
584 menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency", 597 menu.insertSubmenu(_l(label, L_ALPHA), submenu);
585 "Menu containing various transparency options"): label,
586 submenu);
587 } 598 }
588#endif // HAVE_XRENDER 599#endif // HAVE_XRENDER
589 } else if (type == "extramenus") { 600 } else if (type == "extramenus") {
590 BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); 601 BScreen* s = Fluxbox::instance()->findScreen(screen);
591 BScreen::ExtraMenus::iterator it = screen->extraWindowMenus().begin(); 602 BScreen::ExtraMenus::iterator it = s->extraWindowMenus().begin();
592 BScreen::ExtraMenus::iterator it_end = screen->extraWindowMenus().end(); 603 BScreen::ExtraMenus::iterator it_end = s->extraWindowMenus().end();
593 for (; it != it_end; ++it) { 604 for (; it != it_end; ++it) {
594 it->second->disableTitle(); 605 it->second->disableTitle();
595 menu.insert(it->first, it->second); 606 menu.insertSubmenu(it->first, it->second);
596 } 607 }
597 608
598 } else if (type == "sendto") { 609 } else if (type == "sendto") {
599 menu.insert(label.empty() ? _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"): 610 menu.insertSubmenu(_l(label, L_SENDTO),
600 label, new SendToMenu(*Fluxbox::instance()->findScreen(menu.screenNumber()))); 611 new SendToMenu(*Fluxbox::instance()->findScreen(screen)));
601 } else if (type == "layer") { 612 } else if (type == "layer") {
602 BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); 613 BScreen* s = Fluxbox::instance()->findScreen(screen);
603 if (screen == 0) 614 if (s == 0)
604 return false; 615 return false;
605 616
606 FbTk::Menu *submenu = new LayerMenu(screen->menuTheme(), 617 FbTk::Menu *submenu = new LayerMenu(s->menuTheme(),
607 screen->imageControl(), 618 s->imageControl(),
608 *screen->layerManager().getLayer(ResourceLayer::MENU), 619 *(s->layerManager()).getLayer(ResourceLayer::MENU),
609 &context, 620 &context,
610 false); 621 false);
611 submenu->disableTitle(); 622 submenu->disableTitle();
612 menu.insert(label.empty()?_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"):label, submenu); 623 menu.insertSubmenu(_l(label, L_LAYER), submenu);
613
614 624
615 } else if (type == "separator") { 625 } else if (type == "separator") {
616 menu.insert(new FbTk::MenuSeparator()); 626 menu.insertItem(new FbTk::MenuSeparator());
617 } else 627 } else
618 return false; 628 return false;
619 629