// Configmenu.cc for Fluxbox Window Manager // Copyright (c) 2001 - 2002 Henrik Kinnunen (fluxgen@linuxmail.org) // // Configmenu.cc for Blackbox - An X11 Window Manager // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // $Id: Configmenu.cc,v 1.20 2002/10/25 21:10:58 fluxgen Exp $ #include "Configmenu.hh" #include "i18n.hh" #include "Toolbar.hh" #include "Window.hh" #include "Screen.hh" #include "Tab.hh" #include "fluxbox.hh" #ifdef HAVE_CONFIG_H #include "config.h" #endif // HAVE_CONFIG_H enum {CMENU_USE_TABS=9, CMENU_USE_ICONS, CMENU_SLOPPY_WIN_GROUP, CMENU_DESKTOP_WHEELING, CMENU_WORKSPACE_WARPING, CMENU_ANTIALIAS, CMENU_TAB_ROTATE=21}; Configmenu::Configmenu(BScreen *scr) : Basemenu(scr), m_focusmenu(scr), m_placementmenu(scr), m_tabmenu(scr) { I18n *i18n = I18n::instance(); setLabel(i18n->getMessage( FBNLS::ConfigmenuSet, FBNLS::ConfigmenuConfigOptions, "Config options")); setInternalMenu(); using namespace FBNLS; insert(i18n->getMessage( ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"), &m_focusmenu); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"), &m_placementmenu); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuTabPlacement, "Tab Placement"), &m_tabmenu); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuImageDithering, "Image Dithering"), 1); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuOpaqueMove, "Opaque Window Moving"), 2); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuFullMax, "Full Maximization"), 3); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuFocusNew, "Focus New Windows"), 4); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuFocusLast, "Focus Last Window on Workspace"), 5); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuMaxOverSlit, "Maximize Over Slit"), 6); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuTabs, "Use Tabs"), CMENU_USE_TABS); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuIcons, "Use Icons"), CMENU_USE_ICONS); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuSloppyWindowGrouping, "Sloppy Window Grouping"), CMENU_SLOPPY_WIN_GROUP); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuWorkspaceWarping, "Workspace Warping"), CMENU_WORKSPACE_WARPING); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuDesktopWheeling, "Desktop MouseWheel Switching"), CMENU_DESKTOP_WHEELING); //TODO: do we really need i18n support for this? #ifdef USE_XFT insert("Antialias", CMENU_ANTIALIAS); #endif // USE_XFT update(); setItemSelected(8, screen()->doMaxOverSlit()); setItemSelected(3, screen()->getImageControl()->doDither()); setItemSelected(4, screen()->doOpaqueMove()); setItemSelected(5, screen()->doFullMax()); setItemSelected(6, screen()->doFocusNew()); setItemSelected(7, screen()->doFocusLast()); setItemSelected(CMENU_USE_TABS, Fluxbox::instance()->useTabs()); setItemSelected(CMENU_USE_ICONS, Fluxbox::instance()->useIconBar()); setItemSelected(CMENU_SLOPPY_WIN_GROUP, screen()->isSloppyWindowGrouping()); setItemSelected(CMENU_WORKSPACE_WARPING, screen()->isWorkspaceWarping()); setItemSelected(CMENU_DESKTOP_WHEELING, screen()->isDesktopWheeling()); #ifdef USE_XFT setItemSelected(CMENU_ANTIALIAS, screen()->antialias()); #endif // USE_XFT } Configmenu::~Configmenu() { } void Configmenu::itemSelected(int button, unsigned int index) { if (button == 1) { BasemenuItem *item = find(index); if (item->function()) switch(item->function()) { case 1: // dither screen()->getImageControl()-> setDither((! screen()->getImageControl()->doDither())); setItemSelected(index, screen()->getImageControl()->doDither()); break; case 2: // opaque move screen()->saveOpaqueMove((! screen()->doOpaqueMove())); setItemSelected(index, screen()->doOpaqueMove()); break; case 3: // full maximization screen()->saveFullMax((! screen()->doFullMax())); setItemSelected(index, screen()->doFullMax()); break; case 4: // focus new windows screen()->saveFocusNew((! screen()->doFocusNew())); setItemSelected(index, screen()->doFocusNew()); break; case 6: // maximize over slit screen()->saveMaxOverSlit( !screen()->doMaxOverSlit() ); setItemSelected(index, screen()->doMaxOverSlit()); break; case 5: // focus last window on workspace screen()->saveFocusLast((! screen()->doFocusLast())); setItemSelected(index, screen()->doFocusLast()); break; case CMENU_USE_TABS: { Fluxbox *fluxbox = Fluxbox::instance(); fluxbox->saveTabs(!fluxbox->useTabs()); setItemSelected(index, fluxbox->useTabs()); screen()->reconfigure(); } break; case CMENU_USE_ICONS: { Fluxbox *fluxbox = Fluxbox::instance(); fluxbox->saveIconBar(!fluxbox->useIconBar()); setItemSelected(index, fluxbox->useIconBar()); screen()->reconfigure(); } break; case CMENU_SLOPPY_WIN_GROUP: { screen()->saveSloppyWindowGrouping(!screen()->isSloppyWindowGrouping()); setItemSelected(index, screen()->isSloppyWindowGrouping()); screen()->reconfigure(); } break; case CMENU_WORKSPACE_WARPING: { screen()->saveWorkspaceWarping(!screen()->isWorkspaceWarping()); setItemSelected(index, screen()->isWorkspaceWarping()); screen()->reconfigure(); } break; case CMENU_DESKTOP_WHEELING: { screen()->saveDesktopWheeling(!screen()->isDesktopWheeling()); setItemSelected(index, screen()->isDesktopWheeling()); screen()->reconfigure(); } break; #ifdef USE_XFT case CMENU_ANTIALIAS: // Note: no need to reconfigure here, screen reconfigures if antialias changes screen()->setAntialias(!screen()->antialias()); setItemSelected(index, screen()->antialias()); break; #endif // USE_XFT } //save resources Fluxbox::instance()->save_rc(); } } void Configmenu::reconfigure() { m_focusmenu.reconfigure(); m_placementmenu.reconfigure(); m_tabmenu.reconfigure(); Basemenu::reconfigure(); } Configmenu::Focusmenu::Focusmenu(BScreen *scr) : Basemenu(scr) { I18n *i18n = I18n::instance(); using namespace FBNLS; setLabel(i18n->getMessage( ConfigmenuSet, ConfigmenuFocusModel, "Focus Model")); setInternalMenu(); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuSemiSloppyFocus, "Semi Sloppy Focus"), 3); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 4); update(); setItemSelected(0, !(screen()->isSloppyFocus() || screen()->isSemiSloppyFocus())); setItemSelected(1, screen()->isSloppyFocus()); setItemSelected(2, screen()->isSemiSloppyFocus()); setItemEnabled(3, (screen()->isSloppyFocus() || screen()->isSemiSloppyFocus())); setItemSelected(3, screen()->doAutoRaise()); } void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) { if (button == 1) { BasemenuItem *item = find(index); if (item->function()) { switch (item->function()) { case 1: // click to focus screen()->saveSloppyFocus(False); screen()->saveSemiSloppyFocus(False); screen()->saveAutoRaise(False); if (! Fluxbox::instance()->getFocusedWindow()) { XSetInputFocus(Fluxbox::instance()->getXDisplay(), screen()->getToolbar()->getWindowID(), RevertToParent, CurrentTime); } else { XSetInputFocus(Fluxbox::instance()->getXDisplay(), Fluxbox::instance()->getFocusedWindow()->getClientWindow(), RevertToParent, CurrentTime); } screen()->reconfigure(); break; case 2: // sloppy focus screen()->saveSemiSloppyFocus(False); screen()->saveSloppyFocus(True); screen()->reconfigure(); break; case 3: // semi sloppy focus screen()->saveSloppyFocus(False); screen()->saveSemiSloppyFocus(True); screen()->reconfigure(); break; case 4: // auto raise with sloppy focus Bool change = ((screen()->doAutoRaise()) ? False : True); screen()->saveAutoRaise(change); break; } //save resources Fluxbox::instance()->save_rc(); //toggle options setItemSelected(0, !(screen()->isSloppyFocus() || screen()->isSemiSloppyFocus())); setItemSelected(1, screen()->isSloppyFocus()); setItemSelected(2, screen()->isSemiSloppyFocus()); setItemEnabled(3, (screen()->isSloppyFocus() || screen()->isSemiSloppyFocus())); setItemSelected(3, screen()->doAutoRaise()); } } } Configmenu::Placementmenu::Placementmenu(BScreen *scr) : Basemenu(scr) { I18n *i18n = I18n::instance(); using namespace FBNLS; setLabel(i18n->getMessage( ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement")); setInternalMenu(); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"), BScreen::ROWSMARTPLACEMENT); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"), BScreen::COLSMARTPLACEMENT); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"), BScreen::CASCADEPLACEMENT); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"), BScreen::LEFTRIGHT); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"), BScreen::RIGHTLEFT); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"), BScreen::TOPBOTTOM); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"), BScreen::BOTTOMTOP); update(); switch (screen()->getPlacementPolicy()) { case BScreen::ROWSMARTPLACEMENT: setItemSelected(0, true); break; case BScreen::COLSMARTPLACEMENT: setItemSelected(1, true); break; case BScreen::CASCADEPLACEMENT: setItemSelected(2, true); break; } bool rl = (screen()->getRowPlacementDirection() == BScreen::LEFTRIGHT), tb = (screen()->getColPlacementDirection() == BScreen::TOPBOTTOM); setItemSelected(3, rl); setItemSelected(4, ! rl); setItemSelected(5, tb); setItemSelected(6, ! tb); } void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) { if (button == 1) { BasemenuItem *item = find(index); if (item->function()) { switch (item->function()) { case BScreen::ROWSMARTPLACEMENT: screen()->savePlacementPolicy(item->function()); setItemSelected(0, true); setItemSelected(1, false); setItemSelected(2, false); break; case BScreen::COLSMARTPLACEMENT: screen()->savePlacementPolicy(item->function()); setItemSelected(0, false); setItemSelected(1, true); setItemSelected(2, false); break; case BScreen::CASCADEPLACEMENT: screen()->savePlacementPolicy(item->function()); setItemSelected(0, false); setItemSelected(1, false); setItemSelected(2, true); break; case BScreen::LEFTRIGHT: screen()->saveRowPlacementDirection(BScreen::LEFTRIGHT); setItemSelected(3, true); setItemSelected(4, false); break; case BScreen::RIGHTLEFT: screen()->saveRowPlacementDirection(BScreen::RIGHTLEFT); setItemSelected(3, false); setItemSelected(4, true); break; case BScreen::TOPBOTTOM: screen()->saveColPlacementDirection(BScreen::TOPBOTTOM); setItemSelected(5, true); setItemSelected(6, false); break; case BScreen::BOTTOMTOP: screen()->saveColPlacementDirection(BScreen::BOTTOMTOP); setItemSelected(5, false); setItemSelected(6, true); break; } //save resources Fluxbox::instance()->save_rc(); } } } Configmenu::Tabmenu::Tabmenu(BScreen *scr) : Basemenu(scr) { I18n *i18n = I18n::instance(); using namespace FBNLS; setLabel(i18n->getMessage( ConfigmenuSet, ConfigmenuTabPlacement, "Tab Placement")); setInternalMenu(); insert(i18n->getMessage( CommonSet, CommonPlacementTopLeft, "Top Left"), Tab::PTOP + Tab::ALEFT); insert(i18n->getMessage( CommonSet, CommonPlacementTopCenter, "Top Center"), Tab::PTOP + Tab::ACENTER); insert(i18n->getMessage( CommonSet, CommonPlacementTopRight, "Top Right"), Tab::PTOP + Tab::ARIGHT); insert(i18n->getMessage( CommonSet, CommonPlacementTopRelative, "Top Relative"), Tab::PTOP + Tab::ARELATIVE); insert(i18n->getMessage( CommonSet, CommonPlacementBottomLeft, "Bottom Left"), Tab::PBOTTOM + Tab::ALEFT); insert(i18n->getMessage( CommonSet, CommonPlacementBottomCenter, "Bottom Center"), Tab::PBOTTOM + Tab::ACENTER); insert(i18n->getMessage( CommonSet, CommonPlacementBottomRight, "Bottom Right"), Tab::PBOTTOM + Tab::ARIGHT); insert(i18n->getMessage( CommonSet, CommonPlacementBottomRelative, "Bottom Relative"), Tab::PBOTTOM + Tab::ARELATIVE); insert(i18n->getMessage( CommonSet, CommonPlacementLeftTop, "Left Top"), Tab::PLEFT + Tab::ARIGHT); insert(i18n->getMessage( CommonSet, CommonPlacementLeftCenter, "Left Center"), Tab::PLEFT + Tab::ACENTER); insert(i18n->getMessage( CommonSet, CommonPlacementLeftBottom, "Left Bottom"), Tab::PLEFT + Tab::ALEFT); insert(i18n->getMessage( CommonSet, CommonPlacementLeftRelative, "Left Relative"), Tab::PLEFT + Tab::ARELATIVE); insert(i18n->getMessage( CommonSet, CommonPlacementRightTop, "Right Top"), Tab::PRIGHT + Tab::ARIGHT); insert(i18n->getMessage( CommonSet, CommonPlacementRightCenter, "Right Center"), Tab::PRIGHT + Tab::ACENTER); insert(i18n->getMessage( CommonSet, CommonPlacementRightBottom, "Right Bottom"), Tab::PRIGHT + Tab::ALEFT); insert(i18n->getMessage( CommonSet, CommonPlacementRightRelative, "Right Relative"), Tab::PRIGHT + Tab::ARELATIVE); insert(i18n->getMessage( ConfigmenuSet, ConfigmenuTabRotateVertical, "Rotate Vertical Tabs"), CMENU_TAB_ROTATE); update(); setSelected(); } void Configmenu::Tabmenu::itemSelected(int button, unsigned int index) { if (button == 1) { #ifdef DEBUG fprintf(stderr, "Item(%d)\n", index); #endif BasemenuItem *item = find(index); switch (item->function()) { case (Tab::PTOP + Tab::ALEFT): screen()->saveTabPlacement(Tab::PTOP); screen()->saveTabAlignment(Tab::ALEFT); screen()->reconfigure(); break; case (Tab::PTOP + Tab::ACENTER): screen()->saveTabPlacement(Tab::PTOP); screen()->saveTabAlignment(Tab::ACENTER); screen()->reconfigure(); break; case (Tab::PTOP + Tab::ARIGHT): screen()->saveTabPlacement(Tab::PTOP); screen()->saveTabAlignment(Tab::ARIGHT); screen()->reconfigure(); break; case (Tab::PTOP + Tab::ARELATIVE): screen()->saveTabPlacement(Tab::PTOP); screen()->saveTabAlignment(Tab::ARELATIVE); screen()->reconfigure(); break; case (Tab::PBOTTOM + Tab::ALEFT): screen()->saveTabPlacement(Tab::PBOTTOM); screen()->saveTabAlignment(Tab::ALEFT); screen()->reconfigure(); break; case (Tab::PBOTTOM + Tab::ACENTER): screen()->saveTabPlacement(Tab::PBOTTOM); screen()->saveTabAlignment(Tab::ACENTER); screen()->reconfigure(); break; case (Tab::PBOTTOM + Tab::ARIGHT): screen()->saveTabPlacement(Tab::PBOTTOM); screen()->saveTabAlignment(Tab::ARIGHT); screen()->reconfigure(); break; case (Tab::PBOTTOM + Tab::ARELATIVE): screen()->saveTabPlacement(Tab::PBOTTOM); screen()->saveTabAlignment(Tab::ARELATIVE); screen()->reconfigure(); break; case (Tab::PLEFT + Tab::ARIGHT): screen()->saveTabPlacement(Tab::PLEFT); screen()->saveTabAlignment(Tab::ARIGHT); screen()->reconfigure(); break; case (Tab::PLEFT + Tab::ACENTER): screen()->saveTabPlacement(Tab::PLEFT); screen()->saveTabAlignment(Tab::ACENTER); screen()->reconfigure(); break; case (Tab::PLEFT + Tab::ALEFT): screen()->saveTabPlacement(Tab::PLEFT); screen()->saveTabAlignment(Tab::ALEFT); screen()->reconfigure(); break; case (Tab::PLEFT + Tab::ARELATIVE): screen()->saveTabPlacement(Tab::PLEFT); screen()->saveTabAlignment(Tab::ARELATIVE); screen()->reconfigure(); break; case (Tab::PRIGHT + Tab::ARIGHT): screen()->saveTabPlacement(Tab::PRIGHT); screen()->saveTabAlignment(Tab::ARIGHT); screen()->reconfigure(); break; case (Tab::PRIGHT + Tab::ACENTER): screen()->saveTabPlacement(Tab::PRIGHT); screen()->saveTabAlignment(Tab::ACENTER); screen()->reconfigure(); break; case (Tab::PRIGHT + Tab::ALEFT): screen()->saveTabPlacement(Tab::PRIGHT); screen()->saveTabAlignment(Tab::ALEFT); screen()->reconfigure(); break; case (Tab::PRIGHT + Tab::ARELATIVE): screen()->saveTabPlacement(Tab::PRIGHT); screen()->saveTabAlignment(Tab::ARELATIVE); screen()->reconfigure(); break; case CMENU_TAB_ROTATE: if (screen()->isTabRotateVertical()) screen()->saveTabRotateVertical(False); else screen()->saveTabRotateVertical(True); break; } //save resources Fluxbox::instance()->save_rc(); Fluxbox::instance()->reconfigureTabs(); //TODO setSelected(); } } void Configmenu::Tabmenu::setSelected() { setItemSelected(0, (screen()->getTabPlacement() == Tab::PTOP && screen()->getTabAlignment() == Tab::ALEFT)); setItemSelected(1, (screen()->getTabPlacement() == Tab::PTOP && screen()->getTabAlignment() == Tab::ACENTER)); setItemSelected(2, (screen()->getTabPlacement() == Tab::PTOP && screen()->getTabAlignment() == Tab::ARIGHT)); setItemSelected(3, (screen()->getTabPlacement() == Tab::PTOP && screen()->getTabAlignment() == Tab::ARELATIVE)); setItemSelected(4, (screen()->getTabPlacement() == Tab::PBOTTOM && screen()->getTabAlignment() == Tab::ALEFT)); setItemSelected(5, (screen()->getTabPlacement() == Tab::PBOTTOM && screen()->getTabAlignment() == Tab::ACENTER)); setItemSelected(6, (screen()->getTabPlacement() == Tab::PBOTTOM && screen()->getTabAlignment() == Tab::ARIGHT)); setItemSelected(7, (screen()->getTabPlacement() == Tab::PBOTTOM && screen()->getTabAlignment() == Tab::ARELATIVE)); setItemSelected(8, (screen()->getTabPlacement() == Tab::PLEFT && screen()->getTabAlignment() == Tab::ARIGHT)); setItemSelected(9, (screen()->getTabPlacement() == Tab::PLEFT && screen()->getTabAlignment() == Tab::ACENTER)); setItemSelected(10, (screen()->getTabPlacement() == Tab::PLEFT && screen()->getTabAlignment() == Tab::ALEFT)); setItemSelected(11, (screen()->getTabPlacement() == Tab::PLEFT && screen()->getTabAlignment() == Tab::ARELATIVE)); setItemSelected(12, (screen()->getTabPlacement() == Tab::PRIGHT && screen()->getTabAlignment() == Tab::ARIGHT)); setItemSelected(13, (screen()->getTabPlacement() == Tab::PRIGHT && screen()->getTabAlignment() == Tab::ACENTER)); setItemSelected(14, (screen()->getTabPlacement() == Tab::PRIGHT && screen()->getTabAlignment() == Tab::ALEFT)); setItemSelected(15, (screen()->getTabPlacement() == Tab::PRIGHT && screen()->getTabAlignment() == Tab::ARELATIVE)); setItemEnabled(16, (screen()->getTabPlacement() == Tab::PLEFT || screen()->getTabPlacement() == Tab::PRIGHT)); setItemSelected(16, (screen()->isTabRotateVertical() && (screen()->getTabPlacement() == Tab::PLEFT || screen()->getTabPlacement() == Tab::PRIGHT))); }