// SendToMenu.cc for Fluxbox // Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org) // and Simon Bowden (rathnor at users.sourceforge.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$ #include "SendToMenu.hh" #include "Window.hh" #include "Screen.hh" #include "Workspace.hh" #include "WindowCmd.hh" #include "fluxbox.hh" #include "Layer.hh" #include "FbTk/MultiButtonMenuItem.hh" #include "FbTk/Command.hh" class SendToCmd: public FbTk::Command { public: SendToCmd(int workspace, bool follow): m_workspace(workspace), m_follow(follow) { } void execute() { if (WindowCmd<void>::window() != 0) WindowCmd<void>::window()->screen().sendToWorkspace(m_workspace, WindowCmd<void>::window(), m_follow); } private: const int m_workspace; const bool m_follow; }; SendToMenu::SendToMenu(BScreen &screen): FbMenu(screen.menuTheme(), screen.imageControl(), *screen.layerManager().getLayer(Layer::MENU)) { // listen to: // workspace count signal // workspace names signal // current workspace signal screen.workspaceCountSig().attach(this); screen.workspaceNamesSig().attach(this); screen.currentWorkspaceSig().attach(this); disableTitle(); // build menu update(0); } void SendToMenu::update(FbTk::Subject *subj) { if (subj != 0) { if (subj == &(theme().reconfigSig())) { // we got reconfig Theme signal, let base menu handle it FbTk::Menu::update(subj); return; } } // rebuild menu removeAll(); BScreen *screen = Fluxbox::instance()->findScreen(screenNumber()); const BScreen::Workspaces &wlist = screen->getWorkspacesList(); for (size_t i = 0; i < wlist.size(); ++i) { FbTk::RefCount<FbTk::Command> sendto_cmd(new SendToCmd(i, false)); FbTk::RefCount<FbTk::Command> 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); } updateMenu(); } void SendToMenu::show() { if (WindowCmd<void>::window() != 0) { for (unsigned int i=0; i < numberOfItems(); ++i) setItemEnabled(i, true); setItemEnabled(WindowCmd<void>::window()->workspaceNumber(), false); updateMenu(); } FbTk::Menu::show(); }