aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorMathias Gumz <akira@fluxbox.org>2015-01-15 17:49:35 (GMT)
committerMathias Gumz <akira@fluxbox.org>2015-01-15 17:49:45 (GMT)
commitbd9afcafb93382b5b7f32c222594699214581596 (patch)
tree418583c08c6e5ebdfcd172f5aba96d465c27d47b /src/Screen.cc
parent8387742c8860694777f7c2c62da0a90c9e836988 (diff)
downloadfluxbox-bd9afcafb93382b5b7f32c222594699214581596.zip
fluxbox-bd9afcafb93382b5b7f32c222594699214581596.tar.bz2
Refactor: split out menu generation from BScreen
Again, it's easier to read the code when the whole menu-generation is out of the way.
Diffstat (limited to 'src/Screen.cc')
-rw-r--r--src/Screen.cc367
1 files changed, 9 insertions, 358 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index bd99868..9aab3f7 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -42,6 +42,7 @@
42#include "FbTk/RadioMenuItem.hh" 42#include "FbTk/RadioMenuItem.hh"
43 43
44// menus 44// menus
45#include "ConfigMenu.hh"
45#include "FbMenu.hh" 46#include "FbMenu.hh"
46#include "LayerMenu.hh" 47#include "LayerMenu.hh"
47 48
@@ -173,55 +174,11 @@ int anotherWMRunning(Display *display, XErrorEvent *) {
173int calcSquareDistance(int x1, int y1, int x2, int y2) { 174int calcSquareDistance(int x1, int y1, int x2, int y2) {
174 return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1); 175 return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
175} 176}
176
177class TabPlacementMenuItem: public FbTk::RadioMenuItem {
178public:
179 TabPlacementMenuItem(const FbTk::FbString & label, BScreen &screen,
180 FbWinFrame::TabPlacement place,
181 FbTk::RefCount<FbTk::Command<void> > &cmd):
182 FbTk::RadioMenuItem(label, cmd),
183 m_screen(screen),
184 m_place(place) {
185 setCloseOnClick(false);
186 }
187
188 bool isSelected() const { return m_screen.getTabPlacement() == m_place; }
189 void click(int button, int time, unsigned int mods) {
190 m_screen.saveTabPlacement(m_place);
191 FbTk::RadioMenuItem::click(button, time, mods);
192 }
193
194
195private:
196 BScreen &m_screen;
197 FbWinFrame::TabPlacement m_place;
198};
199
200void clampMenuDelay(int& delay) { 177void clampMenuDelay(int& delay) {
201 delay = FbTk::Util::clamp(delay, 0, 5000); 178 delay = FbTk::Util::clamp(delay, 0, 5000);
202} 179}
203 180
204 181
205struct TabPlacementString {
206 FbWinFrame::TabPlacement placement;
207 const char* str;
208};
209
210const TabPlacementString placement_strings[] = {
211 { FbWinFrame::TOPLEFT, "TopLeft" },
212 { FbWinFrame::TOP, "Top" },
213 { FbWinFrame::TOPRIGHT, "TopRight" },
214 { FbWinFrame::BOTTOMLEFT, "BottomLeft" },
215 { FbWinFrame::BOTTOM, "Bottom" },
216 { FbWinFrame::BOTTOMRIGHT, "BottomRight" },
217 { FbWinFrame::LEFTBOTTOM, "LeftBottom" },
218 { FbWinFrame::LEFT, "Left" },
219 { FbWinFrame::LEFTTOP, "LeftTop" },
220 { FbWinFrame::RIGHTBOTTOM, "RightBottom" },
221 { FbWinFrame::RIGHT, "Right" },
222 { FbWinFrame::RIGHTTOP, "RightTop" }
223};
224
225Atom atom_fbcmd = 0; 182Atom atom_fbcmd = 0;
226Atom atom_wm_check = 0; 183Atom atom_wm_check = 0;
227Atom atom_net_desktop = 0; 184Atom atom_net_desktop = 0;
@@ -238,72 +195,10 @@ void initAtoms(Display* dpy) {
238 atom_kwm1 = XInternAtom(dpy, "KWM_DOCKWINDOW", False); 195 atom_kwm1 = XInternAtom(dpy, "KWM_DOCKWINDOW", False);
239} 196}
240 197
241
242} // end anonymous namespace 198} // end anonymous namespace
243 199
244 200
245 201
246namespace FbTk {
247
248template<>
249string FbTk::Resource<FbWinFrame::TabPlacement>::
250getString() const {
251
252 size_t i = (m_value == FbTk::Util::clamp(m_value, FbWinFrame::TOPLEFT, FbWinFrame::RIGHTTOP)
253 ? m_value
254 : FbWinFrame::DEFAULT) - 1;
255 return placement_strings[i].str;
256}
257
258template<>
259void FbTk::Resource<FbWinFrame::TabPlacement>::
260setFromString(const char *strval) {
261
262 size_t i;
263 for (i = 0; i < sizeof(placement_strings)/sizeof(TabPlacementString); ++i) {
264 if (strcasecmp(strval, placement_strings[i].str) == 0) {
265 m_value = placement_strings[i].placement;
266 return;
267 }
268 }
269 setDefaultValue();
270}
271
272} // end namespace FbTk
273
274
275BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm,
276 const string &scrname,
277 const string &altscrname):
278 opaque_move(rm, true, scrname + ".opaqueMove", altscrname+".OpaqueMove"),
279 full_max(rm, false, scrname+".fullMaximization", altscrname+".FullMaximization"),
280 max_ignore_inc(rm, true, scrname+".maxIgnoreIncrement", altscrname+".MaxIgnoreIncrement"),
281 max_disable_move(rm, false, scrname+".maxDisableMove", altscrname+".MaxDisableMove"),
282 max_disable_resize(rm, false, scrname+".maxDisableResize", altscrname+".MaxDisableResize"),
283 workspace_warping(rm, true, scrname+".workspacewarping", altscrname+".WorkspaceWarping"),
284 show_window_pos(rm, false, scrname+".showwindowposition", altscrname+".ShowWindowPosition"),
285 auto_raise(rm, true, scrname+".autoRaise", altscrname+".AutoRaise"),
286 click_raises(rm, true, scrname+".clickRaises", altscrname+".ClickRaises"),
287 default_deco(rm, "NORMAL", scrname+".defaultDeco", altscrname+".DefaultDeco"),
288 tab_placement(rm, FbWinFrame::TOPLEFT, scrname+".tab.placement", altscrname+".Tab.Placement"),
289 windowmenufile(rm, Fluxbox::instance()->getDefaultDataFilename("windowmenu"), scrname+".windowMenu", altscrname+".WindowMenu"),
290 typing_delay(rm, 0, scrname+".noFocusWhileTypingDelay", altscrname+".NoFocusWhileTypingDelay"),
291 workspaces(rm, 4, scrname+".workspaces", altscrname+".Workspaces"),
292 edge_snap_threshold(rm, 10, scrname+".edgeSnapThreshold", altscrname+".EdgeSnapThreshold"),
293 focused_alpha(rm, 255, scrname+".window.focus.alpha", altscrname+".Window.Focus.Alpha"),
294 unfocused_alpha(rm, 255, scrname+".window.unfocus.alpha", altscrname+".Window.Unfocus.Alpha"),
295 menu_alpha(rm, 255, scrname+".menu.alpha", altscrname+".Menu.Alpha"),
296 menu_delay(rm, 200, scrname + ".menuDelay", altscrname+".MenuDelay"),
297 tab_width(rm, 64, scrname + ".tab.width", altscrname+".Tab.Width"),
298 tooltip_delay(rm, 500, scrname + ".tooltipDelay", altscrname+".TooltipDelay"),
299 allow_remote_actions(rm, false, scrname+".allowRemoteActions", altscrname+".AllowRemoteActions"),
300 clientmenu_use_pixmap(rm, true, scrname+".clientMenu.usePixmap", altscrname+".ClientMenu.UsePixmap"),
301 tabs_use_pixmap(rm, true, scrname+".tabs.usePixmap", altscrname+".Tabs.UsePixmap"),
302 max_over_tabs(rm, false, scrname+".tabs.maxOver", altscrname+".Tabs.MaxOver"),
303 default_internal_tabs(rm, true /* TODO: autoconf option? */ , scrname+".tabs.intitlebar", altscrname+".Tabs.InTitlebar") {
304
305
306}
307 202
308BScreen::BScreen(FbTk::ResourceManager &rm, 203BScreen::BScreen(FbTk::ResourceManager &rm,
309 const string &screenname, 204 const string &screenname,
@@ -514,6 +409,7 @@ BScreen::~BScreen() {
514 409
515 FbTk::EventManager *evm = FbTk::EventManager::instance(); 410 FbTk::EventManager *evm = FbTk::EventManager::instance();
516 evm->remove(rootWindow()); 411 evm->remove(rootWindow());
412
517 Keys *keys = Fluxbox::instance()->keys(); 413 Keys *keys = Fluxbox::instance()->keys();
518 if (keys) 414 if (keys)
519 keys->unregisterWindow(rootWindow().window()); 415 keys->unregisterWindow(rootWindow().window());
@@ -578,19 +474,17 @@ BScreen::~BScreen() {
578 474
579 // slit must be destroyed before headAreas (Struts) 475 // slit must be destroyed before headAreas (Struts)
580 m_slit.reset(0); 476 m_slit.reset(0);
581
582 477
583 delete m_rootmenu.release(); 478 delete m_rootmenu.release();
584 delete m_workspacemenu.release(); 479 delete m_workspacemenu.release();
585 delete m_windowmenu.release(); 480 delete m_windowmenu.release();
586 481
587 // TODO fluxgen: check if this is the right place 482 // TODO fluxgen: check if this is the right place
588 for (size_t i = 0; i < m_head_areas.size(); i++) 483 for (size_t i = 0; i < m_head_areas.size(); i++)
589 delete m_head_areas[i]; 484 delete m_head_areas[i];
590 485
591 delete m_focus_control; 486 delete m_focus_control;
592 delete m_placement_strategy; 487 delete m_placement_strategy;
593
594} 488}
595 489
596bool BScreen::isRestart() { 490bool BScreen::isRestart() {
@@ -1541,258 +1435,15 @@ float BScreen::getYGap(int head) {
1541} 1435}
1542 1436
1543void BScreen::setupConfigmenu(FbTk::Menu &menu) { 1437void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1544 _FB_USES_NLS;
1545
1546 menu.removeAll();
1547
1548 FbTk::MacroCommand *s_a_reconf_macro = new FbTk::MacroCommand();
1549 FbTk::MacroCommand *s_a_reconftabs_macro = new FbTk::MacroCommand();
1550 FbTk::RefCount<FbTk::Command<void> > saverc_cmd(new FbTk::SimpleCommand<Fluxbox>(
1551 *Fluxbox::instance(),
1552 &Fluxbox::save_rc));
1553 FbTk::RefCount<FbTk::Command<void> > reconf_cmd(FbTk::CommandParser<void>::instance().parse("reconfigure"));
1554
1555 FbTk::RefCount<FbTk::Command<void> > reconftabs_cmd(new FbTk::SimpleCommand<BScreen>(
1556 *this,
1557 &BScreen::reconfigureTabs));
1558 s_a_reconf_macro->add(saverc_cmd);
1559 s_a_reconf_macro->add(reconf_cmd);
1560 s_a_reconftabs_macro->add(saverc_cmd);
1561 s_a_reconftabs_macro->add(reconftabs_cmd);
1562 FbTk::RefCount<FbTk::Command<void> > save_and_reconfigure(s_a_reconf_macro);
1563 FbTk::RefCount<FbTk::Command<void> > save_and_reconftabs(s_a_reconftabs_macro);
1564 // create focus menu
1565 // we don't set this to internal menu so will
1566 // be deleted toghether with the parent
1567 FbTk::FbString focusmenu_label = _FB_XTEXT(Configmenu, FocusModel,
1568 "Focus Model",
1569 "Method used to give focus to windows");
1570 FbTk::Menu *focus_menu = createMenu(focusmenu_label);
1571
1572#define _BOOLITEM(m,a, b, c, d, e, f) (m).insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(a, b, c, d), e, f))
1573
1574
1575#define _FOCUSITEM(a, b, c, d, e) \
1576 focus_menu->insertItem(new FocusModelMenuItem(_FB_XTEXT(a, b, c, d), focusControl(), \
1577 e, save_and_reconfigure))
1578
1579 _FOCUSITEM(Configmenu, ClickFocus,
1580 "Click To Focus", "Click to focus",
1581 FocusControl::CLICKFOCUS);
1582 _FOCUSITEM(Configmenu, MouseFocus,
1583 "Mouse Focus (Keyboard Friendly)",
1584 "Mouse Focus (Keyboard Friendly)",
1585 FocusControl::MOUSEFOCUS);
1586 _FOCUSITEM(Configmenu, StrictMouseFocus,
1587 "Mouse Focus (Strict)",
1588 "Mouse Focus (Strict)",
1589 FocusControl::STRICTMOUSEFOCUS);
1590#undef _FOCUSITEM
1591
1592 focus_menu->insertItem(new FbTk::MenuSeparator());
1593 focus_menu->insertItem(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
1594 ClickTabFocus, "ClickTabFocus", "Click tab to focus windows"),
1595 focusControl(), FocusControl::CLICKTABFOCUS, save_and_reconfigure));
1596 focus_menu->insertItem(new TabFocusModelMenuItem(_FB_XTEXT(Configmenu,
1597 MouseTabFocus, "MouseTabFocus", "Hover over tab to focus windows"),
1598 focusControl(), FocusControl::MOUSETABFOCUS, save_and_reconfigure));
1599 focus_menu->insertItem(new FbTk::MenuSeparator());
1600
1601 try {
1602 focus_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusNew,
1603 "Focus New Windows", "Focus newly created windows"),
1604 m_resource_manager.getResource<bool>(name() + ".focusNewWindows"),
1605 saverc_cmd));
1606 } catch (FbTk::ResourceException & e) {
1607 cerr<<e.what()<<endl;
1608 }
1609
1610#ifdef XINERAMA
1611 try {
1612 focus_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, FocusSameHead,
1613 "Keep Head", "Only revert focus on same head"),
1614 m_resource_manager.getResource<bool>(name() + ".focusSameHead"),
1615 saverc_cmd));
1616 } catch (FbTk::ResourceException e) {
1617 cerr<<e.what()<<endl;
1618 }
1619#endif // XINERAMA
1620 1438
1621 _BOOLITEM(*focus_menu, Configmenu, AutoRaise, 1439 struct ConfigMenu::SetupHelper sh = {
1622 "Auto Raise", "Auto Raise windows on sloppy", 1440 .screen = *this,
1623 resource.auto_raise, saverc_cmd); 1441 .rm = m_resource_manager,
1624 _BOOLITEM(*focus_menu, Configmenu, ClickRaises, 1442 .resource = resource,
1625 "Click Raises", "Click Raises",
1626 resource.click_raises, saverc_cmd);
1627
1628 focus_menu->updateMenu();
1629
1630 menu.insertSubmenu(focusmenu_label, focus_menu);
1631
1632 // END focus menu
1633
1634 // BEGIN maximize menu
1635
1636 FbTk::FbString maxmenu_label = _FB_XTEXT(Configmenu, MaxMenu,
1637 "Maximize Options", "heading for maximization options");
1638 FbTk::Menu *maxmenu = createMenu(maxmenu_label);
1639
1640 _BOOLITEM(*maxmenu, Configmenu, FullMax,
1641 "Full Maximization", "Maximise over slit, toolbar, etc",
1642 resource.full_max, saverc_cmd);
1643 _BOOLITEM(*maxmenu, Configmenu, MaxIgnoreInc,
1644 "Ignore Resize Increment",
1645 "Maximizing Ignores Resize Increment (e.g. xterm)",
1646 resource.max_ignore_inc, saverc_cmd);
1647 _BOOLITEM(*maxmenu, Configmenu, MaxDisableMove,
1648 "Disable Moving", "Don't Allow Moving While Maximized",
1649 resource.max_disable_move, saverc_cmd);
1650 _BOOLITEM(*maxmenu, Configmenu, MaxDisableResize,
1651 "Disable Resizing", "Don't Allow Resizing While Maximized",
1652 resource.max_disable_resize, saverc_cmd);
1653
1654 maxmenu->updateMenu();
1655 menu.insertSubmenu(maxmenu_label, maxmenu);
1656
1657 // END maximize menu
1658
1659 // BEGIN tab menu
1660
1661 FbTk::FbString tabmenu_label = _FB_XTEXT(Configmenu, TabMenu,
1662 "Tab Options",
1663 "heading for tab-related options");
1664 FbTk::Menu *tab_menu = createMenu(tabmenu_label);
1665 FbTk::FbString tabplacement_label = _FB_XTEXT(Menu, Placement, "Placement", "Title of Placement menu");
1666 FbTk::Menu *tabplacement_menu = createToggleMenu(tabplacement_label);
1667
1668 tab_menu->insertSubmenu(tabplacement_label, tabplacement_menu);
1669
1670 _BOOLITEM(*tab_menu,Configmenu, TabsInTitlebar,
1671 "Tabs in Titlebar", "Tabs in Titlebar",
1672 resource.default_internal_tabs, save_and_reconftabs);
1673 tab_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Common, MaximizeOver,
1674 "Maximize Over", "Maximize over this thing when maximizing"),
1675 resource.max_over_tabs, save_and_reconfigure));
1676 tab_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Toolbar, ShowIcons,
1677 "Show Pictures", "chooses if little icons are shown next to title in the iconbar"),
1678 resource.tabs_use_pixmap, save_and_reconfigure));
1679
1680 FbTk::MenuItem *tab_width_item =
1681 new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, ExternalTabWidth,
1682 "External Tab Width",
1683 "Width of external-style tabs"),
1684 resource.tab_width, 10, 3000, /* silly number */
1685 *tab_menu);
1686 tab_width_item->setCommand(save_and_reconftabs);
1687 tab_menu->insertItem(tab_width_item);
1688
1689 // menu is 3 wide, 5 down
1690 struct PlacementP {
1691 const FbTk::FbString label;
1692 FbWinFrame::TabPlacement placement;
1693 }; 1443 };
1694 static const PlacementP place_menu[] = {
1695
1696 { _FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), FbWinFrame::TOPLEFT},
1697 { _FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), FbWinFrame::LEFTTOP},
1698 { _FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), FbWinFrame::LEFT},
1699 { _FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), FbWinFrame::LEFTBOTTOM},
1700 { _FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), FbWinFrame::BOTTOMLEFT},
1701 { _FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), FbWinFrame::TOP},
1702 { "", FbWinFrame::TOPLEFT},
1703 { "", FbWinFrame::TOPLEFT},
1704 { "", FbWinFrame::TOPLEFT},
1705 { _FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), FbWinFrame::BOTTOM},
1706 { _FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), FbWinFrame::TOPRIGHT},
1707 { _FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), FbWinFrame::RIGHTTOP},
1708 { _FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), FbWinFrame::RIGHT},
1709 { _FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), FbWinFrame::RIGHTBOTTOM},
1710 { _FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), FbWinFrame::BOTTOMRIGHT}
1711 };
1712
1713 tabplacement_menu->setMinimumColumns(3);
1714 // create items in sub menu
1715 for (size_t i=0; i< sizeof(place_menu)/sizeof(PlacementP); ++i) {
1716 const PlacementP& p = place_menu[i];
1717 if (p.label == "") {
1718 tabplacement_menu->insert(p.label);
1719 tabplacement_menu->setItemEnabled(i, false);
1720 } else
1721 tabplacement_menu->insertItem(new TabPlacementMenuItem(p.label, *this, p.placement, save_and_reconftabs));
1722 }
1723 tabplacement_menu->updateMenu();
1724 1444
1725 menu.insertSubmenu(tabmenu_label, tab_menu); 1445 menu.removeAll();
1726 1446 ConfigMenu::setup(menu, sh);
1727#ifdef HAVE_XRENDER
1728 if (FbTk::Transparent::haveRender() ||
1729 FbTk::Transparent::haveComposite()) {
1730
1731 FbTk::FbString alphamenu_label = _FB_XTEXT(Configmenu, Transparency,
1732 "Transparency",
1733 "Menu containing various transparency options");
1734 FbTk::Menu *alpha_menu = createMenu(alphamenu_label);
1735
1736 if (FbTk::Transparent::haveComposite(true)) {
1737 static FbTk::SimpleAccessor<bool> s_pseudo(Fluxbox::instance()->getPseudoTrans());
1738 alpha_menu->insertItem(new FbTk::BoolMenuItem(_FB_XTEXT(Configmenu, ForcePseudoTrans,
1739 "Force Pseudo-Transparency",
1740 "When composite is available, still use old pseudo-transparency"),
1741 s_pseudo, save_and_reconfigure));
1742 }
1743
1744 // in order to save system resources, don't save or reconfigure alpha
1745 // settings until after the user is done changing them
1746 FbTk::RefCount<FbTk::Command<void> > delayed_save_and_reconf(
1747 new FbTk::DelayedCmd(save_and_reconfigure));
1748
1749 FbTk::MenuItem *focused_alpha_item =
1750 new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, FocusedAlpha,
1751 "Focused Window Alpha",
1752 "Transparency level of the focused window"),
1753 resource.focused_alpha, 0, 255, *alpha_menu);
1754 focused_alpha_item->setCommand(delayed_save_and_reconf);
1755 alpha_menu->insertItem(focused_alpha_item);
1756
1757 FbTk::MenuItem *unfocused_alpha_item =
1758 new FbTk::IntMenuItem(_FB_XTEXT(Configmenu,
1759 UnfocusedAlpha,
1760 "Unfocused Window Alpha",
1761 "Transparency level of unfocused windows"),
1762
1763 resource.unfocused_alpha, 0, 255, *alpha_menu);
1764 unfocused_alpha_item->setCommand(delayed_save_and_reconf);
1765 alpha_menu->insertItem(unfocused_alpha_item);
1766
1767 FbTk::MenuItem *menu_alpha_item =
1768 new FbTk::IntMenuItem(_FB_XTEXT(Configmenu, MenuAlpha,
1769 "Menu Alpha", "Transparency level of menu"),
1770 resource.menu_alpha, 0, 255, *alpha_menu);
1771 menu_alpha_item->setCommand(delayed_save_and_reconf);
1772 alpha_menu->insertItem(menu_alpha_item);
1773
1774 alpha_menu->updateMenu();
1775 menu.insertSubmenu(alphamenu_label, alpha_menu);
1776 }
1777#endif // HAVE_XRENDER
1778
1779 Configmenus::iterator it = m_configmenu_list.begin();
1780 Configmenus::iterator it_end = m_configmenu_list.end();
1781 for (; it != it_end; ++it)
1782 menu.insertSubmenu(it->first, it->second);
1783
1784 _BOOLITEM(menu, Configmenu, OpaqueMove,
1785 "Opaque Window Moving",
1786 "Window Moving with whole window visible (as opposed to outline moving)",
1787 resource.opaque_move, saverc_cmd);
1788 _BOOLITEM(menu, Configmenu, WorkspaceWarping,
1789 "Workspace Warping",
1790 "Workspace Warping - dragging windows to the edge and onto the next workspace",
1791 resource.workspace_warping, saverc_cmd);
1792
1793#undef _BOOLITEM
1794
1795 // finaly update menu
1796 menu.updateMenu(); 1447 menu.updateMenu();
1797} 1448}
1798 1449