]> Dogcows Code - chaz/openbox/blobdiff - src/Windowmenu.cc
build a 'openbox' binary
[chaz/openbox] / src / Windowmenu.cc
index 8483f1ab97b72397e140ba92f00d1a729d364977..f274a047e3cc38e121503bd305154b48d29dac3a 100644 (file)
@@ -1,5 +1,6 @@
-// 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());
 }
 
 
@@ -85,71 +81,64 @@ 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) {
   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(button);
+    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 +146,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 +158,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)
+  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());
+    }
+  }
 
   Basemenu::update();
 }
This page took 0.027132 seconds and 4 git commands to generate.