Grabs

Grabs are the mouse button/keyboard mappings in subtle and can be used in various combinations, no grab is limited either to button or keyboard only. Generally they are combinations or chains of one or more modifiers and a button/key.

Genereally there are different types of grabs:
  1. Predefined grabs that call a specific actions
  2. Grabs that call a Ruby block
  3. Grabs that exec a program

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)

Modifier keys

  • A = Alt key
  • C = Control key
  • M = Meta key
  • S = Shift key
  • W = Super (Windows key)

Common keys

  • Space
  • Tab
  • Enter / Return
  • F1 - F12
  • Left, Down, Up, Right
  • Next, Prior
  • Page_Up, Page_Down
  • Home, End
  • Insert, Delete
  • Add, Subtract, Multiply, Divide, Equal
  • Decimal
  • Num_Lock
  • Escape

Multimedia keys

The following list shows some typically used keynames for multimedia keys. Per default they are unassigned, see Assigning keynames for more.

  • XF86AudioMute
  • XF86AudioRaiseVolume
  • XF86AudioLowerVolume
  • XF86AudioPlay
  • XF86AudioPrev
  • XF86AudioNext
  • XF86WWW
  • XF86Calculator
  • XF86Mail

The complete list with all keynames can be found in /usr/share/X11/XKeysymDB.

Fn keys

Fn keys found on notebooks other than numpad keys can't be used directly, they need to be defined. See Assigning keynames for more.

Examples

Numbers: on /off1 grab "S-B1", :WindowMove
2 grab "A-space" do |c|
3   c.toggle_float
4 end
5 grab "W-F1", "xterm -sb" 

Assigning keynames

Keys like the multimedia keys are unassigned or even unknown to the xserver and can't be used directly, but xmodmap can be used to assign keynames to these new keycodes. To get the actual keycodes of a key there is showkey, a tool that can't be used in a virtual terminal.

  • Get keycode
1 kb mode was XLATE
2 
3 press any key (program terminates 10s after last keypress)...
4 keycode  28 release
5 keycode 153 press
6 keycode 153 release
  • Add to ~/.Xmodmap
1 keycode 153 = XF86AudioNext
1  grab "XF86AudioNext", "mpc next" 

Predefined

Escape

Set an escape grab that needs to be pressed before any other grab can be used like in screen.

Subtle

SubtleReload

Reload config and sublets.

Example:

1 grab "W-C-r", :SubtleReload

SubtleRestart

Restart subtle without exiting Xorg.

Example:

1 grab "W-C-S-r", :SubtleRestart

SubtleQuit

Quit subtle and exit Xorg session.

Example:

1 grab "W-C-q", :SubtleQuit

Views

ViewJump

Move pointer either to screen showing numbered view (multihead) or open numbered view on current screen.

  • ViewJump1
  • ViewJump2
  • ...
  • ViewJumpN

Example:

1 grab "W-S-1", :ViewJump1

ViewSwitch

Set current view to numbered view and swap view with screen currently showing it. (multihead)

  • ViewSwitch1
  • ViewSwitch2
  • ...
  • ViewSwitchN

Example:

1 grab "W-1", :ViewSwitch

ViewNext

Select next view.

Example:

1 grab "KP_Add", :ViewNext

ViewPrev

Select previous view.

Example:

1 grab "KP_Substract", :ViewPrev

Screens

ScreenJump

Move pointer to the numbered screen.

  • ScreenJump1
  • ScreenJump2
  • ..
  • ScreenJumpN

Example:

1 grab "W-A-1", :ScreenJump1

Windows

Window grabs manipulate/toggle various properties of client windows.

WindowMove

Move window either by mouse movement while holding the mouse button or via arrow/cursor keys. The move mode can be exited either with releasing the mouse button or pressing return.

Example:

1 grab "W-B1", :WindowMove

WindowResize

Resize window either by mouse movement while holding the mouse button or via arrow/cursor keys. The resize mode can be exited either with releasing the mouse button or pressing return.

Example:

1 grab "W-B3", :WindowResize

WindowFloat

Toggle floating mode of window. Floating windows have no gravity and float above the other windows.

Example:

1 grab "W-f", :WindowFloat

WindowFull

Toggle fullscreen mode of window.

Example:

1 grab "W-space", :WindowFull

WindowStick

Toggle sticky mode of window. Sticky windows appear on all screens.

Example:

1 grab "W-s", :WindowStick

WindowRaise

Move window to top of window stacking list.

Example:

1 grab "W-r", :WindowRaise

WindowLower

Move window to bottom of window stacking list.

Example:

1 grab "W-l", :WindowLower

WindowLeft

Select window left of current window.

Example:

1 grab "W-Left", :WindowLeft

WindowDown

Select window below current window.

Example:

1 grab "W-Down", :WindowDown

WindowUp

Select window above current window.

Example:

1 grab "W-Up", :WindowUp

WindowRight

Select window right of current window.

Example:

1 grab "W-Right", :WindowRight

WindowKill

Kill current window.

Example:

1 grab "W-k", :WindowKill

Gravities

Gravity grabs change the gravity of the selected client on the current view, they are basically a list of gravities and are toggled.

Example:

1 grab "W-KP_7", [ :top_left, :top_left66, :top_left33 ]

Blocks

Grabs can also call a Ruby block (aka lambda/proc), the arity of the block is either a client window or none. Inside of the blocks the whole API of subtlext can be used, the extension will be loaded ondemand.

Example:

Numbers: on /off1 grab "S-F2" do |c| 
2   puts c.name
3 end

Exec

Invoke a shell and exec a program.

Example:

1 grab "W-Return", "urxvt"