Hacking¶
The following information is for people who are interested in subtle's internals and/or like to play around and extend subtle.
- Hacking
- RDoc documentation
- Unit testing
- Subtlext
- EWMH/ICCCM specifications
- Default
- _NET_NUMBER_OF_DESKTOPS
- _NET_DESKTOP_NAMES
- _NET_VIRTUAL_ROOTS
- _NET_CURRENT_DESKTOP
- _NET_RESTACK_WINDOW
- _NET_MOVERESIZE_WINDOW
- _NET_CLOSE_WINDOW
- WM State
- _NET_WM_STATE_FULLSCREEN
- _NET_WM_STATE_ABOVE
- _NET_WM_STATE_STICKY
- XEmbed
- MANAGER
- _NET_SYSTEM_TRAY_OPCODE
- _NET_SYSTEM_TRAY_MESSAGE_DATA
- _NET_SYSTEM_TRAY_S
- _XEMBED
- _XEMBED_INFO
- XEMBED_EMBEDDED_NOTIFY
- XEMBED_WINDOW_ACTIVATE
- XEMBED_WINDOW_DEACTIVATE
- XEMBED_REQUEST_FOCUS
- XEMBED_FOCUS_IN
- XEMBED_FOCUS_OUT
- Subtle extension
- SUBTLE_WINDOW_TAG
- SUBTLE_WINDOW_UNTAG
- SUBTLE_WINDOW_TAGS
- SUBTLE_WINDOW_GRAVITY
- SUBTLE_WINDOW_SCREEN
- SUBTLE_WINDOW_FLAGS
- SUBTLE_WINDOW_RESIZE
- SUBTLE_GRAVITY_NEW
- SUBTLE_GRAVITY_LIST
- SUBTLE_GRAVITY_KILL
- SUBTLE_TAG_NEW
- SUBTLE_TAG_LIST
- SUBTLE_TAG_KILL
- SUBTLE_VIEW_NEW
- SUBTLE_VIEW_KILL
- SUBTLE_SUBLET_NEW
- SUBTLE_SUBLET_UPDATE
- SUBTLE_SUBLET_DATA
- SUBTLE_SUBLET_LIST
- SUBTLE_SUBLET_KILL
- SUBTLE_RELOAD_CONFIG
- SUBTLE_RELOAD_SUBLETS
- SUBTLE_RESTART
- SUBTLE_QUIT
- SUBTLE_COLORS
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¶
_NET_DESKTOP_NAMES¶
_NET_VIRTUAL_ROOTS¶
_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
_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)
_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>
_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
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
_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
_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
XEmbed¶
MANAGER¶
_NET_SYSTEM_TRAY_OPCODE¶
_NET_SYSTEM_TRAY_MESSAGE_DATA¶
_NET_SYSTEM_TRAY_S¶
_XEMBED¶
_XEMBED_INFO¶
XEMBED_EMBEDDED_NOTIFY¶
XEMBED_WINDOW_ACTIVATE¶
XEMBED_WINDOW_DEACTIVATE¶
XEMBED_REQUEST_FOCUS¶
XEMBED_FOCUS_IN¶
XEMBED_FOCUS_OUT¶
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
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
SUBTLE_WINDOW_TAGS¶
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
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
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 |
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
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>
SUBTLE_GRAVITY_LIST¶
Get a gravity mode list
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
SUBTLE_TAG_NEW¶
Create a new tag
1 data.b[0-20] = <Tag name>
SUBTLE_TAG_LIST¶
Get a tag list
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
SUBTLE_VIEW_NEW¶
Create a new view
1 data.b[0-20] = <View name>
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
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
SUBTLE_SUBLET_DATA¶
Set data field of sublet
1 data.b[0] = <Sublet id>
2 data.b[1-20] = <data>
SUBTLE_SUBLET_LIST¶
Get sublet list
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
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
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
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
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
SUBTLE_COLORS¶
Get a color list
