X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindowmenu.cc;h=c49a6f91e3177771649654ee590afe050078814d;hb=45863e605c2dc7d605293331c26f688305c45fac;hp=8483f1ab97b72397e140ba92f00d1a729d364977;hpb=72af8cea6a0573f7d2c004102cd04f1a1ad88798;p=chaz%2Fopenbox diff --git a/src/Windowmenu.cc b/src/Windowmenu.cc index 8483f1ab..c49a6f91 100644 --- a/src/Windowmenu.cc +++ b/src/Windowmenu.cc @@ -1,5 +1,6 @@ -// Windowmenu.cc for Openbox -// Copyright (c) 2001 Sean 'Shaleh' Perry +// -*- mode: C++; indent-tabs-mode: nil; -*- +// Windowmenu.cc for Blackbox - an X11 Window manager +// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // // Permission is hereby granted, free of charge, to any person obtaining a @@ -20,62 +21,57 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// stupid macros needed to access some functions in version 2 of the GNU C -// library -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif // _GNU_SOURCE - #ifdef HAVE_CONFIG_H # include "../config.h" #endif // HAVE_CONFIG_H -#include "i18n.h" -#include "openbox.h" -#include "Screen.h" -#include "Window.h" -#include "Windowmenu.h" -#include "Workspace.h" - -#ifdef STDC_HEADERS +extern "C" { +#ifdef HAVE_STRING_H # include -#endif // STDC_HEADERS +#endif // HAVE_STRING_H +} +#include "i18n.hh" +#include "blackbox.hh" +#include "Screen.hh" +#include "Window.hh" +#include "Windowmenu.hh" +#include "Workspace.hh" -Windowmenu::Windowmenu(OpenboxWindow &win) : Basemenu(*win.getScreen()), - window(win), screen(*win.getScreen()) -{ + +Windowmenu::Windowmenu(BlackboxWindow *win) : Basemenu(win->getScreen()) { + window = win; setTitleVisibility(False); setMovable(False); setInternalMenu(); - sendToMenu = new SendtoWorkspacemenu(*this); - insert(i18n->getMessage(WindowmenuSet, WindowmenuSendTo, "Send To ..."), - sendToMenu); - insert(i18n->getMessage(WindowmenuSet, WindowmenuShade, "Shade"), - BScreen::WindowShade); - insert(i18n->getMessage(WindowmenuSet, WindowmenuIconify, "Iconify"), - BScreen::WindowIconify); - insert(i18n->getMessage(WindowmenuSet, WindowmenuMaximize, "Maximize"), - BScreen::WindowMaximize); - insert(i18n->getMessage(WindowmenuSet, WindowmenuRaise,"Raise"), - BScreen::WindowRaise); - insert(i18n->getMessage(WindowmenuSet, WindowmenuLower, "Lower"), - BScreen::WindowLower); - insert(i18n->getMessage(WindowmenuSet, WindowmenuStick, "Stick"), - BScreen::WindowStick); - insert(i18n->getMessage(WindowmenuSet, WindowmenuKillClient, "Kill Client"), - BScreen::WindowKill); - insert(i18n->getMessage(WindowmenuSet, WindowmenuClose, "Close"), - BScreen::WindowClose); + sendToMenu = new SendtoWorkspacemenu(this); + insert(i18n(WindowmenuSet, WindowmenuSendTo, "Send To ..."), + sendToMenu); + insert(i18n(WindowmenuSet, WindowmenuShade, "Shade"), + BScreen::WindowShade); + insert(i18n(WindowmenuSet, WindowmenuIconify, "Iconify"), + BScreen::WindowIconify); + insert(i18n(WindowmenuSet, WindowmenuMaximize, "Maximize"), + BScreen::WindowMaximize); + insert(i18n(WindowmenuSet, WindowmenuRaise,"Raise"), + BScreen::WindowRaise); + insert(i18n(WindowmenuSet, WindowmenuLower, "Lower"), + BScreen::WindowLower); + insert(i18n(WindowmenuSet, WindowmenuStick, "Stick"), + BScreen::WindowStick); + insert(i18n(WindowmenuSet, WindowmenuKillClient, "Kill Client"), + BScreen::WindowKill); + insert(i18n(WindowmenuSet, WindowmenuClose, "Close"), + BScreen::WindowClose); update(); - setItemEnabled(1, window.hasTitlebar()); - setItemEnabled(2, window.isIconifiable()); - setItemEnabled(3, window.isMaximizable()); - setItemEnabled(8, window.isClosable()); + setItemEnabled(1, window->hasTitlebar()); + setItemEnabled(2, window->isIconifiable()); + setItemEnabled(3, window->isMaximizable()); + setItemEnabled(8, window->isClosable()); } @@ -85,71 +81,69 @@ Windowmenu::~Windowmenu(void) { void Windowmenu::show(void) { - if (isItemEnabled(1)) setItemSelected(1, window.isShaded()); - if (isItemEnabled(3)) setItemSelected(3, window.isMaximized()); - if (isItemEnabled(6)) setItemSelected(6, window.isStuck()); + if (isItemEnabled(1)) setItemSelected(1, window->isShaded()); + if (isItemEnabled(3)) setItemSelected(3, window->isMaximized()); + if (isItemEnabled(6)) setItemSelected(6, window->isStuck()); Basemenu::show(); } -void Windowmenu::itemSelected(int button, int index) { +void Windowmenu::itemSelected(int button, unsigned int index) { + if (button != 1) + return; + BasemenuItem *item = find(index); - /* Added by Scott Moynes, April 8, 2002 - Ignore the middle button for every item except the maximize - button in the window menu. Maximize needs it for - horizontal/vertical maximize, however, for the others it is - inconsistent with the rest of the window behaviour. - */ - if(button != 2) { - hide(); - switch (item->function()) { - case BScreen::WindowShade: - window.shade(); - break; - - case BScreen::WindowIconify: - window.iconify(); - break; - - case BScreen::WindowMaximize: - window.maximize((unsigned int) button); - break; - - case BScreen::WindowClose: - window.close(); - break; - - case BScreen::WindowRaise: - screen.getWorkspace(window.getWorkspaceNumber())->raiseWindow(&window); - break; - - case BScreen::WindowLower: - screen.getWorkspace(window.getWorkspaceNumber())->lowerWindow(&window); - break; - - case BScreen::WindowStick: - window.stick(); - break; - - case BScreen::WindowKill: - XKillClient(screen.getBaseDisplay().getXDisplay(), - window.getClientWindow()); - break; - } - } else if (item->function() == BScreen::WindowMaximize) { - hide(); - window.maximize((unsigned int) button); + hide(); + switch (item->function()) { + case BScreen::WindowShade: + window->shade(); + break; + + case BScreen::WindowIconify: + window->iconify(); + break; + + case BScreen::WindowMaximize: + window->maximize(1); // full maximize + break; + + case BScreen::WindowClose: + window->close(); + break; + + case BScreen::WindowRaise: { + Workspace *wkspc = + getScreen()->getWorkspace(window->getWorkspaceNumber()); + wkspc->raiseWindow(window); + } + break; + + case BScreen::WindowLower: { + Workspace *wkspc = + getScreen()->getWorkspace(window->getWorkspaceNumber()); + wkspc->lowerWindow(window); + } + break; + + case BScreen::WindowStick: + window->stick(); + break; + + case BScreen::WindowKill: + XKillClient(getScreen()->getBaseDisplay()->getXDisplay(), + window->getClientWindow()); + break; } } void Windowmenu::reconfigure(void) { - setItemEnabled(1, window.hasTitlebar()); - setItemEnabled(2, window.isIconifiable()); - setItemEnabled(3, window.isMaximizable()); - setItemEnabled(8, window.isClosable()); + setItemEnabled(1, window->hasTitlebar()); + setItemEnabled(2, window->isIconifiable()); + setItemEnabled(3, window->isMaximizable()); + setItemEnabled(8, window->isClosable()); sendToMenu->reconfigure(); @@ -157,8 +151,11 @@ void Windowmenu::reconfigure(void) { } -Windowmenu::SendtoWorkspacemenu::SendtoWorkspacemenu(Windowmenu &w) - : Basemenu(w.screen), windowmenu(w) { +Windowmenu::SendtoWorkspacemenu::SendtoWorkspacemenu(Windowmenu *w) + : Basemenu(w->getScreen()) { + + window = w->window; + setTitleVisibility(False); setMovable(False); setInternalMenu(); @@ -166,30 +163,39 @@ Windowmenu::SendtoWorkspacemenu::SendtoWorkspacemenu(Windowmenu &w) } -void Windowmenu::SendtoWorkspacemenu::itemSelected(int button, int index) { +void Windowmenu::SendtoWorkspacemenu::itemSelected(int button, + unsigned int index) { if (button > 2) return; - if (index <= windowmenu.screen.getWorkspaceCount()) { - if (index == windowmenu.screen.getCurrentWorkspaceID()) return; - if (windowmenu.window.isStuck()) windowmenu.window.stick(); + if (index <= getScreen()->getWorkspaceCount()) { + if (index == getScreen()->getCurrentWorkspaceID()) return; + if (window->isStuck()) window->stick(); - if (button == 1) windowmenu.window.withdraw(); - windowmenu.screen.reassociateWindow(&(windowmenu.window), index, True); - if (button == 2) windowmenu.screen.changeWorkspaceID(index); + if (button == 1) window->withdraw(); + getScreen()->reassociateWindow(window, index, True); + if (button == 2) getScreen()->changeWorkspaceID(index); } hide(); } void Windowmenu::SendtoWorkspacemenu::update(void) { - int i, r = getCount(); - - if (r != 0) - for (i = 0; i < r; ++i) - remove(0); + unsigned int i, r = getCount(), + workspace_count = getScreen()->getWorkspaceCount(); + while (r > workspace_count) { + remove(0); + r = getCount(); + } - for (i = 0; i < windowmenu.screen.getWorkspaceCount(); ++i) - insert(windowmenu.screen.getWorkspace(i)->getName()); + for (i = 0; i < workspace_count; ++i) { + if (r < workspace_count) { + insert(getScreen()->getWorkspace(i)->getName()); + ++r; + } else { + changeItemLabel(i, getScreen()->getWorkspace(i)->getName()); + setItemEnabled(i, i != getScreen()->getCurrentWorkspaceID()); + } + } Basemenu::update(); }