Hi. Well, you can invent many many buttons, if not infinite. It's likely that pull-in-all ends in poor achievements.
If he needs often, say, toggle-sticky-button, then he can bind it to a key. Or an alternative I come up with is to have a "general button" suitable for user-definition. Perhaps it's a trimmed down version of window operation menu, and they can easily add/remove commands to it. Not sure at all. > Possible future plans: > > * Beeing able to change more options on the fly than the font-color (I > dunno which ones yet, but > perhaps the button-order (maybe using some fancy custom GtkWidget?), > or the frame-color (though > the later my cause ugly results on some themes perhaps)) So, more flexibility. My comment above can be re-interpreted in this way. > * add something like window-is-tabbed-p to recognize tabbed windows A must. tab-raise-on-hover is currently raise-on-hover, but it can be fixed with this. In fact, what is needed is (windows-tab-group w), which returns the tab group to which the window belongs, or nil if none. Anyway, tab lacks good standards. > add a new frame-class 'tabbed (so that themes can be set-up for > supporting both tabbed and non-tabbed windows *at once*) It is good that Sawfish provide some fallback tab support for themes. I confess I don't understand, after reading your patch, what the frame-class is. ;) Yep, it's documented. Teika (Teika kazura) On Sat, 26 Sep 2009 23:11:07 +0200, Christopher Roy Bratusek wrote: > Hi all, > > I've been thinking of new buttons provided by sawfish, so we don't need > to reinvent the wheel everytime (like mxflat does). > Together with the new options for changing frame-font-colors > independently of the theme and on-the-fly it may improve the > experience of making new themes for sawfish (or improving old ones). > > First of all the complete patch (frame-classes, their keymap, > sawfish.texi, news.texi, ChangeLog and KEYBINDINGS update) > > ************************************************* > diff --git a/ChangeLog b/ChangeLog > index 10136ab..71cf661 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -42,6 +42,18 @@ > > * man/sawfish.texi: added update-frame-font-color > > + * man/sawfish.texi > + * KEYBINDINGS > + * lisp/sawfish/wm/frames.jl > + * lisp/sawfish/wm/keymaps.jl: added new buttons + keymaps + docs: > + - sticky button > + - lock button > + - rename button > + - move/resize button > + - raise/lower button > + > + * man/news.texi: updated > + > 2009-09-23 Christopher Bratusek <[email protected]> > * man/news.texi: news items for 1.6.0 are partially rewritten [Teika > Kazura] > > diff --git a/KEYBINDINGS b/KEYBINDINGS > index 7d3156c..d500489 100644 > --- a/KEYBINDINGS > +++ b/KEYBINDINGS > @@ -113,7 +113,7 @@ for example: > ( unbind-keys global-keymap "W-Tab" 'cycle-windows ) > > another thing would be nested keybindings (I prefer `macros' instead of > `nested keyinbindgs'), > -like in emacs. nested means you first press keys which together act as > a new modifier > +like in emacs. nested means you first press keys which together act as > a new modifier > (this new modifier works like the compose key does -> you don't have to > keep it pressed, like other modifiers), > then you press another key (or keybinding) to actually perform the > desired action, example: > > @@ -189,3 +189,31 @@ Button1-Click1 -> Popup Window Menu > shade-button-keymap (Those bindings are active when the pointer is on > the shade button) > > Button1-Off -> Toggle Window Shaded > + > +sticky-button-keymap (Those bindings are active when the pointer is on > the sticky button) > + > +Button1-Off -> Toggle Window Sticky > +Button2-Off -> Toggle Window Viewport-Sticky > + > +lock-button-keymap (Those bindings are active when the pointer is on > the lock button) > + > +Button1-Off -> Toggle Window Fixed-Position > + > +rename-button-keymap (Those bindings are active when the pointer is on > the rename button) > + > +Button1-Off -> Rename Window > + > +move-resize-button-keymap (Those bindings are active when the pointer > in on the move/resize button) > + > +Button1-Off -> Move Window Interactively > +Button2-Off -> Resize Window Interactively > +Button3-Off -> Move Window Center > +Button4-Off -> Double Window Size > +Button5-Off -> Halve Window Size > + > +raise-lower-button-keymap (Those bindings are active when the pointer > in on the raise/lower button) > + > +Button1-Off -> Raise Window > +Button2-Off -> Lower Window > +Button4-Off -> Raise Window Depth > +Button5-Off -> Lower Window Depth > diff --git a/lisp/sawfish/wm/frames.jl b/lisp/sawfish/wm/frames.jl > index 9c65c2e..c6b8397 100644 > --- a/lisp/sawfish/wm/frames.jl > +++ b/lisp/sawfish/wm/frames.jl > @@ -633,6 +633,11 @@ deciding which frame type to ask a theme to > generate.") > (define-frame-class 'iconify-button '((keymap . > iconify-button-keymap))) > (define-frame-class 'maximize-button '((keymap . > maximize-button-keymap))) > (define-frame-class 'shade-button '((keymap . shade-button-keymap))) > + (define-frame-class 'sticky-button '((keymap . > sticky-button-keymap))) > + (define-frame-class 'lock-button '((keymap . lock-button-keymap))) > + (define-frame-class 'rename-button '((keymap . > rename-button-keymap))) > + (define-frame-class 'move-resize-button '((keymap . > move-resize-button-keymap))) > + (define-frame-class 'raise-lower-button '((keymap . > raise-lower-button-keymap))) > > (define-frame-class 'title `((keymap . title-keymap) > (cursor . ,(cursor-for-frame-part 'title)))) > diff --git a/lisp/sawfish/wm/keymaps.jl b/lisp/sawfish/wm/keymaps.jl > index 25e761b..f27cec2 100644 > --- a/lisp/sawfish/wm/keymaps.jl > +++ b/lisp/sawfish/wm/keymaps.jl > @@ -101,7 +101,7 @@ > "W-Button2-Click1" 'popup-window-menu > "W-Button1-Move" 'move-window-interactively > "Button1-Click1" 'raise-and-pass-through-click > - "W-ISO_Left_Tab" 'tab-raise-left-window > + "W-ISO_Left_Tab" 'tab-raise-left-window > "H-ISO_Left_Tab" 'tab-raise-right-window) > "Keymap containing bindings active when a client window is > focused." > :group bindings > @@ -177,6 +177,57 @@ of a window. (Only mouse-bindings are evaluated in > this map.)" > :group bindings > :type keymap) > > + (defcustom sticky-button-keymap (bind-keys (make-keymap) > + "Button1-Off" 'toggle-window-sticky > + "Button2-Off" '(call-command > + (lambda () > + (if (window-get > (current-event-window) 'sticky-viewport) > + (window-put > (current-event-window) 'sticky-viewport > nil) > + (window-put > (current-event-window) 'sticky-viewport t))))) > + "Keymap containing bindings active when the pointer is in the > sticky button > +of a window. (Only mouse-bindings are evaluated in this map.)" > + :group bindings > + :type keymap) > + > + (defcustom lock-button-keymap (bind-keys (make-keymap) > + "Button1-Off" '(call-command > + (lambda () > + (if (window-get (current-event-window) > 'fixed-position) > + (window-put (current-event-window) > 'fixed-position nil) > + (window-put (current-event-window) > 'fixed-position t))))) > + "Keymap containing bindings active when the pointer is in the lock > button > +of a window. (Only mouse-bindings are evaluated in this map.)" > + :group bindings > + :type keymap) > + > + (defcustom rename-button-keymap (bind-keys (make-keymap) > + "Button1-Off" 'rename-window) > + "Keymap containing bindings active when the pointer is in the > rename button > +of a window. (Only mouse-bindings are evaluated in this map.)" > + :group bindings > + :type keymap) > + > + (defcustom move-resize-button-keymap (bind-keys (make-keymap) > + "Button1-Off" > 'move-window-interactively > + "Button2-Off" > 'resize-window-interactively > + "Button3-Off" 'move-window-center > + "Button4-Off" 'double-window-size > + "Button5-Off" 'halve-window-size) > + "Keymap containing bindings active when the pointer is in the > move/resize button > +of a window. (Only mouse-bindings are evaluated in this map.)" > + :group bindings > + :type keymap) > + > + (defcustom raise-lower-button-keymap (bind-keys (make-keymap) > + "Button1-Off" 'raise-window > + "Button2-Off" 'lower-window > + "Button4-Off" 'raise-window-depth > + "Button5-Off" 'lower-window-depth) > + "Keymap containing bindings active when the pointer is in the > raise/lower button > +of a window. (Only mouse-bindings are evaluated in this map.)" > + :group bindings > + :type keymap) > + > (defvar pointer-motion-threshold 2 > "Distance in pixels pointer must move before generating motion > events.") > > @@ -196,7 +247,7 @@ of a window. (Only mouse-bindings are evaluated in > this map.)" > (define (keymap-add-window w) > (unless (window-get w 'keymap) > (window-put w 'keymap window-keymap))) > - > + > (add-hook 'add-window-hook keymap-add-window) > > ;; custom support for modifiers > diff --git a/man/news.texi b/man/news.texi > index 077c4bb..1387fe2 100644 > --- a/man/news.texi > +++ b/man/news.texi > @@ -83,7 +83,7 @@ Shrink-yank functions and @code{send-to-workspace}. > > @item Sawfish does now support theme-tarballs compressed with XZ (aka > LZMA2) or LZMA [Christopher Bratusek] > > -...@item 3 new sawfish-mmc based commands (@code{maximize-unframe}, > @code{maximize-reframe} and @code{rename-window}) [Christopher Bratusek] > +...@item 3 new sawfish-mmc based commands (@code{maximize-unframe}, > @code{maximize-reframe} and @code{rename-window} (not ICCCM compliant)) > [Christopher Bratusek] > > @item 5 new move-cursor commands (@code{move-cursor-} @code{northwest}, > @code{northeast}, @code{southwest}, @code{southeast}), and > @code{move-cursor-center} [Christopher Bratusek] > > @@ -126,6 +126,19 @@ In KDE4 WM Selector, Sawfish is added. > > @item Added @code{get-window-by-class} and > @code{get-window-by-class-re} [Christopher Bratusek] > @end itemize > +...@item New Frame Classes: > +...@itemize @minus > + > +...@item @code{sticky-button}, a button to toggle window @code{sticky} or > @code{viewport-sticky} [Christopher Bratusek] > + > +...@item @code{lock-button}, a button to toggle window position > @code{fixed} [Christopher Bratusek] > + > +...@item @code{rename-button}, a button to rename the window-title and > window-icon properties (not ICCCM compliant) [Christopher Bratusek] > + > +...@item @code{move-resize-button}, a button to perform various move and > resize actions on a window [Christopher Bratusek] > + > +...@item @code{raise-lower-button}, a button to perform various raising > and lowering actions on a window [Christopher Bratusek] > +...@end itemize > @item Widget Transistion: > @itemize @minus > > diff --git a/man/sawfish.texi b/man/sawfish.texi > index 4d14006..4fd46a9 100644 > --- a/man/sawfish.texi > +++ b/man/sawfish.texi > @@ -3231,10 +3231,11 @@ The names of the pre-defined classes are as > follows, their meanings > should be self-explanatory: > > @code{title}, @code{menu-button}, @code{close-button}, > -...@code{iconify-button}, @code{maximize-button}, @code{top-border}, > -...@code{left-border}, @code{right-border}, @code{bottom-border}, > -...@code{top-left-corner}, @code{top-right-corner}, > -...@code{bottom-left-corner}, @code{bottom-right-corner}. > +...@code{iconify-button}, @code{maximize-button}, @code{sticky-button}, > +...@code{lock-button}, @code{rename-button}, @code{move-resize-button}, > +...@code{raise-lower-button}, @code{top-border}, @code{left-border}, > +...@code{right-border}, @code{bottom-border}, @code{top-left-corner}, > +...@code{top-right-corner}, @code{bottom-left-corner}, > @code{bottom-right-corner}. > > @noindent > Extra classes can be created by adding to @code{frame-part-classes}. > @@ -5347,6 +5348,11 @@ Keymaps active in the title and borders of window > frames. > @itemx maximize-button-keymap > @itemx menu-button-keymap > @itemx shade-button-keymap > +...@itemx sticky-button-keymap > +...@itemx lock-button-keymap > +...@itemx rename-button-keymap > +...@itemx move-resize-button-keymap > +...@itemx raise-lower-button-keymap > Keymaps active in the standard window frame buttons. > > @item override-keymap > ************************************************* > > Alternatively I may add `toggle-window-sticky-viewport' and > `toggle-window-fixed-position' commands > instead of manually calling window-put, if that is desired. > > Possible future plans: > > * Beeing able to change more options on the fly than the font-color (I > dunno which ones yet, but > perhaps the button-order (maybe using some fancy custom GtkWidget?), > or the frame-color (though > the later my cause ugly results on some themes perhaps)) > > * add something like window-is-tabbed-p to recognize tabbed windows and > add a new frame-class 'tabbed > (so that themes can be set-up for supporting both tabbed and > non-tabbed windows *at once*) > > * more? > > Now I would like to hear your oppionions. > > Happy Hacking, > Chris
