diff options
Diffstat (limited to 'src/Screen.cc')
-rw-r--r-- | src/Screen.cc | 367 |
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 *) { | |||
173 | int calcSquareDistance(int x1, int y1, int x2, int y2) { | 174 | int 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 | |||
177 | class TabPlacementMenuItem: public FbTk::RadioMenuItem { | ||
178 | public: | ||
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 | |||
195 | private: | ||
196 | BScreen &m_screen; | ||
197 | FbWinFrame::TabPlacement m_place; | ||
198 | }; | ||
199 | |||
200 | void clampMenuDelay(int& delay) { | 177 | void 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 | ||
205 | struct TabPlacementString { | ||
206 | FbWinFrame::TabPlacement placement; | ||
207 | const char* str; | ||
208 | }; | ||
209 | |||
210 | const 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 | |||
225 | Atom atom_fbcmd = 0; | 182 | Atom atom_fbcmd = 0; |
226 | Atom atom_wm_check = 0; | 183 | Atom atom_wm_check = 0; |
227 | Atom atom_net_desktop = 0; | 184 | Atom 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 | ||
246 | namespace FbTk { | ||
247 | |||
248 | template<> | ||
249 | string FbTk::Resource<FbWinFrame::TabPlacement>:: | ||
250 | getString() 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 | |||
258 | template<> | ||
259 | void FbTk::Resource<FbWinFrame::TabPlacement>:: | ||
260 | setFromString(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 | |||
275 | BScreen::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 | ||
308 | BScreen::BScreen(FbTk::ResourceManager &rm, | 203 | BScreen::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 | ||
596 | bool BScreen::isRestart() { | 490 | bool BScreen::isRestart() { |
@@ -1541,258 +1435,15 @@ float BScreen::getYGap(int head) { | |||
1541 | } | 1435 | } |
1542 | 1436 | ||
1543 | void BScreen::setupConfigmenu(FbTk::Menu &menu) { | 1437 | void 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 | ||