From 5f9f2475b72e977fa96214e368c34c588b265888 Mon Sep 17 00:00:00 2001
From: Mark Tiefenbruck <mark@fluxbox.org>
Date: Sun, 28 Jun 2009 10:15:06 -0700
Subject: make Raise/LowerLayer accept integer argument for number of layers,
 default 2

---
 ChangeLog                     |  2 ++
 doc/asciidoc/fluxbox-keys.txt |  2 +-
 doc/fluxbox-keys.5.in         |  2 +-
 src/CurrentWindowCmd.cc       | 25 +++++++++++++++++++------
 src/CurrentWindowCmd.hh       | 11 +++++++++++
 src/Window.cc                 |  9 ++-------
 src/Window.hh                 |  3 +--
 7 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 925e20e..da33f82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
  (Format: Year/Month/Day)
 Changes for 1.1.2
 *09/06/28:
+   * Make Raise/LowerLayer commands accept integer argument, defualt 2 (Mark)
+     CurrentWindowCmd.cc/hh Window.cc/hh
    * Change default toolbar head to 1 (Mark)
      Toolbar.cc
    * Add window menu and alt-tab to error case for keys file (Mark)
diff --git a/doc/asciidoc/fluxbox-keys.txt b/doc/asciidoc/fluxbox-keys.txt
index ae9abb0..58f59b1 100644
--- a/doc/asciidoc/fluxbox-keys.txt
+++ b/doc/asciidoc/fluxbox-keys.txt
@@ -195,7 +195,7 @@ These commands ordinarily affect only the currently focused window. The
 	Reorder this window to the top or bottom of the window stack, within
 	its current layer. See 'fluxbox(1)' for a discussion of layers.
 
-*RaiseLayer* / *LowerLayer*::
+*RaiseLayer* / *LowerLayer* ['offset']::
 	Raise the window up to the layer above, or lower it to the layer
 	below. See 'fluxbox(1)' for a discussion of layers.
 
diff --git a/doc/fluxbox-keys.5.in b/doc/fluxbox-keys.5.in
index f1ee22f..1420162 100644
--- a/doc/fluxbox-keys.5.in
+++ b/doc/fluxbox-keys.5.in
@@ -278,7 +278,7 @@ Reorder this window to the top or bottom of the window stack, within its current
 for a discussion of layers\&.
 .RE
 .PP
-\fBRaiseLayer\fR / \fBLowerLayer\fR
+\fBRaiseLayer\fR / \fBLowerLayer\fR [\fIoffset\fR]
 .RS 4
 Raise the window up to the layer above, or lower it to the layer below\&. See
 \fIfluxbox(1)\fR
diff --git a/src/CurrentWindowCmd.cc b/src/CurrentWindowCmd.cc
index dfb5c19..6cb5c08 100644
--- a/src/CurrentWindowCmd.cc
+++ b/src/CurrentWindowCmd.cc
@@ -52,12 +52,8 @@ FbTk::Command<void> *createCurrentWindowCmd(const std::string &command,
         return new CurrentWindowCmd(&FluxboxWindow::maximizeHorizontal);
     else if (command == "raise")
         return new CurrentWindowCmd(&FluxboxWindow::raise);
-    else if (command == "raiselayer")
-        return new CurrentWindowCmd(&FluxboxWindow::raiseLayer);
     else if (command == "lower")
         return new CurrentWindowCmd(&FluxboxWindow::lower);
-    else if (command == "lowerlayer")
-        return new CurrentWindowCmd(&FluxboxWindow::lowerLayer);
     else if (command == "close")
         return new CurrentWindowCmd(&FluxboxWindow::close);
     else if (command == "killwindow" || command == "kill")
@@ -95,9 +91,7 @@ REGISTER_COMMAND_PARSER(maximize, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(maximizevertical, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(maximizehorizontal, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(raise, createCurrentWindowCmd, void);
-REGISTER_COMMAND_PARSER(raiselayer, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(lower, createCurrentWindowCmd, void);
-REGISTER_COMMAND_PARSER(lowerlayer, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(close, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(killwindow, createCurrentWindowCmd, void);
 REGISTER_COMMAND_PARSER(kill, createCurrentWindowCmd, void);
@@ -466,6 +460,25 @@ void SetLayerCmd::real_execute() {
     fbwindow().moveToLayer(m_layer);
 }
 
+FbTk::Command<void> *ChangeLayerCmd::parse(const string &command,
+        const string &args, bool trusted) {
+    int num = 2;
+    FbTk_istringstream iss(args.c_str());
+    iss >> num;
+    if (command == "raiselayer")
+        return new ChangeLayerCmd(-num);
+    else if (command == "lowerlayer")
+        return new ChangeLayerCmd(num);
+    return 0;
+}
+
+REGISTER_COMMAND_PARSER(raiselayer, ChangeLayerCmd::parse, void);
+REGISTER_COMMAND_PARSER(lowerlayer, ChangeLayerCmd::parse, void);
+
+void ChangeLayerCmd::real_execute() {
+    fbwindow().changeLayer(m_diff);
+}
+
 namespace {
 class SetTitleDialog: public TextDialog, public FbTk::Observer {
 public:
diff --git a/src/CurrentWindowCmd.hh b/src/CurrentWindowCmd.hh
index 32cc5f0..edf00fa 100644
--- a/src/CurrentWindowCmd.hh
+++ b/src/CurrentWindowCmd.hh
@@ -255,6 +255,17 @@ private:
     int m_layer;
 };
 
+class ChangeLayerCmd: public WindowHelperCmd {
+public:
+    explicit ChangeLayerCmd(int diff): m_diff(diff) { }
+    static FbTk::Command<void> *parse(const std::string &command,
+                                      const std::string &args, bool trusted);
+protected:
+    void real_execute();
+private:
+    int m_diff;
+};
+
 class MatchCmd: public WindowHelperBoolCmd {
 public:
     MatchCmd(const std::string &pat): m_pat(pat.c_str()) { };
diff --git a/src/Window.cc b/src/Window.cc
index 825c050..defa6cc 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -1697,15 +1697,10 @@ void FluxboxWindow::tempRaise() {
 }
 
 
-void FluxboxWindow::raiseLayer() {
-    moveToLayer(m_state.layernum-1);
+void FluxboxWindow::changeLayer(int diff) {
+    moveToLayer(m_state.layernum+diff);
 }
 
-void FluxboxWindow::lowerLayer() {
-    moveToLayer(m_state.layernum+1);
-}
-
-
 void FluxboxWindow::moveToLayer(int layernum, bool force) {
 #ifdef DEBUG
     cerr<<"FluxboxWindow("<<title()<<")::moveToLayer("<<layernum<<")"<<endl;
diff --git a/src/Window.hh b/src/Window.hh
index bf177b4..92d20d7 100644
--- a/src/Window.hh
+++ b/src/Window.hh
@@ -243,8 +243,7 @@ public:
     void raise();
     void lower();
     void tempRaise();
-    void raiseLayer();
-    void lowerLayer();
+    void changeLayer(int diff);
     /// moves the window to a new layer
     void moveToLayer(int layernum, bool force = false);
     int getOnHead() const;
-- 
cgit v0.11.2