FAQ » History » Version 4
Christoph Kappel, 01/23/2018 02:25 PM
1 | 1 | Christoph Kappel | h1. FAQ |
---|---|---|---|
2 | 1 | Christoph Kappel | |
3 | 1 | Christoph Kappel | {{toc}} |
4 | 1 | Christoph Kappel | |
5 | 3 | Christoph Kappel | h2. How do I start program xyz? |
6 | 1 | Christoph Kappel | |
7 | 3 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
8 | 3 | Christoph Kappel | |
9 | 3 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
10 | 3 | Christoph Kappel | |
11 | 3 | Christoph Kappel | <pre><code class="ruby"> |
12 | 3 | Christoph Kappel | subtle & |
13 | 3 | Christoph Kappel | PID=$! |
14 | 3 | Christoph Kappel | sleep 2 |
15 | 3 | Christoph Kappel | urxvt |
16 | 3 | Christoph Kappel | wait $PID |
17 | 3 | Christoph Kappel | </code></pre> |
18 | 3 | Christoph Kappel | |
19 | 3 | Christoph Kappel | * Start your program via [[grab]]: |
20 | 3 | Christoph Kappel | |
21 | 3 | Christoph Kappel | <pre><code class="ruby"> |
22 | 3 | Christoph Kappel | "A-x" => "urxvt" |
23 | 3 | Christoph Kappel | </code></pre> |
24 | 3 | Christoph Kappel | |
25 | 3 | Christoph Kappel | _"dmenu":http://tools.suckless.org/dmenu is added as default launcher in the distributed config to make it more convenient._ |
26 | 3 | Christoph Kappel | |
27 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
28 | 3 | Christoph Kappel | |
29 | 3 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
30 | 3 | Christoph Kappel | |
31 | 3 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
32 | 3 | Christoph Kappel | |
33 | 3 | Christoph Kappel | [[Subtler]]: |
34 | 3 | Christoph Kappel | <pre><code class="ruby"> |
35 | 3 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
36 | 3 | Christoph Kappel | subtler -cT view tag #< Tag view 'view' with tag 'tag' |
37 | 3 | Christoph Kappel | subtler -vT client tag #< Tag client 'client' with tag 'tag' |
38 | 3 | Christoph Kappel | </code></pre> |
39 | 3 | Christoph Kappel | |
40 | 3 | Christoph Kappel | [[Subtlext]]: |
41 | 3 | Christoph Kappel | <pre><code class="ruby"> |
42 | 3 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
43 | 3 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
44 | 3 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
45 | 3 | Christoph Kappel | </code></pre> |
46 | 3 | Christoph Kappel | |
47 | 3 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
48 | 3 | Christoph Kappel | |
49 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
50 | 3 | Christoph Kappel | |
51 | 3 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
52 | 3 | Christoph Kappel | |
53 | 3 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
54 | 3 | Christoph Kappel | |
55 | 3 | Christoph Kappel | [[Subtler]]: |
56 | 3 | Christoph Kappel | <pre><code class="ruby"> |
57 | 3 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
58 | 3 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
59 | 3 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
60 | 3 | Christoph Kappel | </code></pre> |
61 | 3 | Christoph Kappel | |
62 | 3 | Christoph Kappel | [[Subtlext]]: |
63 | 3 | Christoph Kappel | <pre><code class="ruby"> |
64 | 3 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
65 | 3 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
66 | 3 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
67 | 3 | Christoph Kappel | </code></pre> |
68 | 3 | Christoph Kappel | |
69 | 3 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
70 | 3 | Christoph Kappel | |
71 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
72 | 3 | Christoph Kappel | |
73 | 3 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
74 | 3 | Christoph Kappel | |
75 | 3 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
76 | 3 | Christoph Kappel | |
77 | 3 | Christoph Kappel | [[Subtler]]: |
78 | 3 | Christoph Kappel | <pre><code class="ruby"> |
79 | 3 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
80 | 3 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
81 | 3 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
82 | 3 | Christoph Kappel | </code></pre> |
83 | 3 | Christoph Kappel | |
84 | 3 | Christoph Kappel | [[Subtlext]]: |
85 | 3 | Christoph Kappel | <pre><code class="ruby"> |
86 | 3 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
87 | 3 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
88 | 3 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
89 | 3 | Christoph Kappel | </code></pre> |
90 | 3 | Christoph Kappel | |
91 | 3 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
92 | 3 | Christoph Kappel | |
93 | 3 | Christoph Kappel | h2. How does subtle match clients? |
94 | 3 | Christoph Kappel | |
95 | 1 | Christoph Kappel | [[Subtle]] matches the {{color(#ff0000, WM_NAME)}} and the {{color(#0000ff, WM_CLASS)}} property of a window and not the title. This to ensure the match is correct. |
96 | 2 | Christoph Kappel | There are several ways to get these values, here are the most common: |
97 | 1 | Christoph Kappel | |
98 | 2 | Christoph Kappel | * "xprop":http://www.xfree86.org/current/xprop.1.html: Just select the window and have a look for the WM_CLASS line which usually look like this: |
99 | 1 | Christoph Kappel | |
100 | 2 | Christoph Kappel | p{class:pre}. WM_CLASS(STRING) = "{{color(#ff0000, urxvt)}}", "{{color(#0000ff, URxvt)}}") |
101 | 1 | Christoph Kappel | |
102 | 2 | Christoph Kappel | * [[subtler]]: Run *[[subtler]] -cl* and look for the matching line: |
103 | 1 | Christoph Kappel | |
104 | 1 | Christoph Kappel | p{class:pre}. 0x800007 * 1 1020x374 2 1 --- {{color(#ff0000, urxvt)}} ({{color(#0000ff,URxvt)}}) |
105 | 2 | Christoph Kappel | |
106 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
107 | 3 | Christoph Kappel | |
108 | 1 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
109 | 2 | Christoph Kappel | |
110 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
111 | 2 | Christoph Kappel | |
112 | 2 | Christoph Kappel | [[Subtler]]: |
113 | 2 | Christoph Kappel | <pre><code class="ruby"> |
114 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
115 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
116 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
117 | 2 | Christoph Kappel | </code></pre> |
118 | 2 | Christoph Kappel | |
119 | 2 | Christoph Kappel | [[Subtlext]]: |
120 | 2 | Christoph Kappel | <pre><code class="ruby"> |
121 | 2 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
122 | 2 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
123 | 2 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
124 | 2 | Christoph Kappel | </code></pre> |
125 | 2 | Christoph Kappel | |
126 | 2 | Christoph Kappel | [[Grabs]]: |
127 | 2 | Christoph Kappel | <pre><code class="ruby"> |
128 | 2 | Christoph Kappel | def move_view(client, view_id) |
129 | 2 | Christoph Kappel | begin |
130 | 2 | Christoph Kappel | cur = current_view |
131 | 2 | Christoph Kappel | view = views[view_id - 1] |
132 | 2 | Christoph Kappel | |
133 | 2 | Christoph Kappel | begin |
134 | 2 | Christoph Kappel | tag = find_tag(view.name) |
135 | 2 | Christoph Kappel | rescue |
136 | 2 | Christoph Kappel | tag = add_tag(view.name) |
137 | 2 | Christoph Kappel | end |
138 | 2 | Christoph Kappel | |
139 | 2 | Christoph Kappel | # Remove client from current tag |
140 | 2 | Christoph Kappel | if(client.has_tag?(cur.name)) |
141 | 2 | Christoph Kappel | client.untag(cur.name) |
142 | 2 | Christoph Kappel | end |
143 | 2 | Christoph Kappel | |
144 | 2 | Christoph Kappel | # Tag new view with itself |
145 | 2 | Christoph Kappel | if(!view.has_tag?(tag)) |
146 | 2 | Christoph Kappel | view.tag(tag) |
147 | 2 | Christoph Kappel | end |
148 | 2 | Christoph Kappel | |
149 | 2 | Christoph Kappel | # Finally add tag to client |
150 | 2 | Christoph Kappel | client.tag(tag) |
151 | 2 | Christoph Kappel | rescue => err |
152 | 2 | Christoph Kappel | puts err |
153 | 2 | Christoph Kappel | end |
154 | 2 | Christoph Kappel | end |
155 | 2 | Christoph Kappel | |
156 | 2 | Christoph Kappel | GRABS = { |
157 | 2 | Christoph Kappel | "A-F1" => lambda { |c| move_view(c, 1) }, |
158 | 2 | Christoph Kappel | "A-F2" => lambda { |c| move_view(c, 2) }, |
159 | 2 | Christoph Kappel | "A-F3" => lambda { |c| move_view(c, 3) }, |
160 | 2 | Christoph Kappel | "A-F4" => lambda { |c| move_view(c, 4) } |
161 | 2 | Christoph Kappel | } |
162 | 1 | Christoph Kappel | </code></pre> |
163 | 1 | Christoph Kappel | |
164 | 2 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
165 | 1 | Christoph Kappel | |
166 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
167 | 3 | Christoph Kappel | |
168 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
169 | 2 | Christoph Kappel | |
170 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
171 | 2 | Christoph Kappel | |
172 | 2 | Christoph Kappel | [[Subtler]]: |
173 | 2 | Christoph Kappel | <pre><code class="ruby"> |
174 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
175 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
176 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
177 | 2 | Christoph Kappel | </code></pre> |
178 | 2 | Christoph Kappel | |
179 | 2 | Christoph Kappel | [[Subtlext]]: |
180 | 2 | Christoph Kappel | <pre><code class="ruby"> |
181 | 2 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
182 | 2 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
183 | 2 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
184 | 2 | Christoph Kappel | </code></pre> |
185 | 2 | Christoph Kappel | |
186 | 2 | Christoph Kappel | Or with [[grabs]] and "Ruby":http://www.ruby-lang.org lambdas: |
187 | 2 | Christoph Kappel | |
188 | 2 | Christoph Kappel | [[Grabs]]: |
189 | 2 | Christoph Kappel | <pre><code class="ruby"> |
190 | 2 | Christoph Kappel | def move_view(client, view_id) |
191 | 2 | Christoph Kappel | begin |
192 | 2 | Christoph Kappel | cur = current_view |
193 | 2 | Christoph Kappel | view = views[view_id - 1] |
194 | 2 | Christoph Kappel | |
195 | 2 | Christoph Kappel | begin |
196 | 2 | Christoph Kappel | tag = find_tag(view.name) |
197 | 2 | Christoph Kappel | rescue |
198 | 2 | Christoph Kappel | tag = add_tag(view.name) |
199 | 2 | Christoph Kappel | end |
200 | 2 | Christoph Kappel | |
201 | 2 | Christoph Kappel | # Remove client from current tag |
202 | 2 | Christoph Kappel | if(client.has_tag?(cur.name)) |
203 | 2 | Christoph Kappel | client.untag(cur.name) |
204 | 2 | Christoph Kappel | end |
205 | 2 | Christoph Kappel | |
206 | 2 | Christoph Kappel | # Tag new view with itself |
207 | 2 | Christoph Kappel | if(!view.has_tag?(tag)) |
208 | 2 | Christoph Kappel | view.tag(tag) |
209 | 2 | Christoph Kappel | end |
210 | 2 | Christoph Kappel | |
211 | 2 | Christoph Kappel | # Finally add tag to client |
212 | 2 | Christoph Kappel | client.tag(tag) |
213 | 2 | Christoph Kappel | rescue => err |
214 | 2 | Christoph Kappel | puts err |
215 | 2 | Christoph Kappel | end |
216 | 2 | Christoph Kappel | end |
217 | 2 | Christoph Kappel | |
218 | 2 | Christoph Kappel | GRABS = { |
219 | 2 | Christoph Kappel | "A-F1" => lambda { |c| move_view(c, 1) }, |
220 | 2 | Christoph Kappel | "A-F2" => lambda { |c| move_view(c, 2) }, |
221 | 2 | Christoph Kappel | "A-F3" => lambda { |c| move_view(c, 3) }, |
222 | 1 | Christoph Kappel | "A-F4" => lambda { |c| move_view(c, 4) } |
223 | 1 | Christoph Kappel | } |
224 | 1 | Christoph Kappel | </code></pre> |
225 | 2 | Christoph Kappel | |
226 | 1 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
227 | 2 | Christoph Kappel | |
228 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
229 | 3 | Christoph Kappel | |
230 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
231 | 2 | Christoph Kappel | |
232 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
233 | 2 | Christoph Kappel | |
234 | 2 | Christoph Kappel | [[Subtler]]: |
235 | 2 | Christoph Kappel | <pre><code class="ruby"> |
236 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
237 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
238 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
239 | 2 | Christoph Kappel | </code></pre> |
240 | 2 | Christoph Kappel | |
241 | 2 | Christoph Kappel | [[Subtlext]]: |
242 | 2 | Christoph Kappel | <pre><code class="ruby"> |
243 | 2 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
244 | 2 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
245 | 2 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
246 | 1 | Christoph Kappel | </code></pre> |
247 | 1 | Christoph Kappel | |
248 | 1 | Christoph Kappel | Please also have a look at the [[recipes]] wiki page which also includes two examples how to move clients. |
249 | 2 | Christoph Kappel | |
250 | 1 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
251 | 2 | Christoph Kappel | |
252 | 3 | Christoph Kappel | h2. How do I set a wallpaper in subtle? |
253 | 3 | Christoph Kappel | |
254 | 2 | Christoph Kappel | [[subtle]] itself has no own functionality to set a wallpaper, _~/.xinitrc_ is perfectly suited for this. |
255 | 2 | Christoph Kappel | |
256 | 2 | Christoph Kappel | Due the design of [[subtle]] sets background color of the root window and therefore overwrites any root pixmap set before. |
257 | 2 | Christoph Kappel | |
258 | 2 | Christoph Kappel | This can be bypassed with this: |
259 | 1 | Christoph Kappel | |
260 | 1 | Christoph Kappel | <pre><code class="ruby">subtle & |
261 | 2 | Christoph Kappel | PID=$! |
262 | 1 | Christoph Kappel | display -window root pixmap.png |
263 | 2 | Christoph Kappel | wait $PID |
264 | 1 | Christoph Kappel | </code></pre> |
265 | 2 | Christoph Kappel | |
266 | 3 | Christoph Kappel | h2. How do I set a wallpaper in subtle? |
267 | 3 | Christoph Kappel | |
268 | 2 | Christoph Kappel | [[subtle]] itself has no own functionality to set a wallpaper, _~/.xinitrc_ is perfectly suited for this. |
269 | 2 | Christoph Kappel | |
270 | 2 | Christoph Kappel | Due the design of [[subtle]] sets background color of the root window and therefore overwrites any root pixmap set before. |
271 | 2 | Christoph Kappel | |
272 | 2 | Christoph Kappel | This can be bypassed with this: |
273 | 2 | Christoph Kappel | |
274 | 1 | Christoph Kappel | <pre><code class="ruby">subtle & |
275 | 1 | Christoph Kappel | PID=$! |
276 | 2 | Christoph Kappel | display -window root pixmap.png |
277 | 2 | Christoph Kappel | wait $PID |
278 | 1 | Christoph Kappel | </code></pre> |
279 | 2 | Christoph Kappel | |
280 | 1 | Christoph Kappel | Or just comment out the background line. |
281 | 2 | Christoph Kappel | |
282 | 3 | Christoph Kappel | h2. How do I run a java program? |
283 | 3 | Christoph Kappel | |
284 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
285 | 2 | Christoph Kappel | |
286 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
287 | 2 | Christoph Kappel | |
288 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
289 | 2 | Christoph Kappel | |
290 | 2 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to MToolkit, which is known to work with non-reparenting windows managers like [[subtle]]. Dependend on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
291 | 2 | Christoph Kappel | |
292 | 1 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
293 | 1 | Christoph Kappel | |
294 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
295 | 2 | Christoph Kappel | |
296 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
297 | 1 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
298 | 2 | Christoph Kappel | |
299 | 1 | Christoph Kappel | |
300 | 2 | Christoph Kappel | |
301 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
302 | 3 | Christoph Kappel | |
303 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
304 | 2 | Christoph Kappel | |
305 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
306 | 2 | Christoph Kappel | |
307 | 2 | Christoph Kappel | [[Subtler]]: |
308 | 2 | Christoph Kappel | <pre><code class="ruby"> |
309 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
310 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
311 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
312 | 2 | Christoph Kappel | </code></pre> |
313 | 2 | Christoph Kappel | |
314 | 2 | Christoph Kappel | [[Subtlext]]: |
315 | 1 | Christoph Kappel | <pre><code class="ruby"> |
316 | 1 | Christoph Kappel | s = Subtlext::Subtle.new #< Connect to subtle |
317 | 2 | Christoph Kappel | s.find_client("client").tag("tag") #< Tag client 'client' with tag 'tag' |
318 | 2 | Christoph Kappel | s.find_view("view").tag("tag") #< Tag view 'view' with tag 'tag' |
319 | 2 | Christoph Kappel | </code></pre> |
320 | 2 | Christoph Kappel | |
321 | 1 | Christoph Kappel | Please also have a look at the [[recipes]] wiki page which also includes two examples how to move clients. |
322 | 2 | Christoph Kappel | |
323 | 1 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
324 | 2 | Christoph Kappel | |
325 | 3 | Christoph Kappel | h2. How do I start program xyz? |
326 | 3 | Christoph Kappel | |
327 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
328 | 2 | Christoph Kappel | |
329 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
330 | 2 | Christoph Kappel | |
331 | 2 | Christoph Kappel | <pre><code class="ruby"> |
332 | 2 | Christoph Kappel | subtle & |
333 | 2 | Christoph Kappel | PID=$! |
334 | 2 | Christoph Kappel | sleep 2 |
335 | 2 | Christoph Kappel | urxvt |
336 | 1 | Christoph Kappel | wait $PID |
337 | 1 | Christoph Kappel | </code></pre> |
338 | 2 | Christoph Kappel | |
339 | 2 | Christoph Kappel | * Start your program via [[grab]]: |
340 | 2 | Christoph Kappel | |
341 | 2 | Christoph Kappel | <pre><code class="ruby"> |
342 | 2 | Christoph Kappel | "A-x" => "urxvt" |
343 | 1 | Christoph Kappel | </code></pre> |
344 | 2 | Christoph Kappel | |
345 | 1 | Christoph Kappel | _"dmenu":http://tools.suckless.org/dmenu is added as default launcher in the distributed config to make it more convenient._ |
346 | 2 | Christoph Kappel | |
347 | 3 | Christoph Kappel | h2. How do I run a java program? |
348 | 3 | Christoph Kappel | |
349 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
350 | 2 | Christoph Kappel | |
351 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
352 | 2 | Christoph Kappel | |
353 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
354 | 1 | Christoph Kappel | |
355 | 1 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to MToolkit, which is known to work with non-reparenting windows managers like [[subtle]]. Dependend on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
356 | 2 | Christoph Kappel | |
357 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
358 | 2 | Christoph Kappel | |
359 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
360 | 2 | Christoph Kappel | |
361 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
362 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
363 | 1 | Christoph Kappel | |
364 | 2 | Christoph Kappel | |
365 | 1 | Christoph Kappel | |
366 | 3 | Christoph Kappel | h2. How do I run a java program? |
367 | 3 | Christoph Kappel | |
368 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
369 | 2 | Christoph Kappel | |
370 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
371 | 2 | Christoph Kappel | |
372 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
373 | 2 | Christoph Kappel | |
374 | 1 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to MToolkit, which is known to work with non-reparenting windows managers like [[subtle]]. Dependend on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
375 | 1 | Christoph Kappel | |
376 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
377 | 2 | Christoph Kappel | |
378 | 2 | Christoph Kappel | In case both doesn't work there is a third option: The JDK internally uses a hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org made the tool "wmname":http://tools.suckless.org/wmname to change the name of the wm and just lie to Java. |
379 | 2 | Christoph Kappel | |
380 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
381 | 2 | Christoph Kappel | |
382 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
383 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
384 | 1 | Christoph Kappel | |
385 | 2 | Christoph Kappel | |
386 | 1 | Christoph Kappel | |
387 | 3 | Christoph Kappel | h2. How do I run a java program? |
388 | 3 | Christoph Kappel | |
389 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
390 | 2 | Christoph Kappel | |
391 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
392 | 2 | Christoph Kappel | |
393 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
394 | 1 | Christoph Kappel | |
395 | 1 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to MToolkit, which is known to work with non-reparenting windows managers like [[subtle]]. Dependend on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
396 | 2 | Christoph Kappel | |
397 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
398 | 2 | Christoph Kappel | |
399 | 2 | Christoph Kappel | In case both doesn't work there is a third option: The JDK internally uses a hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made the tool "wmname":http://tools.suckless.org/wmname to change the name of the wm and just lie to Java. |
400 | 2 | Christoph Kappel | |
401 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
402 | 2 | Christoph Kappel | |
403 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
404 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
405 | 1 | Christoph Kappel | |
406 | 2 | Christoph Kappel | |
407 | 1 | Christoph Kappel | |
408 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
409 | 3 | Christoph Kappel | |
410 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
411 | 2 | Christoph Kappel | |
412 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
413 | 2 | Christoph Kappel | |
414 | 2 | Christoph Kappel | [[Subtler]]: |
415 | 2 | Christoph Kappel | <pre><code class="ruby"> |
416 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
417 | 1 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
418 | 1 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
419 | 2 | Christoph Kappel | </code></pre> |
420 | 2 | Christoph Kappel | |
421 | 2 | Christoph Kappel | [[Subtlext]]: |
422 | 2 | Christoph Kappel | <pre><code class="ruby"> |
423 | 2 | Christoph Kappel | Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
424 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
425 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
426 | 2 | Christoph Kappel | </code></pre> |
427 | 2 | Christoph Kappel | |
428 | 2 | Christoph Kappel | Please also have a look at the [[recipes]] wiki page which also includes two examples how to move clients. |
429 | 2 | Christoph Kappel | |
430 | 1 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
431 | 2 | Christoph Kappel | |
432 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
433 | 3 | Christoph Kappel | |
434 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[Tags|tagging system]] and is initially usually done in the [[config]]. |
435 | 2 | Christoph Kappel | |
436 | 2 | Christoph Kappel | You can change tags either with [[subtler]] or [[subtlext]] per runtime: |
437 | 2 | Christoph Kappel | |
438 | 2 | Christoph Kappel | [[Subtler]]: |
439 | 2 | Christoph Kappel | <pre><code class="ruby"> |
440 | 1 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
441 | 1 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
442 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
443 | 2 | Christoph Kappel | </code></pre> |
444 | 2 | Christoph Kappel | |
445 | 2 | Christoph Kappel | [[Subtlext]]: |
446 | 2 | Christoph Kappel | <pre><code class="ruby"> |
447 | 2 | Christoph Kappel | Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
448 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
449 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
450 | 2 | Christoph Kappel | </code></pre> |
451 | 2 | Christoph Kappel | |
452 | 1 | Christoph Kappel | Please also have a look at the [[recipes]] wiki page which also includes two examples how to move clients. |
453 | 2 | Christoph Kappel | |
454 | 1 | Christoph Kappel | In _/usr/share/subtle/scripts_ is a tagging example script with the help of "dmenu":http://tools.suckless.org/dmenu. |
455 | 2 | Christoph Kappel | |
456 | 3 | Christoph Kappel | h2. How do I add tags to console based programs? |
457 | 3 | Christoph Kappel | |
458 | 2 | Christoph Kappel | Generally [[subtle]] can apply [[Tagging|tags]] based on the {{color(#0000ff, WM_NAME)}} and both {{color(#ff0000, WM_CLASS)}} components. Console based programs like "irssi":http://irssi.org can be started like this and will change the {{color(#0000ff, WM_NAME)}} of the terminal: |
459 | 2 | Christoph Kappel | |
460 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -e irssi</code></pre> |
461 | 2 | Christoph Kappel | |
462 | 2 | Christoph Kappel | Inspecting the terminal with "xprop":http://www.xfree86.org/current/xprop.1.html: |
463 | 2 | Christoph Kappel | |
464 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
465 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "urxvt")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
466 | 2 | Christoph Kappel | |
467 | 2 | Christoph Kappel | So if we want to tag this window there are some things that should be considered: |
468 | 2 | Christoph Kappel | |
469 | 2 | Christoph Kappel | * "irssi":http://irssi.org updates the {{color(#0000ff, WM_NAME)}} only |
470 | 2 | Christoph Kappel | * [[Tagging]] matches per default both {{color(#ff0000, WM_CLASS)}} components ({{color(#aa0000, instance)}} and {{color(#ff00ff, class)}} name) |
471 | 2 | Christoph Kappel | * [[Tagging|Tags]] are applied when a window is mapped - that is *before* the terminal launches "irssi":http://irssi.org |
472 | 2 | Christoph Kappel | |
473 | 1 | Christoph Kappel | To safely [[Tagging|tag]] it's better to change the {{color(#aa0000, instance)}} name of the terminal like this: |
474 | 1 | Christoph Kappel | |
475 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -name irssi -e irssi</code></pre> |
476 | 2 | Christoph Kappel | |
477 | 2 | Christoph Kappel | This results in following (via "xprop":http://www.xfree86.org/current/xprop.1.html): |
478 | 2 | Christoph Kappel | |
479 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
480 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
481 | 2 | Christoph Kappel | |
482 | 2 | Christoph Kappel | A [[Tagging|tag]] for this could be: |
483 | 2 | Christoph Kappel | |
484 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
485 | 2 | Christoph Kappel | match "irssi" |
486 | 1 | Christoph Kappel | end</code></pre> |
487 | 2 | Christoph Kappel | |
488 | 1 | Christoph Kappel | Please keep in mind, that the {{color(#ff0000, WM_CLASS)}} {{color(#ff00ff, class)}} name is still *URxvt* and will match others [[Tagging|tags]] too. |
489 | 2 | Christoph Kappel | |
490 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
491 | 3 | Christoph Kappel | |
492 | 2 | Christoph Kappel | Generally [[subtle]] can apply [[Tagging|tags]] based on the {{color(#0000ff, WM_NAME)}} and both {{color(#ff0000, WM_CLASS)}} components. Console based programs like "irssi":http://irssi.org can be started like this and will change the {{color(#0000ff, WM_NAME)}} of the terminal: |
493 | 2 | Christoph Kappel | |
494 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -e irssi</code></pre> |
495 | 2 | Christoph Kappel | |
496 | 2 | Christoph Kappel | Inspecting the terminal with "xprop":http://www.xfree86.org/current/xprop.1.html: |
497 | 2 | Christoph Kappel | |
498 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
499 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "urxvt")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
500 | 2 | Christoph Kappel | |
501 | 2 | Christoph Kappel | So if we want to tag this window there are some things that should be considered: |
502 | 2 | Christoph Kappel | |
503 | 2 | Christoph Kappel | * "irssi":http://irssi.org updates the {{color(#0000ff, WM_NAME)}} only |
504 | 2 | Christoph Kappel | * [[Tagging]] matches per default both {{color(#ff0000, WM_CLASS)}} components ({{color(#aa0000, instance)}} and {{color(#ff00ff, class)}} name) |
505 | 2 | Christoph Kappel | * [[Tagging|Tags]] are applied when a window is mapped - that is *before* the terminal launches "irssi":http://irssi.org |
506 | 1 | Christoph Kappel | |
507 | 1 | Christoph Kappel | To safely [[Tagging|tag]] it's better to change the {{color(#aa0000, instance)}} name of the terminal like this: |
508 | 2 | Christoph Kappel | |
509 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -name irssi -e irssi</code></pre> |
510 | 2 | Christoph Kappel | |
511 | 2 | Christoph Kappel | This results in following (via "xprop":http://www.xfree86.org/current/xprop.1.html): |
512 | 2 | Christoph Kappel | |
513 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
514 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
515 | 2 | Christoph Kappel | |
516 | 2 | Christoph Kappel | A [[Tagging|tag]] for this could be: |
517 | 2 | Christoph Kappel | |
518 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
519 | 1 | Christoph Kappel | match "irssi" |
520 | 1 | Christoph Kappel | end</code></pre> |
521 | 1 | Christoph Kappel | |
522 | 2 | Christoph Kappel | Please keep in mind, that the {{color(#ff0000, WM_CLASS)}} {{color(#ff00ff, class)}} name is still *URxvt* and will match others [[Tagging|tags]] too. |
523 | 2 | Christoph Kappel | |
524 | 3 | Christoph Kappel | h2. How does subtle match clients? |
525 | 3 | Christoph Kappel | |
526 | 2 | Christoph Kappel | [[subtle]] matches the {{color(#ff0000, WM_NAME)}} and the {{color(#0000ff, WM_CLASS)}} property of a window and not the title. This to ensure the match is correct. |
527 | 2 | Christoph Kappel | There are several ways to get these values, here are the most common: |
528 | 2 | Christoph Kappel | |
529 | 2 | Christoph Kappel | Select the window with "xprop":http://www.xfree86.org/current/xprop.1.htmland have a look for the {{color(#ff0000, WM_NAME)}} and {{color(#0000ff, WM_CLASS)}} lines which usually look like this: |
530 | 2 | Christoph Kappel | |
531 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "urxvt" |
532 | 1 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
533 | 1 | Christoph Kappel | |
534 | 2 | Christoph Kappel | Run *[[subtler]] -cl* and look for the matching line: |
535 | 2 | Christoph Kappel | |
536 | 1 | Christoph Kappel | <pre><code class="bash">0x800007 * 1 1020x374 2 1 --- {{color(#ff0000, urxvt)}} ({{color(#0000ff,URxvt)}})</code></pre> |
537 | 2 | Christoph Kappel | |
538 | 3 | Christoph Kappel | h2. How does subtle match clients? |
539 | 3 | Christoph Kappel | |
540 | 2 | Christoph Kappel | [[subtle]] matches the {{color(#ff0000, WM_NAME)}} and the {{color(#0000ff, WM_CLASS)}} property of a window and not the title. This to ensure the match is correct. |
541 | 2 | Christoph Kappel | There are several ways to get these values, here are the most common: |
542 | 2 | Christoph Kappel | |
543 | 2 | Christoph Kappel | Select the window with "xprop":http://www.xfree86.org/current/xprop.1.htmland have a look for the {{color(#ff0000, WM_NAME)}} and {{color(#0000ff, WM_CLASS)}} lines which usually look like this: |
544 | 2 | Christoph Kappel | |
545 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "urxvt" |
546 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
547 | 2 | Christoph Kappel | |
548 | 1 | Christoph Kappel | Run *[[subtler]] -cl* and look for the matching line: |
549 | 2 | Christoph Kappel | |
550 | 1 | Christoph Kappel | <pre><code class="bash">0x800007 * 1 1020x374 2 1 --- {{color(#ff0000, urxvt)}} ({{color(#0000ff,URxvt)}})</code></pre> |
551 | 1 | Christoph Kappel | |
552 | 3 | Christoph Kappel | h2. How can I use subtle without numpad? |
553 | 3 | Christoph Kappel | |
554 | 2 | Christoph Kappel | Per default [[subtle]] uses the numpad, because it's easier to remind the different postions when you can see them. Generally this is just a suggestion, it's up to you to change the grabs to your needs - any keys will work. |
555 | 2 | Christoph Kappel | |
556 | 2 | Christoph Kappel | Keys that also have proven to work well are *q-w-e*, *a-s-d* and *y-x-c*: |
557 | 2 | Christoph Kappel | |
558 | 2 | Christoph Kappel | <pre><code class="ruby">grab "W-q", [ :top_left, :top_left66, :top_left33 ] |
559 | 2 | Christoph Kappel | grab "W-w", [ :top, :top66, :top33 ] |
560 | 2 | Christoph Kappel | grab "W-e", [ :top_right, :top_right66, :top_right33 ] |
561 | 2 | Christoph Kappel | grab "W-a", [ :left, :left66, :left33 ] |
562 | 2 | Christoph Kappel | grab "W-s", [ :center, :center66, :center33 ] |
563 | 2 | Christoph Kappel | grab "W-d", [ :right, :right66, :right33 ] |
564 | 2 | Christoph Kappel | grab "W-y", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
565 | 2 | Christoph Kappel | grab "W-x", [ :bottom, :bottom66, :bottom33 ] |
566 | 2 | Christoph Kappel | grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] |
567 | 2 | Christoph Kappel | </code></pre> |
568 | 1 | Christoph Kappel | |
569 | 2 | Christoph Kappel | You can find more about assigning keys [[Grabs|here]]. |
570 | 1 | Christoph Kappel | |
571 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
572 | 3 | Christoph Kappel | |
573 | 2 | Christoph Kappel | Generally [[subtle]] can apply [[Tagging|tags]] based on the {{color(#0000ff, WM_NAME)}} and both {{color(#ff0000, WM_CLASS)}} components. Console based programs like "irssi":http://irssi.org can be started like this and will change the {{color(#0000ff, WM_NAME)}} of the terminal: |
574 | 2 | Christoph Kappel | |
575 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -e irssi</code></pre> |
576 | 2 | Christoph Kappel | |
577 | 2 | Christoph Kappel | Inspecting the terminal with "xprop":http://www.xfree86.org/current/xprop.1.html: |
578 | 2 | Christoph Kappel | |
579 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
580 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "urxvt")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
581 | 2 | Christoph Kappel | |
582 | 2 | Christoph Kappel | So if we want to tag this window there are some things that should be considered: |
583 | 1 | Christoph Kappel | |
584 | 1 | Christoph Kappel | * "irssi":http://irssi.org updates the {{color(#0000ff, WM_NAME)}} only |
585 | 2 | Christoph Kappel | * [[Tagging]] matches per default both {{color(#ff0000, WM_CLASS)}} components ({{color(#aa0000, instance)}} and {{color(#ff00ff, class)}} name) |
586 | 2 | Christoph Kappel | * [[Tagging|Tags]] are applied when a window is mapped - that is *before* the terminal launches "irssi":http://irssi.org |
587 | 2 | Christoph Kappel | |
588 | 2 | Christoph Kappel | To safely [[Tagging|tag]] it's better to change the {{color(#aa0000, instance)}} name of the terminal like this: |
589 | 2 | Christoph Kappel | |
590 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -name irssi -e irssi</code></pre> |
591 | 2 | Christoph Kappel | |
592 | 2 | Christoph Kappel | This results in following (via "xprop":http://www.xfree86.org/current/xprop.1.html): |
593 | 2 | Christoph Kappel | |
594 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
595 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
596 | 2 | Christoph Kappel | |
597 | 2 | Christoph Kappel | A [[Tagging|tag]] for this could be: |
598 | 2 | Christoph Kappel | |
599 | 1 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
600 | 2 | Christoph Kappel | match "irssi" |
601 | 1 | Christoph Kappel | end</code></pre> |
602 | 2 | Christoph Kappel | |
603 | 2 | Christoph Kappel | Please keep in mind, that the {{color(#ff0000, WM_CLASS)}} {{color(#ff00ff, class)}} name is still *URxvt* and will match other [[Tagging|tags]] too. |
604 | 2 | Christoph Kappel | |
605 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
606 | 3 | Christoph Kappel | |
607 | 2 | Christoph Kappel | Generally [[subtle]] can apply [[Tagging|tags]] based on the {{color(#0000ff, WM_NAME)}} and both {{color(#ff0000, WM_CLASS)}} components. Console based programs like "irssi":http://irssi.org can be started like this and will change the {{color(#0000ff, WM_NAME)}} of the terminal: |
608 | 2 | Christoph Kappel | |
609 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -e irssi</code></pre> |
610 | 2 | Christoph Kappel | |
611 | 2 | Christoph Kappel | Inspecting the terminal with "xprop":http://www.xfree86.org/current/xprop.1.html: |
612 | 2 | Christoph Kappel | |
613 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
614 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "urxvt")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
615 | 2 | Christoph Kappel | |
616 | 1 | Christoph Kappel | So if we want to tag this window there are some things that should be considered: |
617 | 1 | Christoph Kappel | |
618 | 2 | Christoph Kappel | * "irssi":http://irssi.org updates the {{color(#0000ff, WM_NAME)}} only |
619 | 2 | Christoph Kappel | * [[Tagging]] matches per default both {{color(#ff0000, WM_CLASS)}} components ({{color(#aa0000, instance)}} and {{color(#ff00ff, class)}} name) |
620 | 2 | Christoph Kappel | * [[Tagging|Tags]] are applied when a window is mapped - that is *before* the terminal launches "irssi":http://irssi.org |
621 | 2 | Christoph Kappel | |
622 | 2 | Christoph Kappel | To safely [[Tagging|tag]] it's better to change the {{color(#aa0000, instance)}} name of the terminal like this: |
623 | 2 | Christoph Kappel | |
624 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -name irssi -e irssi</code></pre> |
625 | 1 | Christoph Kappel | |
626 | 1 | Christoph Kappel | This results in following (via "xprop":http://www.xfree86.org/current/xprop.1.html): |
627 | 2 | Christoph Kappel | |
628 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
629 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
630 | 2 | Christoph Kappel | |
631 | 2 | Christoph Kappel | A [[Tagging|tag]] for this could be: |
632 | 2 | Christoph Kappel | |
633 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
634 | 1 | Christoph Kappel | match :instance => "irssi" |
635 | 2 | Christoph Kappel | end</code></pre> |
636 | 1 | Christoph Kappel | |
637 | 2 | Christoph Kappel | Please keep in mind, that the {{color(#ff0000, WM_CLASS)}} {{color(#ff00ff, class)}} name is still *URxvt* and will match other [[Tagging|tags]] too. |
638 | 2 | Christoph Kappel | |
639 | 3 | Christoph Kappel | h2. How do I run a program on startup? |
640 | 3 | Christoph Kappel | |
641 | 2 | Christoph Kappel | Let's say you want urxvt to start after subtle, and for some reason @echo "urxvt" >> ~/.xinitrc@ is just not cutting it. Using the :start hook and Subtlext we can simulate autostart like so: |
642 | 1 | Christoph Kappel | |
643 | 2 | Christoph Kappel | <pre> |
644 | 1 | Christoph Kappel | on :start do |
645 | 2 | Christoph Kappel | Subtlext::Subtle.spawn "urxvt" |
646 | 2 | Christoph Kappel | end |
647 | 2 | Christoph Kappel | </pre> |
648 | 2 | Christoph Kappel | |
649 | 3 | Christoph Kappel | h2. How can I use subtle without numpad? |
650 | 3 | Christoph Kappel | |
651 | 1 | Christoph Kappel | Per default [[subtle]] uses the numpad, because it's easier to remind the different postions when you can see them. Generally this is just a suggestion, it's up to you to change the grabs to your needs - any keys will work. |
652 | 2 | Christoph Kappel | |
653 | 2 | Christoph Kappel | Keys that also have proven to work well are *q-w-e*, *a-s-d* and *y-x-c*: |
654 | 2 | Christoph Kappel | |
655 | 2 | Christoph Kappel | <pre><code class="ruby">grab "W-q", [ :top_left, :top_left66, :top_left33 ] |
656 | 2 | Christoph Kappel | grab "W-w", [ :top, :top66, :top33 ] |
657 | 2 | Christoph Kappel | grab "W-e", [ :top_right, :top_right66, :top_right33 ] |
658 | 2 | Christoph Kappel | grab "W-a", [ :left, :left66, :left33 ] |
659 | 2 | Christoph Kappel | grab "W-s", [ :center, :center66, :center33 ] |
660 | 2 | Christoph Kappel | grab "W-d", [ :right, :right66, :right33 ] |
661 | 2 | Christoph Kappel | |
662 | 2 | Christoph Kappel | # QWERTZ |
663 | 2 | Christoph Kappel | grab "W-y", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
664 | 2 | Christoph Kappel | |
665 | 2 | Christoph Kappel | # QWERTY |
666 | 2 | Christoph Kappel | grab "W-z", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
667 | 2 | Christoph Kappel | |
668 | 1 | Christoph Kappel | grab "W-x", [ :bottom, :bottom66, :bottom33 ] |
669 | 2 | Christoph Kappel | grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] |
670 | 2 | Christoph Kappel | </code></pre> |
671 | 2 | Christoph Kappel | |
672 | 2 | Christoph Kappel | |
673 | 2 | Christoph Kappel | You can find more about assigning keys [[Grabs|here]]. |
674 | 2 | Christoph Kappel | |
675 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
676 | 3 | Christoph Kappel | |
677 | 2 | Christoph Kappel | Generally [[subtle]] can apply [[Tagging|tags]] based on the {{color(#0000ff, WM_NAME)}} and both {{color(#ff0000, WM_CLASS)}} components. Console based programs like "irssi":http://irssi.org can be started like this and will change the {{color(#0000ff, WM_NAME)}} of the terminal: |
678 | 2 | Christoph Kappel | |
679 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -e irssi</code></pre> |
680 | 2 | Christoph Kappel | |
681 | 2 | Christoph Kappel | Inspecting the terminal with "xprop":http://www.xfree86.org/current/xprop.1.html: |
682 | 2 | Christoph Kappel | |
683 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
684 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "urxvt")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
685 | 2 | Christoph Kappel | |
686 | 2 | Christoph Kappel | So if we want to tag this window there are some things that should be considered: |
687 | 1 | Christoph Kappel | |
688 | 1 | Christoph Kappel | * "irssi":http://irssi.org updates the {{color(#0000ff, WM_NAME)}} only |
689 | 2 | Christoph Kappel | * [[Tagging]] matches per default both {{color(#ff0000, WM_CLASS)}} components ({{color(#aa0000, instance)}} and {{color(#ff00ff, class)}} name) |
690 | 2 | Christoph Kappel | * [[Tagging|Tags]] are applied when a window is mapped - that is *before* the terminal launches "irssi":http://irssi.org |
691 | 2 | Christoph Kappel | |
692 | 2 | Christoph Kappel | To safely [[Tagging|tag]] it's better to change the {{color(#aa0000, instance)}} name of the terminal like this: |
693 | 2 | Christoph Kappel | |
694 | 2 | Christoph Kappel | <pre><code class="bash">urxvt -name irssi -e irssi</code></pre> |
695 | 2 | Christoph Kappel | |
696 | 2 | Christoph Kappel | This results in following (via "xprop":http://www.xfree86.org/current/xprop.1.html): |
697 | 2 | Christoph Kappel | |
698 | 1 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "irssi" |
699 | 1 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
700 | 2 | Christoph Kappel | |
701 | 1 | Christoph Kappel | A [[Tagging|tag]] for this could be: |
702 | 1 | Christoph Kappel | |
703 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
704 | 1 | Christoph Kappel | match :instance => "irssi" |
705 | 1 | Christoph Kappel | end</code></pre> |
706 | 2 | Christoph Kappel | |
707 | 2 | Christoph Kappel | Please keep in mind, that the {{color(#ff0000, WM_CLASS)}} {{color(#ff00ff, class)}} name is still *URxvt* and will match other [[Tagging|tags]] too. To avoid that there is the *exclude* match, it works similar to the normal match but excludes certain windows: |
708 | 2 | Christoph Kappel | |
709 | 1 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
710 | 2 | Christoph Kappel | exclude :instance => "irssi" |
711 | 1 | Christoph Kappel | end</code></pre> |
712 | 2 | Christoph Kappel | |
713 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
714 | 3 | Christoph Kappel | |
715 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those: |
716 | 2 | Christoph Kappel | |
717 | 2 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
718 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
719 | 2 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
720 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
721 | 1 | Christoph Kappel | match "name" |
722 | 1 | Christoph Kappel | resize true |
723 | 1 | Christoph Kappel | end |
724 | 4 | Christoph Kappel | </code></pre> |
725 | 1 | Christoph Kappel | |
726 | 3 | Christoph Kappel | h2. How can I delete a sublet manually? |
727 | 3 | Christoph Kappel | |
728 | 1 | Christoph Kappel | [[Sublets]] usually consist of a **.rb* file, a **.spec* file and one or more icons. All these files can be found in their respective folder in @$XDG_DATA_HOME/subtle@ resp. @~/.local/share/subtle@. After deleting the [[sublets|sublet]] files the cache of [[sur]] needs to be updated or otherwise [[sur]] will think the [[sublets|sublet]] is still installed: @sur update -l@ |
729 | 1 | Christoph Kappel | |
730 | 3 | Christoph Kappel | h2. How can I manually delete a sublet? |
731 | 3 | Christoph Kappel | |
732 | 1 | Christoph Kappel | [[Sublets]] usually consist of a **.rb* file, a **.spec* file and one or more icons. All these files can be found in their respective folder in @$XDG_DATA_HOME/subtle@ resp. @~/.local/share/subtle@. After deleting the [[sublets|sublet]] files the cache of [[sur]] needs to be updated or otherwise [[sur]] will think the [[sublets|sublet]] is still installed: @sur update -l@ |
733 | 2 | Christoph Kappel | |
734 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
735 | 3 | Christoph Kappel | |
736 | 2 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
737 | 2 | Christoph Kappel | |
738 | 2 | Christoph Kappel | Following names are currently in use: |
739 | 2 | Christoph Kappel | |
740 | 2 | Christoph Kappel | |_. Browser |_. WM_NAME |_. WM_CLASS | |
741 | 2 | Christoph Kappel | | Firefox | <unknown> | "<unknown>", "<unknown>" | |
742 | 2 | Christoph Kappel | | Chromium | exe | "exe", "Exe" | |
743 | 2 | Christoph Kappel | | Opera | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
744 | 2 | Christoph Kappel | |
745 | 1 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
746 | 2 | Christoph Kappel | |
747 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
748 | 2 | Christoph Kappel | match "<unkown>|exe|operapluginwrapper" |
749 | 2 | Christoph Kappel | stick true |
750 | 2 | Christoph Kappel | end</code></pre> |
751 | 2 | Christoph Kappel | |
752 | 3 | Christoph Kappel | h2. How do I run a program on startup/autostart? |
753 | 3 | Christoph Kappel | |
754 | 1 | Christoph Kappel | Let's say you want "urxvt":http://software.schmorp.de/pkg/rxvt-unicode.html to start after [[subtle]], and for some reason @echo "urxvt" >> ~/.xinitrc@ is just not cutting it. Using the *:start* hook and [[subtlext]] we can simulate autostart like so: |
755 | 1 | Christoph Kappel | |
756 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
757 | 2 | Christoph Kappel | on :start do |
758 | 2 | Christoph Kappel | Subtlext::Subtle.spawn "urxvt" |
759 | 2 | Christoph Kappel | end |
760 | 2 | Christoph Kappel | </pre></code> |
761 | 2 | Christoph Kappel | |
762 | 3 | Christoph Kappel | h2. How do I start program xyz? |
763 | 3 | Christoph Kappel | |
764 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
765 | 2 | Christoph Kappel | |
766 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
767 | 2 | Christoph Kappel | |
768 | 2 | Christoph Kappel | <pre><code class="ruby"> |
769 | 2 | Christoph Kappel | subtle & |
770 | 2 | Christoph Kappel | PID=$! |
771 | 2 | Christoph Kappel | sleep 2 |
772 | 2 | Christoph Kappel | urxvt |
773 | 1 | Christoph Kappel | wait $PID |
774 | 2 | Christoph Kappel | </code></pre> |
775 | 1 | Christoph Kappel | |
776 | 1 | Christoph Kappel | * Start your program via [[grabs]]: |
777 | 1 | Christoph Kappel | |
778 | 2 | Christoph Kappel | <pre><code class="ruby"> |
779 | 2 | Christoph Kappel | "A-x" => "urxvt" |
780 | 2 | Christoph Kappel | </code></pre> |
781 | 2 | Christoph Kappel | |
782 | 2 | Christoph Kappel | Additionally there are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki#Launcher. |
783 | 2 | Christoph Kappel | |
784 | 2 | Christoph Kappel | |
785 | 3 | Christoph Kappel | h2. How do I start program XYZ? |
786 | 3 | Christoph Kappel | |
787 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
788 | 1 | Christoph Kappel | |
789 | 1 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
790 | 2 | Christoph Kappel | |
791 | 2 | Christoph Kappel | <pre><code class="ruby"> |
792 | 2 | Christoph Kappel | subtle & |
793 | 2 | Christoph Kappel | PID=$! |
794 | 2 | Christoph Kappel | sleep 2 |
795 | 2 | Christoph Kappel | urxvt |
796 | 1 | Christoph Kappel | wait $PID |
797 | 2 | Christoph Kappel | </code></pre> |
798 | 1 | Christoph Kappel | |
799 | 2 | Christoph Kappel | * Start your program via [[grabs]]: |
800 | 2 | Christoph Kappel | |
801 | 1 | Christoph Kappel | <pre><code class="ruby"> |
802 | 1 | Christoph Kappel | "A-x" => "urxvt" |
803 | 2 | Christoph Kappel | </code></pre> |
804 | 2 | Christoph Kappel | |
805 | 2 | Christoph Kappel | Additionally there are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki#Launcher. |
806 | 2 | Christoph Kappel | |
807 | 2 | Christoph Kappel | |
808 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
809 | 3 | Christoph Kappel | |
810 | 1 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
811 | 2 | Christoph Kappel | |
812 | 2 | Christoph Kappel | There are two possible ways: |
813 | 2 | Christoph Kappel | |
814 | 2 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
815 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
816 | 2 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
817 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
818 | 2 | Christoph Kappel | match "name" |
819 | 2 | Christoph Kappel | resize true |
820 | 1 | Christoph Kappel | end |
821 | 1 | Christoph Kappel | |
822 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
823 | 3 | Christoph Kappel | |
824 | 1 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
825 | 2 | Christoph Kappel | |
826 | 2 | Christoph Kappel | There are two possible ways: |
827 | 2 | Christoph Kappel | |
828 | 1 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
829 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
830 | 2 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
831 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
832 | 2 | Christoph Kappel | match "name" |
833 | 2 | Christoph Kappel | resize true |
834 | 2 | Christoph Kappel | end |
835 | 2 | Christoph Kappel | |
836 | 3 | Christoph Kappel | h2. How do I run a java program? |
837 | 3 | Christoph Kappel | |
838 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
839 | 2 | Christoph Kappel | |
840 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
841 | 1 | Christoph Kappel | |
842 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
843 | 1 | Christoph Kappel | |
844 | 2 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to MToolkit, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
845 | 2 | Christoph Kappel | |
846 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
847 | 1 | Christoph Kappel | |
848 | 2 | Christoph Kappel | In case both doesn't work there is a third option: The JDK internally uses a hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made the tool "wmname":http://tools.suckless.org/wmname to change the name of the wm and just lie to Java. |
849 | 1 | Christoph Kappel | |
850 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
851 | 2 | Christoph Kappel | |
852 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
853 | 1 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
854 | 1 | Christoph Kappel | |
855 | 2 | Christoph Kappel | |
856 | 1 | Christoph Kappel | |
857 | 3 | Christoph Kappel | h2. How do I set a wallpaper in subtle? |
858 | 3 | Christoph Kappel | |
859 | 2 | Christoph Kappel | On start, [[subtle]] sets a background color (_if set_) to the root window and therefore *overwrites* any root pixmap set before. To avoid this, you just need to comment out the *:background* line from your config. |
860 | 2 | Christoph Kappel | |
861 | 2 | Christoph Kappel | [[subtle]] itself has no and will never have either an autostart or way to set a wallpaper directly. Normally you just want to setup your X session and and not [[subtle]]. Your _~/.xinitrc_ is the right place for stuff like this. |
862 | 2 | Christoph Kappel | |
863 | 2 | Christoph Kappel | A background can easily set with a tool like "feh":http://linuxbrit.co.uk/software/feh/. |
864 | 2 | Christoph Kappel | |
865 | 3 | Christoph Kappel | h2. How can I use subtle without numpad? |
866 | 3 | Christoph Kappel | |
867 | 2 | Christoph Kappel | Per default [[subtle]] uses the numpad, because it's easier to remind the different postions when you can see them. Generally this is just a suggestion, it's up to you to change the grabs to your needs - any keys will work. |
868 | 1 | Christoph Kappel | |
869 | 2 | Christoph Kappel | Keys that also have proven to work well are *q-w-e*, *a-s-d* and *y-x-c*: |
870 | 2 | Christoph Kappel | |
871 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">grab "W-q", [ :top_left, :top_left66, :top_left33 ] |
872 | 2 | Christoph Kappel | grab "W-w", [ :top, :top66, :top33 ] |
873 | 2 | Christoph Kappel | grab "W-e", [ :top_right, :top_right66, :top_right33 ] |
874 | 2 | Christoph Kappel | grab "W-a", [ :left, :left66, :left33 ] |
875 | 2 | Christoph Kappel | grab "W-s", [ :center, :center66, :center33 ] |
876 | 2 | Christoph Kappel | grab "W-d", [ :right, :right66, :right33 ] |
877 | 1 | Christoph Kappel | |
878 | 1 | Christoph Kappel | # QWERTZ |
879 | 1 | Christoph Kappel | grab "W-y", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
880 | 2 | Christoph Kappel | |
881 | 1 | Christoph Kappel | # QWERTY |
882 | 2 | Christoph Kappel | grab "W-z", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
883 | 1 | Christoph Kappel | |
884 | 2 | Christoph Kappel | grab "W-x", [ :bottom, :bottom66, :bottom33 ] |
885 | 2 | Christoph Kappel | grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] |
886 | 2 | Christoph Kappel | </code></pre> |
887 | 2 | Christoph Kappel | |
888 | 2 | Christoph Kappel | |
889 | 2 | Christoph Kappel | You can find more about assigning keys [[Grabs|here]]. |
890 | 2 | Christoph Kappel | |
891 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
892 | 3 | Christoph Kappel | |
893 | 1 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[tagging]]. There are many ways to change tags per runtime, common is to use either [[subtler]] or [[subtlext]]. |
894 | 2 | Christoph Kappel | |
895 | 3 | Christoph Kappel | h2. subtler |
896 | 2 | Christoph Kappel | |
897 | 3 | Christoph Kappel | |
898 | 1 | Christoph Kappel | [[subtler]] can be used on the commandline: |
899 | 2 | Christoph Kappel | |
900 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
901 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
902 | 1 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
903 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
904 | 2 | Christoph Kappel | </code></pre> |
905 | 2 | Christoph Kappel | |
906 | 3 | Christoph Kappel | h2. subtlext |
907 | 2 | Christoph Kappel | |
908 | 3 | Christoph Kappel | |
909 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
910 | 1 | Christoph Kappel | |
911 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
912 | 1 | Christoph Kappel | |
913 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
914 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
915 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
916 | 2 | Christoph Kappel | </code></pre> |
917 | 2 | Christoph Kappel | |
918 | 3 | Christoph Kappel | h2. Snippets |
919 | 2 | Christoph Kappel | |
920 | 3 | Christoph Kappel | |
921 | 1 | Christoph Kappel | The [[snippets]] wiki page includes examples how to "move":http://subforge.org/wiki/subtle/Snippets#Move-windows windows to another view. |
922 | 2 | Christoph Kappel | |
923 | 3 | Christoph Kappel | h2. Contrib |
924 | 2 | Christoph Kappel | |
925 | 3 | Christoph Kappel | |
926 | 2 | Christoph Kappel | h3. Vitag |
927 | 1 | Christoph Kappel | |
928 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains "vitag":http://subforge.org/projects/subtle-contrib/wiki#Vitag, a script to change the [[tagging|tags]] of windows and views with an editor. |
929 | 2 | Christoph Kappel | |
930 | 2 | Christoph Kappel | h3. Launcher |
931 | 2 | Christoph Kappel | |
932 | 1 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
933 | 2 | Christoph Kappel | |
934 | 3 | Christoph Kappel | h2. Stick |
935 | 1 | Christoph Kappel | |
936 | 3 | Christoph Kappel | |
937 | 1 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: W-s) or with [[subtler]]. (click on the window: subtler -cXS) |
938 | 2 | Christoph Kappel | |
939 | 2 | Christoph Kappel | |
940 | 2 | Christoph Kappel | |
941 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
942 | 3 | Christoph Kappel | |
943 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via the [[tagging]]. There are many ways to change tags per runtime, common is to use either [[subtler]] or [[subtlext]]. |
944 | 1 | Christoph Kappel | |
945 | 3 | Christoph Kappel | h2. subtler |
946 | 1 | Christoph Kappel | |
947 | 3 | Christoph Kappel | |
948 | 2 | Christoph Kappel | [[subtler]] can be used on the commandline: |
949 | 2 | Christoph Kappel | |
950 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
951 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
952 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
953 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
954 | 1 | Christoph Kappel | </code></pre> |
955 | 2 | Christoph Kappel | |
956 | 3 | Christoph Kappel | h2. subtlext |
957 | 2 | Christoph Kappel | |
958 | 3 | Christoph Kappel | |
959 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
960 | 2 | Christoph Kappel | |
961 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
962 | 2 | Christoph Kappel | |
963 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
964 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
965 | 1 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
966 | 2 | Christoph Kappel | </code></pre> |
967 | 1 | Christoph Kappel | |
968 | 3 | Christoph Kappel | h2. Snippets |
969 | 1 | Christoph Kappel | |
970 | 3 | Christoph Kappel | |
971 | 1 | Christoph Kappel | The [[snippets]] wiki page includes examples how to "move":http://subforge.org/wiki/subtle/Snippets#Move-windows windows to another view. |
972 | 2 | Christoph Kappel | |
973 | 3 | Christoph Kappel | h2. Contrib |
974 | 2 | Christoph Kappel | |
975 | 3 | Christoph Kappel | |
976 | 2 | Christoph Kappel | h3. Vitag |
977 | 2 | Christoph Kappel | |
978 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains "vitag":http://subforge.org/projects/subtle-contrib/wiki#Vitag, a script to change the [[tagging|tags]] of windows and views with an editor. |
979 | 1 | Christoph Kappel | |
980 | 2 | Christoph Kappel | h3. Launcher |
981 | 1 | Christoph Kappel | |
982 | 2 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
983 | 2 | Christoph Kappel | |
984 | 3 | Christoph Kappel | h2. Stick |
985 | 1 | Christoph Kappel | |
986 | 3 | Christoph Kappel | |
987 | 2 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: *W-s*) or with [[subtler]]. (click on the window: @subtler -cXS@) |
988 | 2 | Christoph Kappel | |
989 | 2 | Christoph Kappel | |
990 | 1 | Christoph Kappel | |
991 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
992 | 3 | Christoph Kappel | |
993 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via [[tagging]]. There are many ways to change [[tagging|tags]] per runtime, common is to use either [[subtler]] or [[subtlext]]. |
994 | 2 | Christoph Kappel | |
995 | 3 | Christoph Kappel | h2. subtler |
996 | 2 | Christoph Kappel | |
997 | 3 | Christoph Kappel | |
998 | 2 | Christoph Kappel | [[subtler]] can be used on the commandline: |
999 | 2 | Christoph Kappel | |
1000 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
1001 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
1002 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
1003 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
1004 | 2 | Christoph Kappel | </code></pre> |
1005 | 2 | Christoph Kappel | |
1006 | 3 | Christoph Kappel | h2. subtlext |
1007 | 1 | Christoph Kappel | |
1008 | 3 | Christoph Kappel | |
1009 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
1010 | 2 | Christoph Kappel | |
1011 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
1012 | 2 | Christoph Kappel | |
1013 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
1014 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
1015 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
1016 | 2 | Christoph Kappel | </code></pre> |
1017 | 2 | Christoph Kappel | |
1018 | 3 | Christoph Kappel | h2. Snippets |
1019 | 2 | Christoph Kappel | |
1020 | 3 | Christoph Kappel | |
1021 | 2 | Christoph Kappel | The [[snippets]] wiki page includes examples how to "move":http://subforge.org/wiki/subtle/Snippets#Move-windows windows to another view. |
1022 | 1 | Christoph Kappel | |
1023 | 3 | Christoph Kappel | h2. Contrib |
1024 | 2 | Christoph Kappel | |
1025 | 3 | Christoph Kappel | |
1026 | 2 | Christoph Kappel | h3. Vitag |
1027 | 2 | Christoph Kappel | |
1028 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains "vitag":http://subforge.org/projects/subtle-contrib/wiki#Vitag, a script to change the [[tagging|tags]] of windows and views with an editor. |
1029 | 2 | Christoph Kappel | |
1030 | 2 | Christoph Kappel | h3. Launcher |
1031 | 2 | Christoph Kappel | |
1032 | 2 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
1033 | 2 | Christoph Kappel | |
1034 | 3 | Christoph Kappel | h2. Stick |
1035 | 1 | Christoph Kappel | |
1036 | 3 | Christoph Kappel | |
1037 | 1 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: *W-s*) or with [[subtler]]. (click on the window: @subtler -cXS@) |
1038 | 2 | Christoph Kappel | |
1039 | 2 | Christoph Kappel | |
1040 | 2 | Christoph Kappel | |
1041 | 3 | Christoph Kappel | h2. How do I run a java program? |
1042 | 3 | Christoph Kappel | |
1043 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
1044 | 1 | Christoph Kappel | |
1045 | 1 | Christoph Kappel | If this happens just try to start your program like this: |
1046 | 2 | Christoph Kappel | |
1047 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
1048 | 2 | Christoph Kappel | |
1049 | 2 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to _MToolkit_, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
1050 | 2 | Christoph Kappel | |
1051 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
1052 | 2 | Christoph Kappel | |
1053 | 2 | Christoph Kappel | In case both doesn't work there is a third option: The JDK internally uses a hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made the tool "wmname":http://tools.suckless.org/wmname to change the name of the wm and just lie to Java. |
1054 | 2 | Christoph Kappel | |
1055 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
1056 | 1 | Christoph Kappel | |
1057 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
1058 | 1 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
1059 | 1 | Christoph Kappel | |
1060 | 1 | Christoph Kappel | bq. Note: Many problems only affect the "JRE":http://www.oracle.com/technetwork/java/javase/downloads/index.html and can be avoided by using the "OpenJDK":http://openjdk.java.net. |
1061 | 2 | Christoph Kappel | |
1062 | 2 | Christoph Kappel | |
1063 | 2 | Christoph Kappel | |
1064 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
1065 | 3 | Christoph Kappel | |
1066 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
1067 | 2 | Christoph Kappel | |
1068 | 2 | Christoph Kappel | There are two possible ways: |
1069 | 2 | Christoph Kappel | |
1070 | 2 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
1071 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
1072 | 1 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
1073 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
1074 | 1 | Christoph Kappel | match "name" |
1075 | 1 | Christoph Kappel | resize true |
1076 | 2 | Christoph Kappel | end |
1077 | 1 | Christoph Kappel | |
1078 | 1 | Christoph Kappel | .bq Note: This can happen with "java":http://java.com too, see "here":http://subforge.org/ezfaq/show/subtle?faq_id=14 for more information. |
1079 | 2 | Christoph Kappel | |
1080 | 3 | Christoph Kappel | h2. How do I run a Java program? |
1081 | 3 | Christoph Kappel | |
1082 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
1083 | 2 | Christoph Kappel | |
1084 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
1085 | 2 | Christoph Kappel | |
1086 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
1087 | 2 | Christoph Kappel | |
1088 | 2 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to _MToolkit_, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
1089 | 2 | Christoph Kappel | |
1090 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
1091 | 2 | Christoph Kappel | |
1092 | 2 | Christoph Kappel | In case both doesn't work there is a third option: The JDK internally uses a hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made the tool "wmname":http://tools.suckless.org/wmname to change the name of the wm and just lie to Java. |
1093 | 2 | Christoph Kappel | |
1094 | 1 | Christoph Kappel | Generally this problem is really long lasting, see here: |
1095 | 2 | Christoph Kappel | |
1096 | 1 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
1097 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
1098 | 2 | Christoph Kappel | |
1099 | 1 | Christoph Kappel | bq. Note: Many problems only affect the "JRE":http://www.oracle.com/technetwork/java/javase/downloads/index.html and can be avoided by using the "OpenJDK":http://openjdk.java.net. |
1100 | 1 | Christoph Kappel | |
1101 | 2 | Christoph Kappel | |
1102 | 2 | Christoph Kappel | |
1103 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
1104 | 3 | Christoph Kappel | |
1105 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
1106 | 2 | Christoph Kappel | |
1107 | 2 | Christoph Kappel | There are two possible ways: |
1108 | 2 | Christoph Kappel | |
1109 | 2 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
1110 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
1111 | 2 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
1112 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
1113 | 2 | Christoph Kappel | match "name" |
1114 | 2 | Christoph Kappel | resize true |
1115 | 2 | Christoph Kappel | end</code></pre> |
1116 | 2 | Christoph Kappel | |
1117 | 2 | Christoph Kappel | bq. Note: This can happen with "java":http://java.com too, see "here":http://subforge.org/ezfaq/show/subtle?faq_id=14 for more information. |
1118 | 2 | Christoph Kappel | |
1119 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
1120 | 3 | Christoph Kappel | |
1121 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
1122 | 2 | Christoph Kappel | |
1123 | 1 | Christoph Kappel | There are two possible ways: |
1124 | 1 | Christoph Kappel | |
1125 | 1 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
1126 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
1127 | 1 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
1128 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" |
1129 | 1 | Christoph Kappel | match "name" |
1130 | 2 | Christoph Kappel | resize true |
1131 | 2 | Christoph Kappel | end</code></pre> |
1132 | 2 | Christoph Kappel | |
1133 | 2 | Christoph Kappel | bq. Note: This can happen with "Java":http://java.com too, see "here":http://subforge.org/ezfaq/show/subtle?faq_id=14 for more information. |
1134 | 2 | Christoph Kappel | |
1135 | 3 | Christoph Kappel | h2. Is there any log file? |
1136 | 3 | Christoph Kappel | |
1137 | 2 | Christoph Kappel | Nope, there is *no* log file. In case you need one for e.g. reporting a bug +please+ read to the [[bugs|reporting a bug]] wiki page and check the paragraph about [[bugs#enable-logging|logging]]. |
1138 | 2 | Christoph Kappel | |
1139 | 3 | Christoph Kappel | h2. How do I run a Java program? |
1140 | 3 | Christoph Kappel | |
1141 | 1 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
1142 | 2 | Christoph Kappel | |
1143 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
1144 | 2 | Christoph Kappel | |
1145 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
1146 | 2 | Christoph Kappel | |
1147 | 1 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to _MToolkit_, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
1148 | 1 | Christoph Kappel | |
1149 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
1150 | 2 | Christoph Kappel | |
1151 | 2 | Christoph Kappel | In case both doesn't work there is a third option: "Java":http://java.com seems to use an internally hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made a tool ("wmname":http://tools.suckless.org/wmname) to change the name of the wm. Since r2520 [[subtle]] can do that for you, just enable the *:wmname* option. |
1152 | 2 | Christoph Kappel | |
1153 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
1154 | 2 | Christoph Kappel | |
1155 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
1156 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
1157 | 2 | Christoph Kappel | |
1158 | 1 | Christoph Kappel | bq. Note: Many problems only affect the "JRE":http://www.oracle.com/technetwork/java/javase/downloads/index.html and can be avoided by using the "OpenJDK":http://openjdk.java.net. |
1159 | 1 | Christoph Kappel | |
1160 | 2 | Christoph Kappel | |
1161 | 2 | Christoph Kappel | |
1162 | 3 | Christoph Kappel | h2. How do I run a Java program? |
1163 | 3 | Christoph Kappel | |
1164 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
1165 | 2 | Christoph Kappel | |
1166 | 2 | Christoph Kappel | If this happens just try to start your program like this: |
1167 | 2 | Christoph Kappel | |
1168 | 2 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
1169 | 1 | Christoph Kappel | |
1170 | 2 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to _MToolkit_, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
1171 | 1 | Christoph Kappel | |
1172 | 2 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
1173 | 2 | Christoph Kappel | |
1174 | 2 | Christoph Kappel | In case both doesn't work there is a third option: "Java":http://java.com seems to use an internally hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made a tool ("wmname":http://tools.suckless.org/wmname) to change the name of the wm. |
1175 | 2 | Christoph Kappel | |
1176 | 1 | Christoph Kappel | Since r2520 [[subtle]] can do that for you, just enable the *:wmname* option. |
1177 | 1 | Christoph Kappel | |
1178 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
1179 | 2 | Christoph Kappel | |
1180 | 2 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
1181 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
1182 | 2 | Christoph Kappel | |
1183 | 2 | Christoph Kappel | bq. Note: Many problems only affect the "JRE":http://www.oracle.com/technetwork/java/javase/downloads/index.html and can be avoided by using the "OpenJDK":http://openjdk.java.net. |
1184 | 2 | Christoph Kappel | |
1185 | 1 | Christoph Kappel | |
1186 | 2 | Christoph Kappel | |
1187 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
1188 | 3 | Christoph Kappel | |
1189 | 1 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
1190 | 1 | Christoph Kappel | |
1191 | 2 | Christoph Kappel | Following names are currently in use: |
1192 | 1 | Christoph Kappel | |
1193 | 2 | Christoph Kappel | |_. Browser |_. WM_NAME |_. WM_CLASS | |
1194 | 1 | Christoph Kappel | | Firefox | <unknown> | "<unknown>", "<unknown>" | |
1195 | 2 | Christoph Kappel | | Chromium | exe | "exe", "Exe" | |
1196 | 2 | Christoph Kappel | | Opera | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
1197 | 2 | Christoph Kappel | |
1198 | 2 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
1199 | 2 | Christoph Kappel | |
1200 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
1201 | 2 | Christoph Kappel | match "<unknown>|exe|operapluginwrapper" |
1202 | 1 | Christoph Kappel | stick true |
1203 | 2 | Christoph Kappel | end</code></pre> |
1204 | 1 | Christoph Kappel | |
1205 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
1206 | 3 | Christoph Kappel | |
1207 | 2 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
1208 | 1 | Christoph Kappel | |
1209 | 2 | Christoph Kappel | Following names are currently in use: |
1210 | 1 | Christoph Kappel | |
1211 | 2 | Christoph Kappel | |_. Browser |_. Arch |_. WM_NAME |_. WM_CLASS | |
1212 | 2 | Christoph Kappel | | Firefox | x86 | <unknown> | "<unknown>", "<unknown>" | |
1213 | 1 | Christoph Kappel | | Chromium | x86 | exe | "exe", "Exe" | |
1214 | 2 | Christoph Kappel | | Opera | x86 | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
1215 | 1 | Christoph Kappel | | nspluginwrapper | x86_64 | "npviewer.bin" | "Npviewer.bin" | |
1216 | 2 | Christoph Kappel | |
1217 | 1 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
1218 | 2 | Christoph Kappel | |
1219 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
1220 | 2 | Christoph Kappel | match "<unknown>|exe|operapluginwrapper" |
1221 | 2 | Christoph Kappel | stick true |
1222 | 2 | Christoph Kappel | end</code></pre> |
1223 | 2 | Christoph Kappel | |
1224 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
1225 | 3 | Christoph Kappel | |
1226 | 2 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
1227 | 1 | Christoph Kappel | |
1228 | 2 | Christoph Kappel | Following names are currently in use: |
1229 | 1 | Christoph Kappel | |
1230 | 2 | Christoph Kappel | |_. Browser |_. Arch |_. WM_NAME |_. WM_CLASS | |
1231 | 1 | Christoph Kappel | | Firefox | x86 | <unknown> | "<unknown>", "<unknown>" | |
1232 | 2 | Christoph Kappel | | Chromium | x86 | exe | "exe", "Exe" | |
1233 | 1 | Christoph Kappel | | Opera | x86 | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
1234 | 1 | Christoph Kappel | | nspluginwrapper | x86_64 | "npviewer.bin" | "Npviewer.bin" | |
1235 | 2 | Christoph Kappel | |
1236 | 2 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
1237 | 2 | Christoph Kappel | |
1238 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
1239 | 2 | Christoph Kappel | match "<unknown>|exe|operapluginwrapper|npviewer.bin" |
1240 | 2 | Christoph Kappel | stick true |
1241 | 2 | Christoph Kappel | end</code></pre> |
1242 | 1 | Christoph Kappel | |
1243 | 3 | Christoph Kappel | h2. What is required for the volume sublet? |
1244 | 3 | Christoph Kappel | |
1245 | 2 | Christoph Kappel | The volume [[sublets|sublet]] uses @/dev/mixer@ to set/get the volume levels, which is an older interface introduced with "OSS":http://www.opensound.com/ and still available via "ALSA OSS emulation":http://www.alsa-project.org/. Apparently, newer kernels refuse to autoload that module anymore and you need to load it manually or via any init file. |
1246 | 2 | Christoph Kappel | |
1247 | 1 | Christoph Kappel | {{info(Please check to the docs of your distribution how to do it.)}} |
1248 | 2 | Christoph Kappel | |
1249 | 1 | Christoph Kappel | <pre><code>modprobe snd_mixer_oss</code></pre> |
1250 | 2 | Christoph Kappel | |
1251 | 2 | Christoph Kappel | {{warn(Following explanation is technical!)}} |
1252 | 2 | Christoph Kappel | |
1253 | 2 | Christoph Kappel | The [[sublets|sublet]] needs a way to access a mixer without any asynchronous callbacks. The reason for that is that [[subtle]] is single-threaded and can't use a dedicated thread to wait for the reply, but the APIs of "ALSA":http://www.alsa-project.org/ and "PulseAudio":http://pulseaudio.org are both designed to be asynchronous. Normally event drivven is fine but it is troublesome when you can't use their mainloop. |
1254 | 2 | Christoph Kappel | |
1255 | 2 | Christoph Kappel | Since there is no way to add e.g. a control socket to the event main loop of [[subtle]], the @/dev/mixer@ approach is the only way and works for all sound systems. |
1256 | 2 | Christoph Kappel | |
1257 | 3 | Christoph Kappel | h2. How do I move program xyz to view abc? |
1258 | 3 | Christoph Kappel | |
1259 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via [[tagging]]. There are many ways to change [[tagging|tags]] per runtime, common is to use either [[subtler]] or [[subtlext]]. |
1260 | 2 | Christoph Kappel | |
1261 | 3 | Christoph Kappel | h2. subtler |
1262 | 2 | Christoph Kappel | |
1263 | 3 | Christoph Kappel | |
1264 | 2 | Christoph Kappel | [[subtler]] can be used on the commandline: |
1265 | 2 | Christoph Kappel | |
1266 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
1267 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
1268 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
1269 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
1270 | 2 | Christoph Kappel | </code></pre> |
1271 | 2 | Christoph Kappel | |
1272 | 3 | Christoph Kappel | h2. subtlext |
1273 | 2 | Christoph Kappel | |
1274 | 3 | Christoph Kappel | |
1275 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
1276 | 2 | Christoph Kappel | |
1277 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
1278 | 2 | Christoph Kappel | |
1279 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
1280 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
1281 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
1282 | 1 | Christoph Kappel | </code></pre> |
1283 | 1 | Christoph Kappel | |
1284 | 3 | Christoph Kappel | h2. Snippets |
1285 | 1 | Christoph Kappel | |
1286 | 3 | Christoph Kappel | |
1287 | 1 | Christoph Kappel | The [[snippets]] wiki page includes examples how to [[snippets#Move-windows|move to another view]]. |
1288 | 2 | Christoph Kappel | |
1289 | 3 | Christoph Kappel | h2. Contrib |
1290 | 2 | Christoph Kappel | |
1291 | 3 | Christoph Kappel | |
1292 | 2 | Christoph Kappel | h3. Vitag |
1293 | 2 | Christoph Kappel | |
1294 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains [[subtle-contrib:vitag|vitag]] a script to change the [[tagging|tags]] of windows and views with an editor. |
1295 | 2 | Christoph Kappel | |
1296 | 1 | Christoph Kappel | h3. Launcher |
1297 | 1 | Christoph Kappel | |
1298 | 2 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
1299 | 1 | Christoph Kappel | |
1300 | 3 | Christoph Kappel | h2. Stick |
1301 | 1 | Christoph Kappel | |
1302 | 3 | Christoph Kappel | |
1303 | 1 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: *W-s*) or with [[subtler]]. (click on the window: @subtler -cXS@) |
1304 | 1 | Christoph Kappel | |
1305 | 1 | Christoph Kappel | |
1306 | 2 | Christoph Kappel | |
1307 | 3 | Christoph Kappel | h2. Where does sur store sublets and icons? |
1308 | 3 | Christoph Kappel | |
1309 | 2 | Christoph Kappel | [[sur]] follows the "XDG Base Directory specifications":http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html to store data, which includes some base path for specific data types. |
1310 | 1 | Christoph Kappel | |
1311 | 1 | Christoph Kappel | Following paths are used: |
1312 | 2 | Christoph Kappel | |
1313 | 2 | Christoph Kappel | |_. Type |_. XDG path |_. Default path | |
1314 | 1 | Christoph Kappel | | Sublets | @$XDG_DATA_HOME/subtle/sublets@ | @~/.local/share/subtle/sublets@ | |
1315 | 1 | Christoph Kappel | | Icons | @$XDG_DATA_HOME/subtle(icons@ | @~/.local/share/subtle/icons@ | |
1316 | 1 | Christoph Kappel | |
1317 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
1318 | 3 | Christoph Kappel | |
1319 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
1320 | 1 | Christoph Kappel | |
1321 | 1 | Christoph Kappel | There are two possible ways: |
1322 | 2 | Christoph Kappel | |
1323 | 1 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
1324 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
1325 | 1 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
1326 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" do |
1327 | 2 | Christoph Kappel | match "name" |
1328 | 2 | Christoph Kappel | resize true |
1329 | 2 | Christoph Kappel | end</code></pre> |
1330 | 2 | Christoph Kappel | |
1331 | 2 | Christoph Kappel | bq. Note: This can happen with "Java":http://java.com too, see "here":http://subforge.org/ezfaq/show/subtle?faq_id=14 for more information. |
1332 | 2 | Christoph Kappel | |
1333 | 3 | Christoph Kappel | h2. How can I use subtle without numpad? |
1334 | 3 | Christoph Kappel | |
1335 | 1 | Christoph Kappel | Per default [[subtle]] uses the numpad, because it's easier to remind the different postions when you can see them. Generally this is just a suggestion, it's up to you to change the grabs to your needs - any keys will work. |
1336 | 2 | Christoph Kappel | |
1337 | 1 | Christoph Kappel | Keys that also have proven to work well are *q-w-e*, *a-s-d* and *y-x-c*: |
1338 | 2 | Christoph Kappel | |
1339 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">grab "W-q", [ :top_left, :top_left66, :top_left33 ] |
1340 | 2 | Christoph Kappel | grab "W-w", [ :top, :top66, :top33 ] |
1341 | 2 | Christoph Kappel | grab "W-e", [ :top_right, :top_right66, :top_right33 ] |
1342 | 2 | Christoph Kappel | grab "W-a", [ :left, :left66, :left33 ] |
1343 | 2 | Christoph Kappel | grab "W-s", [ :center, :center66, :center33 ] |
1344 | 1 | Christoph Kappel | grab "W-d", [ :right, :right66, :right33 ] |
1345 | 2 | Christoph Kappel | |
1346 | 1 | Christoph Kappel | # QWERTZ |
1347 | 2 | Christoph Kappel | grab "W-y", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
1348 | 1 | Christoph Kappel | |
1349 | 2 | Christoph Kappel | # QWERTY |
1350 | 1 | Christoph Kappel | grab "W-z", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
1351 | 2 | Christoph Kappel | |
1352 | 2 | Christoph Kappel | grab "W-x", [ :bottom, :bottom66, :bottom33 ] |
1353 | 2 | Christoph Kappel | grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] |
1354 | 2 | Christoph Kappel | </code></pre> |
1355 | 2 | Christoph Kappel | |
1356 | 2 | Christoph Kappel | |
1357 | 2 | Christoph Kappel | You can find more about assigning keys [[Grabs|here]]. |
1358 | 1 | Christoph Kappel | |
1359 | 3 | Christoph Kappel | h2. What is the difference between ViewSwitch and ViewJump? |
1360 | 3 | Christoph Kappel | |
1361 | 2 | Christoph Kappel | Boths keys change the [[view]] of the current active [[screens|screen]], but the behavior how they do that depends on if the system consists either of a single [[screens|screen]] or more. |
1362 | 2 | Christoph Kappel | |
1363 | 3 | Christoph Kappel | h2. Single screen |
1364 | 1 | Christoph Kappel | |
1365 | 3 | Christoph Kappel | |
1366 | 1 | Christoph Kappel | Here both [[grabs]] do +exactly+ the same. |
1367 | 2 | Christoph Kappel | |
1368 | 3 | Christoph Kappel | h2. Multi screen |
1369 | 2 | Christoph Kappel | |
1370 | 3 | Christoph Kappel | |
1371 | 2 | Christoph Kappel | Here the behavior depends of the select [[views|view]] is visible on another screen or not. |
1372 | 2 | Christoph Kappel | |
1373 | 2 | Christoph Kappel | * *ViewSwitch* either swaps the current [[views|view]] with the selected if it is visible on another [[screens|screen]] or just sets the selected [[views|view]] on current [[screens|screen]]. |
1374 | 2 | Christoph Kappel | * *ViewJump* either focus the selected [[views|view]] if it is visible on another screen or just sets the select view on current [[screens|screen]]. |
1375 | 2 | Christoph Kappel | |
1376 | 3 | Christoph Kappel | h2. What is the difference between ViewSwitch and ViewJump? |
1377 | 3 | Christoph Kappel | |
1378 | 2 | Christoph Kappel | Boths keys change the [[view]] of the current active [[screens|screen]], but the behavior how they do that depends on if the system consists either of a single [[screens|screen]] or more. |
1379 | 2 | Christoph Kappel | |
1380 | 3 | Christoph Kappel | h2. Single screen |
1381 | 2 | Christoph Kappel | |
1382 | 3 | Christoph Kappel | |
1383 | 2 | Christoph Kappel | Here both [[grabs]] do +exactly+ the same. |
1384 | 2 | Christoph Kappel | |
1385 | 3 | Christoph Kappel | h2. Multi screen |
1386 | 1 | Christoph Kappel | |
1387 | 3 | Christoph Kappel | |
1388 | 2 | Christoph Kappel | Here the behavior depends on if the selected [[views|view]] is visible on another [[screens|screen]] or not. |
1389 | 2 | Christoph Kappel | |
1390 | 2 | Christoph Kappel | * *ViewSwitch* either swaps the current [[views|view]] with the selected if it is visible on another [[screens|screen]] or just sets the selected [[views|view]] on current [[screens|screen]]. |
1391 | 2 | Christoph Kappel | * *ViewJump* either focus the selected [[views|view]] if it is visible on another [[screens|screen]] or just sets the select [[views|view]] on current [[screens|screen]]. |
1392 | 2 | Christoph Kappel | |
1393 | 3 | Christoph Kappel | h2. Why does subtle cause to many wakeups? |
1394 | 3 | Christoph Kappel | |
1395 | 1 | Christoph Kappel | The wakeups are caused by a "Ruby":http://ruby-lang.org internal polling thread that runs every 10ms to schedule/handle other threads and signals. There is currently no way to avoid that in "YARV":http://www.atdot.net/yarv/, although the problem is well known. |
1396 | 2 | Christoph Kappel | |
1397 | 2 | Christoph Kappel | http://www.ruby-forum.com/topic/200147 |
1398 | 1 | Christoph Kappel | |
1399 | 3 | Christoph Kappel | h2. How do I tag gimp? |
1400 | 3 | Christoph Kappel | |
1401 | 2 | Christoph Kappel | [[Tagging]] "GIMP":http://gimp.org can be nasty, because the current version (2.6) uses inconsistent window names and roles. The window roles are fixed in the current development snapshot and will hopefully find their way into the 2.8 release. |
1402 | 2 | Christoph Kappel | |
1403 | 1 | Christoph Kappel | https://bugzilla.gnome.org/show_bug.cgi?id=645456 |
1404 | 2 | Christoph Kappel | |
1405 | 3 | Christoph Kappel | h2. How do I move a program to another view? |
1406 | 3 | Christoph Kappel | |
1407 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via [[tagging]]. There are many ways to change [[tagging|tags]] per runtime, common is to use either [[subtler]] or [[subtlext]]. |
1408 | 2 | Christoph Kappel | |
1409 | 3 | Christoph Kappel | h2. subtler |
1410 | 2 | Christoph Kappel | |
1411 | 3 | Christoph Kappel | |
1412 | 1 | Christoph Kappel | [[subtler]] can be used on the commandline: |
1413 | 2 | Christoph Kappel | |
1414 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
1415 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
1416 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
1417 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
1418 | 2 | Christoph Kappel | </code></pre> |
1419 | 2 | Christoph Kappel | |
1420 | 3 | Christoph Kappel | h2. subtlext |
1421 | 2 | Christoph Kappel | |
1422 | 3 | Christoph Kappel | |
1423 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
1424 | 2 | Christoph Kappel | |
1425 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
1426 | 2 | Christoph Kappel | |
1427 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
1428 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
1429 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
1430 | 2 | Christoph Kappel | </code></pre> |
1431 | 2 | Christoph Kappel | |
1432 | 3 | Christoph Kappel | h2. Snippets |
1433 | 2 | Christoph Kappel | |
1434 | 3 | Christoph Kappel | |
1435 | 2 | Christoph Kappel | The [[snippets]] wiki page includes examples how to [[snippets#Move-windows|move to another view]]. |
1436 | 2 | Christoph Kappel | |
1437 | 3 | Christoph Kappel | h2. Contrib |
1438 | 2 | Christoph Kappel | |
1439 | 3 | Christoph Kappel | |
1440 | 1 | Christoph Kappel | h3. Vitag |
1441 | 1 | Christoph Kappel | |
1442 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains [[subtle-contrib:vitag|vitag]] a script to change the [[tagging|tags]] of windows and views with an editor. |
1443 | 2 | Christoph Kappel | |
1444 | 2 | Christoph Kappel | h3. Launcher |
1445 | 2 | Christoph Kappel | |
1446 | 2 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
1447 | 2 | Christoph Kappel | |
1448 | 3 | Christoph Kappel | h2. Stick |
1449 | 1 | Christoph Kappel | |
1450 | 3 | Christoph Kappel | |
1451 | 1 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: *W-s*) or with [[subtler]]. (click on the window: @subtler -cXS@) |
1452 | 2 | Christoph Kappel | |
1453 | 2 | Christoph Kappel | |
1454 | 2 | Christoph Kappel | |
1455 | 3 | Christoph Kappel | h2. How do I start a program? |
1456 | 3 | Christoph Kappel | |
1457 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
1458 | 2 | Christoph Kappel | |
1459 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
1460 | 2 | Christoph Kappel | |
1461 | 2 | Christoph Kappel | <pre><code class="ruby"> |
1462 | 2 | Christoph Kappel | subtle & |
1463 | 2 | Christoph Kappel | PID=$! |
1464 | 2 | Christoph Kappel | sleep 2 |
1465 | 2 | Christoph Kappel | urxvt |
1466 | 2 | Christoph Kappel | wait $PID |
1467 | 2 | Christoph Kappel | </code></pre> |
1468 | 2 | Christoph Kappel | |
1469 | 1 | Christoph Kappel | * Start your program via [[grabs]]: |
1470 | 1 | Christoph Kappel | |
1471 | 1 | Christoph Kappel | <pre><code class="ruby"> |
1472 | 2 | Christoph Kappel | "A-x" => "urxvt" |
1473 | 1 | Christoph Kappel | </code></pre> |
1474 | 2 | Christoph Kappel | |
1475 | 2 | Christoph Kappel | There are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in [[subtle-contrib:Launcher|here]]. |
1476 | 2 | Christoph Kappel | |
1477 | 2 | Christoph Kappel | |
1478 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1479 | 3 | Christoph Kappel | |
1480 | 2 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] just uses both of the {{color(#ff0000, WM_CLASS)}} values for tagging. |
1481 | 2 | Christoph Kappel | |
1482 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1483 | 2 | Christoph Kappel | |
1484 | 2 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the {{color(#ff0000, WM_CLASS)}} and may match other [[tagging|tags]]. |
1485 | 2 | Christoph Kappel | |
1486 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. |
1487 | 2 | Christoph Kappel | |
1488 | 2 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
1489 | 2 | Christoph Kappel | |
1490 | 2 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
1491 | 2 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
1492 | 2 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
1493 | 1 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
1494 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
1495 | 2 | Christoph Kappel | |
1496 | 2 | Christoph Kappel | So the easiest way to reliable match this client is a [[lagging|tag]] like this: |
1497 | 2 | Christoph Kappel | |
1498 | 1 | Christoph Kappel | <pre>code class="ruby">tag "irssi" do |
1499 | 1 | Christoph Kappel | match :instance => "irssi" |
1500 | 2 | Christoph Kappel | end</code></pre> |
1501 | 2 | Christoph Kappel | |
1502 | 2 | Christoph Kappel | |
1503 | 2 | Christoph Kappel | |
1504 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1505 | 3 | Christoph Kappel | |
1506 | 2 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] just uses both of the *WM_CLASS* values for tagging. |
1507 | 2 | Christoph Kappel | |
1508 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1509 | 1 | Christoph Kappel | |
1510 | 1 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the *WM_CLASS* and may match other [[tagging|tags]] like: |
1511 | 2 | Christoph Kappel | |
1512 | 2 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
1513 | 2 | Christoph Kappel | match "urxvt" |
1514 | 2 | Christoph Kappel | end</code></pre> |
1515 | 2 | Christoph Kappel | |
1516 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. |
1517 | 2 | Christoph Kappel | |
1518 | 2 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
1519 | 2 | Christoph Kappel | |
1520 | 2 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
1521 | 2 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
1522 | 1 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
1523 | 1 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
1524 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
1525 | 1 | Christoph Kappel | |
1526 | 1 | Christoph Kappel | So the easiest way to reliable match this client is a [[lagging|tag]] like this: |
1527 | 2 | Christoph Kappel | |
1528 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
1529 | 2 | Christoph Kappel | match :instance => "irssi" |
1530 | 2 | Christoph Kappel | end</code></pre> |
1531 | 2 | Christoph Kappel | |
1532 | 2 | Christoph Kappel | |
1533 | 2 | Christoph Kappel | |
1534 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1535 | 3 | Christoph Kappel | |
1536 | 1 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] just uses both of the *WM_CLASS* values for tagging. |
1537 | 2 | Christoph Kappel | |
1538 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1539 | 2 | Christoph Kappel | |
1540 | 2 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the *WM_CLASS* and may match other [[tagging|tags]] like: |
1541 | 2 | Christoph Kappel | |
1542 | 2 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
1543 | 2 | Christoph Kappel | match "urxvt" |
1544 | 2 | Christoph Kappel | end</code></pre> |
1545 | 2 | Christoph Kappel | |
1546 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. So the easiest way to reliable match this client is a [[tagging|tag]] like this: |
1547 | 2 | Christoph Kappel | |
1548 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
1549 | 2 | Christoph Kappel | match :instance => "irssi" |
1550 | 2 | Christoph Kappel | end</code></pre> |
1551 | 2 | Christoph Kappel | |
1552 | 2 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
1553 | 1 | Christoph Kappel | |
1554 | 1 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
1555 | 2 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
1556 | 2 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
1557 | 2 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
1558 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
1559 | 2 | Christoph Kappel | |
1560 | 2 | Christoph Kappel | |
1561 | 2 | Christoph Kappel | |
1562 | 2 | Christoph Kappel | |
1563 | 2 | Christoph Kappel | |
1564 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1565 | 3 | Christoph Kappel | |
1566 | 1 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] uses both of the *WM_CLASS* values for tagging. |
1567 | 2 | Christoph Kappel | |
1568 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1569 | 2 | Christoph Kappel | |
1570 | 2 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the *WM_CLASS* and may match other [[tagging|tags]] like: |
1571 | 2 | Christoph Kappel | |
1572 | 1 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
1573 | 1 | Christoph Kappel | match "urxvt" |
1574 | 2 | Christoph Kappel | end</code></pre> |
1575 | 2 | Christoph Kappel | |
1576 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. So the easiest way to reliable match this client is a [[tagging|tag]] like this: |
1577 | 2 | Christoph Kappel | |
1578 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
1579 | 1 | Christoph Kappel | match :instance => "irssi" |
1580 | 1 | Christoph Kappel | end</code></pre> |
1581 | 2 | Christoph Kappel | |
1582 | 2 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
1583 | 1 | Christoph Kappel | |
1584 | 2 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
1585 | 1 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
1586 | 2 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
1587 | 2 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
1588 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
1589 | 2 | Christoph Kappel | |
1590 | 2 | Christoph Kappel | |
1591 | 2 | Christoph Kappel | |
1592 | 2 | Christoph Kappel | |
1593 | 2 | Christoph Kappel | |
1594 | 3 | Christoph Kappel | h2. Why did the volume sublet stop working after kernel update? |
1595 | 3 | Christoph Kappel | |
1596 | 1 | Christoph Kappel | The volume [[sublets|sublet]] uses @/dev/mixer@ to set/get the volume levels, which is an older interface introduced with "OSS":http://www.opensound.com/ and still available via "ALSA OSS emulation":http://www.alsa-project.org/. Apparently, newer kernels refuse to autoload that module anymore and you need to load it manually or via any init file. |
1597 | 2 | Christoph Kappel | |
1598 | 1 | Christoph Kappel | {{info(Please check to the docs of your distribution how to do it.)}} |
1599 | 1 | Christoph Kappel | |
1600 | 2 | Christoph Kappel | {{warn(Following explanation is technical!)}} |
1601 | 2 | Christoph Kappel | |
1602 | 2 | Christoph Kappel | The [[sublets|sublet]] needs a way to access a mixer without any asynchronous callbacks. The reason for that is that [[subtle]] is single-threaded and can't use a dedicated thread to wait for the reply, but the APIs of "ALSA":http://www.alsa-project.org/ and "PulseAudio":http://pulseaudio.org are both designed to be asynchronous. Normally event drivven is fine but it is troublesome when you can't use their mainloop. |
1603 | 2 | Christoph Kappel | |
1604 | 2 | Christoph Kappel | Since there is no way to add e.g. a control socket to the event main loop of [[subtle]], the @/dev/mixer@ approach is the only way and works for all sound systems. |
1605 | 2 | Christoph Kappel | |
1606 | 3 | Christoph Kappel | h2. Why did the volume sublet stop working after kernel update? |
1607 | 3 | Christoph Kappel | |
1608 | 1 | Christoph Kappel | The volume [[sublets|sublet]] uses @/dev/mixer@ to set/get the volume levels, which is an older interface introduced with "OSS":http://www.opensound.com/ and still available via "ALSA OSS emulation":http://www.alsa-project.org/. Apparently, newer kernels refuse to autoload that module anymore and you need to load it manually or via any init file. |
1609 | 2 | Christoph Kappel | |
1610 | 2 | Christoph Kappel | {{info(Please check to the docs of your distribution how to do it.)}} |
1611 | 2 | Christoph Kappel | |
1612 | 2 | Christoph Kappel | <pre><code>modprobe snd_mixer_oss</code></pre> |
1613 | 2 | Christoph Kappel | |
1614 | 2 | Christoph Kappel | {{warn(Following explanation is technical!)}} |
1615 | 2 | Christoph Kappel | |
1616 | 2 | Christoph Kappel | The [[sublets|sublet]] needs a way to access a mixer without any asynchronous callbacks. The reason for that is that [[subtle]] is single-threaded and can't use a dedicated thread to wait for the reply, but the APIs of "ALSA":http://www.alsa-project.org/ and "PulseAudio":http://pulseaudio.org are both designed to be asynchronous. Normally event drivven is fine but it is troublesome when you can't use their mainloop. |
1617 | 2 | Christoph Kappel | |
1618 | 1 | Christoph Kappel | Since there is no way to add e.g. a control socket to the event main loop of [[subtle]], the @/dev/mixer@ approach is the only way and works for all sound systems. |
1619 | 2 | Christoph Kappel | |
1620 | 3 | Christoph Kappel | h2. Is subtle a reparenting window manager? |
1621 | 3 | Christoph Kappel | |
1622 | 1 | Christoph Kappel | *Nope*, [[subtle]] doesn't reparent windows and there is in fact *no* reason to do that. The layout in [[subtle]] is a really loose set, the only relation between a [[views|view]] and a [[client]] is [[tagging]] and this is checked on every [[views|view]] update. |
1623 | 2 | Christoph Kappel | |
1624 | 2 | Christoph Kappel | Reparenting windows would require following additional steps, when a window is visible on a certain [[views|view]]: |
1625 | 2 | Christoph Kappel | |
1626 | 2 | Christoph Kappel | # Resize the [[views|view]] toplevel window to the size of the current [[screen]] |
1627 | 2 | Christoph Kappel | # Reparent the [[client]] window to the toplevel window |
1628 | 2 | Christoph Kappel | # Handle (ignore here) the generated expose and crossing events |
1629 | 2 | Christoph Kappel | |
1630 | 2 | Christoph Kappel | Probably sounds like not much overhead, but keep in mind this is just required because the developer of "Java":http://www.java.com/ and "Qt":http://qt.nokia.com/products/ cannot understand following line from the "ICCCM":http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.1: |
1631 | 2 | Christoph Kappel | |
1632 | 2 | Christoph Kappel | bq. Clients must be aware that some window managers will reparent their top-level windows so that a window that was created as a child of the root will be displayed as a child of some window belonging to the window manager |
1633 | 2 | Christoph Kappel | |
1634 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1635 | 3 | Christoph Kappel | |
1636 | 2 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] uses both of the *WM_CLASS* values for tagging. |
1637 | 2 | Christoph Kappel | |
1638 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1639 | 2 | Christoph Kappel | |
1640 | 2 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the *WM_CLASS* and may match other [[tagging|tags]] like: |
1641 | 2 | Christoph Kappel | |
1642 | 1 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
1643 | 1 | Christoph Kappel | match "urxvt" |
1644 | 2 | Christoph Kappel | end</code></pre> |
1645 | 2 | Christoph Kappel | |
1646 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. So the easiest way to reliable match this client is a [[tagging|tag]] like this: |
1647 | 2 | Christoph Kappel | |
1648 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
1649 | 2 | Christoph Kappel | match :instance => "irssi" |
1650 | 1 | Christoph Kappel | end</code></pre> |
1651 | 2 | Christoph Kappel | |
1652 | 1 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
1653 | 2 | Christoph Kappel | |
1654 | 1 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
1655 | 1 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
1656 | 2 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
1657 | 2 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
1658 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
1659 | 1 | Christoph Kappel | |
1660 | 2 | Christoph Kappel | Please have a look at the [[Tagging|tagging wiki page]] for more information. |
1661 | 1 | Christoph Kappel | |
1662 | 2 | Christoph Kappel | |
1663 | 2 | Christoph Kappel | |
1664 | 2 | Christoph Kappel | |
1665 | 3 | Christoph Kappel | h2. Why does subtle cause to many wakeups? |
1666 | 3 | Christoph Kappel | |
1667 | 1 | Christoph Kappel | The wakeups are caused by a "Ruby":http://ruby-lang.org internal polling thread that runs every 10ms to schedule/handle other threads and signals. There is currently no way to avoid that in "YARV":http://www.atdot.net/yarv/, although the problem is well known. |
1668 | 1 | Christoph Kappel | |
1669 | 2 | Christoph Kappel | http://www.ruby-forum.com/topic/200147 |
1670 | 1 | Christoph Kappel | |
1671 | 2 | Christoph Kappel | There is finally some progress regarding this: http://www.ruby-forum.com/topic/549998 |
1672 | 2 | Christoph Kappel | |
1673 | 3 | Christoph Kappel | h2. Why don't my grabs work with xyz keyboard layout? |
1674 | 3 | Christoph Kappel | |
1675 | 2 | Christoph Kappel | Actually, I have no idea why setting the keyboard layout in your @xorg.conf@ isn't suffucient, but apparently you need to call *setxkbmap* in one of your startup files to set the keymap. My suggestion is to use the @~/.xinitrc@, because it is perfectly suited to setup Xorg and usually read. |
1676 | 2 | Christoph Kappel | |
1677 | 2 | Christoph Kappel | Just add something like this to your @~/.xinitrc@ *before* you start [[subtle]]: |
1678 | 1 | Christoph Kappel | |
1679 | 1 | Christoph Kappel | <pre><code>setxkbmap -layout 'de(nodeadkeys)'</code></pre> |
1680 | 2 | Christoph Kappel | |
1681 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
1682 | 3 | Christoph Kappel | |
1683 | 2 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
1684 | 2 | Christoph Kappel | |
1685 | 1 | Christoph Kappel | Following names are currently in use: |
1686 | 1 | Christoph Kappel | |
1687 | 2 | Christoph Kappel | |_. Browser |_. Arch |_. WM_NAME |_. WM_CLASS | |
1688 | 1 | Christoph Kappel | | Firefox <7.0.1 | all | <unknown> | "<unknown>", "<unknown>" | |
1689 | 1 | Christoph Kappel | | Firefox >=7.0.1 | all | plugin-container | "plugin-container", "Plugin-container" | |
1690 | 2 | Christoph Kappel | | Chromium | all | exe | "exe", "Exe" | |
1691 | 2 | Christoph Kappel | | Opera | x86 | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
1692 | 1 | Christoph Kappel | | nspluginwrapper | x86_64 | "npviewer.bin" | "Npviewer.bin" | |
1693 | 2 | Christoph Kappel | |
1694 | 1 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
1695 | 2 | Christoph Kappel | |
1696 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
1697 | 2 | Christoph Kappel | match "<unknown>|plugin-container|exe|operapluginwrapper|npviewer.bin" |
1698 | 2 | Christoph Kappel | stick true |
1699 | 2 | Christoph Kappel | end</code></pre> |
1700 | 2 | Christoph Kappel | |
1701 | 3 | Christoph Kappel | h2. How do I (auto)start applications? |
1702 | 3 | Christoph Kappel | |
1703 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
1704 | 2 | Christoph Kappel | |
1705 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
1706 | 2 | Christoph Kappel | |
1707 | 2 | Christoph Kappel | <pre><code class="ruby"> |
1708 | 2 | Christoph Kappel | subtle & |
1709 | 2 | Christoph Kappel | PID=$! |
1710 | 1 | Christoph Kappel | sleep 2 |
1711 | 1 | Christoph Kappel | urxvt |
1712 | 2 | Christoph Kappel | wait $PID |
1713 | 2 | Christoph Kappel | </code></pre> |
1714 | 1 | Christoph Kappel | |
1715 | 1 | Christoph Kappel | * Start your program via [[grabs]]: |
1716 | 1 | Christoph Kappel | |
1717 | 2 | Christoph Kappel | <pre><code class="ruby"> |
1718 | 1 | Christoph Kappel | "A-x" => "urxvt" |
1719 | 2 | Christoph Kappel | </code></pre> |
1720 | 2 | Christoph Kappel | |
1721 | 2 | Christoph Kappel | There are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in [[subtle-contrib:Launcher|here]]. |
1722 | 1 | Christoph Kappel | |
1723 | 1 | Christoph Kappel | |
1724 | 3 | Christoph Kappel | h2. How do I (auto)start programs? |
1725 | 3 | Christoph Kappel | |
1726 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
1727 | 2 | Christoph Kappel | |
1728 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
1729 | 1 | Christoph Kappel | |
1730 | 1 | Christoph Kappel | <pre><code class="ruby"> |
1731 | 2 | Christoph Kappel | subtle & |
1732 | 2 | Christoph Kappel | PID=$! |
1733 | 2 | Christoph Kappel | sleep 2 |
1734 | 2 | Christoph Kappel | urxvt |
1735 | 2 | Christoph Kappel | wait $PID |
1736 | 2 | Christoph Kappel | </code></pre> |
1737 | 2 | Christoph Kappel | |
1738 | 2 | Christoph Kappel | * Start your program via [[grabs]]: |
1739 | 1 | Christoph Kappel | |
1740 | 2 | Christoph Kappel | <pre><code class="ruby"> |
1741 | 1 | Christoph Kappel | "A-x" => "urxvt" |
1742 | 1 | Christoph Kappel | </code></pre> |
1743 | 1 | Christoph Kappel | |
1744 | 2 | Christoph Kappel | There are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in [[subtle-contrib:Launcher|here]]. |
1745 | 2 | Christoph Kappel | |
1746 | 2 | Christoph Kappel | |
1747 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1748 | 3 | Christoph Kappel | |
1749 | 2 | Christoph Kappel | GLFW set the windows name after the window get created, so you can't match a particular GLFW window by his name. |
1750 | 2 | Christoph Kappel | |
1751 | 1 | Christoph Kappel | to match any GLFW window : |
1752 | 2 | Christoph Kappel | |
1753 | 1 | Christoph Kappel | <pre> |
1754 | 1 | Christoph Kappel | tag "glfw" do |
1755 | 1 | Christoph Kappel | \tmatch name: "GLFW.*" |
1756 | 1 | Christoph Kappel | \t# Your code.... |
1757 | 1 | Christoph Kappel | end |
1758 | 2 | Christoph Kappel | </pre> |
1759 | 2 | Christoph Kappel | |
1760 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1761 | 3 | Christoph Kappel | |
1762 | 2 | Christoph Kappel | GLFW set the name of the window after the window get created, so you can't match a particular window by his name. |
1763 | 2 | Christoph Kappel | |
1764 | 2 | Christoph Kappel | to match any GLFW window : |
1765 | 1 | Christoph Kappel | |
1766 | 1 | Christoph Kappel | <pre> |
1767 | 1 | Christoph Kappel | tag "glfw" do |
1768 | 2 | Christoph Kappel | \tmatch name: "GLFW.*" |
1769 | 1 | Christoph Kappel | \t# your code |
1770 | 2 | Christoph Kappel | end |
1771 | 2 | Christoph Kappel | </pre> |
1772 | 2 | Christoph Kappel | |
1773 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1774 | 3 | Christoph Kappel | |
1775 | 2 | Christoph Kappel | GLFW set the name of the window after the window get created, so you can't match a particular window by his name. |
1776 | 2 | Christoph Kappel | |
1777 | 1 | Christoph Kappel | to match any GLFW window : |
1778 | 1 | Christoph Kappel | |
1779 | 2 | Christoph Kappel | <pre> |
1780 | 2 | Christoph Kappel | tag "glfw" do |
1781 | 1 | Christoph Kappel | \tmatch name: "GLFW.*" |
1782 | 2 | Christoph Kappel | \t# your code |
1783 | 1 | Christoph Kappel | end |
1784 | 2 | Christoph Kappel | </pre> |
1785 | 2 | Christoph Kappel | |
1786 | 3 | Christoph Kappel | h2. Why does subtle cause to many wakeups? |
1787 | 3 | Christoph Kappel | |
1788 | 2 | Christoph Kappel | The wakeups are caused by a "Ruby":http://ruby-lang.org internal polling thread that runs every 10ms to schedule/handle other threads and signals. There is currently no way to avoid that in "YARV":http://www.atdot.net/yarv/, although the problem is well known. |
1789 | 2 | Christoph Kappel | |
1790 | 1 | Christoph Kappel | http://www.ruby-forum.com/topic/200147 |
1791 | 1 | Christoph Kappel | |
1792 | 1 | Christoph Kappel | There is finally some progress regarding this: http://www.ruby-forum.com/topic/549998 |
1793 | 1 | Christoph Kappel | |
1794 | 3 | Christoph Kappel | h2. Is there any log file? |
1795 | 3 | Christoph Kappel | |
1796 | 2 | Christoph Kappel | Nope, there is *no* log file. In case you need one for e.g. reporting a bug +please+ read to the [[bugs|reporting a bug]] wiki page and check the paragraph about [[bugs#enable-logging|logging]]. |
1797 | 2 | Christoph Kappel | |
1798 | 3 | Christoph Kappel | h2. How do I (auto)start programs? |
1799 | 3 | Christoph Kappel | |
1800 | 2 | Christoph Kappel | There are several way how to start a certain programm, here are the most common: |
1801 | 2 | Christoph Kappel | |
1802 | 2 | Christoph Kappel | * Start your program via your $HOME/.xinitrc: |
1803 | 2 | Christoph Kappel | |
1804 | 2 | Christoph Kappel | <pre><code class="ruby"> |
1805 | 1 | Christoph Kappel | subtle & |
1806 | 1 | Christoph Kappel | PID=$! |
1807 | 2 | Christoph Kappel | sleep 2 |
1808 | 1 | Christoph Kappel | urxvt |
1809 | 2 | Christoph Kappel | wait $PID |
1810 | 1 | Christoph Kappel | </code></pre> |
1811 | 2 | Christoph Kappel | |
1812 | 1 | Christoph Kappel | * Start your program via [[grabs]]: |
1813 | 2 | Christoph Kappel | |
1814 | 1 | Christoph Kappel | <pre><code class="ruby"> |
1815 | 2 | Christoph Kappel | "A-x" => "urxvt" |
1816 | 2 | Christoph Kappel | </code></pre> |
1817 | 2 | Christoph Kappel | |
1818 | 2 | Christoph Kappel | There are many launchers available like "dmenu":http://tools.suckless.org/dmenu and there is even a launcher especially designed for [[subtle]], you can find it in [[subtle-contrib:Launcher|here]]. |
1819 | 1 | Christoph Kappel | |
1820 | 1 | Christoph Kappel | |
1821 | 3 | Christoph Kappel | h2. How do I tag gimp? |
1822 | 3 | Christoph Kappel | |
1823 | 1 | Christoph Kappel | [[Tagging]] "GIMP":http://gimp.org can be nasty, because the current version (2.6) uses inconsistent window names and roles. The window roles are fixed in the current development snapshot and will hopefully find their way into the 2.8 release. |
1824 | 2 | Christoph Kappel | |
1825 | 1 | Christoph Kappel | https://bugzilla.gnome.org/show_bug.cgi?id=645456 |
1826 | 2 | Christoph Kappel | |
1827 | 3 | Christoph Kappel | h2. How do I set a wallpaper in subtle? |
1828 | 3 | Christoph Kappel | |
1829 | 2 | Christoph Kappel | On start, [[subtle]] sets a background color (_if set_) to the root window and therefore *overwrites* any root pixmap set before. To avoid this, you just need to comment out the *:background* line from your config. |
1830 | 1 | Christoph Kappel | |
1831 | 2 | Christoph Kappel | [[subtle]] itself has no and will never have either an autostart or way to set a wallpaper directly. Normally you just want to setup your X session and and not [[subtle]]. Your _~/.xinitrc_ is the right place for stuff like this. |
1832 | 2 | Christoph Kappel | |
1833 | 2 | Christoph Kappel | A background can easily set with a tool like "feh":http://linuxbrit.co.uk/software/feh/. |
1834 | 1 | Christoph Kappel | |
1835 | 3 | Christoph Kappel | h2. Why don't my grabs work with xyz keyboard layout? |
1836 | 3 | Christoph Kappel | |
1837 | 1 | Christoph Kappel | Actually, I have no idea why setting the keyboard layout in your @xorg.conf@ isn't suffucient, but apparently you need to call *setxkbmap* in one of your startup files to set the keymap. My suggestion is to use the @~/.xinitrc@, because it is perfectly suited to setup Xorg and usually read. |
1838 | 2 | Christoph Kappel | |
1839 | 1 | Christoph Kappel | Just add something like this to your @~/.xinitrc@ *before* you start [[subtle]]: |
1840 | 2 | Christoph Kappel | |
1841 | 2 | Christoph Kappel | <pre><code>setxkbmap -layout 'de(nodeadkeys)'</code></pre> |
1842 | 2 | Christoph Kappel | |
1843 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1844 | 3 | Christoph Kappel | |
1845 | 2 | Christoph Kappel | GLFW set the windows name after the window get created, so you can't match a particular GLFW window by his name. |
1846 | 1 | Christoph Kappel | |
1847 | 2 | Christoph Kappel | to match any GLFW window : |
1848 | 2 | Christoph Kappel | |
1849 | 2 | Christoph Kappel | <pre> |
1850 | 2 | Christoph Kappel | tag "glfw" do |
1851 | 2 | Christoph Kappel | \tmatch name: "GLFW.*" |
1852 | 2 | Christoph Kappel | \t# Your code.... |
1853 | 2 | Christoph Kappel | end |
1854 | 2 | Christoph Kappel | </pre> |
1855 | 2 | Christoph Kappel | |
1856 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1857 | 3 | Christoph Kappel | |
1858 | 1 | Christoph Kappel | GLFW set the name of the window after the window get created, so you can't match a particular window by his name. |
1859 | 1 | Christoph Kappel | |
1860 | 1 | Christoph Kappel | to match any GLFW window : |
1861 | 2 | Christoph Kappel | |
1862 | 2 | Christoph Kappel | <pre> |
1863 | 2 | Christoph Kappel | tag "glfw" do |
1864 | 2 | Christoph Kappel | \tmatch name: "GLFW.*" |
1865 | 2 | Christoph Kappel | \t# your code |
1866 | 2 | Christoph Kappel | end |
1867 | 2 | Christoph Kappel | </pre> |
1868 | 2 | Christoph Kappel | |
1869 | 3 | Christoph Kappel | h2. How can I manually delete a sublet? |
1870 | 3 | Christoph Kappel | |
1871 | 1 | Christoph Kappel | [[Sublets]] usually consist of a **.rb* file, a **.spec* file and one or more icons. All these files can be found in their respective folder in @$XDG_DATA_HOME/subtle@ resp. @~/.local/share/subtle@. After deleting the [[sublets|sublet]] files the cache of [[sur]] needs to be updated or otherwise [[sur]] will think the [[sublets|sublet]] is still installed: @sur update -l@ |
1872 | 1 | Christoph Kappel | |
1873 | 3 | Christoph Kappel | h2. Where does sur store sublets and icons? |
1874 | 3 | Christoph Kappel | |
1875 | 1 | Christoph Kappel | [[sur]] follows the "XDG Base Directory specifications":http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html to store data, which includes some base path for specific data types. |
1876 | 2 | Christoph Kappel | |
1877 | 2 | Christoph Kappel | Following paths are used: |
1878 | 2 | Christoph Kappel | |
1879 | 2 | Christoph Kappel | |_. Type |_. XDG path |_. Default path | |
1880 | 2 | Christoph Kappel | | Sublets | @$XDG_DATA_HOME/subtle/sublets@ | @~/.local/share/subtle/sublets@ | |
1881 | 2 | Christoph Kappel | | Icons | @$XDG_DATA_HOME/subtle(icons@ | @~/.local/share/subtle/icons@ | |
1882 | 1 | Christoph Kappel | |
1883 | 3 | Christoph Kappel | h2. How to match a GLFW window |
1884 | 3 | Christoph Kappel | |
1885 | 2 | Christoph Kappel | GLFW set the name of the window after the window get created, so you can't match a particular window by his name. |
1886 | 2 | Christoph Kappel | |
1887 | 2 | Christoph Kappel | to match any GLFW window : |
1888 | 1 | Christoph Kappel | |
1889 | 1 | Christoph Kappel | <pre> |
1890 | 2 | Christoph Kappel | tag "glfw" do |
1891 | 2 | Christoph Kappel | \tmatch name: "GLFW.*" |
1892 | 2 | Christoph Kappel | \t# your code |
1893 | 2 | Christoph Kappel | end |
1894 | 2 | Christoph Kappel | </pre> |
1895 | 2 | Christoph Kappel | |
1896 | 3 | Christoph Kappel | h2. How do I run a program on startup/autostart? |
1897 | 3 | Christoph Kappel | |
1898 | 1 | Christoph Kappel | Let's say you want "urxvt":http://software.schmorp.de/pkg/rxvt-unicode.html to start after [[subtle]], and for some reason @echo "urxvt" >> ~/.xinitrc@ is just not cutting it. Using the *:start* hook and [[subtlext]] we can simulate autostart like so: |
1899 | 2 | Christoph Kappel | |
1900 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
1901 | 2 | Christoph Kappel | on :start do |
1902 | 2 | Christoph Kappel | Subtlext::Subtle.spawn "urxvt" |
1903 | 2 | Christoph Kappel | end |
1904 | 2 | Christoph Kappel | </pre></code> |
1905 | 1 | Christoph Kappel | |
1906 | 3 | Christoph Kappel | h2. Where is the output window of flash in fullscreen? |
1907 | 3 | Christoph Kappel | |
1908 | 2 | Christoph Kappel | For flash, browsers seem to use window instance and class names that doesn't match the browser values. Therefore the windows will usually appear on the default view. |
1909 | 2 | Christoph Kappel | |
1910 | 2 | Christoph Kappel | Following names are currently in use: |
1911 | 2 | Christoph Kappel | |
1912 | 2 | Christoph Kappel | |_. Browser |_. Arch |_. WM_NAME |_. WM_CLASS | |
1913 | 1 | Christoph Kappel | | Firefox <7.0.1 | all | <unknown> | "<unknown>", "<unknown>" | |
1914 | 1 | Christoph Kappel | | Firefox >=7.0.1 | all | plugin-container | "plugin-container", "Plugin-container" | |
1915 | 2 | Christoph Kappel | | Chromium | all | exe | "exe", "Exe" | |
1916 | 2 | Christoph Kappel | | Opera | x86 | "operapluginwrapper" | "operapluginwrapper", "Operapluginwrapper" | |
1917 | 2 | Christoph Kappel | | nspluginwrapper | x86_64 | "npviewer.bin" | "Npviewer.bin" | |
1918 | 2 | Christoph Kappel | |
1919 | 2 | Christoph Kappel | The easiest way to avoid that is to add a [[tagging|tag]] that makes these windows sticky: |
1920 | 2 | Christoph Kappel | |
1921 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "flash" do |
1922 | 2 | Christoph Kappel | match "<unknown>|plugin-container|exe|operapluginwrapper|npviewer.bin" |
1923 | 2 | Christoph Kappel | stick true |
1924 | 2 | Christoph Kappel | end</code></pre> |
1925 | 2 | Christoph Kappel | |
1926 | 3 | Christoph Kappel | h2. What is the difference between ViewSwitch and ViewJump? |
1927 | 3 | Christoph Kappel | |
1928 | 1 | Christoph Kappel | Boths keys change the [[view]] of the current active [[screens|screen]], but the behavior how they do that depends on if the system consists either of a single [[screens|screen]] or more. |
1929 | 2 | Christoph Kappel | |
1930 | 3 | Christoph Kappel | h2. Single screen |
1931 | 2 | Christoph Kappel | |
1932 | 3 | Christoph Kappel | |
1933 | 2 | Christoph Kappel | Here both [[grabs]] do +exactly+ the same. |
1934 | 2 | Christoph Kappel | |
1935 | 3 | Christoph Kappel | h2. Multi screen |
1936 | 2 | Christoph Kappel | |
1937 | 3 | Christoph Kappel | |
1938 | 2 | Christoph Kappel | Here the behavior depends on if the selected [[views|view]] is visible on another [[screens|screen]] or not. |
1939 | 1 | Christoph Kappel | |
1940 | 1 | Christoph Kappel | * *ViewSwitch* either swaps the current [[views|view]] with the selected if it is visible on another [[screens|screen]] or just sets the selected [[views|view]] on current [[screens|screen]]. |
1941 | 2 | Christoph Kappel | * *ViewJump* either focus the selected [[views|view]] if it is visible on another [[screens|screen]] or just sets the select [[views|view]] on current [[screens|screen]]. |
1942 | 1 | Christoph Kappel | |
1943 | 3 | Christoph Kappel | h2. Why does program XYZ appears/turns as/to a gray canvas? |
1944 | 3 | Christoph Kappel | |
1945 | 2 | Christoph Kappel | Generally, this happens, when a program needs a specific aspect ratio and [[subtle]] sets a gravity that violates this. Windows can tell the window manager about this kind of preferences via their size hints and [[subtle]] can honor those. |
1946 | 1 | Christoph Kappel | |
1947 | 2 | Christoph Kappel | There are two possible ways: |
1948 | 1 | Christoph Kappel | |
1949 | 2 | Christoph Kappel | # Enable size hints globally with the _:resize_ option |
1950 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">set :resize, true</code></pre> |
1951 | 2 | Christoph Kappel | # Enable this per program via [[tagging|tag]] |
1952 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby">tag "name" do |
1953 | 2 | Christoph Kappel | match "name" |
1954 | 1 | Christoph Kappel | resize true |
1955 | 2 | Christoph Kappel | end</code></pre> |
1956 | 2 | Christoph Kappel | |
1957 | 2 | Christoph Kappel | bq. Note: This can happen with "Java":http://java.com too, see "here":http://subforge.org/ezfaq/show/subtle?faq_id=14 for more information. |
1958 | 2 | Christoph Kappel | |
1959 | 3 | Christoph Kappel | h2. How do I run a Java program? |
1960 | 3 | Christoph Kappel | |
1961 | 2 | Christoph Kappel | "Java":http://java.com *expects* a certain behaviour (_reparenting of client windows_) of a window manager which is not part of any standard, therefore some "Java":http://java.com programs just show a white canvas. |
1962 | 2 | Christoph Kappel | |
1963 | 1 | Christoph Kappel | If this happens just try to start your program like this: |
1964 | 1 | Christoph Kappel | |
1965 | 1 | Christoph Kappel | <pre><code class="shell">AWT_TOOLKIT=MToolkit program</code></pre> |
1966 | 2 | Christoph Kappel | |
1967 | 1 | Christoph Kappel | This changes the default tookit of "Java":http://java.com to _MToolkit_, which is known to work with non-reparenting windows managers like [[subtle]]. Depending on your "OpenJDK":http://openjdk.java.net version and your architecture this may either lead to a segmentation fault or your "OpenJDK":http://openjdk.java.net just has no support for *MToolkit*. In this case check if your distribution has applied a patch for this issue which allows something like this to change the default behaviour: |
1968 | 1 | Christoph Kappel | |
1969 | 1 | Christoph Kappel | <pre><code class="shell">_JAVA_AWT_WM_NONREPARENTING=1 program</code></pre> |
1970 | 2 | Christoph Kappel | |
1971 | 2 | Christoph Kappel | In case both doesn't work there is a third option: "Java":http://java.com seems to use an internally hardcoded list of window managers that are non-reparenting, the "suckless":http://suckless.org guys made a tool ("wmname":http://tools.suckless.org/wmname) to change the name of the wm. |
1972 | 2 | Christoph Kappel | |
1973 | 2 | Christoph Kappel | Since r2520 [[subtle]] can do that for you, just enable the *:wmname* option. |
1974 | 2 | Christoph Kappel | |
1975 | 2 | Christoph Kappel | Generally this problem is really long lasting, see here: |
1976 | 2 | Christoph Kappel | |
1977 | 1 | Christoph Kappel | http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511454 |
1978 | 2 | Christoph Kappel | http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508650 |
1979 | 1 | Christoph Kappel | |
1980 | 2 | Christoph Kappel | bq. Note: Many problems only affect the "JRE":http://www.oracle.com/technetwork/java/javase/downloads/index.html and can be avoided by using the "OpenJDK":http://openjdk.java.net. |
1981 | 2 | Christoph Kappel | |
1982 | 2 | Christoph Kappel | |
1983 | 1 | Christoph Kappel | |
1984 | 3 | Christoph Kappel | h2. How do I tag console based programs? |
1985 | 3 | Christoph Kappel | |
1986 | 2 | Christoph Kappel | When console based programs like "irssi":http://irssi.org are started with a terminal like @urxvt -e irssi@, they usually just change the *WM_NAME* of the terminal and per default, [[subtle]] uses both of the *WM_CLASS* values for tagging. |
1987 | 2 | Christoph Kappel | |
1988 | 2 | Christoph Kappel | The problem about that is, that the [[tagging]] is normally done before the terminal really starts the desired app. To avoid that all better known terminals support the *-name* argument which changes the instance value (first string) of the *WM_CLASS*: @urxvt -name irssi -e irssi@ |
1989 | 2 | Christoph Kappel | |
1990 | 2 | Christoph Kappel | Another problem is that terminals retain their class value (second string) of the *WM_CLASS* and may match other [[tagging|tags]] like: |
1991 | 2 | Christoph Kappel | |
1992 | 2 | Christoph Kappel | <pre><code class="ruby">tag "terms" do |
1993 | 2 | Christoph Kappel | match "urxvt" |
1994 | 2 | Christoph Kappel | end</code></pre> |
1995 | 1 | Christoph Kappel | |
1996 | 2 | Christoph Kappel | The common solution to bypass is this to use the :instance matcher, which just matches when for the specific instance value. So the easiest way to reliable match this client is a [[tagging|tag]] like this: |
1997 | 1 | Christoph Kappel | |
1998 | 2 | Christoph Kappel | <pre><code class="ruby">tag "irssi" do |
1999 | 2 | Christoph Kappel | match :instance => "irssi" |
2000 | 2 | Christoph Kappel | end</code></pre> |
2001 | 2 | Christoph Kappel | |
2002 | 2 | Christoph Kappel | Following table shows the *WM_NAME* and *WM_CLASS* output of "xprop":http://www.xfree86.org/current/xprop.1.html of the various combinations: |
2003 | 2 | Christoph Kappel | |
2004 | 2 | Christoph Kappel | |_. Command |_. WM_NAME |_. WM_CLASS | |
2005 | 2 | Christoph Kappel | | urxvt | urxvt | urxvt, URxvt | |
2006 | 2 | Christoph Kappel | | urxvt -e irssi | irssi | urxvt, URxvt | |
2007 | 2 | Christoph Kappel | | urxvt -name irssi | urxvt | irssi, URxvt | |
2008 | 2 | Christoph Kappel | | urxvt -name irssi -e irssi | irssi | irssi, URxvt | |
2009 | 2 | Christoph Kappel | |
2010 | 2 | Christoph Kappel | Please have a look at the [[Tagging|tagging wiki page]] for more information. |
2011 | 2 | Christoph Kappel | |
2012 | 2 | Christoph Kappel | |
2013 | 2 | Christoph Kappel | |
2014 | 2 | Christoph Kappel | |
2015 | 3 | Christoph Kappel | h2. How can I use subtle without numpad? |
2016 | 3 | Christoph Kappel | |
2017 | 2 | Christoph Kappel | Per default [[subtle]] uses the numpad, because it's easier to remind the different postions when you can see them. Generally this is just a suggestion, it's up to you to change the grabs to your needs - any keys will work. |
2018 | 2 | Christoph Kappel | |
2019 | 2 | Christoph Kappel | Keys that also have proven to work well are *q-w-e*, *a-s-d* and *y-x-c*: |
2020 | 2 | Christoph Kappel | |
2021 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">grab "W-q", [ :top_left, :top_left66, :top_left33 ] |
2022 | 2 | Christoph Kappel | grab "W-w", [ :top, :top66, :top33 ] |
2023 | 2 | Christoph Kappel | grab "W-e", [ :top_right, :top_right66, :top_right33 ] |
2024 | 2 | Christoph Kappel | grab "W-a", [ :left, :left66, :left33 ] |
2025 | 1 | Christoph Kappel | grab "W-s", [ :center, :center66, :center33 ] |
2026 | 2 | Christoph Kappel | grab "W-d", [ :right, :right66, :right33 ] |
2027 | 1 | Christoph Kappel | |
2028 | 2 | Christoph Kappel | # QWERTZ |
2029 | 2 | Christoph Kappel | grab "W-y", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
2030 | 2 | Christoph Kappel | |
2031 | 2 | Christoph Kappel | # QWERTY |
2032 | 2 | Christoph Kappel | grab "W-z", [ :bottom_left, :bottom_left66, :bottom_left33 ] |
2033 | 2 | Christoph Kappel | |
2034 | 2 | Christoph Kappel | grab "W-x", [ :bottom, :bottom66, :bottom33 ] |
2035 | 2 | Christoph Kappel | grab "W-c", [ :bottom_right, :bottom_right66, :bottom_right33 ] |
2036 | 2 | Christoph Kappel | </code></pre> |
2037 | 2 | Christoph Kappel | |
2038 | 2 | Christoph Kappel | |
2039 | 2 | Christoph Kappel | You can find more about assigning keys [[Grabs|here]]. |
2040 | 2 | Christoph Kappel | |
2041 | 3 | Christoph Kappel | h2. How does subtle match clients? |
2042 | 3 | Christoph Kappel | |
2043 | 2 | Christoph Kappel | [[subtle]] matches the {{color(#ff0000, WM_NAME)}} and the {{color(#0000ff, WM_CLASS)}} property of a window and not the title. This to ensure the match is correct. |
2044 | 2 | Christoph Kappel | There are several ways to get these values, here are the most common: |
2045 | 2 | Christoph Kappel | |
2046 | 2 | Christoph Kappel | Select the window with "xprop":http://www.xfree86.org/current/xprop.1.htmland have a look for the {{color(#ff0000, WM_NAME)}} and {{color(#0000ff, WM_CLASS)}} lines which usually look like this: |
2047 | 2 | Christoph Kappel | |
2048 | 2 | Christoph Kappel | <pre><code class="bash">{{color(#0000ff, WM_NAME)}}(STRING) = "urxvt" |
2049 | 2 | Christoph Kappel | {{color(#ff0000, WM_CLASS)}}(STRING) = {{color(#aa0000, "irssi")}}, {{color(#ff00ff, "URxvt")}}</code></pre> |
2050 | 1 | Christoph Kappel | |
2051 | 2 | Christoph Kappel | Run *[[subtler]] -cl* and look for the matching line: |
2052 | 2 | Christoph Kappel | |
2053 | 1 | Christoph Kappel | <pre><code class="bash">0x800007 * 1 1020x374 2 1 --- {{color(#ff0000, urxvt)}} ({{color(#0000ff,URxvt)}})</code></pre> |
2054 | 2 | Christoph Kappel | |
2055 | 3 | Christoph Kappel | h2. Is subtle a reparenting window manager? |
2056 | 3 | Christoph Kappel | |
2057 | 2 | Christoph Kappel | *Nope*, [[subtle]] doesn't reparent windows and there is in fact *no* reason to do that. The layout in [[subtle]] is a really loose set, the only relation between a [[views|view]] and a [[client]] is [[tagging]] and this is checked on every [[views|view]] update. |
2058 | 2 | Christoph Kappel | |
2059 | 2 | Christoph Kappel | Reparenting windows would require following additional steps, when a window is visible on a certain [[views|view]]: |
2060 | 2 | Christoph Kappel | |
2061 | 2 | Christoph Kappel | # Resize the [[views|view]] toplevel window to the size of the current [[screen]] |
2062 | 2 | Christoph Kappel | # Reparent the [[client]] window to the toplevel window |
2063 | 1 | Christoph Kappel | # Handle (ignore here) the generated expose and crossing events |
2064 | 2 | Christoph Kappel | |
2065 | 1 | Christoph Kappel | Probably sounds like not much overhead, but keep in mind this is just required because the developer of "Java":http://www.java.com/ and "Qt":http://qt.nokia.com/products/ cannot understand following line from the "ICCCM":http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.1: |
2066 | 2 | Christoph Kappel | |
2067 | 2 | Christoph Kappel | bq. Clients must be aware that some window managers will reparent their top-level windows so that a window that was created as a child of the root will be displayed as a child of some window belonging to the window manager |
2068 | 2 | Christoph Kappel | |
2069 | 3 | Christoph Kappel | h2. How do I move a program to another view? |
2070 | 3 | Christoph Kappel | |
2071 | 2 | Christoph Kappel | Placement in [[subtle]] is +strict+ and completely done via [[tagging]]. There are many ways to change [[tagging|tags]] per runtime, common is to use either [[subtler]] or [[subtlext]]. |
2072 | 2 | Christoph Kappel | |
2073 | 3 | Christoph Kappel | h2. subtler |
2074 | 2 | Christoph Kappel | |
2075 | 3 | Christoph Kappel | |
2076 | 1 | Christoph Kappel | [[subtler]] can be used on the commandline: |
2077 | 2 | Christoph Kappel | |
2078 | 1 | Christoph Kappel | <pre>{{hide}}<code class="ruby"> |
2079 | 2 | Christoph Kappel | subtler -ta tag #< Add new tag 'tag' |
2080 | 2 | Christoph Kappel | subtler -cT client tag #< Tag client 'client' with tag 'tag' |
2081 | 2 | Christoph Kappel | subtler -vT view tag #< Tag view 'view' with tag 'tag' |
2082 | 2 | Christoph Kappel | </code></pre> |
2083 | 2 | Christoph Kappel | |
2084 | 3 | Christoph Kappel | h2. subtlext |
2085 | 2 | Christoph Kappel | |
2086 | 3 | Christoph Kappel | |
2087 | 2 | Christoph Kappel | [[subtlext]] requires basic "ruby":http://ruby-lang.org knowledge: |
2088 | 2 | Christoph Kappel | |
2089 | 2 | Christoph Kappel | <pre>{{hide}}<code class="ruby">require "subtle/subtlext" |
2090 | 2 | Christoph Kappel | |
2091 | 2 | Christoph Kappel | tag = Subtlext::Tag.new("tag").save #< Add new tag 'tag' |
2092 | 2 | Christoph Kappel | Subtlext::Client["client"] + "tag" #< Tag client 'client' with tag 'tag' |
2093 | 2 | Christoph Kappel | Subtlext::View["view"] + "tag" #< Tag view 'view' with tag 'tag' |
2094 | 2 | Christoph Kappel | </code></pre> |
2095 | 2 | Christoph Kappel | |
2096 | 3 | Christoph Kappel | h2. Snippets |
2097 | 2 | Christoph Kappel | |
2098 | 3 | Christoph Kappel | |
2099 | 2 | Christoph Kappel | The [[snippets]] wiki page includes examples how to [[snippets#Move-windows|move to another view]]. |
2100 | 2 | Christoph Kappel | |
2101 | 3 | Christoph Kappel | h2. Contrib |
2102 | 2 | Christoph Kappel | |
2103 | 3 | Christoph Kappel | |
2104 | 2 | Christoph Kappel | h3. Vitag |
2105 | 2 | Christoph Kappel | |
2106 | 2 | Christoph Kappel | "subtle-contrib":http://subforge.org/projects/subtle-contrib/wiki contains [[subtle-contrib:vitag|vitag]] a script to change the [[tagging|tags]] of windows and views with an editor. |
2107 | 2 | Christoph Kappel | |
2108 | 2 | Christoph Kappel | h3. Launcher |
2109 | 2 | Christoph Kappel | |
2110 | 2 | Christoph Kappel | The "launcher":http://subforge.org/projects/subtle-contrib/wiki#Launcher uses quite the opposite way, instead of moving a window to a certain screen it just provides a way to launch a window directly on the right view with the correct [[tagging|tags]]. |
2111 | 2 | Christoph Kappel | |
2112 | 3 | Christoph Kappel | h2. Stick |
2113 | 2 | Christoph Kappel | |
2114 | 3 | Christoph Kappel | |
2115 | 2 | Christoph Kappel | Most of the time, setting the window to *stick* does the trick too. Stick just displays the window on all views until the mode is disabled again. This can be done with [[grabs]] (default keys: *W-s*) or with [[subtler]]. (click on the window: @subtler -cXS@) |
2116 | 2 | Christoph Kappel | |
2117 | 2 | Christoph Kappel | |
2118 | 2 | Christoph Kappel | |
2119 | 3 | Christoph Kappel | h2. What is required for the volume sublet? |
2120 | 3 | Christoph Kappel | |
2121 | 2 | Christoph Kappel | The volume [[sublets|sublet]] uses @/dev/mixer@ to set/get the volume levels, which is an older interface introduced with "OSS":http://www.opensound.com/ and still available via "ALSA OSS emulation":http://www.alsa-project.org/. Apparently, newer kernels refuse to autoload that module anymore and you need to load it manually or via any init file. |
2122 | 2 | Christoph Kappel | |
2123 | 2 | Christoph Kappel | {{info(Please check to the docs of your distribution how to do it.)}} |
2124 | 2 | Christoph Kappel | |
2125 | 2 | Christoph Kappel | <pre><code>modprobe snd_mixer_oss</code></pre> |
2126 | 2 | Christoph Kappel | |
2127 | 2 | Christoph Kappel | {{warn(Following explanation is technical!)}} |
2128 | 2 | Christoph Kappel | |
2129 | 2 | Christoph Kappel | The [[sublets|sublet]] needs a way to access a mixer without any asynchronous callbacks. The reason for that is that [[subtle]] is single-threaded and can't use a dedicated thread to wait for the reply, but the APIs of "ALSA":http://www.alsa-project.org/ and "PulseAudio":http://pulseaudio.org are both designed to be asynchronous. Normally event drivven is fine but it is troublesome when you can't use their mainloop. |
2130 | 2 | Christoph Kappel | |
2131 | 2 | Christoph Kappel | Since there is no way to add e.g. a control socket to the event main loop of [[subtle]], the @/dev/mixer@ approach is the only way and works for all sound systems. |