Re: Patch to save memory and speed up StyleTab

fuchur <[email protected]>
Newsgroups gmane.comp.window-managers.sawfish
Organization W.W
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

On Sun, 20 Apr 2014 13:20:40 +0200
wrote fuchur <[email protected]>:

>>looks good, I'm gonna test a bit more before commiting.

Here i have more for testing. I have completes cabinets gui.
Patches "10-tab-tiler-add.patch 11-tab-tiler-add.patch" apply after all
other patches from this thread. Cabinet also needs
cabinet-missing.png in "/usr/share/sawfish/images" (the default images
folder from sawfish) please add this icon.

Add:

(require 'sawfish.wm.state.maximize)
(require 'sawfish.wm.tabs.tabgroup)
(require 'sawfish.wm.ext.window-history)

in your ~/.sawfish/rc, why see below. Now cabinet works.

Bugs: (i have now idea why)

Without

(require 'sawfish.wm.state.maximize)
(require 'sawfish.wm.tabs.tabgroup)
(require 'sawfish.wm.ext.window-history)

in your ~/.sawfish/rc this key-commands not work:

maximize-window-toggle maximize-window-fullscreen-toggle
maximize-window-horizontally-toggle maximize-window-vertically-toggle
maximize-window-fullxinerama-toggle maximize-fill-window
maximize-fill-window-horizontally maximize-fill-window-vertically
tab-release-window tab-move-to-end tab-move-to-beginning
tab-move-to-right tab-move-to-left
window-history-save-position window-history-save-dimensions
window-history-save-attributes window-history-forget

if you have a new/clean "~/.sawfish/" folder. Cabinet can only call
key-commands which you can call from sawfish-client.

In events i have disable the re-exit hook see comment in the file.


- -- 
Regards,
Fuchur

GPG Fingerprint: CA3B 8204 5B3E 6D48 6D53  C116 E5BC 70D5 B8D7 B2B0
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iEYEARECAAYFAlNmNvIACgkQ5bxw1bjXsrDnYQCfduoswUIyExYJIJx2REDZarFd
XKYAnAmC7/7w3ZB5bTY77nVag+cQLM8i
=Q+JY
-----END PGP SIGNATURE-----
10-tab-tiler-add.patch (text/x-patch, 75.8 KB)
diff -urNad sawfish.orgi/lisp/sawfish/wm/autoload.jl sawfish/lisp/sawfish/wm/autoload.jl
--- sawfish.orgi/lisp/sawfish/wm/autoload.jl
+++ sawfish/lisp/sawfish/wm/autoload.jl
@@ -126,6 +126,8 @@
 (autoload-command 'slide-group-right 'sawfish.wm.commands.slide-window)
 (autoload-command 'slide-group-up 'sawfish.wm.commands.slide-window)
 (autoload-command 'slide-group-down 'sawfish.wm.commands.slide-window)
+(defgroup cabinet "Cabinet" :group focus :require sawfish.wm.ext.cabinet)
+(autoload-command 'cabinet-switch 'sawfish.wm.ext.cabinet)
 (defgroup gpsy "Grow, Pack, Shrink & Yank" :group move :require sawfish.wm.commands.grow-pack)
 (defgroup cycle "Window Cycling" :group focus :require sawfish.wm.commands.x-cycle)
 (defgroup shade-hover "Shade Hover" :group focus :require sawfish.wm.ext.shade-hover)
diff -urNad sawfish.orgi/lisp/sawfish/wm/ext/cabinet.jl sawfish/lisp/sawfish/wm/ext/cabinet.jl
--- sawfish.orgi/lisp/sawfish/wm/ext/cabinet.jl
+++ sawfish/lisp/sawfish/wm/ext/cabinet.jl
@@ -1,716 +1,956 @@
-;; cabinet.jl 1.1 -- A tool for window display,search and manipulation 
-;; Time-stamp: <2012-01-16 12:51:02 hqwrong>
-
+;; cabinet.jl
 
 ;; Copyright (C) 2011, 2012 hqwrong <[email protected]>
 
+;; This file is part of sawfish.
 
-     ;; This program is free software: you can redistribute it and/or modify
-     ;; it under the terms of the GNU General Public License as published by
-     ;; the Free Software Foundation, either version 3 of the License, or (at
-     ;; your option) any later version.
-
-     ;; This program is distributed in the hope that it will be useful, but
-     ;; WITHOUT ANY WARRANTY; without even the implied warranty of
-     ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     ;; General Public License for more details.
-
-     ;; You should have received a copy of the GNU General Public License
-     ;; along with this program.  If not, see `http://www.gnu.org/licenses/'.
-
-;;
-;;; Commentary:
-
-;; Note:
-;;  The words "window" and "application" mean same
-;;  thing,they are used interchangeablly. The word "item"
-;;  means the item displayed on Cabinet, which corresponding
-;;  to an application. The words "selected item" means the
-;;  first item on Cabinet. The words "selected window" means
-;;  the window corresponding to the selected item.
-
-;; ** Start up
-;;   Cabinet required `hqw-util.jl', it should have been published along
-;; with Cabinet. To separate them apart, because hqw-util.jl's
-;; independence, you may find it useful at other occasions.
-
-;;   Put `hqw-util.jl' and `cabinet.jl' into your load directory,and 
-
-;;   (require 'cabinet)
-
-;;   Use command `cabinet-switch' to start Cabinet.
-;; To bind it to "W-s",copy the following line to your rc file.
-
-;; (bind-keys global-keymap "W-s" 'cabinet-switch)
-
-;; ** Cabinet Features.
-;;   Cabinet has a similar interface with iswitch,it also adds
-;; some own features, like:
-
-;; 1) Support window icons to be shown
-;;    Actually,this is my main motive to write Cabinet. For
-;; People are apt to distinguish from images instead of
-;; text.
-
-;; 2) Support cycling among workspaces
-;;   Most times the reason you create another workspace is
-;; to make a bunch of applications distinguished from
-;; others. It's a bad idear to mix them together to choose
-;; from. The better one is only let you have applications of
-;; current workspace,and enable you to cycle among
-;; workspaces.
-;;   Though, Cabinet afford you a choice: To toggle between
-;; workspace-mode -- to just show windows of current workspace --
-;; and all-mode -- to show all the windows. When in
-;; workspace mode, the tag on split line is something like
-;; 2/3, which means the largest workspace id is 3, and now
-;; you are in workspace of id 2. When in all mode, the tag
-;; should be "ALL".
-;; Notice to make you cycle through workspaces,you should
-;; set workspace boundary to 'wrap-around,put this in your
-;; rc file:
-
-;; (setq workspace-boundary-mode 'wrap-around)
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or (at
+;; your option) any later version.
 
-;; 3) Distinguish windows for display from windows for
-;; manipulation.
-;;   Some applications, most time you are not inclined to
-;; select them via Cabinet, for you already have a hot key
-;; for them or other reasons, but somehow you just want to
-;; see them there: being displayed on Cabinet. You may see a
-;; split line on Cabinet, the items below it are windows
-;; that you just want to display. This feature makes Cabinet
-;; could somehow functions like a panel.
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
 
-;; 4) Use forground color instead of tag to indicate window
-;; status.
-;;   Because the same reason for enabling icons. Because it
-;; saves a charater's space.
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see `http://www.gnu.org/licenses/'.
 
-;; 5) Enable users to manipulate a bunch of windows.
-;; Use "Super-Spc" to mark the selected window, and use
-;; procedure `with-marked-wl', you can manipulate
-;; them. The marks will be cleared out after you quit
-;; from Cabinet. Cabinet affords a procedure to tile marked
-;; windows horizontally .
 
-;; 6) Item format
-;;   Item format is  like this :
-;;       icon + window name + <window class> + viewport id + workspace id
-;;   Variable `cabinet-item-text' controls what to append to icon.
-;;   You are welcomed to reset it.
+(define-structure sawfish.wm.ext.cabinet
+  
+    (export cabinet-switch
+            ;; 
+            cabinet-keymap-complete
+            cabinet-item-text
+            ;; you'll need following procedures only when
+            ;; you want to extend cabinet-keymap
+            with-update-on-workspace
+            with-selected
+            with-marked-wl
+            with-exit-and-clear-mark
+            with-update-on-input
+            with-new-wlist
+            with-draw)
+    
+    (open rep
+          rep.data
+          rep.system
+          rep.regexp
+          rep.lang.math
+          rep.io.timers
+          sawfish.wm.util.events
+          sawfish.wm.prg.compton
+          sawfish.wm.tabs.tabgroup
+          sawfish.wm.state.shading
+          sawfish.wm.state.iconify
+          sawfish.wm.stacking
+          sawfish.wm.util.workarea
+          sawfish.wm.viewport
+          sawfish.wm.state.maximize
+          sawfish.wm.util.display-window
+          sawfish.wm.custom
+          sawfish.wm.commands
+          sawfish.wm.colors
+          sawfish.wm.events
+          sawfish.wm.fonts
+          sawfish.wm.images
+          sawfish.wm.misc
+          sawfish.wm.util.x
+          sawfish.wm.windows
+          sawfish.wm.workspace)
 
-;; ** Cabinet Keymap
-;;   I made the default keymap(cabinet-keymap) according to my
-;; favour, So it's recommended to create yours. The easiest
-;; way to get started will be to copy the default keymap
-;; binding from the cabinet.jl, and modify it.
-;; Most key bindings are obvious, while some need extra explanation.
-;; Here is a list:
-;;           "Super-v"    toggle workspace-mode and all-mode
-;;           "Super-s"    cycle windows
-;;           "Super-r"    reversely cycle windows
-;;           "Super-S"     cycle workspaces.(Notice 'S' is capital)
-;;           "Super-R"     reversely cycle workspaces.
-;;           "Super-z"     toggle iconify property of selected window.
-;;           "Super-SPC"   mark selected window
-;;           "Super-x"     exchange windows-for-display and windows-for-manipulation
-;;           "Super-g"    Same with "RET",but will restore stack order.
-;;           "Super-t"   tile horizontally marked windows
-;;           "Super-T"   tile vertically marked windows
 
-;; ** For ones who want to extend cabinet keymap
-;; You may notice, in keymap definition, there are a bunch of
-;; procedures like `with-draw', `with-new-wlist' and so on. Yes,
-;; it's comfusing and ugly, but it's flexible, it enables
-;; you to extend cabinet-keymap at will. Anyway,I've tried
-;; to make doc string clear to alleviate you aversion.:-)
+  (defgroup cabinet "Cabinet"
+    :group focus
+    :require sawfish.wm.ext.cabinet)
 
-;; ** Version list
-;; Cabinet 1.0 2011.11
-;; Cabinet 1.1 2011.12.16  fixed a bug
+  (defgroup filter "Filter"
+    :group (focus cabinet))
+  
+  (defgroup bindings "Keybindings"
+    :group (focus cabinet))
 
-;; Enjoy!!
+  (defcustom cabinet:margin (cons 10 10)
+    "Margin to the border of cabinet."
+    :group (focus cabinet)
+    :type (pair (number 1 50 10 1) (number 1 50 10 1)))
+  
+  (defcustom cabinet:item-margin 6
+    "Margin between items."
+    :group (focus cabinet)
+    :range (1 . 50)
+    :type number)
+  
+  (defcustom cabinet:input-line-margin 25
+    "Margin between input line and the first item."
+    :group (focus cabinet)
+    :range (1 . 100)
+    :type number)
+  
+  (defcustom cabinet:icon-size 24
+    "Icon size."
+    :group (focus cabinet)
+    :range (8 . 128)
+    :type number)
+  
+  (defcustom cabinet:workspace-mode-on-initial nil
+    "Display only windows from current workspace."
+    :group (focus cabinet)
+    :type boolean)
+  
+  (defcustom cabinet:display-cabinet-on-active nil
+    "Display cabinet on active monitor."
+    :group (focus cabinet)
+    :type boolean)
 
-(define-structure sawfish.wm.ext.cabinet 
+  (defcustom cabinet:cycle-as-start nil
+    "Cycle overhead when start cabinet-switch, like x-cycle."
+    :group (focus cabinet)
+    :type boolean)
   
-      (export cabinet-switch
-              ;; 
-              cabinet-keymap
-              cabinet-item-text
-              ;; you'll need following procedures only when
-              ;; you want to extend cabinet-keymap
-              with-update-on-workspace
-              with-selected
-              with-marked-wl
-              with-exit-and-clear-mark
-              with-update-on-input
-              with-new-wlist
-              with-draw)
+  (defcustom cabinet:manipulation-on-selected 'Raise 
+    "Action if browse across cabinet."
+    :group (focus cabinet)
+    :type (choice Raise Focus None))
+  
+  (defcustom cabinet:raise-window-timeout 200
+    "Delay in milliseconds until a window gets raised if browse across cabinet. \\bottom"
+    :group (focus cabinet)
+    :type (range (1 . 1000)))
 
-      (open rep
-            rep.data
-            rep.system
-            rep.regexp
-            rep.lang.math
-            sawfish.wm.state.shading
-            sawfish.wm.state.iconify
-            sawfish.wm.stacking
-            sawfish.wm.viewport
-            sawfish.wm.state.maximize
-            sawfish.wm.util.display-window
-            sawfish.wm.custom
-            sawfish.wm.commands
-            sawfish.wm.colors
-            sawfish.wm.events
-            sawfish.wm.fonts
-            sawfish.wm.images
-            sawfish.wm.misc
-            sawfish.wm.util.x
-            sawfish.wm.windows
-            sawfish.wm.workspace
-	    sawfish.wm.util.events)
+  (defcustom cabinet:command-repeat-timeout 100
+    "Delay in milliseconds until a window keybinding gets repeats. \\bottom"
+    :group (focus cabinet)
+    :type (range (100 . 1000)))
 
-   ;; (mapc require '( rep
-   ;;       rep.system
-   ;;       rep.regexp
-   ;;       sawfish.wm.state.iconify
-   ;;       sawfish.wm.stacking
-   ;;       sawfish.wm.viewport
-   ;;       sawfish.wm.state.maximize
-   ;;       sawfish.wm.custom
-   ;;       sawfish.wm.commands
-   ;;       sawfish.wm.colors
-   ;;       sawfish.wm.events
-   ;;       sawfish.wm.fonts
-   ;;       sawfish.wm.images
-   ;;       sawfish.wm.misc
-   ;;       sawfish.wm.util.x
-   ;;       sawfish.wm.windows
-   ;;       sawfish.wm.workspace))
+  (defcustom cabinet:default-item-forground (get-color "#FFFFFF")
+    "Font color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:background (get-color "#000000")
+    "Background color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:forground-input (get-color "#FFFF00")
+    "Input text color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:split-line-forground (get-color "#B22222")
+    "Split line color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:maximized-item-forground (get-color "#FFA500")
+    "Maximized windows color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:iconified-item-forground (get-color "#6D6D6D")
+    "Iconified windows color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:shaded-item-forground (get-color "#0000FF")
+    "Shaded windows color."
+    :group (focus cabinet)
+    :type color)
+  
+  (defcustom cabinet:filter-out-for-manipulation (list "^Conky$" "^Gkrellm$")
+    nil
+    :group (focus cabinet filter)
+    :widget-flags (expand-horizontally expand-vertically)
+    :type* `(list string ,(_ "Windows displayed below the split line.")))
+  
+  (defcustom cabinet:filter-out-from-display (list "^Gdesklets-daemon$" "^Xfce4-panel$" "^Mate-panel$"
+                                                   "^Xfdesktop$" "^x-caja-desktop$" "^plasma-desktop$")
+    nil
+    :group (focus cabinet filter)
+    :widget-flags (expand-horizontally expand-vertically)
+    :type* `(list string ,(_ "Windows removed from cabinet.")))
+  
+  (defcustom cabinet:cycle "Super-TAB"
+    "Cycle through windows."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; variables welcome to change ;;;;;;;;;;;;;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-   (defgroup cabinet "Cabinet"
-      :group focus
-      :require cabinet)
+  (defcustom cabinet:reversely-cycle "C-TAB"
+    "Reversely cycle through windows."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defcustom cabinet-x-margin 10
-      "The horizontal margin of cabinet"
-      :type number
-      :group (focus cabinet))
-   (defcustom cabinet-y-margin 10
-      "The vertically margin of cabinet"
-      :group (focus cabinet)
-      :type number)
-   (defcustom cabinet-item-margin 6
-      " The margin between item and item."
-      :group (focus cabinet)
-      :type number)
-   (defcustom cycle-as-start
-      t
-      "whether cycle overhead,when start cabinet-switch.
-Just like x-cycle"
-      :group (focus cabinet)
-      :type boolean)
+  (defcustom cabinet:restore-order "ESC"
+    "Exit with restore stack order."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defcustom workspace-mode-on-initial
-      t
-      "whether to show windows in current workspace.
-nil, means to show windows of all workspaces."
-      :group (focus cabinet)
-      :type boolean)
-   
-   (defcustom cabinet-input-line-margin
-      25
-      "The margin between input line and the first item"
-      :group (focus cabinet)
-      :type number)
+  (defcustom cabinet:toggle-workspace-mode "Super-a"
+    "Toggle windows from current or all workspaces."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defvar cabinet-icon-size '(32 . 32)
-      "Each icon size of window shown on cabinet"
-      )
-   (defvar cabinet-input-forground (get-color "yellow")
-      "Forground color of your input" )
+  (defcustom cabinet:exchange-manipulation "Super-q"
+    "Toggle windows for display and for manipulation."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defvar cabinet-split-line-forground (get-color "firebrick"))
+  (defcustom cabinet:cycle-workspaces "Super-x"
+    "Cycle through workspaces."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defvar iconified-item-forground (get-color "gray"))
+  (defcustom cabinet:cycle-reversely-workspaces "Super-y"
+    "Reversely cycle through workspaces."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :group (focus cabinet bindings))
 
-   (defvar default-item-forground (get-color "white"))
+  (defcustom cabinet:advance-user-keybindings nil
+    "Advance user keymap."
+    :group (focus cabinet bindings)
+    :after-set (lambda () (search-bad-key))
+    :type boolean)
 
-   (defvar maximized-item-forground (get-color "orange"))
+  (defcustom cabinet:mark-selected "Super-SPC"
+    "Marked window as selected."
+    :type event
+    :after-set (lambda () (search-bad-key))
+    :depends cabinet:advance-user-keybindings
+    :group (focus cabinet bindings))
 
-   (defvar shaded-item-forground (get-color "blue"))
+  (defcustom cabinet:advance-keybindings '(("Super-d" delete-window t none)
+                                           ("Super-i" toggle-window-iconified t none)
+                                           ("Super-m" maximize-window-toggle t none)
+                                           ("Super-s" toggle-window-shaded t none)
+                                           ("Super-f" maximize-window-fullscreen-toggle t none)
+                                           ("Super-t" tab-add-maked-windows t none)
+                                           ("C-d" delete-window t close)
+                                           ("C-i" toggle-window-iconified t close)
+                                           ("C-m" maximize-window-toggle t close)
+                                           ("C-s" toggle-window-shaded t close)
+                                           ("C-f" maximize-window-fullscreen-toggle t close)
+                                           ("C-t" tab-add-maked-windows t close)
+                                           ("M-d" delete-window t go-to-next)
+                                           ("M-i" toggle-window-iconified t go-to-next)
+                                           ("M-m" maximize-window-toggle t go-to-next)
+                                           ("M-s" toggle-window-shaded t go-to-next)
+                                           ("M-f" maximize-window-fullscreen-toggle t go-to-next)
+                                           ("M-t" tab-add-maked-windows t go-to-next))
+    nil
+    :type* `(alist (event ,(_ "Key:"))
+                   ((h-and (symbol 
+                            delete-window maximize-window-toggle toggle-window-iconified toggle-window-shaded toggle-window-sticky
+                            maximize-window-fullscreen-toggle maximize-window-horizontally-toggle maximize-window-vertically-toggle
+                            maximize-window-fullxinerama-toggle maximize-full-vertical-left-toggle maximize-full-vertical-right-toggle
+                            tab-add-maked-windows tab-release-window tab-move-to-end tab-move-to-beginning tab-move-to-right tab-move-to-left
+                            move-window-to-center move-window-to-top-left move-window-to-next-workspace move-window-to-previous-workspace
+                            toggle-fixed-postion toggle-window-never-focus toggle-window-ignored toggle-task-list-skip toggle-window-cycle-skip
+                            toggle-window-list-skip toggle-desktop send-to-next-head send-to-previous-head
+                            raise-window lower-window raise-window-depth lower-window-depth raise-lower-window
+                            raise-window-and-transients raise-lower-window-and-transients delete-window-safely destroy-window
+                            window-history-save-position window-history-save-dimensions window-history-save-attributes window-history-forget  
+                            iconify-window uniconify-window shade-window unshade-window make-window-sticky make-window-unsticky
+                            make-window-ignored make-window-not-ignored               
+                            maximize-fill-window maximize-fill-window-horizontally maximize-fill-window-vertically 
+                            ;; tab/titelbar-toggle tab/titelbar-to-top tab/titelbar-to-bottom tab/titelbar-to-right tab/titelbar-to-left 
+                            ;; move-window-center move-window-up move-window-down 
+                            ;; move-window-right move-window-left move-window-next move-window-previous 
+                            ;; shrink-window-up shrink-window-down shrink-window-left shrink-window-right 
+                            ;; yank-window-up yank-window-down yank-window-left yank-window-right
+                            ;; size-window-add-column size-window-subtract-column size-window-add-row size-window-subtract-row 
+                            ;; grow-window-up grow-window-down grow-window-left grow-window-right
+                            ;; pack-window-up pack-window-down pack-window-right pack-window-left 
+                            ;; double-window-size halve-window-size
+                            ;; send-to-next-workspace send-to-previous-workspace send-to-workspace-left
+                            ;; send-to-workspace-right send-to-workspace-up send-to-workspace-down
+                            ;; maximize-window-fullscreen maximize-window-fullxinerama  
+                            )
+                           (label "After executed cabinet:")
+                           (choice none close go-to-next)) ,(_ "Event")))
+    :widget-flags (expand-vertically)
+    :after-set (lambda () (search-bad-key))
+    :depends cabinet:advance-user-keybindings
+    :group (focus cabinet bindings))
 
-   (defvar cabinet-background (get-color "black"))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; end defcustom
 
-   
+  (define (do-when-tabbed w do)
+    "Action when W is tabbed."
+    (when (window-tabbed-p w)
+      (tab-refresh-group w do)
+      (window-opacity w)))
 
-   (defvar cabinet-filter-out-for-manipulation-list
-      '(
-        "^Conky$"
-        )
-      "The matching windows are only for display.
-You can see their items below split line.")
+  (define (window-tabbed-foreground-p w)
+    "Returns t if W is a foreground tab"
+    (if (window-tabbed-p w)
+        (eq w (nth 0 (tab-group-windows-stacking-order w)))))
 
-   (defvar cabinet-filter-out-for-display-list
-      '(
-        "^\.gnome-desktop$"
-        "Gnome-panel"
-        "^gmc$"
-        "^panel$")
-   
-      "The matching windows are filtered out,they
-will not be shown on cabinet.")
+  (define (tabbgroup-is-shaded-p w)
+    "Returns t if tabbgroup from W is shaded"
+    (let ((shaded 't))
+      (when (window-tabbed-p w)
+        (mapcar (lambda (w)
+                  (if (not (window-get w 'shaded)) (setq shaded nil))) (tab-group-windows w))
+        shaded)))
 
-   (defvar manipulation-on-selected
-      raise-window
-      "what to do on selected window, each time draw/refresh
-   Cabinet. 
-It must be set to a procedure with one argument. ")
-   
-   (define (cabinet-item-text w)
-      "The text part shown on cabinet item"
-      (concat (when (window-get w 'cabinet-marked)
-                 " **")
+  (define (cabinet-item-text w)
+    "The text part shown on cabinet item"
+    ;; if we remove a window we temporary need this if
+    (if (not (numberp (window-id w)))
+        "Window is gone" 
+      (concat (when (window-get w 'marked)
+                " »»")
+              (when (window-tabbed-p w)
+                (if (window-tabbed-foreground-p w)
+                    (if (eq cabinet:manipulation-on-selected 'None)
+                        (format nil " [%s%s]" (tab-window-group-index w) '★)
+                      (format nil " [%s]" (tab-window-group-index w)))
+                  (format nil " [%s]" (tab-window-group-index w))))
               "  "
               (window-name w)
-              " <"
+              "  ["
               (window-class-name w 1)
-              ">"
-              (format nil
-                      " %s"
-                      (window-viewport w)
-                      )
-              (format nil
-                      " %s"
-                      (window-get w 'workspaces))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; End @ usr variables ;;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-   (define input-line-height (font-height default-font))
-   (define cabinet-font-height input-line-height)
-
-   (define wlist-for-manipulation          
-      nil)
-
-   (define wlist-for-display
-      nil)
-
-   (define wlist-for-cabinet
-      nil)
-
-   (define cabinet-window nil)
-
-   (define cabinet-orin-wlist)
-   (define cabinet-orin-focus)
-   (define cabinet-input "")
-   (define cabinet-orin-workspace)
-   (define workspace-mode)
-   (define cabinet-filter-for-display-func)
-   (define cabinet-filter-for-manipulation-func)
+              "] "
+              (when (or (> (car (window-viewport w)) 0)
+                        (> (cdr (window-viewport w)) 0))
+                (format nil " %s" (window-viewport w)))
+              (when (window-get w 'workspaces)
+                (format nil " %s" (window-get w 'workspaces)))
+              ;;(when (window-sticky-p w)
+              ;;  (format nil " ∘"))
+              (if (and (window-maximized-vertically-p w)
+                       (not (window-maximized-horizontally-p w)))
+                  (format nil " ↕"))
+              (if (and (window-maximized-horizontally-p w)
+                       (not (window-maximized-vertically-p w)))
+                  (format nil " ↔"))
+              (when (window-maximized-p w)
+                (if (or (tabbgroup-is-shaded-p w)
+                        (and (not (window-tabbed-p w))
+                             (window-shaded-p w)))
+                    (format nil " ▾")))
+              (when (window-get w 'marked)
+                " ««"))))
 
-   ;; item-format package
-   (define (cabinet-item-format w)
-      (define (cabinet-item-text-format w)
-         (cons (cabinet-item-text w)
-               (cond
-                ((window-iconified-p w) iconified-item-forground)
-                ((window-maximized-p w) maximized-item-forground)
-                ((window-shaded-p w) shaded-item-forground )
-                (t  default-item-forground)))
-         )
+  (define input-line-height (font-height default-font))
+  (define cabinet-font-height input-line-height)
+  (define wlist-for-manipulation nil)
+  (define wlist-for-display nil)
+  (define wlist-for-cabinet nil)
+  (define cabinet-window nil)
+  (define cabinet-orin-wlist)
+  (define cabinet-orin-focus)
+  (define cabinet-input "")
+  (define cabinet-orin-workspace)
+  (define workspace-mode)
+  (define cabinet-filter-for-display-func)
+  (define cabinet-filter-for-manipulation-func)
+  (define cabinet-raise-timer nil)
+  (define command-timer nil)
+  (define bad-key nil)
+  (define focus-by-tab nil)
 
-      (let (
-            (item (cons (window-icon-image w)
-                        (cabinet-item-text-format w))))
-                     
-         (lambda (tag)
-            (cond
-             ((eq tag 'icon) (car item))
-             ((eq tag 'text) (cadr item))
-             ((eq tag 'forground) (cdr (cdr item)))))))
+  ;; item-format package
+  (define (cabinet-item-text-format w)
+    (cons (cabinet-item-text w)
+          (cond
+           ((window-iconified-p w) cabinet:iconified-item-forground)
+           ((window-maximized-p w) cabinet:maximized-item-forground)
+           ((if (or (tabbgroup-is-shaded-p w)
+                    (and (not (window-tabbed-p w))
+                         (window-shaded-p w)))
+                cabinet:shaded-item-forground))
+           (t cabinet:default-item-forground))))
 
-   (define (make-item icon text forground)
+  (define (cabinet-item-format w)
+    (let ((item (cons (if (window-icon-image w)
+                          (window-icon-image w)
+                        (require 'rep.io.files)
+                        (if (file-exists-p (concat (car (cdr image-load-path)) "/" "cabinet-missing.png"))
+                            (make-image (concat (cdr image-load-path) "cabinet-missing.png"))))
+                      (cabinet-item-text-format w))))
       (lambda (tag)
-         (cond
-          ((eq tag 'icon) icon)
-          ((eq tag 'text) text)
-          ((eq tag 'forground) forground))))
-   (define (get-item-icon item) (item 'icon))
-   (define (get-item-text item) (item 'text))
-   (define (get-item-forground item) (item 'forground))
-   ;; end @ item format package 
-
-   (define (cabinet-filter filter-list)
-      (lambda (window)
-         (let loop ((fow-nrl filter-list))
-              (cond
-               ((null fow-nrl) t)
-               ((or (string-match (car fow-nrl) 
-                                  (window-name window)
-                                  0 nil)
-                    (string-match (car fow-nrl) 
-                                  (window-class-name window 1)
-                                  0 nil))
-                nil)
-               (t (loop (cdr fow-nrl)))))))
-
-   (define (cabinet-split-line)
-      (make-item nil
-                 (format nil 
-                         "===================%s========================="
-                         (if workspace-mode
-                               (format nil
-                                       " %s/%s "
-                                       current-workspace
-                                       (cdr (workspace-limits)))
-                            "ALL"))
-                 cabinet-split-line-forground))
-
-   (define (draw-items wl input-line)
-      (when (x-window-p cabinet-window)
-         (x-destroy-window cabinet-window)
-         (setq cabinet-window nil))
-
-      (let* (
-             (wl-size (length wl))
+        (cond
+         ((eq tag 'icon) (car item))
+         ((eq tag 'text) (cadr item))
+         ((eq tag 'forground) (cdr (cdr item)))))))
 
-             (cabinet-items wl)
+  (define (make-item icon text forground)
+    (lambda (tag)
+      (cond
+       ((eq tag 'icon) icon)
+       ((eq tag 'text) text)
+       ((eq tag 'forground) forground))))
+  (define (get-item-icon item) (item 'icon))
+  (define (get-item-text item) (item 'text))
+  (define (get-item-forground item) (item 'forground))
+  ;; end @ item format package 
 
-             (item-height (max (cdr cabinet-icon-size)
-                               cabinet-font-height))
-             (wx (+ (* 2 cabinet-x-margin)
-                    (car cabinet-icon-size)
-                    (apply max
-                           (mapcar text-width
-                                   (cons input-line
-                                         (mapcar get-item-text
-                                                 cabinet-items))))))
+  (define (cabinet-filter filter-list)
+    (lambda (window)
+      (let loop ((fow-nrl filter-list))
+        (cond
+         ((null fow-nrl) t)
+         ((or (string-match (car fow-nrl) 
+                            (window-name window)
+                            0 nil)
+              (string-match (car fow-nrl) 
+                            (window-class-name window 1)
+                            0 nil))
+          nil)
+         (t (loop (cdr fow-nrl)))))))
+  
+  (define (cabinet-split-line)
+    (make-item nil
+               (format nil "===================%s========================="
+                       (if workspace-mode
+                           (format nil " %s/%s "
+                                   current-workspace
+                                   (cdr (workspace-limits)))
+                         "ALL"))
+               cabinet:split-line-forground))
 
-             (wy (+ (* 2 cabinet-y-margin)
-                    (* wl-size item-height)
-                    (* (- wl-size 1) cabinet-item-margin)
-                    cabinet-input-line-margin
-                    input-line-height))
-             (win-size (cons wx wy)))
-         (define (event-handler type xw)
-            (define (cabinet-draw-text str pos foreground)
-               (let ((gc (x-create-gc xw
-                                      `((foreground . ,foreground)))))
-                  (x-draw-string xw gc pos str)
-                  ;; (x-destroy-gc gc)
-                  ))
-            (x-clear-window wx)
-            ;; draw input line
-            (cabinet-draw-text input-line
-                               (cons cabinet-x-margin (+ cabinet-y-margin
+  (define (draw-items wl input-line)
+    (when (x-window-p cabinet-window)
+      (x-destroy-window cabinet-window)
+      (setq cabinet-window nil))
+    (let* ((wl-size (length wl))
+           (cabinet-items wl)
+           (item-height (max cabinet:icon-size
+                             cabinet-font-height))
+           (wx (+ (* 2 (car cabinet:margin))
+                  cabinet:icon-size
+                  (apply max
+                         (mapcar text-width
+                                 (cons input-line
+                                       (mapcar get-item-text
+                                               cabinet-items))))))
+           (wy (+ (* 2 (cdr cabinet:margin))
+                  (* wl-size item-height)
+                  (* (- wl-size 1) cabinet:item-margin)
+                  cabinet:input-line-margin
+                  input-line-height))
+           (win-size (cons wx wy)))
+      (define (event-handler type xw)
+        (define (cabinet-draw-text str pos foreground)
+          (let ((gc (x-create-gc xw
+                                 `((foreground . ,foreground)))))
+            (x-draw-string xw gc pos str)
+            ;; (x-destroy-gc gc)
+            ))
+        (x-clear-window wx type)
+        ;; draw input line
+        (cabinet-draw-text input-line
+                           (cons (car cabinet:margin) (+ (cdr cabinet:margin)
                                                          cabinet-font-height))
-                               cabinet-input-forground)
-         
-            ;; draw item text
-            (let ((item-count 0)
-                  (item-height-with-margin (+ item-height
-                                              cabinet-item-margin))
-                  (input-height-with-margin (+ input-line-height
-                                               cabinet-input-line-margin)))
-               (mapc (lambda (item)
-                     
-                        (let* (
-                               (icon (get-item-icon item))
-                               (text (get-item-text item))
-                               (item-forground (get-item-forground item))
-                               (icon-x (+ cabinet-x-margin))
-                               (icon-y (+ cabinet-y-margin
-                                          input-height-with-margin
-                                          (* item-count
-                                             item-height-with-margin)))
-                               (text-x (+ icon-x
-                                          (car cabinet-icon-size)))
-                               (text-y (+ icon-y
-                                          (quotient cabinet-font-height 2)
-                                          (quotient (cdr cabinet-icon-size)
-                                                    3))))
-                           (when icon
-                              (x-draw-image icon xw
-                                            (cons icon-x icon-y)
-                                            cabinet-icon-size))
-                           (cabinet-draw-text text
-                                              (cons text-x text-y)
-                                              item-forground
-                                              ))
-                        (setq item-count (+ 1 item-count)))
-                     cabinet-items))) ;; end of event-handler
+                           cabinet:forground-input)
+        ;; draw item text
+        (let ((item-count 0)
+              (item-height-with-margin (+ item-height
+                                          cabinet:item-margin))
+              (input-height-with-margin (+ input-line-height
+                                           cabinet:input-line-margin)))
+          (mapc (lambda (item)
+                  (let* ((icon (get-item-icon item))
+                         (text (get-item-text item))
+                         (item-forground (get-item-forground item))
+                         (icon-x (+ (car cabinet:margin)))
+                         (icon-y (+ (cdr cabinet:margin)
+                                    input-height-with-margin
+                                    (* item-count
+                                       item-height-with-margin)))
+                         (text-x (+ icon-x
+                                    cabinet:icon-size))
+                         (text-y (+ icon-y
+                                    (quotient cabinet-font-height 2)
+                                    (quotient cabinet:icon-size
+                                              3))))
+                    (when icon
+                      (x-draw-image icon xw
+                                    (cons icon-x icon-y)
+                                    (cons cabinet:icon-size cabinet:icon-size)))
+                    (cabinet-draw-text text
+                                       (cons text-x text-y)
+                                       item-forground))
+                  (setq item-count (+ 1 item-count)))
+                cabinet-items))) ;; end of event-handler
+      (setq cabinet-window
+            (let ((head (if cabinet:display-cabinet-on-active (current-head) '0)))
+              (x-create-window `(,(+ (car (head-offset head))
+                                     (- (quotient (car (head-dimensions head)) 2)
+                                        (quotient wx 2)))
+                                 .
+                                 ,(+ (cdr (head-offset head))
+                                     (- (quotient (cdr (head-dimensions head)) 2)
+                                        (quotient wy 2))))
+                               win-size
+                               1
+                               `((background . ,cabinet:background))
+                               event-handler)))
+      (x-map-window cabinet-window)
+      cabinet-window))
 
-         (setq cabinet-window
-               (x-create-window `(,(- (quotient (screen-width) 2)
-                                      (quotient wx 2))
-                                  .
-                                  ,(- (quotient (screen-height) 2)
-                                      (quotient wy 2)))
-                                win-size
-                                1
-                                `(
-                                  (background . ,cabinet-background)
-                                  )
-                                event-handler
-                                ))
-         (x-map-window cabinet-window)
-         cabinet-window))
+  (define (display-bad-key)
+    (display-message (concat "Cabinet:" "\n" "\n" bad-key "\n" "\nIs duplicate." "\nDisable cabinet.")
+                     `((background . ,(get-color "Red")))))
 
-   ;; keymap package
-   (define (cabinet-switch-to-next)
-      (when (not (null wlist-for-manipulation))
-         (setq wlist-for-manipulation
-               (append (cdr wlist-for-manipulation)
-                       (list (car wlist-for-manipulation))))))
+  (define (search-bad-key)
+    (setq bad-key nil)
+    (let ((key-list (list cabinet:cycle cabinet:reversely-cycle cabinet:restore-order cabinet:toggle-workspace-mode
+                          cabinet:exchange-manipulation cabinet:cycle-workspaces cabinet:cycle-reversely-workspaces)) key rest-list)
+      (when cabinet:advance-user-keybindings
+        (setq key-list (append key-list (list cabinet:mark-selected)))
+        (setq key-list (append key-list 
+                               (mapcar (lambda (w)
+                                         (car w))
+                                       cabinet:advance-keybindings))))
+      (mapcar (lambda ()
+                (setq rest-list (cdr key-list))
+                (setq key (car key-list))
+                (when (not (x-keysym-name (car (lookup-event key))))
+                  (setq bad-key key)
+                  (display-message (concat "Cabinet:" "\n" "\n" bad-key "\n" "\nIs not a valid x-keysym-name." "\nDisable cabinets.")
+                                   `((background . ,(get-color "Red")))))
+                (when (member key rest-list)
+                  (setq bad-key key)
+                  (display-bad-key))
+                (setq key-list (cdr key-list)))
+              key-list)))
+  
+  ;; keymap package
+  (define (command-delay-timer)
+    (setq command-timer
+          (make-timer (lambda ()
+                        (setq command-timer nil))
+                      (quotient cabinet:command-repeat-timeout 1000) (mod cabinet:command-repeat-timeout 1000))))
 
-   (define (cabinet-switch-to-previous)
-      (when (not (null wlist-for-manipulation))
-         (setq wlist-for-manipulation
-               (let ((rl (reverse wlist-for-manipulation)))
-                  (list* (car rl) (reverse (cdr rl)))))))
+  (define (update-cabinet-interface-add)
+    (when (x-window-p cabinet-window)
+      (setq wlist-for-manipulation
+            (filter cabinet-filter-for-manipulation-func
+                    (filter cabinet-filter-for-display-func
+                            (stacking-order))))
+      (setq wlist-for-display (filter (lambda (win)
+                                        (not (cabinet-filter-for-manipulation-func win)))
+                                      (stacking-order)))
+      (if workspace-mode
+          (update-on-workspace))
+      (draw-cabinet)))
 
-   (define (toggle-iconify)
-      (let ((w (car wlist-for-manipulation)))
-         (if (window-get w 'iconified)
-               (uniconify-window w)
-            (iconify-window w))))
+  (define (update-cabinet-interface-remove)
+    (when (x-window-p cabinet-window)
+      (let ((old-manipulation wlist-for-manipulation)
+            (old-display wlist-for-display)
+            new-manipulation new-display)
+        (setq new-manipulation
+              (filter cabinet-filter-for-manipulation-func
+                      (filter cabinet-filter-for-display-func
+                              (stacking-order))))
+        (setq new-display (filter (lambda (win)
+                                    (not (cabinet-filter-for-manipulation-func win)))
+                                  (stacking-order)))
+        (mapcar (lambda (w)
+                  (if (not (member w new-manipulation))
+                      (setq wlist-for-manipulation (remove w old-manipulation))))
+                old-manipulation)
+        (mapcar (lambda (w)
+                  (if (not (member w new-display))
+                      (setq wlist-for-manipulation (remove w old-display))))
+                old-display)
+        (if workspace-mode
+            (update-on-workspace))
+        (draw-cabinet))))
 
-   (define (erase-input)
-      (setq cabinet-input ""))
+  (define (update-cabinet-interface #!optional next)
+    (when (x-window-p cabinet-window)
+      (when (not (null wlist-for-manipulation))
+        (if (member next wlist-for-manipulation)
+            (cabinet-switch-to-next)))
+      (if workspace-mode
+          (update-on-workspace))
+      (draw-cabinet)))
 
-   (define (with-draw cmd)  
-      "If your cmd will change Cabinet's
+  (define (cabinet-switch-to-next)
+    (when cabinet-raise-timer
+      (delete-timer cabinet-raise-timer)
+      (setq cabinet-raise-timer nil))
+    (when (not (null wlist-for-manipulation))
+      (setq wlist-for-manipulation
+            (append (cdr wlist-for-manipulation)
+                    (list (car wlist-for-manipulation))))))
+  
+  (define (cabinet-switch-to-previous)
+    (when cabinet-raise-timer
+      (delete-timer cabinet-raise-timer)
+      (setq cabinet-raise-timer nil))
+    (when (not (null wlist-for-manipulation))
+      (setq wlist-for-manipulation
+            (let ((rl (reverse wlist-for-manipulation)))
+              (list* (car rl) (reverse (cdr rl)))))))
+  
+  (define (erase-input)
+    (setq cabinet-input ""))
+  
+  (define (with-draw cmd)  
+    "If your cmd will change Cabinet's
 apperances,then add it."
-      (lambda ()
-         (cmd)
-         (draw-cabinet)))
-
-   (define (with-new-wlist cmd)
-      " If your cmd makes the number of items 
+    (lambda ()
+      (cmd)
+      (draw-cabinet)))
+  
+  (define (with-new-wlist cmd)
+    "If your cmd the number of items 
 grow, then add it"
-      (lambda ()
-         (cmd)
-         (setq wlist-for-manipulation
-               (filter cabinet-filter-for-manipulation-func
-                       (filter cabinet-filter-for-display-func
-                               (stacking-order))))
-         (setq wlist-for-display
-               (filter (lambda (win)
-                          (not (cabinet-filter-for-manipulation-func win)))
-                       (filter cabinet-filter-for-display-func
-                               (stacking-order))))))
-
-   (define (with-update-on-input cmd)
-      " It will filter items  on input after
+    (lambda ()
+      (cmd)
+      (setq wlist-for-manipulation
+            (filter cabinet-filter-for-manipulation-func
+                    (filter cabinet-filter-for-display-func
+                            (stacking-order))))
+      (setq wlist-for-display (filter (lambda (win)
+                                  (not (cabinet-filter-for-manipulation-func win)))
+                                (stacking-order)))))
+  
+  (define (with-update-on-input cmd)
+    " It will filter items on input after
 execution of cmd, add it when you feel proper."
-      (lambda ()  
-         (cmd)
-         (cabinet-update-on-input)))
-
-   (define (cabinet-update-on-input)
-      "Same with `with-update-on-input',except that it's
+    (lambda ()  
+      (cmd)
+      (cabinet-update-on-input)))
+  
+  (define (cabinet-update-on-input)
+    "Same with `with-update-on-input',except that it's
 a procedure with no argument."
-      (setq wlist-for-manipulation
-            (if (not (null wlist-for-manipulation))
-                  (filter (lambda (w)
-                             (string-match cabinet-input
-                                           (concat
-                                            (window-name w)
-                                            (window-class-name w ))
-                                           0 t))
-                          wlist-for-manipulation))))
-
-   (define (with-exit-and-clear-mark cmd)
-      " Use it, when you decide to quit Cabinet after
+    (setq wlist-for-manipulation
+          (if (not (null wlist-for-manipulation))
+              (filter (lambda (w)
+                        (string-match cabinet-input
+                                      (concat
+                                       (window-name w)
+                                       (window-class-name w))
+                                      0 t))
+                      wlist-for-manipulation))))
+  
+  (define (with-exit-and-clear-mark cmd)
+    " Use it, when you decide to quit Cabinet after
 your cmd's execution."
-      (lambda ()
-         (cmd)
-         (mapc (lambda (w)
-                  (window-remprop w 'cabinet-marked))
-               cabinet-orin-wlist)
-         (event-exit-wait)))
+    (lambda ()
+      (cmd)
+      (mapc (lambda (w)
+              (when (window-get w 'marked)
+                (window-remprop w 'marked)
+                (call-marked w)))
+            cabinet-orin-wlist)
+      (event-exit-wait)))
 
-   (define (with-marked-wl cmd)
-      "The marked window will be passed to cmd as a list."
-      (lambda ()
-         (cmd (filter-windows (lambda (w)
-                                 (window-get w
-                                             'cabinet-marked))))))
-   (define (with-selected cmd)
-      "The selected window will be passed to cmd as an argument."
-      (lambda ()
-         (cmd (car wlist-for-manipulation))))
+  (define (with-marked-wl cmd)
+    "The marked windows will be passed to cmd as a list."
+    (lambda ()
+      (cmd (filter-windows (lambda (w)
+                             (window-get w
+                                         'marked))))))
+  
+  (define (with-selected cmd)
+    "The selected window will be passed to cmd as an argument."
+    (lambda ()
+      (cmd (car wlist-for-manipulation))))
+  
+  (define (workspace-prev)
+    (cycle-workspace -1))
+  
+  (define (workspace-next)
+    (cycle-workspace 1))
+  
+  (define (cycle-workspace count)
+    (with-draw
+     (lambda ()
+       ((with-update-on-input (with-new-wlist (lambda () t))))
+       (if workspace-mode
+           (next-workspace count)
+         (setq workspace-mode t)
+         (next-workspace count))
+       (update-on-workspace))))
+  
+  (define (toggle-workspace-mode)
+    (with-draw
+     (lambda ()
+       ((with-update-on-input (with-new-wlist (lambda () t))))
+       (if workspace-mode
+           (setq workspace-mode (not workspace-mode))
+         (setq workspace-mode t)
+         (update-on-workspace)))))
+  
+  (define (with-update-on-workspace cmd)
+    "It filters items for current workspace windows.
+add it, when your command changed workspace"
+    (lambda ()
+      (cmd)
+      (update-on-workspace)))
+  
+  (define (update-on-workspace)
+    " Same with `with-update-on-workspace',except that
+this is a procedure with no argument."
+    (setq wlist-for-manipulation
+          (filter (lambda (w)
+                    (let ((ww (window-get w 'workspaces)))
+                      (or (memq current-workspace ww)
+                          (eq ww nil)))) 
+                  wlist-for-manipulation)))
+  
+  (define (call-marked cmd)
+    "Call marked hook if window marked"
+    (call-window-hook 'window-state-change-hook cmd (list '(marked))))
 
-   (define (cycle-workspace count)
-      (with-draw
-       (lambda ()
-          ((with-update-on-input (with-new-wlist (lambda () t))))
-          (if workspace-mode
-                (next-workspace count)
-             (setq workspace-mode t))
-          (update-on-workspace))))
+  (defvar move-window-to-next-workspace
+    (lambda (w)
+      (let ((nw (+ (car (window-get w 'workspaces)) 1)))
+        (send-to-next-workspace w nw))))
 
-   (define (with-update-on-workspace cmd)
-      "It filters items for
-current workspace windows.
-add it, when your command changed workspace"
-      (lambda ()
-         (cmd)
-         (update-on-workspace)))
+  (defvar move-window-to-previous-workspace
+    (lambda (w)
+      (let ((nw (- (car (window-get w 'workspaces)) 1)))
+        (send-to-next-workspace w nw))))
 
-   (define (update-on-workspace)
-      " Same with `with-update-on-workspace',except that
-this is a procedure with no argument."
-      (when (eq workspace-mode t)
-         (setq wlist-for-manipulation
-               (filter (lambda (w)
-                          (let (
-                                (ww (window-get w 'workspaces)))
-                             (or (memq current-workspace ww)
-                                 (eq ww nil)))) 
-                       wlist-for-manipulation))))
+  (defvar move-window-to-top-left
+    (lambda (w)
+    (let ((dims (window-frame-dimensions w))
+          (h-off (cons 0 0))
+          (screen (calculate-workarea #:window w #:head '0)))
+      (move-window-to w
+                      (clamp* (car h-off)
+                              (car dims) (nth 0 screen) (nth 2 screen))
+                      (clamp* (cdr h-off)
+                              (cdr dims) (nth 1 screen) (nth 3 screen)))
+      (call-window-hook 'after-move-hook w))))
 
-   (define cabinet-keymap
-      (bind-keys (make-keymap)
-                 "C-u" (with-draw
-                        (with-update-on-input
-                         (with-update-on-workspace
-                          (with-new-wlist erase-input))))
+  (defvar move-window-to-center
+    (lambda (w)
+    (let ((dims (window-frame-dimensions w))
+          (h-dims (current-head-dimensions w))
+          (h-off (current-head-offset w))
+          (screen (calculate-workarea #:window w #:head (current-head w))))
+      (move-window-to w
+                      (clamp* (+ (car h-off)
+                                 (quotient (- (car h-dims) (car dims)) 2))
+                              (car dims) (nth 0 screen) (nth 2 screen))
+                      (clamp* (+ (cdr h-off)
+                                 (quotient (- (cdr h-dims) (cdr dims)) 2))
+                              (cdr dims) (nth 1 screen) (nth 3 screen)))
+      (call-window-hook 'after-move-hook w))))
+  
+  (defvar tab-add-maked-windows
+    (lambda ()
+      (let* ((win (car wlist-for-manipulation))
+             (tabs (remove win (filter-windows (lambda (w) (window-get w 'marked))))))
+        (when (car tabs)
+          (require 'sawfish.wm.tabs.tab)
+          (window-remprop win 'marked)
+          (mapcar (lambda (w)
+                    (window-remprop w 'marked)
+                    (tab-window-add-to-tabgroup w)
+                    (tab-window-add-to-tabgroup win))
+                  tabs)
+            (set-input-focus nil)))))
 
-                 "SPC" (with-draw
-                        (with-update-on-input
-                         (lambda ()
-                            (setq cabinet-input
-                                  (concat cabinet-input " ")))))
-                 "BS" (with-draw
-                       (with-update-on-input
-                        (with-update-on-workspace
-                         (with-new-wlist
-                          (lambda ()
-                             (when (> (length cabinet-input) 0)
-                                (setq cabinet-input
-                                      (substring cabinet-input
-                                                 0
-                                                 (1- (length cabinet-input))))
-                                ))))))
-              
-                 "Super-s" (with-draw cabinet-switch-to-next)
-                 "C-s" (with-draw cabinet-switch-to-next)
-                 "Super-r" (with-draw cabinet-switch-to-previous)
-                 "C-r" (with-draw cabinet-switch-to-previous)
-                 "Super-w" (with-selected
-                            (lambda (w)
-                               (delete-window w)
-                               (setq wlist-for-manipulation (cdr wlist-for-manipulation))
-                               (draw-cabinet)))
-                 "Super-z" (with-draw toggle-iconify)
-                 "Super-C-z" (with-draw (lambda ()
-                                           (toggle-iconify)
-                                           (cabinet-switch-to-next)))
-                 "RET" (with-exit-and-clear-mark
-                        (with-selected
-                         (lambda (w)
-                           (display-window w))))
-                 "Super-g" (with-exit-and-clear-mark (lambda ()
-                                                        (select-workspace cabinet-orin-workspace)
-                                                        (restack-windows cabinet-orin-wlist)
-                                                        (set-input-focus cabinet-orin-focus)))
-                 "Super-x" (with-draw
-                            (with-update-on-input
-                             (lambda ()
-                                (let (
-                                      (tmp wlist-for-manipulation))
-                                   (setq wlist-for-manipulation wlist-for-display
-                                         wlist-for-display tmp)))))
-                 "Super-SPC" (with-draw
-                              (with-selected
-                               (lambda (w)
-                                  (window-put w
-                                              'cabinet-marked
-                                              (not
-						(window-get w 'cabinet-marked))))))
-                 "Super-S" (cycle-workspace 1)
-                 "Super-R" (cycle-workspace -1)
-                 "Super-v" (with-draw
-                            (lambda ()
-                               ((with-update-on-input
-                                 (with-new-wlist
-                                  (lambda () t))))
-                               (setq workspace-mode (not workspace-mode))))
-                ;; "Right" (with-draw
-                 ;;          (with-selected
-                 ;;           (lambda (w)
-                 ;;              (send-to-next-workspace w 1))))
-                 ;; "Left" (with-draw
-                 ;;         (with-selected
-                 ;;          (lambda (w)
-                 ;;             (send-to-next-workspace w -1))))
-                 ))
+  (define (run-cmd-and-do cmd do)
+    (when (not command-timer)
+      (command-delay-timer)
+      (let ((win (car wlist-for-manipulation))
+            (next (car (cdr wlist-for-manipulation))))
+        (if (eq cmd 'tab-add-maked-windows)
+            (tab-add-maked-windows)
+          (if (and (filter-windows (lambda (w) (window-get w 'marked)))
+                   cabinet:advance-user-keybindings)
+              (mapcar (lambda (x)
+                        (cmd x))
+                      (filter-windows (lambda (w) (window-get w 'marked))))
+            (cmd win)))
+        (when (string= do "close")
+          (mapc (lambda (w)
+                  (when (window-get w 'marked)
+                    (window-remprop w 'marked)
+                    (call-marked w)))
+                cabinet-orin-wlist)
+          (event-exit-wait)
+          (x-destroy-window cabinet-window)
+          (display-window win))
+        
+        (when (string= do "none")
+          (mapc (lambda (w)
+                  (when (window-get w 'marked)
+                    (window-remprop w 'marked)
+                    (call-marked w)))
+                cabinet-orin-wlist)
+          (update-cabinet-interface))
+        
+        (when (string= do "go-to-next")
+          (mapc (lambda (w)
+                  (when (window-get w 'marked)
+                    (window-remprop w 'marked)
+                    (call-marked w)))
+                cabinet-orin-wlist)
+          (update-cabinet-interface next)))))
 
-   ;; end @ keymap package
+  (define (cabinet-keymap-complete)
+    (let ((keymap-complete))
+      (if bad-key
+          (bind-keys (make-keymap) nil)
+        (if (and cabinet:advance-user-keybindings
+                 (car cabinet:advance-keybindings))
+            (setq keymap-complete (append (cabinet-keymap-base) (cabinet-keymap-advance)))
+          (setq keymap-complete (cabinet-keymap-base)))
+        keymap-complete)))
 
-   (define (draw-cabinet)
-      (let (
-            (selected-w (car wlist-for-manipulation)))
-         (when (not (null wlist-for-manipulation))
-            (manipulation-on-selected selected-w))
+  (define (cabinet-keymap-advance)
+    (let ((keybind-list cabinet:advance-keybindings)
+          keymap-list tmp)
+      (mapcar (lambda (w)
+                (setq tmp (list (car w) (list run-cmd-and-do (nth 1 w) (prin1-to-string (nth 3 w)))))
+                (setq keymap-list (append keymap-list (cdr (bind-keys (make-keymap) (nth 0 tmp) (nth 1 tmp))))))
+              keybind-list)
+      keymap-list))
 
-         (draw-items (append (mapcar cabinet-item-format wlist-for-manipulation)
-                             (list (cabinet-split-line))
-                             (mapcar cabinet-item-format wlist-for-display))
-                     (concat cabinet-input "_"))
-         ))
-         
-   (defvar cabinet-handler
-      `(
-        (,(lambda (key) (= 1 (length key)))
-         .
-         ,(lambda (key)
-             (setq cabinet-input (concat cabinet-input key))
-             (cabinet-update-on-input)
-             (draw-cabinet)))))
+  (define (cabinet-keymap-base)
+    (bind-keys (make-keymap)
+               "RET" (with-exit-and-clear-mark
+                      (with-selected
+                       (lambda (w)
+                         (display-window w))))
+               "KP_Enter" (with-exit-and-clear-mark
+                           (with-selected
+                            (lambda (w)
+                              (display-window w))))
+               "SPC" (with-draw
+                      (with-update-on-input
+                       (lambda ()
+                         (setq cabinet-input
+                               (concat cabinet-input " ")))))
+               "BS" (with-draw
+                     (with-update-on-input
+                      (with-update-on-workspace
+                       (with-new-wlist
+                        (lambda ()
+                          (when (> (length cabinet-input) 0)
+                            (setq cabinet-input
+                                  (substring cabinet-input
+                                             0
+                                             (1- (length cabinet-input))))))))))
+               cabinet:cycle (with-draw cabinet-switch-to-next)
+               cabinet:reversely-cycle (with-draw cabinet-switch-to-previous)
+               cabinet:restore-order (with-exit-and-clear-mark 
+                                      (lambda ()
+                                        (select-workspace cabinet-orin-workspace)
+                                        (restack-windows cabinet-orin-wlist)
+                                        (set-input-focus cabinet-orin-focus)
+                                        (when (and focus-by-tab 
+                                                   (numberp (window-id focus-by-tab)))
+                                          (do-when-tabbed focus-by-tab 'focus)
+                                          (setq focus-by-tab nil))))
+               cabinet:exchange-manipulation (with-draw
+                                              (with-update-on-input
+                                               (lambda ()
+                                                 (let ((tmp wlist-for-manipulation))
+                                                   (setq wlist-for-manipulation wlist-for-display
+                                                         wlist-for-display tmp)))))
+               cabinet:toggle-workspace-mode (toggle-workspace-mode)
+               cabinet:cycle-workspaces (workspace-next)
+               cabinet:cycle-reversely-workspaces (workspace-prev)
+               cabinet:mark-selected (when cabinet:advance-user-keybindings
+                                       (with-draw
+                                        (with-selected
+                                         (lambda (w)
+                                           (window-put w 'marked
+                                                       (not (window-get w 'marked)))
+                                           (call-marked w)))))))
+  ;; end @ keymap package
+  (define (draw-cabinet)
+    (let ((w (car wlist-for-manipulation)))
+      (when (not (null wlist-for-manipulation))
+        (when (eq cabinet:manipulation-on-selected 'Raise)
+          (setq cabinet-raise-timer
+                (make-timer (lambda ()
+                              (raise-window w)
+                              (do-when-tabbed w 'raise))
+                            (quotient cabinet:raise-window-timeout 1000) (mod cabinet:raise-window-timeout 1000))))
+        (when (eq cabinet:manipulation-on-selected 'Focus)
+          (setq cabinet-raise-timer
+                (make-timer (lambda ()
+                              (raise-window w)
+                              (set-input-focus w))
+                            (quotient cabinet:raise-window-timeout 1000) (mod cabinet:raise-window-timeout 1000))))
+        (when (eq cabinet:manipulation-on-selected 'None) 
+          (set-input-focus nil)))
+      (draw-items (append (mapcar cabinet-item-format wlist-for-manipulation)
+                          (list (cabinet-split-line))
+                          (mapcar cabinet-item-format wlist-for-display))
+                  (concat cabinet-input "_"))))
+  
+  (defvar cabinet-handler
+    `((,(lambda (key) (= 1 (length key)))
+       .
+       ,(lambda (key)
+          (setq cabinet-input (concat cabinet-input key))
+          (cabinet-update-on-input)
+          (draw-cabinet)))))
 
-   (define (cabinet-switch)
-      "The Main function."
+  (define (unbound-check)
+    (if bad-key
+        (progn (display-bad-key)
+               nil)
+      (display-message nil)
+      't))
 
+  (define (cabinet-switch)
+    "Start cabinet switch."
+    (if bad-key
+        (display-bad-key)
+      (when (and (input-focus) 
+                 (window-tabbed-p (input-focus))
+                 (eq cabinet:manipulation-on-selected 'Raise))
+          (set-input-focus nil)
+          (setq focus-by-tab (input-focus)))
       (setq cabinet-orin-wlist (stacking-order)
             cabinet-orin-focus (input-focus)
-
             cabinet-input ""
             cabinet-orin-workspace current-workspace
-            workspace-mode workspace-mode-on-initial
+            workspace-mode cabinet:workspace-mode-on-initial
             cabinet-filter-for-display-func
-            (cabinet-filter cabinet-filter-out-for-display-list)
+            (cabinet-filter cabinet:filter-out-from-display)
             cabinet-filter-for-manipulation-func
-            (cabinet-filter cabinet-filter-out-for-manipulation-list)
+            (cabinet-filter cabinet:filter-out-for-manipulation)
             wlist-for-cabinet (filter cabinet-filter-for-display-func
                                       (stacking-order))
-
             wlist-for-manipulation (filter cabinet-filter-for-manipulation-func
                                            wlist-for-cabinet)
             wlist-for-display (filter (lambda (win)
-                                         (not (cabinet-filter-for-manipulation-func win)))
-                                      wlist-for-cabinet)
-            )
-    
-  
+                                        (not (cabinet-filter-for-manipulation-func win)))
+                                      wlist-for-cabinet))
       (when workspace-mode
-         (update-on-workspace))
-   
-      (when cycle-as-start
-         (cabinet-switch-to-next))
-  
+        (update-on-workspace))
+      (when cabinet:cycle-as-start
+        (cabinet-switch-to-next))
       (draw-cabinet)
+      (event-wait-for #:keymap (cabinet-keymap-complete)
+                      #:handler cabinet-handler
+                      #:loop-on-unbound (unbound-check))
+      (x-destroy-window cabinet-window)))
 
-      (event-wait-for #:keymap cabinet-keymap
-                    #:handler cabinet-handler
-                    #:loop-on-unbound t)
-      (x-destroy-window cabinet-window))
-   (define-command 'cabinet-switch cabinet-switch)
-   )
+  (search-bad-key)
+
+  (unless batch-mode
+    (add-hook 'tab-group-windows-hook update-cabinet-interface)
+    (add-hook 'before-add-window-hook update-cabinet-interface-add)
+    (add-hook 'destroy-notify-hook update-cabinet-interface-remove))
+
+  (define-command 'cabinet-switch cabinet-switch))
diff -urNad sawfish.orgi/lisp/sawfish/wm/keymaps.jl sawfish/lisp/sawfish/wm/keymaps.jl
--- sawfish.orgi/lisp/sawfish/wm/keymaps.jl
+++ sawfish/lisp/sawfish/wm/keymaps.jl
@@ -87,7 +87,9 @@
   (defcustom global-keymap (bind-keys (make-keymap)
 				      "W-Left" 'previous-workspace
 				      "W-Right" 'next-workspace
-				      "W-Tab" 'cycle-windows)
+                      "W-Tab" 'cycle-windows
+                      "Super-Tab" 'cabinet-switch
+                      "C-Tab" 'cabinet-switch)
     "Keymap active anywhere."
     :group bindings
     :type keymap
diff -urNad sawfish.orgi/lisp/sawfish/wm/tabs/tab.jl sawfish/lisp/sawfish/wm/tabs/tab.jl
--- sawfish.orgi/lisp/sawfish/wm/tabs/tab.jl
+++ sawfish/lisp/sawfish/wm/tabs/tab.jl
@@ -26,6 +26,7 @@
             tabbar-left-margin-transient
             tabbar-right-margin
             tabbar-right-margin-transient
+            tab-window-add-to-tabgroup
             set-tab-adjustments)
 
     (open rep
diff -urNad sawfish.orgi/lisp/sawfish/wm/tabs/tabgroup.jl sawfish/lisp/sawfish/wm/tabs/tabgroup.jl
--- sawfish.orgi/lisp/sawfish/wm/tabs/tabgroup.jl
+++ sawfish/lisp/sawfish/wm/tabs/tabgroup.jl
@@ -28,6 +28,11 @@
             tab-release-window
             tab-raise-left-window
             tab-raise-right-window
+            tab-move-to-beginning
+            tab-move-to-end
+            tab-move-to-right
+            tab-move-to-left
+            tab-window-group-index
             tab-find-window
             tab-rank
             tab-group-window-list
@@ -102,7 +107,7 @@
             (equal (aref (nth 2 (get-x-property w '_NET_WM_WINDOW_TYPE)) 0) '_NET_WM_WINDOW_TYPE_NORMAL))))
 
   (define (window-tabbed-p w)
-    (window-get w 'tabbed))
+        (window-get w 'tabbed))
 
   (define-record-type :tab-group
     (tab-build-group p d wl)
@@ -577,13 +582,13 @@
                     (window-put w 'never-iconify t))
                   (window-put w 'tabbed t)) wins)
         (call-hook 'tab-group-windows-hook (list (tab-group-windows win)))
-        (raise-window win)
+        ;;(raise-window win)
         (setq all-wins nil))
       (setq tab-refresh-lock t)
       (when (window-tabbed-p win)
         (tab-refresh-group win 'move)
         (tab-refresh-group win 'frame)
-        (set-input-focus (nth 0 (tab-group-windows-stacking-order win)))
+        ;;(set-input-focus (nth 0 (tab-group-windows-stacking-order win)))
         (when clicked-frame
           (move-cursor-in-tabbar (input-focus))
           (setq clicked-frame nil)))
@@ -600,7 +605,7 @@
               tabbar-left-margin)))
       (if (not (eq (window-get win 'current-frame-style) (nth 0 (frame-style-tabbars-support win))))
           (warp-cursor (+ (car (window-position win)) start-right (nth 4 tab-pos-list) (quotient (nth 6 tab-pos-list) 2))
-                       (+ (quotient (- (cdr (window-frame-dimensions win)) (cdr (window-dimensions win)) 2) 2) (cdr (window-position win))))
+                       (+ (quotient (- (cdr (window-frame-dimensions win)) (cdr (window-dimensions win)) 4) 2) (cdr (window-position win))))
         (let ((current-pos 
                (if (window-get win 'title-position)
                    (window-get win 'title-position)
diff -urNad sawfish.orgi/lisp/sawfish/wm/util/events.jl sawfish/lisp/sawfish/wm/util/events.jl
--- sawfish.orgi/lisp/sawfish/wm/util/events.jl
+++ sawfish/lisp/sawfish/wm/util/events.jl
@@ -1,87 +1,89 @@
-;; hqw-util.jl 1.0 -- A bunch of util functions for sawfish
+;; events.jl
 
-;; Time-stamp: <2011-12-15 10:23:36 hqwrong>
 ;; Copyright (C) 2011, hqwrong <[email protected]>
 
-;; Permission is granted to copy, distribute and/or modify this
-;; document under the terms of the GNU Free Documentation License,
-;; Version 1.3 or any later version published by the Free Software
-;; Foundation.
+;; This file is part of sawfish.
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License                                                                                      
+;; along with this program.  If not, see `http://www.gnu.org/licenses/'. 
+
 
-;;
-;;; Commentary:
 (define-structure sawfish.wm.util.events
 
-      (export event-wait-for
-              event-exit-wait)
+    (export event-wait-for
+            event-exit-wait)
 
-      (open rep
-            rep.data
-            rep.system
-            rep.regexp
-            rep.lang.math
-            sawfish.wm.state.shading
-            sawfish.wm.state.iconify
-            sawfish.wm.stacking
-            sawfish.wm.viewport
-            sawfish.wm.state.maximize
-            sawfish.wm.custom
-            sawfish.wm.commands
-            sawfish.wm.colors
-            sawfish.wm.events
-            sawfish.wm.fonts
-            sawfish.wm.images
-            sawfish.wm.misc
-            sawfish.wm.util.x
-            sawfish.wm.windows
-            sawfish.wm.workspace)
+    (open rep
+          rep.data
+          rep.system
+          rep.regexp
+          sawfish.wm.misc
+          sawfish.wm.events
+          sawfish.wm.commands)
 
-(define (event-wait-for #!key
-                      (keymap '(keymap))
-                      loop-on-unbound
-                      handler
-                      exit-hook)
-   "wait-for an event.
-	`keymap' is used as the override keymap during `recursive-edit'
+  (define (event-wait-for #!key
+                          (keymap '(keymap))
+                          loop-on-unbound
+                          handler
+                          exit-hook)
+    "wait-for an event.
+`keymap' is used as the override keymap during `recursive-edit'
         
-        `handler' is a list of cons cell,as (predict
+`handler' is a list of cons cell,as (predict
 . procedure), when the key event has no bound in keymap, then the
 key name is passed to each predict by order.Once eval to t ,then
 the associated procedure is called with key as argument,then
 re-enter in `recursive-edit'.Otherwise,if loop-on-unbound is nil,
 exit loop.
 
-        `exit-hook' ,if setted,will be called with key's name as argument,
+`exit-hook' ,if setted,will be called with key's name as argument,
 after exit from loop."
    
-   (call-with-keyboard-grabbed
-    (lambda ()
+    (call-with-keyboard-grabbed
+     (lambda ()
        (let ((override-keymap keymap)
              (re-exit (lambda ()
-                         (throw 're-exit
-                                (event-name (current-event)))))
+                        (throw 're-exit
+                               (event-name (current-event)))))
              (key nil))
-          (add-hook 'unbound-key-hook re-exit)
-          (while (catch 'event-exit
-                    (setq key
-                          (catch 're-exit
-                             (recursive-edit)))
-                    (when handler
-                       (do ((l handler (cdr handler)))
-                             ((null l) t)
-                          (let* ((cell (car l))
-                                 (pred (car cell))
-                                 (proc (cdr cell)))
-                             (when (pred key)
-                                (proc key)
-                                (throw 'event-exit t)))))
-                    (when (not loop-on-unbound)
-                       (throw 'event-exit nil))
-                    t)
-             t)
-          (when exit-hook
-             (exit-hook key))))))
+         ;; XXX No idea what this hook do, here i only got
+         ;; XXX a error messages if i click on an frame part:
+         ;; XXX
+         ;; XXX Sawfish error: 
+         ;; XXX No catcher for throw: re-exit
+         ;; XXX
+         ;; XXX Disable this hook untill someone fix this.
+         ;;(add-hook 'unbound-key-hook re-exit)
+         (while (catch 'event-exit
+                  (setq key
+                        (catch 're-exit
+                          (recursive-edit)))
+                  (when handler
+                     (do ((l handler (cdr handler)))
+                        ((null l) t)
+                        (let* ((cell (car l))
+                               (pred (car cell))
+                               (proc (cdr cell)))
+                          (when (pred key)
+                            (proc key)
+                            (throw 'event-exit t)))))
+                  (when (not loop-on-unbound)
+                    (throw 'event-exit nil))
+                  t)
+           t)
+         (when exit-hook
+           (exit-hook key))))))
 
-(define (event-exit-wait)
-   "You'll find it useful,when you're using `event-wait-for'"
-   (throw 'event-exit)))
+  (define (event-exit-wait)
+    "You'll find it useful,when you're using `event-wait-for'"
+    (throw 'event-exit)))
11-tab-tiler-add.patch (text/x-patch, 18.9 KB)
diff -urNad sawfish.orgi/po/de.po sawfish/po/de.po
--- sawfish.orgi/po/de.po
+++ sawfish/po/de.po
@@ -14,13 +14,13 @@
 # Christopher Roy Bratusek <[email protected]>, 2011.
 # Christian Kirbach <[email protected]>, 2009, 2010, 2011.
 # Hendrik Richter <[email protected]>, 2005.
-# fuchur <[email protected]>, 2013.
+# fuchur <[email protected]>, 2013, 2014.
 msgid ""
 msgstr ""
 "Project-Id-Version: Sawfish WM\n"
 "Report-Msgid-Bugs-To: http://sawfish.tuxfamily.org/flyspray/\n"
 "POT-Creation-Date: 2011-06-23 11:00+0200\n"
-"PO-Revision-Date: 2013-10-09 18:01+0200\n"
+"PO-Revision-Date: 2014-05-02 19:21+0200\n"
 "Last-Translator: fuchur <[email protected]>\n"
 "Language-Team: German <me@home>\n"
 "MIME-Version: 1.0\n"
@@ -6055,42 +6055,585 @@
 msgstr "Cabinet"
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid "The horizontal margin of cabinet"
-msgstr "Abstand des Menüs zum seitlichen Rand von Cabinet"
+msgid "Keybindings"
+msgstr "Tastenkombinationen"
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid "The vertically margin of cabinet"
-msgstr "Abstand des Menüs zum oberen Rand von Cabinet"
+msgid "Margin to the border of cabinet."
+msgstr "Abstand des Menüs zum Rand von Cabinet."
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid " The margin between item and item."
-msgstr "Abstand zwischen den Menüeinträgen von Cabinet"
+msgid "Margin between items."
+msgstr "Abstand zwischen den Menüeinträgen von Cabinet."
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid ""
-"whether cycle overhead,when start cabinet-switch.\n"
-"Just like x-cycle"
-msgstr "Das verhalten von Cabinet wird dem von x-cycle nachempfunden."
+msgid "Margin between input line and the first item."
+msgstr ""
+"Abstand zwischen der Eingabeaufforderung und dem ersten Menüeintrag von "
+"Cabinet."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Icon size."
+msgstr "Icon Größe."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Display only windows from current workspace."
+msgstr "Nur Fenster der aktuellen Arbeitsfläche anzeigen."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Display cabinet on active monitor."
+msgstr "Cabinet auf dem aktiven Monitor anzeigen."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Cycle overhead when start cabinet-switch, like x-cycle."
+msgstr ""
+"Beim aufrufen von Cabinet zum nächsten Menüeintrag springen, wie beim x-cycle."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Action if browse across cabinet."
+msgstr "Verhalten der Fenstern beim blättern in Cabinet."
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
 msgid ""
-"whether to show windows in current workspace.\n"
-"nil, means to show windows of all workspaces."
-msgstr "Cabinet nur auf Fenster der aktuellen Arbeitsfläche anzeigen."
+"Delay in milliseconds until a window gets raised if browse across cabinet. "
+"\\bottom"
+msgstr "Verzögerung bis ein Fenster beim blättern angehoben wird. \\bottom"
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid "The margin between input line and the first item"
+msgid "Delay in milliseconds until a window keybinding gets repeats. \\bottom"
 msgstr ""
-"Abstand zwischen der Eingabeaufforderung und dem ersten Menüeintrag von "
-"Cabinet"
+"Verzögerung der Tastatureingabe bis ein Fensterereignisse wiederholt wird. \\bottom"
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid "Cabinet switch"
-msgstr "Cabinet Fensterleiste"
+msgid "Font color."
+msgstr "Farbe der Schrift."
 
 #. ../lisp/sawfish/wm/ext/cabinet.jl
-msgid "The Main function."
-msgstr "Die Hauptfunktion von Cabinet."
+msgid "Background color."
+msgstr "Farbe des Hintergrunds."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Input text color."
+msgstr "Farbe der Eingabeaufforderung."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Split line color."
+msgstr "Farbe der Trennlinie."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Maximized windows color."
+msgstr "Farbe bei maximierten Fenstern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Iconified windows color."
+msgstr "Farbe bei minimierten Fenstern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Shaded windows color."
+msgstr "Farbe bei eingerollten Fenstern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Windows displayed below the split line."
+msgstr "Fenster die unterhalb der Trennlinie angezeigt werden."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Windows removed from cabinet."
+msgstr "Fenster die nicht in Cabinet angezeigt werden."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Cycle through windows."
+msgstr "Durch die Fenster blättern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Reversely cycle through windows."
+msgstr "Rückwärts durch die Fenster blättern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Exit with restore stack order."
+msgstr "Beenden und Reihenfolge der Fenster wiederherstellen."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Toggle windows from current or all workspaces."
+msgstr ""
+"Umschalten zwischen Fenstern von der aktuellen und allen Arbeitsflächen."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Toggle windows for display and for manipulation."
+msgstr ""
+"Umschalten zwischen Fenstern die ausgewählt werden können und jenen die nur "
+"angezeigt werden."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Cycle through workspaces."
+msgstr "Durch die Arbeitsflächen blättern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Reversely cycle through workspaces."
+msgstr "Rückwärts durch die Arbeitsflächen blättern."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Advance user keymap."
+msgstr "Tastenkombinationen für Fortgeschrittene Benutzer."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Marked window as selected."
+msgstr "Fenster als ausgewählt markieren."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "After executed cabinet:"
+msgstr "Nachdem ausgeführt Cabinet:"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Cabinet:"
+msgstr "Cabinet:"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "\nIs duplicate."
+msgstr "\nIst doppelt."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "\nDisable cabinet."
+msgstr "\nCabinet ausgeschaltet."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "\nIs not a valid x-keysym-name."
+msgstr "\nIst kein zulässiger »x-keysym-name«."
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "Raise"
+msgstr "Anheben"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "go-to-next"
+msgstr "Zu nächste gehen"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "delete-window"
+msgstr "Fenster »Löschen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-iconified"
+msgstr "Fenster »Minimieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-toggle"
+msgstr "Fenster »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-shaded"
+msgstr "Fenster »Einrollen« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-sticky"
+msgstr "Fenster »Anheften« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-full-toggle"
+msgstr "Fenster auf Xinerama Vollbild »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-full-vertical-left-toggle"
+msgstr "Fenster auf der Linken halben Bildschirmgröße »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-full-vertical-right-toggle"
+msgstr "Fenster auf der Rechten halben Bildschirmgröße »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window-toggle"
+msgstr "Fenster füllend »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window-horizontally-toggle"
+msgstr "Fenster horizontal »Füllend Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window-vertically-toggle"
+msgstr "Fenster vertikal »Füllend Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-fullscreen-toggle"
+msgstr "Fenster auf Vollbild »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-horizontally-toggle"
+msgstr "Fenster Horizontal »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-vertically-toggle"
+msgstr "Fenster Vertikal »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-fullxinerama-toggle"
+msgstr "Fenster auf Xinerama Vollbild »Maximieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-fixed-postion"
+msgstr "Fenster »Feste Position« an/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-never-focus"
+msgstr "Fenster »Nie fokussieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-ignored"
+msgstr "Fenster »Ignorieren« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-task-list-skip"
+msgstr "Fenster »In Taskliste überspringen« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-cycle-skip"
+msgstr "Fenster »Beim durchlaufen überspringen« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-list-skip"
+msgstr "Fenster »In der Fensterliste überspringen« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-window-sticky-viewport"
+msgstr "Fenster auf Sichtfeld »Anheften« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "toggle-desktop"
+msgstr "Desktop »Anzeigen« ein/aus"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-next-head"
+msgstr "Fenster zum nächsten Monitor »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-previous-head"
+msgstr "Fenster zum vorherigen Monitor »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-to-center"
+msgstr "Fenster in die Mitte des Bildschirms »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-to-top-left"
+msgstr "Fenster nach oben links auf der Arbeitsfläche »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-down"
+msgstr "Fenster aufs Sichtfeld nach unten »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-right"
+msgstr "Fenster aufs rechte Sichtfeld »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-left"
+msgstr "Fenster aufs linke Sichtfeld »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-next"
+msgstr "Fenster ins nächstes Sichtfeld »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-previous"
+msgstr "Fenster ins vorherige Sichtfeld »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-add-maked-windows"
+msgstr "Markierte Fenster als Reiter »Hinzufügen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-release-window"
+msgstr "Reiter aus Reiterleiste »Lösen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-move-to-end"
+msgstr "Reiter ans Ende der Reiterleiste »Schieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-move-to-beginning"
+msgstr "Reiter an den Anfang der Reiterleiste »Schieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-move-to-right"
+msgstr "Reiter nach Rechts in der Reiterleiste »Schieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab-move-to-left"
+msgstr "Reiter nach Links in der Reiterleiste »Schieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab/titelbar-toggle"
+msgstr "Titelleiste zum gegenüber liegendem Fensterrand »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab/titelbar-to-top"
+msgstr "Titelleiste zum Oberen Fensterrand »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab/titelbar-to-bottom"
+msgstr "Titelleiste zum Unterem Fensterrand »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab/titelbar-to-right"
+msgstr "Titelleiste zum Rechten Fensterrand »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "tab/titelbar-to-left"
+msgstr "Titelleiste zum Linken Fensterrand »Verschieben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-window"
+msgstr "Fenster »Anheben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "lower-window"
+msgstr "Fenster »Absenken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-single-window"
+msgstr "Einzelnes Fenster »Anheben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-lower-single-window"
+msgstr "Einzelnes Fenster »Absenken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-window-depth"
+msgstr "Fenster Tiefe »Anheben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-lower-window"
+msgstr "Fenster »Anheben/Absenken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "lower-window-depth"
+msgstr "Fenster Tiefe »Absenken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-window-and-transients"
+msgstr "Fenster und Dialoge »Anheben«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "raise-lower-window-and-transients"
+msgstr "Fenster und Dialoge »Anheben/Absenken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "shrink-window-up"
+msgstr "Fenster nach oben »Schrumpfen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "shrink-window-down"
+msgstr "Fenster nach unten »Schrumpfen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "shrink-window-left"
+msgstr "Fenster nach links »Schrumpfen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "shrink-window-right"
+msgstr "Fenster nach rechts »Schrumpfen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "yank-window-up"
+msgstr "Fenster nach oben »Zerren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "yank-window-down"
+msgstr "Fenster nach unten »Zerren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "yank-window-left"
+msgstr "Fenster nach links »Zerren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "yank-window-right"
+msgstr "Fenster nach rechts »Zerren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "size-window-add-column"
+msgstr "Fenster um eine Spalte »Vergrößern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "size-window-subtract-column"
+msgstr "Fenster um eine Spalte »Verkleinern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "size-window-add-row"
+msgstr "Fenster um eine Zeile »Vergrößern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "size-window-subtract-row"
+msgstr "Fenster um eine Zeile »Verkleinern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "grow-window-up"
+msgstr "Fenster nach oben »Ausweiten«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "grow-window-down"
+msgstr "Fenster nach unten »Ausweiten«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "grow-window-left"
+msgstr "Fenster nach links »Ausweiten«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "grow-window-right"
+msgstr "Fenster nach rechts »Ausweiten«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "pack-window-up"
+msgstr "Fenster nach oben »Packen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "pack-window-down"
+msgstr "Fenster nach unten »Packen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "pack-window-right"
+msgstr "Fenster nach rechts »Packen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "pack-window-left"
+msgstr "Fenster nach links »Packen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "double-window-size"
+msgstr "Fenstergröße »Verdoppeln«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "halve-window-size"
+msgstr "Fenstergröße »Halbieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "delete-window-safely"
+msgstr "Fenster »Sicher löschen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "destroy-window"
+msgstr "Fenster »Zerstören«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "window-history-save-position"
+msgstr "Fensterchronik Position »Speichern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "window-history-save-dimensions"
+msgstr "Fensterchronik Maße »Speichern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "window-history-save-attributes"
+msgstr "Fensterchronik Attribute »Speichern«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "window-history-forget"
+msgstr "Fensterchronik »Vergessen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "iconify-window"
+msgstr "Fenster »Minimieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "uniconify-window"
+msgstr "Fenster »Wiederherstellen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "shade-window"
+msgstr "Fenster »Einrollen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "unshade-window"
+msgstr "Fenster »Ausrollen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "make-window-ignored"
+msgstr "Fenster »Ignorieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "make-window-not-ignored"
+msgstr "Fenster »Nicht ignorieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "make-window-sticky"
+msgstr "Fenster »Anheften«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "make-window-unsticky"
+msgstr "Fenster »Anheften« ausschalten"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-to-next-workspace"
+msgstr "Fenster auf nächste Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "move-window-to-previous-workspace"
+msgstr "Fenster auf vorherige Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-workspace-left"
+msgstr "Fenster auf linke Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-workspace-right"
+msgstr "Fenster auf rechte Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-workspace-up"
+msgstr "Fenster auf obere Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "send-to-workspace-down"
+msgstr "Fenster auf untere Arbeitsfläche »Schicken«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-discard"
+msgstr "Fenster »Maximiert« verwerfen"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window"
+msgstr "Fenster »Füllend Maximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window-horizontally"
+msgstr "Fenster horizontal »Füllend Maximiere«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-fill-window-vertically"
+msgstr "Fenster vertikal »Füllend Maximiere«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "unmaximize-window"
+msgstr "Fenster »Unmaximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-fullscreen"
+msgstr "Fenster auf Vollbild »Maximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-fullxinerama"
+msgstr "Fenster auf Xinerama Vollbild »Maximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-horizontally"
+msgstr "Fenster horizontal »Maximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "maximize-window-vertically"
+msgstr "Fenster vertikal »Maximieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "copy-to-next-workspace"
+msgstr "Fenster auf nächste Arbeitsfläche »Kopieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "copy-to-previous-workspace"
+msgstr "Fenster auf vorherige Arbeitsfläche »Kopieren«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "focus-desktop"
+msgstr "Arbeitsfläche »Anzeigen«"
+
+#. ../lisp/sawfish/wm/ext/cabinet.jl
+msgid "hide-desktop"
+msgstr "Arbeitsfläche »Verbergen«"
 
 #. ../lisp/sawfish/wm/ext/auto-raise.jl
 msgid "Auto-Raise"
cabinet-missing.png (image/x-apple-ios-png, 18.8 KB) - not displayed
Bildschirmfoto - 04.05.2014 - 14:24:05.png (image/x-apple-ios-png, 22.3 KB) - not displayed
Bildschirmfoto - 04.05.2014 - 14:24:20.png (image/x-apple-ios-png, 18.9 KB) - not displayed
Bildschirmfoto - 04.05.2014 - 14:24:34.png (image/x-apple-ios-png, 27.8 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.