-// Windowmenu.cc for Openbox
-// Copyright (c) 2001 Sean 'Shaleh' Perry <shaleh@debian.org>
+// -*- mode: C++; indent-tabs-mode: nil; -*-
+// Windowmenu.cc for Blackbox - an X11 Window manager
+// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry <shaleh@debian.org>
// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
//
// Permission is hereby granted, free of charge, to any person obtaining a
// 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 <string.h>
-#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());
}
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();
}
-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();
}
-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();
}