# # Author:: Christoph Kappel # Version:: $Id: contrib/subtle.rb,v 2264 2010/11/08 23:03:50 unexist $ # License:: GNU GPL # # = Subtle example configuration # # This file will be installed as default and can also be used as a starter for # an own custom configuration file. The system wide config usually resides in # +/etc/xdg/subtle+ and the user config in +HOME/.config/subtle+, both locations # are dependent on the locations specified by +XDG_CONFIG_DIRS+ and # +XDG_CONFIG_HOME+. # # == Options {{{ # # Following options change behaviour and sizes of the window manager: # # Border size in pixel of the windows set :border, 1 # Window move/resize steps in pixel per keypress set :step, 5 # Window screen border snapping set :snap, 10 # Default starting gravity for windows (0 = gravity of last client) set :gravity, :center # Make transient windows urgent set :urgent, false # Enable respecting of size hints globally set :resize, false # Screen size padding (left, right, top, bottom) set :padding, [ 0, 0, 1, 0 ] # Font string either take from e.g. xfontsel or use xft set :font, "-*-clean-medium-*-*-*-12-*-*-*-*-*-*-*" #set :font, "xft:sans-8" # Space around windows set :gap, 0 # Separator between sublets set :separator, " " # Outline border size in pixel of panel items set :outline, 0 # == Options }}} # == Screen {{{ # # Generally subtle comes with two panels per screen, one on the top and one at # the bottom. Each panel can be configured with different panel items and sublets # screen wise. Per default only the top panel on the first screen is used, it's # up to the user to enable the bottom panel or disable either one or both. # # Empty panels are hidden. # # Following items are available: # # [*:views*] List of views with buttons # [*:title*] Title of the current active window # [*:tray*] Systray icons (Can be used once) # [*:sublets*] Catch-all for installed sublets # [*:sublet*] Name of a sublet for direct placement # [*:spacer*] Variable spacer (free width / count of spacers) # [*:center*] Enclose items with :center to center them on the panel # [*:separator*] Insert separator # # === Link # # http://subforge.org/wiki/subtle/Panel # screen 1 do # Add stipple to panels stipple false # Content of the top panel top [ :clock, :wifi, :spacer, :battery, :temp, :mpd ] # Content of the bottom panel bottom [ :views, :task, :spacer, :separator, :gmail, :separator, :battery, :separator, :spacer, :temp, :volume, :tray ] end # == Screen }}} # == Colors {{{ # # Colors directly define the look of subtle, valid values are: # # [*hexadecimal*] #0000ff # [*decimal*] (0, 0, 255) # [*names*] blue # # Whenever there is no valid value for a color set - subtle will use a default # one. There is only one exception to this: If no background color is given no # color will be set. This will ensure a custom background pixmap won't be # overwritten. # # === Link # # http://subforge.org/wiki/subtle/Themes # # Colors {{{ color :title_fg, "#ffffff" color :title_bg, "#1a1a1a" color :title_border, "#1a1a1a" color :focus_fg, "#ffffff" color :focus_bg, "#595959" color :focus_border, "#1a1a1a" color :urgent_fg, "#850000" #color :urgent_bg, "#404040" #color :urgent_border, "#1a1a1a" color :occupied_fg, "#777777" color :occupied_bg, "#404040" color :occupied_border, "#1a1a1a" color :views_fg, "#a8a8a8" color :views_bg, "#1a1a1a" color :views_border, "#1a1a1a" color :sublets_fg, "#595959" color :sublets_bg, "#1a1a1a" color :sublets_border, "#1a1a1a" color :client_active, "#595959" color :client_inactive, "#404040" color :panel, "#1a1a1a" #color :background, "#404040" color :stipple, "#595959" color :separator, "#850000" # }}} # == Gravities {{{ # # Gravities are predefined sizes a window can be set to. There are several ways # to set a certain gravity, most convenient is to define a gravity via a tag or # change them during runtime via grab. Subtler and subtlext can also modify # gravities. # # A gravity consists of four values which are a percentage value of the screen # size. The first two values are x and y starting at the center of the screen # and he last two values are the width and height. # # === Example # # Following defines a gravity for a window with 100% width and height: # # gravity :example, [ 0, 0, 100, 100 ] # # === Link # # http://subforge.org/wiki/subtle/Gravity # # Top left gravity :top_left, [ 0, 0, 59, 50 ] gravity :top_left66, [ 0, 0, 59, 66 ] gravity :top_left33, [ 0, 0, 59, 34 ] # Top gravity :top, [ 0, 0, 100, 50 ] gravity :top66, [ 0, 0, 100, 66 ] gravity :top33, [ 0, 0, 100, 34 ] # Top right gravity :top_right, [ 100, 0, 41, 50 ] gravity :top_right66, [ 100, 0, 41, 66 ] gravity :top_right33, [ 100, 0, 41, 34 ] # Left gravity :left, [ 0, 0, 59, 100 ] gravity :left66, [ 0, 50, 59, 34 ] gravity :left33, [ 0, 50, 30, 34 ] # Center gravity :center, [ 0, 0, 100, 100 ] gravity :center66, [ 0, 50, 100, 34 ] gravity :center33, [ 50, 50, 50, 34 ] # Right gravity :right, [ 100, 0, 41, 100 ] gravity :right66, [ 100, 50, 41, 34 ] gravity :right33, [ 100, 50, 20, 34 ] # Bottom left gravity :bottom_left, [ 0, 100, 59, 50 ] gravity :bottom_left66, [ 0, 100, 59, 66 ] gravity :bottom_left33, [ 0, 100, 59, 34 ] # Bottom gravity :bottom, [ 0, 100, 100, 50 ] gravity :bottom66, [ 0, 100, 100, 66 ] gravity :bottom33, [ 0, 100, 100, 34 ] # Bottom right gravity :bottom_right, [ 100, 100, 41, 50 ] gravity :bottom_right66, [ 100, 100, 41, 66 ] gravity :bottom_right33, [ 100, 100, 41, 34 ] # Gimp gravity :gimp_image, [ 50, 50, 80, 100 ] gravity :gimp_toolbox, [ 0, 0, 10, 100 ] gravity :gimp_dock, [ 100, 0, 10, 100 ] # == Gravities }}} # == Grabs {{{ # # Grabs are keyboard and mouse actions within subtle, every grab can be # assigned either to a key and/or to a mouse button combination. A grab # consists of a chain and an action. # # === Finding keys # # The best resource for getting the correct key names is # */usr/include/X11/keysymdef.h*, but to make life easier here are some hints # about it: # # * Numbers and letters keep their names, so *a* is *a* and *0* is *0* # * Keypad keys need *KP_* as prefix, so *KP_1* is *1* on the keypad # * Strip the *XK_* from the key names if looked up in # /usr/include/X11/keysymdef.h # * Keys usually have meaningful english names # * Modifier keys have special meaning (Alt (A), Control (C), Meta (M), # Shift (S), Super (W)) # # === Chaining # # Chains are a combination of keys and modifiers to one key and can be used in # various ways to trigger an action. In subtle there are two ways to define # chains for grabs: # # 1. Default way*: Add modifiers to a key and use it for a grab # # *Example*: grab "W-Return", "urxvt" # # 2. *Escape way*: Define an escape grab that needs to be pressed before # *any* other grab can be used like in screen/tmux. # # *Example*: grab "C-y", :SubtleEscape # grab "Return", "urxvt" # # ==== Mouse buttons # # [*B1*] = Button1 (Left mouse button) # [*B2*] = Button2 (Middle mouse button) # [*B3*] = Button3 (Right mouse button) # [*B4*] = Button4 (Mouse wheel up) # [*B5*] = Button5 (Mouse wheel down) # # ==== Modifiers # # [*A*] = Alt key # [*C*] = Control key # [*M*] = Meta key # [*S*] = Shift key # [*W*] = Super (Windows) key # # === Action # # An action is something that happens when a grab is activated, this can be one # of the following: # # [*symbol*] Run a subtle action # [*string*] Start a certain program # [*array*] Cycle through gravities # [*lambda*] Run a Ruby proc # # === Example # # This will create a grab that starts a urxvt when Alt+Enter are pressed: # # grab "A-Return", "urxvt" # # === Link # # http://subforge.org/wiki/subtle/Grabs # # Escape grab # grab "C-y", :SubtleEscape # Jump to view1, view2, ... grab "W-S-1", :ViewJump1 grab "W-S-2", :ViewJump2 grab "W-S-3", :ViewJump3 grab "W-S-4", :ViewJump4 # Switch current view grab "W-1", :ViewSwitch1 grab "W-2", :ViewSwitch2 grab "W-3", :ViewSwitch3 grab "W-4", :ViewSwitch4 # Select next and prev view */ grab "KP_Add", :ViewNext grab "KP_Subtract", :ViewPrev # Move mouse to screen1, screen2, ... grab "W-A-1", :ScreenJump1 grab "W-A-2", :ScreenJump2 grab "W-A-3", :ScreenJump3 grab "W-A-4", :ScreenJump4 # Force reload of config and sublets grab "W-C-r", :SubtleReload # Force restart of subtle grab "W-C-S-r", :SubtleRestart # Quit subtle grab "W-S-q", :SubtleQuit # Move current window grab "W-B1", :WindowMove # Resize current window grab "W-B3", :WindowResize # Toggle floating mode of window grab "W-f", :WindowFloat # Toggle fullscreen mode of window grab "W-space", :WindowFull # Toggle sticky mode of window (will be visible on all views) grab "W-v", :WindowStick # Raise window grab "W-r", :WindowRaise # Lower window grab "W-l", :WindowLower # Select next windows grab "W-Left", :WindowLeft grab "W-Down", :WindowDown grab "W-Up", :WindowUp grab "W-Right", :WindowRight grab "A-S-Tab", :WindowLeft grab "A-Tab", :WindowRight grab "W-S-Tab", :WindowUp grab "W-Tab", :WindowDown # Kill current window grab "A-F4", :WindowKill # Cycle between given gravities grab "W-KP_7", [ :top_left, :top_left66, :top_left33 ] grab "W-KP_8", [ :top, :top66, :top33 ] grab "W-KP_9", [ :top_right, :top_right66, :top_right33 ] grab "W-KP_4", [ :left, :left66, :left33 ] grab "W-KP_5", [ :center, :center66, :center33 ] grab "W-KP_6", [ :right, :right66, :right33 ] grab "W-KP_1", [ :bottom_left, :bottom_left66, :bottom_left33 ] grab "W-KP_2", [ :bottom, :bottom66, :bottom33 ] grab "W-KP_3", [ :bottom_right, :bottom_right66, :bottom_right33 ] grab "W-q", [ :top_left, :top_left66, :top_left33 ] grab "W-w", [ :top, :top66, :top33 ] grab "W-e", [ :top_right, :top_right66, :top_right33 ] grab "W-a", [ :left, :left66, :left33 ] grab "W-s", [ :center, :center66, :center33 ] grab "W-d", [ :right, :right66, :right33 ] grab "W-z", [ :bottom_left, :bottom_left66, :bottom_left33 ] grab "W-x", [ :bottom, :bottom66, :bottom33 ] grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] # Exec programs grab "A-F2", 'dmenu_run -nb "#908884" -nf "#000" -sb "#22211f" -sf "#908884" -p "Launch:" -i' grab "W-Return", "urxvtc" # Run Ruby lambdas grab "S-F2" do |c| puts c.name end grab "S-F3" do puts Subtlext::VERSION end # == Grabs }}} # == Tags {{{ # # Tags are generally used in subtle for placement of windows. This placement is # strict, that means that - aside from other tiling window managers - windows # must have a matching tag to be on a certain view. This also includes that # windows that are started on a certain view will not automatically be placed # there. # # There are to ways to define a tag: # # [*string*] With a WM_CLASS/WM_NAME # [*hash*] With a hash of properties # # === Default # # Whenever a window has no tag it will get the default tag and be placed on the # default view. The default view can either be set by the user with adding the # default tag to a view by choice or otherwise the first defined view will be # chosen automatically. # # === Properties # # Additionally tags can do a lot more then just control the placement - they # also have properties than can define and control some aspects of a window # like the default gravity or the default screen per view. # # [*float*] This property either sets the tagged client floating or prevents # it from being floating depending on the value. # # Example: float true # # [*full*] This property either sets the tagged client to fullscreen or # prevents it from being set to fullscreen depending on the value. # # Example: full true # # [*gravity*] This property sets a certain to gravity to the tagged client, # but only on views that have this tag too. # # Example: gravity :center # # [*match*] This property adds matching patterns to a tag, a tag can have # more than one. Matching works either via plaintext, regex # (see man regex(7)) or window id. Per default tags will only # match the WM_NAME and the WM_CLASS portion of a client, this # can be changed with following possible values: # # [*:name*] Match the WM_NAME # [*:instance*] Match the first (instance) part from WM_CLASS # [*:class*] Match the second (class) part from WM_CLASS # [*:role*] Match the window role # # Example: match :instance => "urxvt" # match [:role, :class] => "test" # match "[xa]+term" # # [*exclude*] This property works exactly the same way as *match*, but it # excludes clients that match from this tag. That can be helpful # with catch-all tags e.g. for console apps. # # Example: exclude :instance => "irssi" # # [*resize*] This property either enables or disables honoring of client # resize hints and is independent of the global option. # # Example: resize true # # [*size*] This property sets a certain to size as well as floating to the # tagged client, but only on views that have this tag too. It # expects an array with x, y, width and height values. # # Example: size [100, 100, 50, 50] # # [*stick*] This property either sets the tagged client to stick or prevents # it from being set to stick depending on the value. Stick clients # are visible on every view. # # Example: stick true # # [*type*] This property sets the [[Tagging|tagged]] client to be treated # as a specific window type though as the window sets the type # itself. Following types are possible: # # [*:desktop*] Treat as desktop window (_NET_WM_WINDOW_TYPE_DESKTOP) # [*:dock*] Treat as dock window (_NET_WM_WINDOW_TYPE_DOCK) # [*:toolbar*] Treat as toolbar windows (_NET_WM_WINDOW_TYPE_TOOLBAR) # [*:splash*] Treat as splash window (_NET_WM_WINDOW_TYPE_SPLASH) # [*:dialog*] Treat as dialog window (_NET_WM_WINDOW_TYPE_DIALOG) # # Example: type :desktop # # [*urgent*] This property either sets the tagged client to be urgent or # prevents it from being urgent depending on the value. Urgent # clients will get keyboard and mouse focus automatically. # # Example: urgent true # # === Link # # http://subforge.org/wiki/subtle/Tagging # # Simple tags tag "terms", "xterm|[u]?rxvt[c]?" tag "browser", "chromium|firefox|navigator" tag "office" # Placement tag "office" do match "[g]?vim" resize true end tag "office" do match "VirtualBox" float true resize true end tag "fixed" do geometry [ 10, 10, 100, 100 ] stick true end tag "resize" do match "sakura|gvim" resize true end tag "gravity" do gravity :center end # Modes tag "stick" do match "mplayer" float true # stick true end tag "float" do match "display" float true end # Gimp tag "gimp_image" do match :role => "gimp-image-window" gravity :gimp_image end tag "gimp_toolbox" do match :role => "gimp-toolbox$" gravity :gimp_toolbox end tag "gimp_dock" do match :role => "gimp-dock" gravity :gimp_dock end # == Tags }}} # == Views {{{ # # Views are the virtual desktops in subtle, they show all windows that share a # tag with them. Windows that have no tag will be visible on the default view # which is the view with the default tag or the first defined view when this # tag isn't set. # # === Link # # http://subforge.org/wiki/subtle/Tagging # view " sys ", "terms|default" view " web ", "browser" view " fun ", "gimp_.*" view " stuff ", "office" # == Views }}} # == Sublets {{{ # # Sublets are Ruby scripts that provide data for the panel and can be managed # with the sur script that comes with subtle. # # Follwing properties can be changed directly: # # [*interval*] Update interval of the sublet # [*foreground*] Default foreground color # [*background*] Default background color # # === Example # # sublet :clock do # interval 30 # foreground "#eeeeee" # background "#000000" # format_string "%H:%M:%S" # end # # === Link # # http://subforge.org/wiki/subtle/Sublets#Configuration # sublet :clock do interval 60 format_date "%a %m/%d" format_time "@ %I:%M %p" end sublet :gmail do user "nedam.nedam@gmail.co" password "986320035" foreground "#555753" urgent "#ffc400" normal "#eeeeee" end sublet :wifi do foreground "#ffc123" end sublet :battery do foreground "#f57900" end sublet :mpd do foreground "#46a4ff" format_string "%note% %artist% - %album% - %title%" end # == Sublets }}} # == Hooks {{{ # # And finally hooks are a way to bind Ruby scripts to a certain event. # # Following hooks exist so far: # # [*:client_create*] Called whenever a window is created # [*:client_configure*] Called whenever a window is configured # [*:client_focus*] Called whenever a window gets focus # [*:client_kill*] Called whenever a window is killed # # [*:tag_create*] Called whenever a tag is created # [*:tag_kill*] Called whenever a tag is killed # # [*:view_create*] Called whenever a view is created # [*:view_configure*] Called whenever a view is configured # [*:view_jump*] Called whenever the view is switched # [*:view_kill*] Called whenever a view is killed # # [*:tile*] Called on whenever tiling would be needed # [*:reload*] Called on reload # [*:start*] Called on start # [*:exit*] Called on exit # # === Example # # This hook will print the name of the window that gets the focus: # # on :client_focus do |c| # puts c.name # end # # === Link # # http://subforge.org/wiki/subtle/Hooks # == Hooks }}} # == Snippets {{{ # ### # Current-view ### on :start do ### # Create missing tags ### views = Subtlext::View.all.map {|v| v.name } ### tags = Subtlext::Tag.all.map {|t| t.name } ### ### views.each do |v| ### unless(tags.include?(v)) ### t = Subtlext::Tag.new(v) ### t.save ### end ### end ### end ### ### # Assign tags to clients ### on :client_create do |c| ### view = Subtlext::View.current ### tags = c.tags.map {|t| t.name } ### ### # Add tag to view ### view.tag(view.name) unless(view.tags.include?(view.name)) ### ### # Exclusive for clients with default tag only ### if(tags.include?("default") and 1 == tags.size) ### c.tags = [ view.name ] ### end ### end #on :start do # Subtlext::Subtle.spawn "nitrogen --restore" # Subtlext::Subtle.spawn "xsetroot -cursor_name left_ptr" #end #begin # require "#{ENV["HOME"]}/bin/launcher/launcher.rb" # # Set fonts # Subtle::Contrib::Launcher.fonts = [ # "xft:Envy Code R:pixelsize=80:antialias=true", # "xft:Envy Code R:pixelsize=12:antialias=true" # ] #rescue LoadError => err # p err #end #grab "W-grave" do # Subtle::Contrib::Launcher.run #end # == Snippets }}} # vim:ts=2:bs=2:sw=2:et:fdm=marker