Hacking

The following information is for people who are interested in subtle's internals and/or like to play around and extend subtle.

RDoc documentation

The latest rdoc documention can either be found here or be generated with in the source tree:

rake rdoc

Unit testing

Subtle is shipped with a bunch of unit tests that can be run easily via rake tasks:

rake test

They can be found in the test folder.

Following tests are included:

Subtlext

 1 % rake test                
 2 (in /home/unexist/projects/subtle)
 3 LD subtle
 4 LD subtler
 5 LD subtlext
 6 Loaded suite /usr/bin/rake
 7 Started
 8 ......
 9 Finished in 0.047792 seconds.
10 
11 6 tests, 84 assertions, 0 failures, 0 errors

EWMH/ICCCM specifications

Here are all EWMH/NetWM atoms listed that are supported by subtle, subtler and subtlext.

Default

_NET_NUMBER_OF_DESKTOPS

top

_NET_DESKTOP_NAMES

top

_NET_VIRTUAL_ROOTS

top

_NET_CURRENT_DESKTOP

Change current desktop

1 data.l[0] = <View id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

_NET_RESTACK_WINDOW

Change stacking of window

1 data.l[0] = <Ignored>
2 data.l[1] = <Client id>
3 data.l[2] = <Detail>
4 data.l[3] = 0
5 data.l[4] = 0

Detail: 0 = Above (raise), 1 = Below (lower)

top

_NET_MOVERESIZE_WINDOW

Resize window

1 data.l[0] = <Ignored>
2 data.l[1] = <x>
3 data.l[2] = <y>
4 data.l[3] = <width>
5 data.l[4] = <height>

top

_NET_CLOSE_WINDOW

Close client window

1 data.l[0] = <Timestamp>
2 data.l[1] = <Ignored>
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

WM State

Normally there are three types of actions: remove (0), add (1) and toggle (2), but we always toggle the states independent of the supplied action. The second property will be ignored.

_NET_WM_STATE_FULLSCREEN

Toggle client fullscreen

1 data.l[0] = <Action>
2 data.l[1] = _NET_WM_STATE_FULLSCREEN
3 data.l[2] = <Ignored>
4 data.l[3] = 0
5 data.l[4] = 0

top

_NET_WM_STATE_ABOVE

Toggle client float

1 data.l[0] = <Action>
2 data.l[1] = _NET_WM_STATE_ABOVE
3 data.l[2] = <Ignored>
4 data.l[3] = 0
5 data.l[4] = 0

top

_NET_WM_STATE_STICKY

Toggle client urgent

1 data.l[0] = <Action>
2 data.l[1] = _NET_WM_STATE_STICKY
3 data.l[2] = <Ignored>
4 data.l[3] = 0
5 data.l[4] = 0

top

XEmbed

MANAGER

top

_NET_SYSTEM_TRAY_OPCODE

top

_NET_SYSTEM_TRAY_MESSAGE_DATA

top

_NET_SYSTEM_TRAY_S

top

_XEMBED

top

_XEMBED_INFO

top

XEMBED_EMBEDDED_NOTIFY

top

XEMBED_WINDOW_ACTIVATE

top

XEMBED_WINDOW_DEACTIVATE

top

XEMBED_REQUEST_FOCUS

top

XEMBED_FOCUS_IN

top

XEMBED_FOCUS_OUT

top

Subtle extension

SUBTLE_WINDOW_TAG

Add a tag to window (Client or View)

1 data.l[0] = <Client id>
2 data.l[1] = <Tag id>
3 data.l[2] = <Type>
4 data.l[3] = 0
5 data.l[4] = 0

Type: 0 = Client, 1 = View

top

SUBTLE_WINDOW_UNTAG

Remove a tag from window (Client or View)

1 data.l[0] = <Client id>
2 data.l[1] = <Tag id>
3 data.l[2] = <Type>
4 data.l[3] = 0
5 data.l[4] = 0

Type: 0 = Client, 1 = View

top

SUBTLE_WINDOW_TAGS

top

SUBTLE_WINDOW_GRAVITY

Set client window gravity

1 data.l[0] = <Client id>
2 data.l[1] = <Gravity type>
3 data.l[2] = <Gravity mode>
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_WINDOW_SCREEN

Set client window screen

1 data.l[0] = <Client id>
2 data.l[1] = <Screen id>
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_WINDOW_FLAGS

Set client flags

1 data.l[0] = <Client id>
2 data.l[1] = <Flags>
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

The bits in flags have the following meaning:

Bit Description
1 Fullscreen
2 Floating
3 Sticky

top

SUBTLE_WINDOW_RESIZE

Toggle client resize

1 data.l[0] = <Client id>
2 data.l[1] = <Bool>
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_GRAVITY_NEW

Create a new gravity mode

1 data.l[0] = <Gravity id>
2 data.l[1] = <x>
3 data.l[2] = <y>
4 data.l[3] = <width>
5 data.l[4] = <height>

top

SUBTLE_GRAVITY_LIST

Get a gravity mode list

top

SUBTLE_GRAVITY_KILL

Kill a tag

1 data.l[0] = <Tag id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_TAG_NEW

Create a new tag

1 data.b[0-20] = <Tag name>

top

SUBTLE_TAG_LIST

Get a tag list

top

SUBTLE_TAG_KILL

Kill a tag

1 data.l[0] = <Tag id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_VIEW_NEW

Create a new view

1 data.b[0-20] = <View name>

top

SUBTLE_VIEW_KILL

Kill a view

1 data.l[0] = <View id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_SUBLET_NEW

Load a sublet from $XDG_DATA_HOME/subtle/sublets

1 data.b[0-20] = <Sublet filename>

SUBTLE_SUBLET_UPDATE

Force update of a sublet

1 data.l[0] = <Sublet id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_SUBLET_DATA

Set data field of sublet

1 data.b[0] = <Sublet id>
2 data.b[1-20] = <data>

top

SUBTLE_SUBLET_LIST

Get sublet list

top

SUBTLE_SUBLET_KILL

Kill a sublet

1 data.l[0] = <Sublet id>
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_RELOAD_CONFIG

Force reload of config

1 data.l[0] = 0
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_RELOAD_SUBLETS

Force sublets to be reloaded

1 data.l[0] = 0
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_RESTART

Force full restart

1 data.l[0] = 0
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_QUIT

Force quit

1 data.l[0] = 0
2 data.l[1] = 0
3 data.l[2] = 0
4 data.l[3] = 0
5 data.l[4] = 0

top

SUBTLE_COLORS

Get a color list

top