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.
This commit is contained in:
Mathias Gumz 2015-01-15 14:24:46 +01:00
parent b4cd455490
commit 8387742c88
15 changed files with 373 additions and 406 deletions

View file

@ -53,7 +53,7 @@ AlphaMenu::AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
m_focused_alpha_item =
new FbTk::IntMenuItem(focused_alpha_label, m_focused_alpha, 0, 255, *this);
insert(m_focused_alpha_item);
insertItem(m_focused_alpha_item);
const FbTk::FbString unfocused_alpha_label =
_FB_XTEXT(Configmenu, UnfocusedAlpha,
@ -62,14 +62,14 @@ AlphaMenu::AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
m_unfocused_alpha_item =
new FbTk::IntMenuItem(unfocused_alpha_label, m_unfocused_alpha, 0, 255, *this);
insert(m_unfocused_alpha_item);
insertItem(m_unfocused_alpha_item);
const FbTk::FbString usedefault_label = _FB_XTEXT(Windowmenu, DefaultAlpha,
"Use Defaults",
"Default transparency settings for this window");
FbTk::MenuItem *usedefault_item =
new AlphaMenuSelectItem(usedefault_label, *this);
insert(usedefault_item);
insertItem(usedefault_item);
updateMenu();
}

View file

@ -118,9 +118,9 @@ void ClientMenu::refreshMenu() {
FluxboxWindow::ClientList::iterator client_it_end =
win->clientList().end();
for (; client_it != client_it_end; ++client_it)
insert(new ClientMenuItem(**client_it, *this));
insertItem(new ClientMenuItem(**client_it, *this));
} else
insert(new ClientMenuItem(**win_it, *this));
insertItem(new ClientMenuItem(**win_it, *this));
}
updateMenu();

View file

@ -37,11 +37,7 @@
#include "FbTk/I18n.hh"
#include "FbTk/FbTime.hh"
#ifdef HAVE_CTIME
#include <ctime>
#else
#include <time.h>
#endif
#include <ctime>
#include <typeinfo>
#include <cstdio>
@ -171,9 +167,9 @@ ClockTool::ClockTool(const FbTk::FbWindow &parent,
FbTk::RefCount<FbTk::Command<void> > saverc(FbTk::CommandParser<void>::instance().parse("saverc"));
FbTk::MenuItem *item = new ClockMenuItem(*this);
item->setCommand(saverc);
menu.insert(item);
menu.insertItem(item);
FbTk::RefCount<FbTk::Command<void> > editformat_cmd(new EditClockFormatCmd());
menu.insert(_FB_XTEXT(Toolbar, ClockEditFormat, "Edit Clock Format", "edit Clock Format") , editformat_cmd);
menu.insertCommand(_FB_XTEXT(Toolbar, ClockEditFormat, "Edit Clock Format", "edit Clock Format") , editformat_cmd);
updateTime();
}

View file

@ -85,9 +85,11 @@ void renderMenuPixmap(Pixmap& pm, FbTk::FbWindow* win, int width, int height, co
namespace FbTk {
Menu *Menu::shown = 0;
Menu* s_shown = 0; // if there's a menu open at all
Menu* s_focused = 0; // holds currently focused menu
Menu *Menu::s_focused = 0;
Menu* Menu::shownMenu() { return s_shown; }
Menu* Menu::focused() { return s_focused; }
Menu::Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl):
m_theme(tm),
@ -101,8 +103,8 @@ Menu::Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl):
m_active_index(-1),
m_shape(0),
m_need_update(true) {
// setup timers
// setup timers
RefCount<Command<void> > show_cmd(new SimpleCommand<Menu>(*this, &Menu::openSubmenu));
m_submenu_timer.setCommand(show_cmd);
m_submenu_timer.fireOnce(true);
@ -192,8 +194,8 @@ Menu::~Menu() {
m_window.hide();
if (shown && shown->window() == window())
shown = 0;
if (s_shown && s_shown->window() == window())
s_shown = 0;
removeAll();
@ -210,59 +212,61 @@ Menu::~Menu() {
s_focused = 0;
}
int Menu::insert(const FbString &label, RefCount<Command<void> > &cmd, int pos) {
return insert(new MenuItem(label, cmd, this), pos);
int Menu::insertCommand(const FbString &label, RefCount<Command<void> > &cmd, int pos) {
return insertItem(new MenuItem(label, cmd, this), pos);
}
int Menu::insert(const FbString &label, int pos) {
return insert(new MenuItem(label, *this), pos);
return insertItem(new MenuItem(label, *this), pos);
}
int Menu::insert(const FbString &label, Menu *submenu, int pos) {
return insert(new MenuItem(label, submenu, this), pos);
int Menu::insertSubmenu(const FbString &label, Menu *submenu, int pos) {
return insertItem(new MenuItem(label, submenu, this), pos);
}
int Menu::insert(MenuItem *item, int pos) {
int Menu::insertItem(MenuItem *item, int pos) {
if (item == 0)
return menuitems.size();
return m_items.size();
if (pos == -1) {
item->setIndex(menuitems.size());
menuitems.push_back(item);
item->setIndex(m_items.size());
m_items.push_back(item);
} else {
menuitems.insert(menuitems.begin() + pos, item);
m_items.insert(m_items.begin() + pos, item);
fixMenuItemIndices();
if (m_active_index >= pos)
m_active_index++;
}
m_need_update = true; // we need to redraw the menu
return menuitems.size();
return m_items.size();
}
void Menu::fixMenuItemIndices() {
for (size_t i = 0; i < menuitems.size(); i++)
menuitems[i]->setIndex(i);
for (size_t i = 0; i < m_items.size(); i++)
m_items[i]->setIndex(i);
}
int Menu::remove(unsigned int index) {
if (index >= menuitems.size()) {
if (index >= m_items.size()) {
#ifdef DEBUG
cerr << __FILE__ << "(" << __LINE__ << ") Bad index (" << index
<< ") given to Menu::remove()"
<< " -- should be between 0 and " << menuitems.size()-1
<< " -- should be between 0 and " << m_items.size()-1
<< " inclusive." << endl;
#endif // DEBUG
return -1;
}
Menuitems::iterator it = menuitems.begin() + index;
Menuitems::iterator it = m_items.begin() + index;
MenuItem *item = (*it);
if (item) {
if (!m_matches.empty())
resetTypeAhead();
menuitems.erase(it);
m_items.erase(it);
// avoid O(n^2) algorithm with removeAll()
if (index != menuitems.size())
if (index != m_items.size())
fixMenuItemIndices();
if (item->submenu() != 0) {
@ -291,12 +295,12 @@ int Menu::remove(unsigned int index) {
m_need_update = true; // we need to redraw the menu
return menuitems.size();
return m_items.size();
}
void Menu::removeAll() {
while (!menuitems.empty())
remove(menuitems.size()-1);
while (!m_items.empty())
remove(m_items.size()-1);
}
void Menu::raise() {
@ -308,26 +312,24 @@ void Menu::lower() {
}
void Menu::cycleItems(bool reverse) {
Menuitems vec;
Menuitems& items = m_items;
if (m_type_ahead.stringSize())
vec = m_matches;
else
vec = menuitems;
items = m_matches;
if (vec.size() < 1)
if (items.empty())
return;
// find the next item to select
// this algorithm assumes menuitems are sorted properly
int new_index = -1;
bool passed = !validIndex(m_active_index);
for (size_t i = 0; i < vec.size(); i++) {
if (!isItemSelectable(vec[i]->getIndex()) ||
vec[i]->getIndex() == m_active_index)
for (size_t i = 0; i < items.size(); i++) {
if (!isItemSelectable(items[i]->getIndex()) ||
items[i]->getIndex() == m_active_index)
continue;
// determine whether or not we've passed the active index
if (!passed && vec[i]->getIndex() > m_active_index) {
if (!passed && items[i]->getIndex() > m_active_index) {
if (reverse && new_index != -1)
break;
passed = true;
@ -335,10 +337,10 @@ void Menu::cycleItems(bool reverse) {
// decide if we want to keep this item
if (passed && !reverse) {
new_index = vec[i]->getIndex();
new_index = items[i]->getIndex();
break;
} else if (reverse || new_index == -1)
new_index = vec[i]->getIndex();
new_index = items[i]->getIndex();
}
if (new_index != -1)
@ -350,11 +352,11 @@ void Menu::setActiveIndex(int new_index) {
int old_active_index = m_active_index;
m_active_index = new_index;
if (validIndex(old_active_index) &&
menuitems[old_active_index] != 0) {
if (menuitems[old_active_index]->submenu()) {
m_items[old_active_index] != 0) {
if (m_items[old_active_index]->submenu()) {
// we need to do this explicitly on the m_window
// since it might hide the parent if we use Menu::hide
menuitems[old_active_index]->submenu()->internal_hide();
m_items[old_active_index]->submenu()->internal_hide();
}
clearItem(old_active_index);
}
@ -365,11 +367,11 @@ void Menu::enterSubmenu() {
if (!validIndex(m_active_index))
return;
Menu *submenu = menuitems[m_active_index]->submenu();
Menu *submenu = m_items[m_active_index]->submenu();
if (submenu == 0)
return;
if (submenu->menuitems.empty())
if (submenu->m_items.empty())
return;
drawSubmenu(m_active_index);
@ -393,15 +395,15 @@ void Menu::updateMenu() {
} else
m_item_w = 1;
if (validIndex(m_active_index) && !menuitems[m_active_index]->isEnabled()) {
if (validIndex(m_active_index) && !m_items[m_active_index]->isEnabled()) {
// find the nearest enabled menuitem and highlight it
for (size_t i = 1; i < menuitems.size(); i++) {
for (size_t i = 1; i < m_items.size(); i++) {
if (validIndex(m_active_index + i) &&
menuitems[m_active_index + i]->isEnabled()) {
m_items[m_active_index + i]->isEnabled()) {
m_active_index += i;
break;
} else if (validIndex(m_active_index - i) &&
menuitems[m_active_index - i]->isEnabled()) {
m_items[m_active_index - i]->isEnabled()) {
m_active_index -= i;
break;
}
@ -409,8 +411,8 @@ void Menu::updateMenu() {
}
unsigned int ii = 0;
Menuitems::iterator it = menuitems.begin();
Menuitems::iterator it_end = menuitems.end();
Menuitems::iterator it = m_items.begin();
Menuitems::iterator it_end = m_items.end();
for (; it != it_end; ++it) {
ii = (*it)->width(theme());
m_item_w = (ii > m_item_w ? ii : m_item_w);
@ -419,10 +421,10 @@ void Menu::updateMenu() {
if (m_item_w < 1)
m_item_w = 1;
if (!menuitems.empty()) {
if (!m_items.empty()) {
m_columns = 1;
while (theme()->itemHeight() * (menuitems.size() + 1) / m_columns +
while (theme()->itemHeight() * (m_items.size() + 1) / m_columns +
theme()->titleHeight() + theme()->borderWidth() > m_screen_height) {
m_columns++;
}
@ -430,8 +432,8 @@ void Menu::updateMenu() {
if (m_columns < m_min_columns)
m_columns = m_min_columns;
m_rows_per_column = menuitems.size() / m_columns;
if (menuitems.size() % m_columns) m_rows_per_column++;
m_rows_per_column = m_items.size() / m_columns;
if (m_items.size() % m_columns) m_rows_per_column++;
} else {
m_columns = 0;
m_rows_per_column = 0;
@ -522,7 +524,7 @@ void Menu::updateMenu() {
void Menu::show() {
if (isVisible() || menuitems.empty())
if (isVisible() || m_items.empty())
return;
m_visible = true;
@ -537,9 +539,9 @@ void Menu::show() {
m_window.show();
raise();
if (shown && shown != this)
shown->hide();
shown = this;
if (s_shown && s_shown != this)
s_shown->hide();
s_shown = this;
}
@ -565,8 +567,8 @@ void Menu::hide(bool force) {
void Menu::grabInputFocus() {
// if there's a submenu open, focus it instead
if (validIndex(m_which_sub) &&
menuitems[m_which_sub]->submenu()->isVisible()) {
menuitems[m_which_sub]->submenu()->grabInputFocus();
m_items[m_which_sub]->submenu()->isVisible()) {
m_items[m_which_sub]->submenu()->grabInputFocus();
return;
}
@ -582,14 +584,14 @@ void Menu::clearWindow() {
m_frame.clear();
// clear foreground bits of frame items
for (size_t i = 0; i < menuitems.size(); i++) {
for (size_t i = 0; i < m_items.size(); i++) {
clearItem(i, false); // no clear
}
m_shape->update();
}
void Menu::redrawFrame(FbDrawable &drawable) {
for (size_t i = 0; i < menuitems.size(); i++) {
for (size_t i = 0; i < m_items.size(); i++) {
drawItem(drawable, i);
}
@ -598,7 +600,7 @@ void Menu::redrawFrame(FbDrawable &drawable) {
void Menu::internal_hide(bool first) {
if (validIndex(m_which_sub)) {
MenuItem *tmp = menuitems[m_which_sub];
MenuItem *tmp = m_items[m_which_sub];
if (tmp && tmp->submenu() && tmp->submenu()->isVisible())
tmp->submenu()->internal_hide(false);
}
@ -609,11 +611,11 @@ void Menu::internal_hide(bool first) {
m_active_index = -1;
clearItem(old); // clear old area from highlight
if (shown == this) {
if (s_shown == this) {
if (m_parent && m_parent->isVisible())
shown = m_parent;
s_shown = m_parent;
else
shown = (Menu *) 0;
s_shown = 0;
}
m_torn = m_visible = m_closing = false;
@ -644,7 +646,7 @@ void Menu::move(int x, int y) {
clearWindow();
if (validIndex(m_which_sub) &&
menuitems[m_which_sub]->submenu()->isVisible())
m_items[m_which_sub]->submenu()->isVisible())
drawSubmenu(m_which_sub);
}
@ -676,17 +678,17 @@ void Menu::redrawTitle(FbDrawable &drawable) {
void Menu::drawSubmenu(unsigned int index) {
if (validIndex(m_which_sub) && static_cast<unsigned int>(m_which_sub) != index) {
MenuItem *itmp = menuitems[m_which_sub];
MenuItem *itmp = m_items[m_which_sub];
if (! itmp->submenu()->isTorn())
itmp->submenu()->internal_hide();
}
if (index >= menuitems.size())
if (index >= m_items.size())
return;
MenuItem *item = menuitems[index];
MenuItem *item = m_items[index];
if (item->submenu() && isVisible() && (! item->submenu()->isTorn()) &&
item->isEnabled()) {
@ -750,7 +752,7 @@ void Menu::drawSubmenu(unsigned int index) {
clearItem(index);
if (! item->submenu()->isVisible() && item->submenu()->numberOfItems() > 0) {
shown = item->submenu();
s_shown = item->submenu();
item->showSubmenu();
item->submenu()->raise();
}
@ -764,11 +766,11 @@ void Menu::drawSubmenu(unsigned int index) {
int Menu::drawItem(FbDrawable &drawable, unsigned int index,
bool highlight, bool exclusive_drawable) {
if (index >= menuitems.size() || menuitems.empty() ||
if (index >= m_items.size() || m_items.empty() ||
m_rows_per_column == 0)
return 0;
MenuItem *item = menuitems[index];
MenuItem *item = m_items[index];
if (! item) return 0;
// ensure we do not divide by 0 and thus cause a SIGFPE
@ -804,7 +806,7 @@ void Menu::setLabel(const FbTk::BiDiString &labelstr) {
void Menu::setItemSelected(unsigned int index, bool sel) {
if (index >= menuitems.size()) return;
if (index >= m_items.size()) return;
MenuItem *item = find(index);
if (! item) return;
@ -814,7 +816,7 @@ void Menu::setItemSelected(unsigned int index, bool sel) {
bool Menu::isItemSelected(unsigned int index) const{
if (index >= menuitems.size()) return false;
if (index >= m_items.size()) return false;
const MenuItem *item = find(index);
if (!item)
@ -825,7 +827,7 @@ bool Menu::isItemSelected(unsigned int index) const{
void Menu::setItemEnabled(unsigned int index, bool enable) {
if (index >= menuitems.size()) return;
if (index >= m_items.size()) return;
MenuItem *item = find(index);
if (! item) return;
@ -835,7 +837,7 @@ void Menu::setItemEnabled(unsigned int index, bool enable) {
bool Menu::isItemEnabled(unsigned int index) const {
if (index >= menuitems.size()) return false;
if (index >= m_items.size()) return false;
const MenuItem *item = find(index);
if (!item)
@ -846,7 +848,7 @@ bool Menu::isItemEnabled(unsigned int index) const {
bool Menu::isItemSelectable(unsigned int index) const {
if (index >= menuitems.size()) return false;
if (index >= m_items.size()) return false;
const MenuItem *item = find(index);
return (!item || !item->isEnabled()) ? false : true;
@ -864,8 +866,8 @@ void Menu::handleEvent(XEvent &event) {
s_focused = this;
// if there's a submenu open, focus it instead
if (validIndex(m_which_sub) &&
menuitems[m_which_sub]->submenu()->isVisible())
menuitems[m_which_sub]->submenu()->grabInputFocus();
m_items[m_which_sub]->submenu()->isVisible())
m_items[m_which_sub]->submenu()->grabInputFocus();
}
}
@ -883,7 +885,7 @@ void Menu::buttonPressEvent(XButtonEvent &be) {
int w = (column * m_rows_per_column) + i;
if (validIndex(w) && isItemSelectable(static_cast<unsigned int>(w))) {
MenuItem *item = menuitems[w];
MenuItem *item = m_items[w];
if (item->submenu()) {
if (!item->submenu()->isVisible())
@ -903,7 +905,7 @@ void Menu::buttonReleaseEvent(XButtonEvent &re) {
m_moving = false;
if (validIndex(m_which_sub) &&
menuitems[m_which_sub]->submenu()->isVisible())
m_items[m_which_sub]->submenu()->isVisible())
drawSubmenu(m_which_sub);
if (alpha() < 255) {
@ -929,7 +931,7 @@ void Menu::buttonReleaseEvent(XButtonEvent &re) {
if (m_active_index == w && isItemEnabled(w) &&
re.x > ix && re.x < (signed) (ix + m_item_w) &&
re.y > iy && re.y < (signed) (iy + theme()->itemHeight())) {
menuitems[w]->click(re.button, re.time, re.state);
m_items[w]->click(re.button, re.time, re.state);
} else {
int old = m_active_index;
m_active_index = w;
@ -955,7 +957,7 @@ void Menu::motionNotifyEvent(XMotionEvent &me) {
clearItem(m_active_index);
if (validIndex(m_which_sub) &&
menuitems[m_which_sub]->submenu()->isVisible())
m_items[m_which_sub]->submenu()->isVisible())
drawSubmenu(m_which_sub);
} else {
// we dont call ::move here 'cause we dont want to update transparency
@ -977,7 +979,7 @@ void Menu::motionNotifyEvent(XMotionEvent &me) {
if (s_focused != this && s_focused != 0)
grabInputFocus();
MenuItem *itmp = menuitems[w];
MenuItem *itmp = m_items[w];
if (itmp == 0)
return;
@ -987,7 +989,7 @@ void Menu::motionNotifyEvent(XMotionEvent &me) {
clearItem(w);
clearItem(old);
MenuItem *item = validIndex(m_which_sub) ? menuitems[m_which_sub] : 0;
MenuItem *item = validIndex(m_which_sub) ? m_items[m_which_sub] : 0;
if (item != 0 && item->submenu() && item->submenu()->isVisible() &&
!item->submenu()->isTorn()) {
// setup hide timer for submenu
@ -1045,9 +1047,9 @@ void Menu::exposeEvent(XExposeEvent &ee) {
// set the iterator to the first item in the column needing redrawing
int index = id + i * m_rows_per_column;
if (index < static_cast<int>(menuitems.size()) && index >= 0) {
Menuitems::iterator it = menuitems.begin() + index;
Menuitems::iterator it_end = menuitems.end();
if (index < static_cast<int>(m_items.size()) && index >= 0) {
Menuitems::iterator it = m_items.begin() + index;
Menuitems::iterator it_end = m_items.end();
for (ii = id; ii <= id_d && it != it_end; ++it, ii++) {
int index = ii + (i * m_rows_per_column);
// redraw the item
@ -1119,7 +1121,7 @@ void Menu::keyPressEvent(XKeyEvent &event) {
isItemEnabled(m_active_index)) {
// send fake button click
int button = (event.state & ShiftMask) ? 3 : 1;
if (menuitems[m_active_index]->submenu() != 0 && button == 1)
if (m_items[m_active_index]->submenu() != 0 && button == 1)
enterSubmenu();
else {
find(m_active_index)->click(button, event.time, event.state);
@ -1131,7 +1133,7 @@ void Menu::keyPressEvent(XKeyEvent &event) {
case XK_Tab:
case XK_ISO_Left_Tab:
if (validIndex(m_active_index) && isItemEnabled(m_active_index) &&
menuitems[m_active_index]->submenu() && m_matches.size() == 1) {
m_items[m_active_index]->submenu() && m_matches.size() == 1) {
enterSubmenu();
m_type_ahead.reset();
} else {
@ -1156,12 +1158,12 @@ void Menu::leaveNotifyEvent(XCrossingEvent &ce) {
m_closing = false;
// if there's a submenu open, highlight its index and stop hide
if (validIndex(m_which_sub) && m_active_index != m_which_sub &&
menuitems[m_which_sub]->submenu()->isVisible()) {
m_items[m_which_sub]->submenu()->isVisible()) {
int old = m_active_index;
m_active_index = m_which_sub;
clearItem(m_active_index);
clearItem(old);
menuitems[m_which_sub]->submenu()->stopHide();
m_items[m_which_sub]->submenu()->stopHide();
}
}
@ -1194,17 +1196,17 @@ void Menu::reconfigure() {
void Menu::openSubmenu() {
int item = m_active_index;
if (!isVisible() || !validIndex(item) || !menuitems[item]->isEnabled() ||
if (!isVisible() || !validIndex(item) || !m_items[item]->isEnabled() ||
(s_focused != this && s_focused && s_focused->isVisible()))
return;
clearItem(item);
if (menuitems[item]->submenu() != 0) {
if (m_items[item]->submenu() != 0) {
// stop hide timer, so it doesnt hides the menu if we
// have the same submenu as the last shown submenu
// (window menu for clients inside workspacemenu for example)
menuitems[item]->submenu()->m_hide_timer.stop();
m_items[item]->submenu()->m_hide_timer.stop();
drawSubmenu(item);
}
@ -1228,15 +1230,15 @@ void Menu::themeReconfigured() {
m_need_update = true;
Menuitems::iterator it = menuitems.begin();
Menuitems::iterator it_end = menuitems.end();
Menuitems::iterator it = m_items.begin();
Menuitems::iterator it_end = m_items.end();
for (; it != it_end; ++it) {
(*it)->updateTheme(theme());
}
reconfigure();
}
void Menu::setScreen(int x, int y, int w, int h) {
void Menu::setScreen(int x, int y, unsigned int w, unsigned int h) {
m_screen_x = x;
m_screen_y = y;
m_screen_width = w;
@ -1277,28 +1279,28 @@ void Menu::clearItem(int index, bool clear, int search_index) {
int item_y = (row * item_h);
bool highlight = (index == m_active_index && isItemSelectable(index));
if (search_index < 0)
// find if we need to underline the item
if (search_index < 0) // need to underline the item
search_index = std::find(m_matches.begin(), m_matches.end(),
find(index)) - m_matches.begin();
// don't highlight if moving, doesn't work with alpha on
if (highlight && !m_moving) {
highlightItem(index);
if (search_index < (int)m_matches.size())
if (search_index < static_cast<int>(m_matches.size()))
drawLine(index, m_type_ahead.stringSize());
return;
} else if (clear)
m_frame.clearArea(item_x, item_y, item_w, item_h);
MenuItem *item = menuitems[index];
if (! item) return;
MenuItem* item = m_items[index];
if (!item)
return;
item->draw(m_frame, theme(), highlight,
true, false, item_x, item_y,
item_w, item_h);
if (search_index < (int)m_matches.size())
if (search_index < static_cast<int>(m_matches.size()))
drawLine(index, m_type_ahead.stringSize());
}
@ -1390,8 +1392,8 @@ void Menu::drawLine(int index, int size){
}
void Menu::hideShownMenu() {
if (shown)
shown->hide();
if (s_shown)
s_shown->hide();
}
} // end namespace FbTk

View file

@ -60,28 +60,18 @@ public:
@name manipulators
*/
//@{
/// add a menu item with a label and a command
int insert(const FbString &label, RefCount<Command<void> > &cmd, int pos=-1);
/// add empty menu item
int insertCommand(const FbString &label, RefCount<Command<void> > &cmd, int pos=-1);
int insert(const FbString &label, int pos=-1);
/// add submenu
int insert(const FbString &label, Menu *submenu, int pos= -1);
/// add menu item
int insert(MenuItem *item, int pos=-1);
/// remove an item
int insertSubmenu(const FbString &label, Menu *submenu, int pos= -1);
int insertItem(MenuItem *item, int pos=-1);
int remove(unsigned int item);
/// remove all items
void removeAll();
void setInternalMenu(bool val = true) { m_internal_menu = val; }
void setAlignment(Alignment a) { m_alignment = a; }
/// raise this window
virtual void raise();
/// lower this window
virtual void lower();
/// cycle through menuitems
void cycleItems(bool reverse);
/// set and highlight new active index
void setActiveIndex(int new_index);
void enterSubmenu();
@ -89,7 +79,7 @@ public:
void enableTitle();
bool isTitleVisible() const { return m_title_vis; }
void setScreen(int x, int y, int w, int h);
void setScreen(int x, int y, unsigned int w, unsigned int h);
/**
@name event handlers
@ -103,21 +93,16 @@ public:
void keyPressEvent(XKeyEvent &ke);
void leaveNotifyEvent(XCrossingEvent &ce);
//@}
/// get input focus
void grabInputFocus();
virtual void reconfigure();
/// set label string
void setLabel(const FbTk::BiDiString &labelstr);
/// move menu to x,y
virtual void move(int x, int y);
virtual void updateMenu();
void setItemSelected(unsigned int index, bool val);
void setItemEnabled(unsigned int index, bool val);
void setMinimumColumns(int columns) { m_min_columns = columns; }
virtual void drawSubmenu(unsigned int index);
/// show menu
virtual void show();
/// hide menu
virtual void hide(bool force = false);
virtual void clearWindow();
/*@}*/
@ -140,7 +125,7 @@ public:
int y() const { return m_window.y(); }
unsigned int width() const { return m_window.width(); }
unsigned int height() const { return m_window.height(); }
size_t numberOfItems() const { return menuitems.size(); }
size_t numberOfItems() const { return m_items.size(); }
int currentSubmenu() const { return m_which_sub; }
bool isItemSelected(unsigned int index) const;
@ -149,12 +134,11 @@ public:
FbTk::ThemeProxy<MenuTheme> &theme() { return m_theme; }
const FbTk::ThemeProxy<MenuTheme> &theme() const { return m_theme; }
unsigned char alpha() const { return theme()->alpha(); }
static Menu *shownMenu() { return shown; }
static Menu *focused() { return s_focused; }
static Menu* shownMenu();
static Menu* focused();
static void hideShownMenu();
/// @return menuitem at index
const MenuItem *find(unsigned int index) const { return menuitems[index]; }
MenuItem *find(unsigned int index) { return menuitems[index]; }
const MenuItem *find(size_t i) const { return m_items[i]; }
MenuItem *find(size_t i) { return m_items[i]; }
//@}
/// @return true if index is valid
bool validIndex(int index) const { return (index < static_cast<int>(numberOfItems()) && index >= 0); }
@ -198,7 +182,7 @@ private:
ImageControl &m_image_ctrl;
typedef std::vector<MenuItem *> Menuitems;
Menuitems menuitems;
Menuitems m_items;
TypeAhead<Menuitems, MenuItem *> m_type_ahead;
Menuitems m_matches;
@ -250,8 +234,6 @@ private:
// the corners
std::auto_ptr<FbTk::Shape> m_shape;
static Menu *shown; ///< used for determining if there's a menu open at all
static Menu *s_focused; ///< holds current input focused menu, so one can determine if a menu is focused
bool m_need_update;
Timer m_submenu_timer;
Timer m_hide_timer;

View file

@ -54,11 +54,7 @@
#include <typeinfo>
#include <iterator>
#ifdef HAVE_CSTRING
#include <cstring>
#else
#include <string.h>
#endif
#include <cstring>
using std::string;
using std::list;
@ -134,73 +130,60 @@ private:
FbTk::Container::Alignment m_mode;
};
enum {
L_TITLE = 0,
L_MODE_NONE,
L_MODE_ICONS,
L_MODE_NO_ICONS,
L_MODE_ICONS_WORKSPACE,
L_MODE_NOICONS_WORKSPACE,
L_MODE_WORKSPACE,
L_MODE_ALL,
L_LEFT,
L_RELATIVE,
L_RIGHT,
};
void setupModeMenu(FbTk::Menu &menu, IconbarTool &handler) {
using namespace FbTk;
_FB_USES_NLS;
menu.setLabel(_FB_XTEXT(Toolbar, IconbarMode, "Iconbar Mode", "Menu title - chooses which set of icons are shown in the iconbar"));
static const FbString _labels[] = {
_FB_XTEXT(Toolbar, IconbarMode, "Iconbar Mode", "Menu title - chooses which set of icons are shown in the iconbar"),
_FB_XTEXT(Toolbar, IconbarModeNone, "None", "No icons are shown in the iconbar"),
_FB_XTEXT(Toolbar, IconbarModeIcons, "Icons", "Iconified windows from all workspaces are shown"),
_FB_XTEXT(Toolbar, IconbarModeNoIcons, "NoIcons", "No iconified windows from all workspaces are shown"),
_FB_XTEXT(Toolbar, IconbarModeWorkspaceIcons, "WorkspaceIcons", "Iconified windows from this workspace are shown"),
_FB_XTEXT(Toolbar, IconbarModeWorkspaceNoIcons, "WorkspaceNoIcons", "No iconified windows from this workspace are shown"),
_FB_XTEXT(Toolbar, IconbarModeWorkspace, "Workspace", "Normal and iconified windows from this workspace are shown"),
_FB_XTEXT(Toolbar, IconbarModeAllWindows, "All Windows", "All windows are shown"),
_FB_XTEXT(Align, Left, "Left", "Align to the left"),
_FB_XTEXT(Align, Relative, "Relative", "Align relative to the width"),
_FB_XTEXT(Align, Right, "Right", "Align to the right"),
};
RefCount<Command<void> > saverc_cmd(new FbCommands::SaveResources());
menu.setLabel(_labels[L_TITLE]);
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_NONE], handler, "none", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_ICONS], handler, "{static groups} (minimized=yes)", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_NO_ICONS], handler, "{static groups} (minimized=no)", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_ICONS_WORKSPACE], handler, "{static groups} (minimized=yes) (workspace)", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_NOICONS_WORKSPACE], handler, "{static groups} (minimized=no) (workspace)", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_WORKSPACE], handler, "{static groups} (workspace)", saverc_cmd));
menu.insertItem(new ToolbarModeMenuItem(_labels[L_MODE_ALL], handler, "{static groups}", saverc_cmd));
menu.insert(new ToolbarModeMenuItem(_FB_XTEXT(Toolbar, IconbarModeNone,
"None", "No icons are shown in the iconbar"),
handler,
"none", saverc_cmd));
menu.insertItem(new FbTk::MenuSeparator());
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeIcons,
"Icons", "Iconified windows from all workspaces are shown"),
handler,
"{static groups} (minimized=yes)", saverc_cmd));
menu.insertItem(new ToolbarAlignMenuItem(_labels[L_LEFT], handler, FbTk::Container::LEFT, saverc_cmd));
menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RELATIVE], handler, FbTk::Container::RELATIVE, saverc_cmd));
menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RIGHT], handler, FbTk::Container::RIGHT, saverc_cmd));
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeNoIcons,
"NoIcons", "No iconified windows from all workspaces are shown"),
handler,
"{static groups} (minimized=no)", saverc_cmd));
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeWorkspaceIcons,
"WorkspaceIcons", "Iconified windows from this workspace are shown"),
handler,
"{static groups} (minimized=yes) (workspace)", saverc_cmd));
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeWorkspaceNoIcons,
"WorkspaceNoIcons", "No iconified windows from this workspace are shown"),
handler,
"{static groups} (minimized=no) (workspace)", saverc_cmd));
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeWorkspace,
"Workspace", "Normal and iconified windows from this workspace are shown"),
handler,
"{static groups} (workspace)", saverc_cmd));
menu.insert(new ToolbarModeMenuItem(
_FB_XTEXT(Toolbar, IconbarModeAllWindows, "All Windows", "All windows are shown"),
handler,
"{static groups}", saverc_cmd));
menu.insert(new FbTk::MenuSeparator());
menu.insert(new ToolbarAlignMenuItem(
_FB_XTEXT(Align, Left, "Left", "Align to the left"),
handler,
FbTk::Container::LEFT, saverc_cmd));
menu.insert(new ToolbarAlignMenuItem(
_FB_XTEXT(Align, Relative, "Relative", "Align relative to the width"),
handler,
FbTk::Container::RELATIVE, saverc_cmd));
menu.insert(new ToolbarAlignMenuItem(
_FB_XTEXT(Align, Right, "Right", "Align to the right"),
handler,
FbTk::Container::RIGHT, saverc_cmd));
menu.insert(new FbTk::MenuSeparator());
menu.insertItem(new FbTk::MenuSeparator());
menu.updateMenu();
}
@ -280,7 +263,7 @@ IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme,
save_and_reconfig->add(reconfig);
save_and_reconfig->add(save);
RefCount<Command<void> > s_and_reconfig(save_and_reconfig);
m_menu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons,
m_menu.insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons,
"Show Pictures", "chooses if little icons are shown next to title in the iconbar"),
m_rc_use_pixmap, s_and_reconfig));
m_menu.updateMenu();
@ -288,7 +271,7 @@ IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme,
m_menu.setInternalMenu();
// add iconbar menu to toolbar menu
menu.insert(m_menu.label().logical(), &m_menu);
menu.insertSubmenu(m_menu.label().logical(), &m_menu);
// setup signals
m_tracker.join(theme.reconfigSig(), FbTk::MemFun(*this, &IconbarTool::themeReconfigured));

View file

@ -55,10 +55,10 @@ LayerMenu::LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
for (size_t i=0; i < 6; ++i) {
// TODO: fetch nls string
if (save_rc) {
insert(new LayerMenuItem(layer_menuitems[i].default_str,
insertItem(new LayerMenuItem(layer_menuitems[i].default_str,
object, layer_menuitems[i].layernum, saverc_cmd));
} else {
insert(new LayerMenuItem(layer_menuitems[i].default_str,
insertItem(new LayerMenuItem(layer_menuitems[i].default_str,
object, layer_menuitems[i].layernum));
}
}

View file

@ -71,6 +71,60 @@ FbTk::StringConvertor s_stringconvertor(FbTk::StringConvertor::ToFbString);
list<string> s_encoding_stack;
list<size_t> s_stacksize_stack;
enum {
L_SHADE = 0,
L_MAXIMIZE,
L_ICONIFY,
L_CLOSE,
L_KILL,
L_LOWER,
L_RAISE,
L_STICK,
L_TITLE,
L_SENDTO,
L_LAYER,
L_ALPHA,
L_MENU_EXIT,
L_MENU_ICONS,
};
// returns 'label' if not empty, otherwise a (translated) default
// value based upon 'type'
const FbTk::FbString& _l(const FbTk::FbString& label, size_t type) {
_FB_USES_NLS;
static const FbTk::FbString _default_labels[] = {
_FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"),
_FB_XTEXT(Windowmenu, Maximize, "Maximize", "Maximize the window"),
_FB_XTEXT(Windowmenu, Iconify, "Iconify", "Iconify the window"),
_FB_XTEXT(Windowmenu, Close, "Close", "Close the window"),
_FB_XTEXT(Windowmenu, Kill, "Kill", "Kill the window"),
_FB_XTEXT(Windowmenu, Lower, "Lower", "Lower the window"),
_FB_XTEXT(Windowmenu, Raise, "Raise", "Raise the window"),
_FB_XTEXT(Windowmenu, Stick, "Stick", "Stick the window"),
_FB_XTEXT(Windowmenu, SetTitle, "Set Title", "Change the title of the window"),
_FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"),
_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"),
_FB_XTEXT(Configmenu, Transparency, "Transparency", "Menu containing various transparency options"),
_FB_XTEXT(Menu, Exit, "Exit", "Exit Command"),
_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"),
};
if (label.empty()) {
return _default_labels[type];
}
return label;
}
/**
* Push the encoding onto the stack, and make it active.
*/
@ -169,7 +223,7 @@ void createStyleMenu(FbTk::Menu &parent, const string &label,
(style[style.length() - 1] != '~')) ||
FbTk::FileUtil::isRegularFile((style + "/theme.cfg").c_str()) ||
FbTk::FileUtil::isRegularFile((style + "/style.cfg").c_str()))
parent.insert(new StyleMenuItem(filelist[file_index], style));
parent.insertItem(new StyleMenuItem(filelist[file_index], style));
}
// update menu graphics
parent.updateMenu();
@ -208,7 +262,7 @@ void createRootCmdMenu(FbTk::Menu &parent, const string &label,
if ((FbTk::FileUtil::isRegularFile(rootcmd.c_str()) &&
(filelist[file_index][0] != '.') &&
(rootcmd[rootcmd.length() - 1] != '~')))
parent.insert(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd));
parent.insertItem(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd));
}
// update menu graphics
parent.updateMenu();
@ -289,29 +343,22 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", menu.screenNumber());
if (submenu == 0)
return;
if (str_label.empty())
menu.insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"));
else
menu.insert(str_label, submenu);
menu.insertSubmenu(_l(str_label, L_MENU_ICONS), submenu);
} else if (str_key == "exit") { // exit
FbTk::RefCount<FbTk::Command<void> > exit_cmd(FbTk::CommandParser<void>::instance().parse("exit"));
if (str_label.empty())
menu.insert(_FB_XTEXT(Menu, Exit, "Exit", "Exit Command"), exit_cmd);
else
menu.insert(str_label, exit_cmd);
menu.insertCommand(_l(str_label, L_MENU_EXIT), exit_cmd);
} else if (str_key == "exec") {
// execute and hide menu
FbTk::RefCount<FbTk::Command<void> > exec_cmd(FbTk::CommandParser<void>::instance().parse("exec " + str_cmd));
menu.insert(str_label, exec_cmd);
menu.insertCommand(str_label, exec_cmd);
} else if (str_key == "macrocmd") {
FbTk::RefCount<FbTk::Command<void> > macro_cmd(FbTk::CommandParser<void>::instance().parse("macrocmd " + str_cmd));
menu.insert(str_label, macro_cmd);
} else if (str_key == "style") { // style
menu.insert(new StyleMenuItem(str_label, str_cmd));
menu.insertCommand(str_label, macro_cmd);
} else if (str_key == "style") {
menu.insertItem(new StyleMenuItem(str_label, str_cmd));
} else if (str_key == "config") {
BScreen *screen = Fluxbox::instance()->findScreen(screen_number);
if (screen != 0)
menu.insert(str_label, &screen->configMenu());
menu.insertSubmenu(str_label, &screen->configMenu());
} // end of config
else if (str_key == "include") { // include
@ -363,7 +410,7 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
parseMenu(parse, *submenu, labelconvertor, reloader);
submenu->updateMenu();
menu.insert(str_label, submenu);
menu.insertSubmenu(str_label, submenu);
} // end of submenu
else if (str_key == "stylesdir" || str_key == "stylesmenu") {
@ -383,10 +430,10 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
BScreen *screen = Fluxbox::instance()->findScreen(screen_number);
if (screen != 0) {
screen->workspaceMenu().setInternalMenu();
menu.insert(str_label, &screen->workspaceMenu());
menu.insertSubmenu(str_label, &screen->workspaceMenu());
}
} else if (str_key == "separator") {
menu.insert(new FbTk::MenuSeparator());
menu.insertItem(new FbTk::MenuSeparator());
} else if (str_key == "encoding") {
startEncoding(str_cmd);
} else if (str_key == "endencoding") {
@ -400,14 +447,14 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem,
// special NLS default labels
if (str_label.empty()) {
if (str_key == "reconfig" || str_key == "reconfigure") {
menu.insert(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command);
menu.insertCommand(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command);
return;
} else if (str_key == "restart") {
menu.insert(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command);
menu.insertCommand(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command);
return;
}
}
menu.insert(str_label, command);
menu.insertCommand(str_label, command);
}
}
if (menu.numberOfItems() != 0) {
@ -498,122 +545,85 @@ bool MenuCreator::createWindowMenuItem(const string &type,
_FB_USES_NLS;
static MenuContext context;
int screen = menu.screenNumber();
if (type == "shade") {
static WindowMenuAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false);
menu.insert(new FbTk::BoolMenuItem(
label.empty()?_FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"):label,
res));
menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_SHADE), res));
} else if (type == "maximize") {
RefCmd maximize_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeFull));
RefCmd maximize_vert_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeVertical));
RefCmd maximize_horiz_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeHorizontal));
FbTk::MultiButtonMenuItem *maximize_item =
new FbTk::MultiButtonMenuItem(3,
label.empty()?
_FB_XTEXT(Windowmenu, Maximize,
"Maximize", "Maximize the window"):
label);
// create maximize item with:
// button1: Maximize normal
// button2: Maximize Vertical
// button3: Maximize Horizontal
new FbTk::MultiButtonMenuItem(3, _l(label, L_MAXIMIZE));
maximize_item->setCommand(1, maximize_cmd);
maximize_item->setCommand(2, maximize_vert_cmd);
maximize_item->setCommand(3, maximize_horiz_cmd);
menu.insert(maximize_item);
menu.insertItem(maximize_item);
} else if (type == "iconify") {
static WindowMenuAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false);
menu.insert(new FbTk::BoolMenuItem(
label.empty() ?
_FB_XTEXT(Windowmenu, Iconify,
"Iconify", "Iconify the window") :
label, res));
menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_ICONIFY), res));
} else if (type == "close") {
RefCmd close_cmd(new WindowCmd<void>(&FluxboxWindow::close));
menu.insert(label.empty() ?
_FB_XTEXT(Windowmenu, Close,
"Close", "Close the window") :
label, close_cmd);
menu.insertCommand(_l(label, L_CLOSE), close_cmd);
} else if (type == "kill" || type == "killwindow") {
RefCmd kill_cmd(new WindowCmd<void>(&FluxboxWindow::kill));
menu.insert(label.empty() ?
_FB_XTEXT(Windowmenu, Kill,
"Kill", "Kill the window"):
label, kill_cmd);
menu.insertCommand(_l(label, L_KILL), kill_cmd);
} else if (type == "lower") {
RefCmd lower_cmd(new WindowCmd<void>(&FluxboxWindow::lower));
menu.insert( label.empty() ?
_FB_XTEXT(Windowmenu, Lower,
"Lower", "Lower the window"):
label, lower_cmd);
menu.insertCommand(_l(label, L_LOWER), lower_cmd);
} else if (type == "raise") {
RefCmd raise_cmd(new WindowCmd<void>(&FluxboxWindow::raise));
menu.insert(label.empty() ?
_FB_XTEXT(Windowmenu, Raise,
"Raise", "Raise the window"):
label, raise_cmd);
menu.insertCommand(_l(label, L_RAISE), raise_cmd);
} else if (type == "stick") {
static WindowMenuAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false);
menu.insert(new FbTk::BoolMenuItem(
label.empty() ?
_FB_XTEXT(Windowmenu, Stick,
"Stick", "Stick the window"):
label, res));
menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_STICK), res));
} else if (type == "settitledialog") {
RefCmd setname_cmd(new SetTitleDialogCmd());
menu.insert(label.empty() ?
_FB_XTEXT(Windowmenu, SetTitle,
"Set Title", "Change the title of the window"):
label, setname_cmd);
menu.insertCommand(_l(label, L_TITLE), setname_cmd);
#ifdef HAVE_XRENDER
} else if (type == "alpha") {
if (FbTk::Transparent::haveComposite() ||
FbTk::Transparent::haveRender()) {
BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber());
if (screen == 0)
BScreen* s = Fluxbox::instance()->findScreen(screen);
if (s == 0)
return false;
FbTk::Menu *submenu =
new AlphaMenu(screen->menuTheme(),
screen->imageControl(),
*screen->layerManager().getLayer(ResourceLayer::MENU));
new AlphaMenu(s->menuTheme(),
s->imageControl(),
*(s->layerManager()).getLayer(ResourceLayer::MENU));
submenu->disableTitle();
menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency",
"Menu containing various transparency options"): label,
submenu);
menu.insertSubmenu(_l(label, L_ALPHA), submenu);
}
#endif // HAVE_XRENDER
} else if (type == "extramenus") {
BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber());
BScreen::ExtraMenus::iterator it = screen->extraWindowMenus().begin();
BScreen::ExtraMenus::iterator it_end = screen->extraWindowMenus().end();
BScreen* s = Fluxbox::instance()->findScreen(screen);
BScreen::ExtraMenus::iterator it = s->extraWindowMenus().begin();
BScreen::ExtraMenus::iterator it_end = s->extraWindowMenus().end();
for (; it != it_end; ++it) {
it->second->disableTitle();
menu.insert(it->first, it->second);
menu.insertSubmenu(it->first, it->second);
}
} else if (type == "sendto") {
menu.insert(label.empty() ? _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"):
label, new SendToMenu(*Fluxbox::instance()->findScreen(menu.screenNumber())));
menu.insertSubmenu(_l(label, L_SENDTO),
new SendToMenu(*Fluxbox::instance()->findScreen(screen)));
} else if (type == "layer") {
BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber());
if (screen == 0)
BScreen* s = Fluxbox::instance()->findScreen(screen);
if (s == 0)
return false;
FbTk::Menu *submenu = new LayerMenu(screen->menuTheme(),
screen->imageControl(),
*screen->layerManager().getLayer(ResourceLayer::MENU),
FbTk::Menu *submenu = new LayerMenu(s->menuTheme(),
s->imageControl(),
*(s->layerManager()).getLayer(ResourceLayer::MENU),
&context,
false);
submenu->disableTitle();
menu.insert(label.empty()?_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"):label, submenu);
menu.insertSubmenu(_l(label, L_LAYER), submenu);
} else if (type == "separator") {
menu.insert(new FbTk::MenuSeparator());
menu.insertItem(new FbTk::MenuSeparator());
} else
return false;

View file

@ -43,12 +43,7 @@
#include "FbTk/RefCount.hh"
#include "FbTk/Util.hh"
#ifdef HAVE_CSTRING
#include <cstring>
#else
#include <string.h>
#endif
#include <cstring>
#include <set>
@ -323,35 +318,35 @@ FbTk::Menu *createRememberMenu(BScreen &screen) {
}
*/
_FB_USES_NLS;
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Workspace, "Workspace", "Remember Workspace"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Workspace, "Workspace", "Remember Workspace"),
Remember::REM_WORKSPACE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, JumpToWorkspace, "Jump to workspace", "Change active workspace to remembered one on open"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, JumpToWorkspace, "Jump to workspace", "Change active workspace to remembered one on open"),
Remember::REM_JUMPWORKSPACE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Head, "Head", "Remember Head"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Head, "Head", "Remember Head"),
Remember::REM_HEAD));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Dimensions, "Dimensions", "Remember Dimensions - with width and height"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Dimensions, "Dimensions", "Remember Dimensions - with width and height"),
Remember::REM_DIMENSIONS));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Position, "Position", "Remember position - window co-ordinates"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Position, "Position", "Remember position - window co-ordinates"),
Remember::REM_POSITION));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Sticky, "Sticky", "Remember Sticky"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Sticky, "Sticky", "Remember Sticky"),
Remember::REM_STUCKSTATE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Decorations, "Decorations", "Remember window decorations"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Decorations, "Decorations", "Remember window decorations"),
Remember::REM_DECOSTATE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Shaded, "Shaded", "Remember shaded"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Shaded, "Shaded", "Remember shaded"),
Remember::REM_SHADEDSTATE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Minimized, "Minimized", "Remember minimized"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Minimized, "Minimized", "Remember minimized"),
Remember::REM_MINIMIZEDSTATE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Maximized, "Maximized", "Remember maximized"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Maximized, "Maximized", "Remember maximized"),
Remember::REM_MAXIMIZEDSTATE));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Fullscreen, "Fullscreen", "Remember fullscreen"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Fullscreen, "Fullscreen", "Remember fullscreen"),
Remember::REM_FULLSCREENSTATE));
if (FbTk::Transparent::haveComposite()
|| FbTk::Transparent::haveRender())
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Alpha, "Transparency", "Remember window tranparency settings"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Alpha, "Transparency", "Remember window tranparency settings"),
Remember::REM_ALPHA));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, Layer, "Layer", "Remember Layer"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, Layer, "Layer", "Remember Layer"),
Remember::REM_LAYER));
menu->insert(new RememberMenuItem(_FB_XTEXT(Remember, SaveOnClose, "Save on close", "Save remembered attributes on close"),
menu->insertItem(new RememberMenuItem(_FB_XTEXT(Remember, SaveOnClose, "Save on close", "Save remembered attributes on close"),
Remember::REM_SAVEONCLOSE));
menu->updateMenu();

View file

@ -1443,12 +1443,10 @@ void BScreen::rereadMenu() {
FbTk::RefCount<FbTk::Command<void> > exit_fb(FbTk::CommandParser<void>::instance().parse("exit"));
FbTk::RefCount<FbTk::Command<void> > execute_xterm(FbTk::CommandParser<void>::instance().parse("exec xterm"));
m_rootmenu->setInternalMenu();
m_rootmenu->insert("xterm", execute_xterm);
m_rootmenu->insert(_FB_XTEXT(Menu, Reconfigure, "Reconfigure",
"Reload Configuration command")),
m_rootmenu->insert(_FB_XTEXT(Menu, Restart, "Restart", "Restart command"),
m_rootmenu->insertCommand("xterm", execute_xterm);
m_rootmenu->insertCommand(_FB_XTEXT(Menu, Restart, "Restart", "Restart command"),
restart_fb);
m_rootmenu->insert(_FB_XTEXT(Menu, Exit, "Exit", "Exit command"),
m_rootmenu->insertCommand(_FB_XTEXT(Menu, Exit, "Exit", "Exit command"),
exit_fb);
}
@ -1571,11 +1569,11 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
"Method used to give focus to windows");
FbTk::Menu *focus_menu = createMenu(focusmenu_label);
#define _BOOLITEM(m,a, b, c, d, e, f) (m).insert(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f))
#define _BOOLITEM(m,a, b, c, d, e, f) (m).insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f))
#define _FOCUSITEM(a, b, c, d, e) \
focus_menu->insert(new FocusModelMenuItem(_FB_XTEXT(a, b, c, d), focusControl(), \
focus_menu->insertItem(new FocusModelMenuItem(_FB_XTEXT(a, b, c, d), focusControl(), \
e, save_and_reconfigure))
_FOCUSITEM(Configmenu, ClickFocus,
@ -1591,17 +1589,17 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
FocusControl::STRICTMOUSEFOCUS);
#undef _FOCUSITEM
focus_menu->insert(new FbTk::MenuSeparator());
focus_menu->insert(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
focus_menu->insertItem(new FbTk::MenuSeparator());
focus_menu->insertItem(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
ClickTabFocus, "ClickTabFocus", "Click tab to focus windows"),
focusControl(), FocusControl::CLICKTABFOCUS, save_and_reconfigure));
focus_menu->insert(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
focus_menu->insertItem(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
MouseTabFocus, "MouseTabFocus", "Hover over tab to focus windows"),
focusControl(), FocusControl::MOUSETABFOCUS, save_and_reconfigure));
focus_menu->insert(new FbTk::MenuSeparator());
focus_menu->insertItem(new FbTk::MenuSeparator());
try {
focus_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusNew,
focus_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusNew,
"Focus New Windows", "Focus newly created windows"),
m_resource_manager.getResource<bool>(name() + ".focusNewWindows"),
saverc_cmd));
@ -1611,7 +1609,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
#ifdef XINERAMA
try {
focus_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusSameHead,
focus_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusSameHead,
"Keep Head", "Only revert focus on same head"),
m_resource_manager.getResource<bool>(name() + ".focusSameHead"),
saverc_cmd));
@ -1629,7 +1627,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
focus_menu->updateMenu();
menu.insert(focusmenu_label, focus_menu);
menu.insertSubmenu(focusmenu_label, focus_menu);
// END focus menu
@ -1654,7 +1652,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
resource.max_disable_resize, saverc_cmd);
maxmenu->updateMenu();
menu.insert(maxmenu_label, maxmenu);
menu.insertSubmenu(maxmenu_label, maxmenu);
// END maximize menu
@ -1667,15 +1665,15 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu");
FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label);
tab_menu->insert(tabplacement_label, tabplacement_menu);
tab_menu->insertSubmenu(tabplacement_label, tabplacement_menu);
_BOOLITEM(*tab_menu,Configmenu, TabsInTitlebar,
"Tabs in Titlebar", "Tabs in Titlebar",
resource.default_internal_tabs, save_and_reconftabs);
tab_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,
tab_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,
"Maximize Over", "Maximize over this thing when maximizing"),
resource.max_over_tabs, save_and_reconfigure));
tab_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons,
tab_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons,
"Show Pictures", "chooses if little icons are shown next to title in the iconbar"),
resource.tabs_use_pixmap, save_and_reconfigure));
@ -1686,7 +1684,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
resource.tab_width, 10, 3000, /* silly number */
*tab_menu);
tab_width_item->setCommand(save_and_reconftabs);
tab_menu->insert(tab_width_item);
tab_menu->insertItem(tab_width_item);
// menu is 3 wide, 5 down
struct PlacementP {
@ -1720,11 +1718,11 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
tabplacement_menu->insert(p.label);
tabplacement_menu->setItemEnabled(i, false);
} else
tabplacement_menu->insert(new TabPlacementMenuItem(p.label, *this, p.placement, save_and_reconftabs));
tabplacement_menu->insertItem(new TabPlacementMenuItem(p.label, *this, p.placement, save_and_reconftabs));
}
tabplacement_menu->updateMenu();
menu.insert(tabmenu_label, tab_menu);
menu.insertSubmenu(tabmenu_label, tab_menu);
#ifdef HAVE_XRENDER
if (FbTk::Transparent::haveRender() ||
@ -1737,7 +1735,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
if (FbTk::Transparent::haveComposite(true)) {
static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans());
alpha_menu->insert(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, ForcePseudoTrans,
alpha_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, ForcePseudoTrans,
"Force Pseudo-Transparency",
"When composite is available, still use old pseudo-transparency"),
s_pseudo, save_and_reconfigure));
@ -1754,7 +1752,7 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
"Transparency level of the focused window"),
resource.focused_alpha, 0, 255, *alpha_menu);
focused_alpha_item->setCommand(delayed_save_and_reconf);
alpha_menu->insert(focused_alpha_item);
alpha_menu->insertItem(focused_alpha_item);
FbTk::MenuItem *unfocused_alpha_item =
new FbTk::IntMenuItem(_FB_XTEXT(Configmenu,
@ -1764,24 +1762,24 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
resource.unfocused_alpha, 0, 255, *alpha_menu);
unfocused_alpha_item->setCommand(delayed_save_and_reconf);
alpha_menu->insert(unfocused_alpha_item);
alpha_menu->insertItem(unfocused_alpha_item);
FbTk::MenuItem *menu_alpha_item =
new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, MenuAlpha,
"Menu Alpha", "Transparency level of menu"),
resource.menu_alpha, 0, 255, *alpha_menu);
menu_alpha_item->setCommand(delayed_save_and_reconf);
alpha_menu->insert(menu_alpha_item);
alpha_menu->insertItem(menu_alpha_item);
alpha_menu->updateMenu();
menu.insert(alphamenu_label, alpha_menu);
menu.insertSubmenu(alphamenu_label, alpha_menu);
}
#endif // HAVE_XRENDER
Configmenus::iterator it = m_configmenu_list.begin();
Configmenus::iterator it_end = m_configmenu_list.end();
for (; it != it_end; ++it)
menu.insert(it->first, it->second);
menu.insertSubmenu(it->first, it->second);
_BOOLITEM(menu, Configmenu, OpaqueMove,
"Opaque Window Moving",

View file

@ -84,12 +84,12 @@ void SendToMenu::rebuildMenu() {
for (size_t i = 0; i < wlist.size(); ++i) {
FbTk::RefCount<FbTk::Command<void> > sendto_cmd(new SendToCmd(i, false));
FbTk::RefCount<FbTk::Command<void> > sendto_follow_cmd(new SendToCmd(i, true));
FbTk::MultiButtonMenuItem* item = new FbTk::MultiButtonMenuItem(3, wlist[i]->name());
item->setCommand(1, sendto_cmd);
item->setCommand(2, sendto_follow_cmd);
item->setCommand(3, sendto_cmd);
insert(item);
insertItem(item);
}
updateMenu();

View file

@ -1099,21 +1099,21 @@ void Slit::updateClientmenu() {
FbTk::RefCount<FbTk::Command<void> > cycle_up(new FbTk::SimpleCommand<Slit>(*this, &Slit::cycleClientsUp));
FbTk::RefCount<FbTk::Command<void> > cycle_down(new FbTk::SimpleCommand<Slit>(*this, &Slit::cycleClientsDown));
m_clientlist_menu.insert(_FB_XTEXT(Slit, CycleUp, "Cycle Up", "Cycle clients upwards"), cycle_up);
m_clientlist_menu.insert(_FB_XTEXT(Slit, CycleDown, "Cycle Down", "Cycle clients downwards"), cycle_down);
m_clientlist_menu.insertCommand(_FB_XTEXT(Slit, CycleUp, "Cycle Up", "Cycle clients upwards"), cycle_up);
m_clientlist_menu.insertCommand(_FB_XTEXT(Slit, CycleDown, "Cycle Down", "Cycle clients downwards"), cycle_down);
m_clientlist_menu.insert(new FbTk::MenuSeparator());
m_clientlist_menu.insertItem(new FbTk::MenuSeparator());
FbTk::RefCount<FbTk::Command<void> > reconfig(new FbTk::SimpleCommand<Slit>(*this, &Slit::reconfigure));
SlitClients::iterator it = m_client_list.begin();
for (; it != m_client_list.end(); ++it) {
if ((*it) != 0 && (*it)->window() != 0)
m_clientlist_menu.insert(new SlitClientMenuItem(*this, *(*it), reconfig));
m_clientlist_menu.insertItem(new SlitClientMenuItem(*this, *(*it), reconfig));
}
m_clientlist_menu.insert(new FbTk::MenuSeparator());
m_clientlist_menu.insertItem(new FbTk::MenuSeparator());
FbTk::RefCount<FbTk::Command<void> > savecmd(new FbTk::SimpleCommand<Slit>(*this, &Slit::saveClientList));
m_clientlist_menu.insert(_FB_XTEXT(Slit,
m_clientlist_menu.insertCommand(_FB_XTEXT(Slit,
SaveSlitList,
"Save SlitList", "Saves the current order in the slit"),
savecmd);
@ -1165,31 +1165,32 @@ void Slit::setupMenu() {
// setup base menu
m_slitmenu.setLabel(_FB_XTEXT(Slit, Slit, "Slit", "The Slit"));
m_slitmenu.insert(_FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"),
placement_menu);
m_slitmenu.insertSubmenu(
_FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"),
placement_menu);
m_slitmenu.insert(_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"), m_layermenu.get());
m_slitmenu.insertSubmenu(
_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"),
m_layermenu.get());
#ifdef XINERAMA
if (screen().hasXinerama()) {
m_slitmenu.insert(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"),
m_xineramaheadmenu =
new XineramaHeadMenu<Slit>(
screen().menuTheme(),
screen(),
screen().imageControl(),
*screen().layerManager().getLayer(::ResourceLayer::MENU),
*this,
_FB_XTEXT(Slit, OnHead, "Slit on Head", "Title of Slits On Head menu")
));
m_xineramaheadmenu = new XineramaHeadMenu<Slit>(
screen().menuTheme(),
screen(),
screen().imageControl(),
*screen().layerManager().getLayer(::ResourceLayer::MENU),
*this,
_FB_XTEXT(Slit, OnHead, "Slit on Head", "Title of Slits On Head menu"));
m_slitmenu.insertSubmenu(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"), m_xineramaheadmenu);
}
#endif //XINERAMA
m_slitmenu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide, "Auto hide", "This thing automatically hides when not close by"),
m_slitmenu.insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide, "Auto hide", "This thing automatically hides when not close by"),
m_rc_auto_hide,
save_and_reconfigure_slit));
m_slitmenu.insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,"Maximize Over", "Maximize over this thing when maximizing"),
m_slitmenu.insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,"Maximize Over", "Maximize over this thing when maximizing"),
m_rc_maximize_over,
save_and_reconfigure_slit));
@ -1206,9 +1207,9 @@ void Slit::setupMenu() {
RefCount<Command<void> > set_alpha_cmd(alpha_macrocmd);
alpha_menuitem->setCommand(set_alpha_cmd);
m_slitmenu.insert(alpha_menuitem);
m_slitmenu.insertItem(alpha_menuitem);
m_slitmenu.insert(_FB_XTEXT(Slit, ClientsMenu, "Clients", "Slit client menu"), &m_clientlist_menu);
m_slitmenu.insertSubmenu(_FB_XTEXT(Slit, ClientsMenu, "Clients", "Slit client menu"), &m_clientlist_menu);
m_slitmenu.updateMenu();
// setup sub menu
@ -1249,10 +1250,8 @@ void Slit::setupMenu() {
placement_menu->insert("");
placement_menu->setItemEnabled(i, false);
} else {
placement_menu->insert(new PlaceSlitMenuItem(str, *this,
placement,
save_and_reconfigure));
FbTk::MenuItem* item = new PlaceSlitMenuItem(str, *this, placement, save_and_reconfigure);
placement_menu->insertItem(item);
}
place_menu.pop_front();
}
@ -1268,7 +1267,6 @@ void Slit::moveToLayer(int layernum) {
void Slit::saveOnHead(int head) {
m_rc_on_head = head;
// reposition
reconfigure();
}

View file

@ -271,9 +271,13 @@ Toolbar::Toolbar(BScreen &scrn, FbTk::Layer &layer, size_t width):
}
Toolbar::~Toolbar() {
if (Fluxbox::instance()->keys())
Fluxbox::instance()->keys()->unregisterWindow(window().window());
Keys* keys = Fluxbox::instance()->keys();
if (keys)
keys->unregisterWindow(window().window());
FbTk::EventManager::instance()->remove(window());
// remove menu items before we delete tools so we dont end up
// with dangling pointers to old submenu items (internal menus)
// from the tools
@ -786,11 +790,11 @@ void Toolbar::setupMenus(bool skip_new_placement) {
visible_macro->add(reconfig_toolbar);
visible_macro->add(save_resources);
RefCommand toggle_visible_cmd(visible_macro);
menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, Visible,
menu().insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, Visible,
"Visible", "Whether this item is visible"),
m_rc_visible, toggle_visible_cmd));
menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide,
menu().insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, AutoHide,
"Auto hide", "Toggle auto hide of toolbar"),
m_rc_auto_hide,
reconfig_toolbar_and_save_resource));
@ -804,25 +808,24 @@ void Toolbar::setupMenus(bool skip_new_placement) {
toolbar_menuitem->setCommand(reconfig_toolbar_and_save_resource);
menu().insert(toolbar_menuitem);
menu().insertItem(toolbar_menuitem);
menu().insert(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,
menu().insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,
"Maximize Over",
"Maximize over this thing when maximizing"),
m_rc_maximize_over,
reconfig_toolbar_and_save_resource));
menu().insert(_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"), &layerMenu());
menu().insertSubmenu(_FB_XTEXT(Menu, Layer, "Layer...", "Title of Layer menu"), &layerMenu());
#ifdef XINERAMA
if (screen().hasXinerama()) {
menu().insert(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"),
m_xineramaheadmenu =
new XineramaHeadMenu<Toolbar>(screen().menuTheme(),
screen(),
screen().imageControl(),
*screen().layerManager().getLayer(::ResourceLayer::MENU),
*this,
_FB_XTEXT(Toolbar, OnHead, "Toolbar on Head",
"Title of toolbar on head menu")));
m_xineramaheadmenu = new XineramaHeadMenu<Toolbar>(screen().menuTheme(),
screen(),
screen().imageControl(),
*screen().layerManager().getLayer(::ResourceLayer::MENU),
*this,
_FB_XTEXT(Toolbar, OnHead, "Toolbar on Head", "Title of toolbar on head menu"));
menu().insertSubmenu(_FB_XTEXT(Menu, OnHead, "On Head...", "Title of On Head menu"), m_xineramaheadmenu);
}
#endif // XINERAMA
@ -860,12 +863,12 @@ void Toolbar::setupMenus(bool skip_new_placement) {
placementMenu().insert(p.label);
placementMenu().setItemEnabled(i, false);
} else
placementMenu().insert(new PlaceToolbarMenuItem(p.label, *this,
placementMenu().insertItem(new PlaceToolbarMenuItem(p.label, *this,
p.placement));
}
}
menu().insert(_FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"), &placementMenu());
menu().insertSubmenu(_FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu"), &placementMenu());
placementMenu().updateMenu();
@ -882,7 +885,7 @@ void Toolbar::setupMenus(bool skip_new_placement) {
RefCount<Command<void> > set_alpha_cmd(alpha_macrocmd);
alpha_menuitem->setCommand(set_alpha_cmd);
menu().insert(alpha_menuitem);
menu().insertItem(alpha_menuitem);
menu().updateMenu();
}

View file

@ -60,7 +60,7 @@ void add_workspaces(WorkspaceMenu& menu, BScreen& screen) {
FbTk::MultiButtonMenuItem* submenu = new FbTk::MultiButtonMenuItem(5, FbTk::BiDiString(w->name()), &w->menu());
FbTk::RefCount<FbTk::Command<void> > jump_cmd(new JumpToWorkspaceCmd(w->workspaceID()));
submenu->setCommand(3, jump_cmd);
menu.insert(submenu, i + IDX_AFTER_ICONS);
menu.insertItem(submenu, i + IDX_AFTER_ICONS);
}
}
@ -111,9 +111,9 @@ void WorkspaceMenu::init(BScreen &screen) {
removeAll();
setLabel(_FB_XTEXT(Workspace, MenuTitle, "Workspaces", "Title of main workspace menu"));
insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"),
insertSubmenu(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"),
MenuCreator::createMenuType("iconmenu", screen.screenNumber()));
insert(new FbTk::MenuSeparator());
insertItem(new FbTk::MenuSeparator());
::add_workspaces(*this, screen);
setItemSelected(screen.currentWorkspace()->workspaceID() + IDX_AFTER_ICONS, true);
@ -134,12 +134,12 @@ void WorkspaceMenu::init(BScreen &screen) {
RefCount<Command<void> > start_edit(FbTk::CommandParser<void>::instance().parse("setworkspacenamedialog"));
insert(new FbTk::MenuSeparator());
insert(_FB_XTEXT(Workspace, NewWorkspace, "New Workspace", "Add a new workspace"),
insertItem(new FbTk::MenuSeparator());
insertCommand(_FB_XTEXT(Workspace, NewWorkspace, "New Workspace", "Add a new workspace"),
new_workspace_cmd);
insert(_FB_XTEXT(Toolbar, EditWkspcName, "Edit current workspace name", "Edit current workspace name"),
insertCommand(_FB_XTEXT(Toolbar, EditWkspcName, "Edit current workspace name", "Edit current workspace name"),
start_edit);
insert(_FB_XTEXT(Workspace, RemoveLast, "Remove Last", "Remove the last workspace"),
insertCommand(_FB_XTEXT(Workspace, RemoveLast, "Remove Last", "Remove the last workspace"),
remove_last_cmd);
updateMenu();

View file

@ -51,7 +51,7 @@ public:
m_object.saveOnHead(m_headnum);
FbTk::RadioMenuItem::click(button, time, mods);
}
private:
ItemType &m_object;
int m_headnum;
@ -103,11 +103,11 @@ void XineramaHeadMenu<ItemType>::reloadHeads()
*/
std::string tname("Head ");
tname += FbTk::StringUtil::number2String(i);
insert(new XineramaHeadMenuItem<ItemType>(
insertItem(new XineramaHeadMenuItem<ItemType>(
tname.c_str(), m_object, i, saverc_cmd));
}
// TODO: nls
insert(new XineramaHeadMenuItem<ItemType>(
insertItem(new XineramaHeadMenuItem<ItemType>(
"All Heads", m_object, 0, saverc_cmd));
updateMenu();
}