-// 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()) {
+
+Windowmenu::Windowmenu(BlackboxWindow *win) : Basemenu(win->getScreen()) {
window = win;
- screen = window->getScreen();
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);
+ 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();
}
-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;
}
}
Windowmenu::SendtoWorkspacemenu::SendtoWorkspacemenu(Windowmenu *w)
- : Basemenu(w->screen) {
- windowmenu = w;
+ : Basemenu(w->getScreen()) {
+
+ window = w->window;
setTitleVisibility(False);
setMovable(False);
}
-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)
+ unsigned int i, r = getCount(),
+ workspace_count = getScreen()->getWorkspaceCount();
+ if (r > workspace_count) {
+ for (i = r; i < workspace_count; ++i)
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();
}