# # Author:: Christoph Kappel # Version:: $Id$ # 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: # OPTIONS = { # Border size in pixel of the windows :border => 2, # Window move/resize steps in pixel per keypress :step => 5, # Window screen border snapping :snap => 10, # Default starting gravity for windows :gravity => :center, # Make transient windows urgent :urgent => true, # Enable respecting of size hints globally :resize => false, # Screen size padding (left, right, top, bottom) :padding => [ 0, 0, 0, 0 ], # Font string (see xfontsel) :font => "-*-fixed-*-*-*-*-10-*-*-*-*-*-*-*" } # # == Panel # # The next configuration values determine the layout and placement of the panel. Generally, # the panel in subtle consists of two independent bars, one on the top and one at the bottom # of the screen. In Xinerama setups there will only be panels visible on the first screen. # # The top and bottom bar can contain different items and will be hidden when empty. # # Following items are available: # # [*:views*] List of views with buttons # [*:title*] Title of the current active window # [*:tray*] Systray icons # [*:sublets*] Installed sublets # [*:spacer*] Variable spacer # PANEL = { # Content of the top panel :top => [ :views, :title, :spacer, :tray, :sublets ], # Content of the bottom panel :bottom => [ ], # Add stipple to panels :stipple => false, # Separator between sublets :separator => "|" } # # == 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. # COLORS = { # Foreground color of panel and separator :fg_panel => "#757575", # Foreground color of view button :fg_views => "#757575", # Foreground color of sublets :fg_sublets => "#757575", # Foreground color of focus window titles and active views :fg_focus => "#fecf35", # Foreground color of urgent window titles and views :fg_urgent => "#FF9800", # Background color of panel :bg_panel => "#202020", # Background color of view button :bg_views => "#202020", # Background color of sublets :bg_sublets => "#202020", # Background color of focus window titles and active views :bg_focus => "#202020", # Background color of urgent window titles and views :bg_urgent => "#202020", # Border color of focus windows :border_focus => "#303030", # Border color of normal windows :border_normal => "#202020", # Background color of root background :background => "#3d3d3d" } # # == 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: # # :example = [ 0, 0, 100, 100 ] # GRAVITIES = { :top_left => [ 0, 0, 50, 50 ], :top_left66 => [ 0, 0, 50, 66 ], :top_left33 => [ 0, 0, 50, 33 ], :top => [ 0, 0, 100, 50 ], :top66 => [ 0, 0, 100, 66 ], :top33 => [ 0, 0, 100, 33 ], :top_right => [ 100, 0, 50, 50 ], :top_right66 => [ 100, 0, 50, 66 ], :top_right33 => [ 100, 0, 50, 33 ], :left => [ 0, 0, 50, 100 ], :left66 => [ 0, 50, 50, 33 ], :left33 => [ 0, 50, 25, 33 ], :center => [ 0, 0, 100, 100 ], :center66 => [ 0, 50, 100, 33 ], :center33 => [ 50, 50, 50, 33 ], :right => [ 100, 0, 50, 100 ], :right66 => [ 100, 50, 50, 33 ], :right33 => [ 100, 50, 25, 33 ], :bottom_left => [ 0, 100, 50, 50 ], :bottom_left66 => [ 0, 100, 50, 66 ], :bottom_left33 => [ 0, 100, 50, 33 ], :bottom => [ 0, 100, 100, 50 ], :bottom66 => [ 0, 100, 100, 66 ], :bottom33 => [ 0, 100, 100, 33 ], :bottom_right => [ 100, 100, 50, 50 ], :bottom_right66 => [ 100, 100, 50, 66 ], :bottom_right33 => [ 100, 100, 50, 33 ] } # == Dmenu # # This is just an example how to use dmenu with colors defined in the subtle config. # @dmenu = "dmenu_run -fn '%s' -nb '%s' -nf '%s' -sb '%s' -sf '%s' -p 'Select:'" % [ OPTIONS[:font], COLORS[:bg_panel], COLORS[:fg_panel], COLORS[:bg_focus], COLORS[:fg_focus] ] # == 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. # # === Chain # # A chain is a string of modifiers, mouse buttons and normal keys separated by a hyphen. # # ==== Modifiers: # # [*S*] Shift key # [*A*] Alt key # [*C*] Control key # [*W*] Super (Windows key) # [*M*] Meta key # # ==== Mouse buttons: # # [*B1*] Button1 # [*B2*] Button2 # [*B3*] Button3 # [*B4*] Button4 # [*B5*] Button5 # # === 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 xterm when Alt+Enter are pressed: # # "A-Return" => "xterm" # GRABS = { # Switch to view1, view2, ... "W-1" => :ViewJump1, "W-2" => :ViewJump2, "W-3" => :ViewJump3, "W-4" => :ViewJump4, # Move mouse to screen1, screen2, ... "W-A-1" => :ScreenJump1, "W-A-2" => :ScreenJump2, "W-A-3" => :ScreenJump3, "W-A-4" => :ScreenJump4, # Move window to screen1, screen2, ... "A-S-1" => :WindowScreen1, "A-S-2" => :WindowScreen2, "A-S-3" => :WindowScreen3, "A-S-4" => :WindowScreen4, # Force reload of sublets "W-C-s" => :SubletsReload, # Force reload of config "W-C-r" => :SubtleReload, # Quit subtle "W-C-q" => :SubtleQuit, # Move current window "W-B1" => :WindowMove, # Resize current window "W-B3" => :WindowResize, # Toggle floating mode of window "W-f" => :WindowFloat, # Toggle fullscreen mode of window "W-space" => :WindowFull, # Toggle sticky mode of window (will be visible on all views) "W-s" => :WindowStick, # Raise window "W-r" => :WindowRaise, # Lower window "W-l" => :WindowLower, # Select next windows "W-Left" => :WindowLeft, "W-Down" => :WindowDown, "W-Up" => :WindowUp, "W-Right" => :WindowRight, # Kill current window "W-S-k" => :WindowKill, # Cycle between given gravities #"W-KP_7" => [ :top_left, :top_left66, :top_left33 ], "W-7" => [ :top_left, :top_left66, :top_left33 ], #"W-KP_8" => [ :top, :top66, :top33 ], "W-8" => [ :top, :top66, :top33 ], #"W-KP_9" => [ :top_right, :top_right66, :top_right33 ], "W-9" => [ :top_right, :top_right66, :top_right33 ], #"W-KP_4" => [ :left, :left66, :left33 ], "W-u" => [ :left, :left66, :left33 ], #"W-KP_5" => [ :center, :center66, :center33 ], "W-i" => [ :center, :center66, :center33 ], #"W-KP_6" => [ :right, :right66, :right33 ], "W-o" => [ :right, :right66, :right33 ], #"W-KP_1" => [ :bottom_left, :bottom_left66, :bottom_left33 ], "W-j" => [ :bottom_left, :bottom_left66, :bottom_left33 ], #"W-KP_2" => [ :bottom, :bottom66, :bottom33 ], "W-k" => [ :bottom, :bottom66, :bottom33 ], #"W-KP_3" => [ :bottom_right, :bottom_right66, :bottom_right33 ], "W-l" => [ :bottom_right, :bottom_right66, :bottom_right33 ], # Exec some programs "W-Return" => "urxvt", "W-x" => @dmenu, # Run Ruby lambdas "S-F2" => lambda { |c| puts c.name }, "S-F3" => lambda { puts version } } # # == 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. # [*:full*] This property either sets the tagged client to fullscreen or prevents it from being # set to fullscreen depending on the value. # [*:gravity*] This property sets a certain to gravity to the tagged client, but only on views that # have this tag too. # [*:match*] This property influcences the matching of tags, per default tags will only match the # WM_NAME and the WM_CLASS portion of a client. Match expects an array 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 # [*:regex*] This property sets the matching pattern for a tag. Matching works either via plain, # regex (see regex) or window id. If a pattern matches more than once ONLY the first # match will be used. # [*:resize*] This property either enables or disables honoring of client resize hints and is # independent of the global option. # [*:screen*] This property sets a certain to screen to the tagged client, but only on views that # have this tag too. Please keep in mind that screen count starts with 0 for the first # screen. # [*: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. # [*: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. # [*: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. TAGS = { "terms" => "xterm|[u]?rxvt", "browser" => "uzbl|opera|firefox|navigator", "editor" => { :regex => "[g]?vim", :resize => true }, "stick" => { :regex => "mplayer|imagemagick", :float => true, :stick => true }, "float" => { :regex => "gimp", :float => true }, "fixed" => { :geometry => [ 10, 10, 100, 100 ], :stick => true }, "resize" => { :regex => "sakura|gvim", :resize => true }, "gravity" => { :gravity => :center } } # # == 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. # VIEWS = { "desk" => "desk" # "terms" => "terms", # "www" => "browser|default", # "dev" => "editor" } # # == Hooks # # And finally hooks are a way to bind Ruby scripts to a certain event. Following hooks exist so far: # # [*:HookCreate*] Called whenever a window is created # [*:HookJump*] Called whenever the view is switched # [*:HookConfigure*] Called whenever a view is configured # [*:HookFocus*] Called whenever a window gets focus # # === Example # # This hook will print the name of the window that gets the focus: # # :HookFocus => lambda { |c| puts c.name } # HOOKS = { } # vim:ts=2:bs=2:sw=2:et:fdm=marker