rumai 3.3.0 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/CREDITS CHANGED
@@ -1,12 +1,8 @@
1
- %#----------------------------------------------------------------------------
2
- ## AUTHORS
3
- %#----------------------------------------------------------------------------
1
+ == AUTHORS
4
2
 
5
3
  Suraj N. Kurapati
6
4
 
7
- %#----------------------------------------------------------------------------
8
- ## CREDITS
9
- %#----------------------------------------------------------------------------
5
+ === Credits
10
6
 
11
7
  Christoph Blank,
12
8
  Kenneth De Winter,
@@ -16,9 +12,6 @@ Nathan Neff,
16
12
  Sebastian Chmielewski,
17
13
  Simon Hafner
18
14
 
19
- %#----------------------------------------------------------------------------
20
- ## LICENSE
21
- %#----------------------------------------------------------------------------
15
+ === License
22
16
 
23
- %# See the file named "LICENSE".
24
- %< "LICENSE"
17
+ %< 'LICENSE'
data/bin/rumai CHANGED
@@ -1,44 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
- #
3
- # This is an interactive Ruby shell (IRB) for Rumai.
4
- #
5
- #
6
- # Usage:
7
- #
8
- # rumai [Options] [STUFF_FOR_IRB]
9
- #
10
- # STUFF_FOR_IRB : Arguments and options for `irb`.
11
- #
12
- #
13
- # Options:
14
- #
15
- # -h, --help : Show this message and exit.
16
- #
17
- # -v, --version : Show version number and exit.
18
- #
19
2
 
20
3
  require 'rumai'
21
4
 
22
- # parse command line
23
5
  if ARGV.delete('-h') or ARGV.delete('--help')
24
- # try to display UNIX version of help manual
25
- man_path = File.join(Rumai::INSTDIR, 'man')
26
- unless system 'man', '-M', man_path, '-a', 'rumai'
27
- # try to display HTML version of help manual
28
- man_html = man_path + '.html'
29
- unless %w[$BROWSER open start].any? {|b| system "#{b} #{man_html}" }
30
- # no luck; direct user to project website
31
- puts "See #{Rumai::WEBSITE}"
32
- end
33
- end
6
+ system 'man', '-M', File.join(Rumai::INSTDIR, 'man'), 'rumai' or
7
+ warn "Could not display the help manual.\nSee #{Rumai::WEBSITE} instead."
34
8
  exit
35
9
  elsif ARGV.delete('-v') or ARGV.delete('--version')
36
10
  puts Rumai::VERSION
37
11
  exit
38
12
  end
39
13
 
40
- # start IRB session
41
14
  require 'rumai/irb'
42
15
  require 'irb/completion'
43
-
44
16
  IRB.start_session Rumai
data/lib/rumai/fs.rb CHANGED
@@ -15,11 +15,11 @@ module Rumai
15
15
  IXP_AGENT = IXP::Agent.new(UNIXSocket.new(IXP_SOCK_ADDR))
16
16
 
17
17
  rescue => error
18
- error.message <<EOF
18
+ error.message << %{\n
19
19
  Ensure that (1) the WMII_ADDRESS environment variable is set and that (2) it
20
20
  correctly specifies the absolute filesystem path to wmii's IXP socket file,
21
- which is typically located at "/tmp/ns.$USER.:$DISPLAY/wmii".
22
- EOF
21
+ which is typically located at "/tmp/ns.${USER}.${DISPLAY}/wmii".
22
+ \n}
23
23
  raise error
24
24
  end
25
25
 
data/lib/rumai/inochi.rb CHANGED
@@ -18,12 +18,12 @@ module Rumai
18
18
  ##
19
19
  # Number of this release of this project.
20
20
  #
21
- VERSION = '3.3.0'
21
+ VERSION = '3.3.1'
22
22
 
23
23
  ##
24
24
  # Date of this release of this project.
25
25
  #
26
- RELDATE = '2010-07-16'
26
+ RELDATE = '2010-08-11'
27
27
 
28
28
  ##
29
29
  # Description of this release of this project.
@@ -44,14 +44,14 @@ module Rumai
44
44
  #
45
45
  # RUNTIME = {
46
46
  # # this project needs exactly version 1.2.3 of the "an_example" gem
47
- # "an_example" => [ "1.2.3" ],
47
+ # 'an_example' => [ '1.2.3' ],
48
48
  #
49
49
  # # this project needs at least version 1.2 (but not
50
50
  # # version 1.2.4 or newer) of the "another_example" gem
51
- # "another_example" => [ ">= 1.2" , "< 1.2.4" ],
51
+ # 'another_example' => [ '>= 1.2' , '< 1.2.4' ],
52
52
  #
53
53
  # # this project needs any version of the "yet_another_example" gem
54
- # "yet_another_example" => [],
54
+ # 'yet_another_example' => [],
55
55
  # }
56
56
  #
57
57
  RUNTIME = {}
@@ -63,23 +63,23 @@ module Rumai
63
63
  #
64
64
  # DEVTIME = {
65
65
  # # this project needs exactly version 1.2.3 of the "an_example" gem
66
- # "an_example" => [ "1.2.3" ],
66
+ # 'an_example' => [ '1.2.3' ],
67
67
  #
68
68
  # # this project needs at least version 1.2 (but not
69
69
  # # version 1.2.4 or newer) of the "another_example" gem
70
- # "another_example" => [ ">= 1.2" , "< 1.2.4" ],
70
+ # 'another_example' => [ '>= 1.2' , '< 1.2.4' ],
71
71
  #
72
72
  # # this project needs any version of the "yet_another_example" gem
73
73
  # "yet_another_example" => [],
74
74
  # }
75
75
  #
76
76
  DEVTIME = {
77
- 'inochi' => [ '>= 3.0.0', '< 4' ],
78
- 'dfect' => [ '~> 2' ], # for unit testing
77
+ 'inochi' => [ '>= 5.0.2', '< 6' ],
78
+ 'detest' => [ '>= 3.1.0', '< 4' ], # for unit testing
79
79
  }
80
80
 
81
81
  # establish gem version dependencies
82
- if respond_to? :gem
82
+ if respond_to? :gem, true
83
83
  [RUNTIME, DEVTIME].each do |deps|
84
84
  deps.each do |gem_name, gem_version|
85
85
  begin
data/man/man1/rumai.1 ADDED
@@ -0,0 +1,1956 @@
1
+ '\" t
2
+ .\" Title: rumai
3
+ .\" Author: [see the "AUTHORS" section]
4
+ .\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
5
+ .\" Date: 08/11/2010
6
+ .\" Manual: \ \&
7
+ .\" Source: \ \& 3.3.1
8
+ .\" Language: English
9
+ .\"
10
+ .TH "RUMAI" "1" "08/11/2010" "\ \& 3\&.3\&.1" "\ \&"
11
+ .\" -----------------------------------------------------------------
12
+ .\" * set default formatting
13
+ .\" -----------------------------------------------------------------
14
+ .\" disable hyphenation
15
+ .nh
16
+ .\" disable justification (adjust text to left margin only)
17
+ .ad l
18
+ .\" -----------------------------------------------------------------
19
+ .\" * MAIN CONTENT STARTS HERE *
20
+ .\" -----------------------------------------------------------------
21
+ .SH "NAME"
22
+ rumai \- Ruby interface to the wmii window manager
23
+ .SH "SYNOPSIS"
24
+ .sp
25
+ \fBrumai\fR [\fIOPTIONS\fR] [\fIIRB_OPTIONS\fR]
26
+ .SS "Command"
27
+ .sp
28
+ Starts an interactive Ruby shell (IRB) session by passing the given \fIIRB_OPTIONS\fR to irb(1) and placing you at a command prompt like this:
29
+ .sp
30
+ .nf
31
+ irb(Rumai):001:0>
32
+ .fi
33
+ .sp
34
+ The \fBirb(Rumai)\fR token in the command prompt indicates that your commands will be evaluated \fIinside\fR the Rumai module\&. As a result, you can omit the "Rumai" prefix from your commands\&.
35
+ .sp
36
+ For example, to get the currently selected client, you can type curr_client instead of Rumai\&.curr_client at the prompt\&. Both commands achieve the same effect\&.
37
+ .sp
38
+ The next thing to notice is that \fBTAB completion\fR is enabled\&. So you can type part of a command and press the TAB key to see a list of possible completions\&.
39
+ .SS "Options"
40
+ .PP
41
+ \fB\-h\fR, \fB\-\-help\fR
42
+ .RS 4
43
+ Display this manual and exit\&.
44
+ .RE
45
+ .PP
46
+ \fB\-v\fR, \fB\-\-version\fR
47
+ .RS 4
48
+ Print version number and exit\&.
49
+ .RE
50
+ .SH "DESCRIPTION"
51
+ .sp
52
+ Rumai is a pure [Ruby] interface to the [wmii] window manager\&. Its name is a portmanteau of "\fBRu\fRby" and "w\fBmi\fRi", which I pronounce as "vim eye"\&.
53
+ .SS "Features"
54
+ .sp
55
+ .RS 4
56
+ .ie n \{\
57
+ \h'-04'\(bu\h'+03'\c
58
+ .\}
59
+ .el \{\
60
+ .sp -1
61
+ .IP \(bu 2.3
62
+ .\}
63
+ Provides an interactive shell for live experimentation\&.
64
+ .RE
65
+ .sp
66
+ .RS 4
67
+ .ie n \{\
68
+ \h'-04'\(bu\h'+03'\c
69
+ .\}
70
+ .el \{\
71
+ .sp -1
72
+ .IP \(bu 2.3
73
+ .\}
74
+ Arranges clients, columns, views, and tags dynamically\&.
75
+ .RE
76
+ .sp
77
+ .RS 4
78
+ .ie n \{\
79
+ \h'-04'\(bu\h'+03'\c
80
+ .\}
81
+ .el \{\
82
+ .sp -1
83
+ .IP \(bu 2.3
84
+ .\}
85
+ Talks directly to wmii\(cqs
86
+ IXP filesystem interface\&.
87
+ .RE
88
+ .sp
89
+ .RS 4
90
+ .ie n \{\
91
+ \h'-04'\(bu\h'+03'\c
92
+ .\}
93
+ .el \{\
94
+ .sp -1
95
+ .IP \(bu 2.3
96
+ .\}
97
+ Includes a pure Ruby client for the
98
+ 9P2000 protocol\&.
99
+ .RE
100
+ .sp
101
+ .RS 4
102
+ .ie n \{\
103
+ \h'-04'\(bu\h'+03'\c
104
+ .\}
105
+ .el \{\
106
+ .sp -1
107
+ .IP \(bu 2.3
108
+ .\}
109
+ Powers
110
+ \m[blue]\fBmy personal\fR\m[]\&\s-2\u[1]\d\s+2
111
+ wmiirc and
112
+ \m[blue]\fBmany others\fR\m[]\&\s-2\u[2]\d\s+2
113
+ like it\&.
114
+ .RE
115
+ .SS "Resources"
116
+ .PP
117
+ Project website
118
+ .RS 4
119
+
120
+ \m[blue]\fBhttp://snk\&.tuxfamily\&.org/lib/rumai/\fR\m[]
121
+ .RE
122
+ .PP
123
+ Announcements feed
124
+ .RS 4
125
+
126
+ \m[blue]\fBhttp://snk\&.tuxfamily\&.org/lib/rumai/ann\&.xml\fR\m[]
127
+ .RE
128
+ .PP
129
+ API documentation
130
+ .RS 4
131
+
132
+ \m[blue]\fBhttp://snk\&.tuxfamily\&.org/lib/rumai/api/\fR\m[]
133
+ .RE
134
+ .PP
135
+ Source code (browse online, download, or checkout)
136
+ .RS 4
137
+
138
+ \m[blue]\fBhttp://github\&.com/sunaku/rumai\fR\m[]
139
+ .RE
140
+ .PP
141
+ Issue tracker (report bugs, request features, get help)
142
+ .RS 4
143
+
144
+ \m[blue]\fBhttp://github\&.com/sunaku/rumai/issues\fR\m[]
145
+ .RE
146
+ .SH "INSTALL"
147
+ .SS "Prerequisites"
148
+ .sp
149
+ .RS 4
150
+ .ie n \{\
151
+ \h'-04'\(bu\h'+03'\c
152
+ .\}
153
+ .el \{\
154
+ .sp -1
155
+ .IP \(bu 2.3
156
+ .\}
157
+
158
+ [Ruby]
159
+ 1\&.8\&.6 or newer\&.
160
+ .RE
161
+ .sp
162
+ .RS 4
163
+ .ie n \{\
164
+ \h'-04'\(bu\h'+03'\c
165
+ .\}
166
+ .el \{\
167
+ .sp -1
168
+ .IP \(bu 2.3
169
+ .\}
170
+
171
+ [RubyGems]
172
+ 1\&.3\&.6 or newer\&.
173
+ .RE
174
+ .sp
175
+ .RS 4
176
+ .ie n \{\
177
+ \h'-04'\(bu\h'+03'\c
178
+ .\}
179
+ .el \{\
180
+ .sp -1
181
+ .IP \(bu 2.3
182
+ .\}
183
+
184
+ [wmii]
185
+ 3\&.9 or newer\&.
186
+ .RE
187
+ .SS "Installing"
188
+ .sp
189
+ .if n \{\
190
+ .RS 4
191
+ .\}
192
+ .nf
193
+ gem install rumai
194
+ .fi
195
+ .if n \{\
196
+ .RE
197
+ .\}
198
+ .SS "Upgrading"
199
+ .sp
200
+ .if n \{\
201
+ .RS 4
202
+ .\}
203
+ .nf
204
+ gem update rumai
205
+ .fi
206
+ .if n \{\
207
+ .RE
208
+ .\}
209
+ .SS "Removing"
210
+ .sp
211
+ .if n \{\
212
+ .RS 4
213
+ .\}
214
+ .nf
215
+ gem uninstall rumai
216
+ .fi
217
+ .if n \{\
218
+ .RE
219
+ .\}
220
+ .SH "USAGE"
221
+ .sp
222
+ Now that you know how to start the interactive shell (see \fBDESCRIPTION\fR above) let us walk through a series of examples that highlight the main features of Rumai\&. You can follow along by copying & pasting the presented commands into the interactive shell\&.
223
+ .SS "Automated client arrangement"
224
+ .sp
225
+ Launch a few terminals so that we have something to work with:
226
+ .sp
227
+ .if n \{\
228
+ .RS 4
229
+ .\}
230
+ .nf
231
+ colors = %w[ red green blue black orange brown gray navy gold ]
232
+ colors\&.each {|c| system "xterm \-bg #{c} \-title #{c} \-e sh \-c read &" }
233
+ .fi
234
+ .if n \{\
235
+ .RE
236
+ .\}
237
+ .sp
238
+ Arrange all clients in a grid:
239
+ .sp
240
+ .if n \{\
241
+ .RS 4
242
+ .\}
243
+ .nf
244
+ curr_view\&.arrange_in_grid
245
+ .fi
246
+ .if n \{\
247
+ .RE
248
+ .\}
249
+ .sp
250
+ Arrange all clients in a diamond shape:
251
+ .sp
252
+ .if n \{\
253
+ .RS 4
254
+ .\}
255
+ .nf
256
+ curr_view\&.arrange_in_diamond
257
+ .fi
258
+ .if n \{\
259
+ .RE
260
+ .\}
261
+ .sp
262
+ Arrange all clients like LarsWM does:
263
+ .sp
264
+ .if n \{\
265
+ .RS 4
266
+ .\}
267
+ .nf
268
+ curr_view\&.arrange_as_larswm
269
+ .fi
270
+ .if n \{\
271
+ .RE
272
+ .\}
273
+ .sp
274
+ Close the terminals we launched earlier:
275
+ .sp
276
+ .if n \{\
277
+ .RS 4
278
+ .\}
279
+ .nf
280
+ terms = curr_view\&.clients\&.select {|c| colors\&.include? c\&.label\&.read }
281
+ terms\&.each {|c| c\&.kill }
282
+ .fi
283
+ .if n \{\
284
+ .RE
285
+ .\}
286
+ .SS "Multiple client grouping"
287
+ .sp
288
+ Launch a few terminals so that we have something to work with:
289
+ .sp
290
+ .if n \{\
291
+ .RS 4
292
+ .\}
293
+ .nf
294
+ colors = %w[ red green blue black orange brown gray navy gold ]
295
+ colors\&.each {|c| system "xterm \-bg #{c} \-title #{c} \-e sh \-c read &" }
296
+ .fi
297
+ .if n \{\
298
+ .RE
299
+ .\}
300
+ .sp
301
+ Add the red, green, and blue terminals into the "grouping":
302
+ .sp
303
+ .if n \{\
304
+ .RS 4
305
+ .\}
306
+ .nf
307
+ terms = curr_view\&.clients\&.select do |c|
308
+ %w[red green blue]\&.include? c\&.label\&.read
309
+ end
310
+ terms\&.each {|c| c\&.group }
311
+ .fi
312
+ .if n \{\
313
+ .RE
314
+ .\}
315
+ .sp
316
+ You should now see a new button labelled as "@" on the left\-hand side of wmii\(cqs bar, indicating that there is now a new view labelled "@" in wmii\&. Let us inspect what clients this mysterious view contains:
317
+ .sp
318
+ .if n \{\
319
+ .RS 4
320
+ .\}
321
+ .nf
322
+ v = View\&.new "@"
323
+ puts v\&.clients\&.map {|c| c\&.label\&.read }
324
+ .fi
325
+ .if n \{\
326
+ .RE
327
+ .\}
328
+ .sp
329
+ Aha! The mysterious view contains the red, green, and blue clients we recently "grouped"\&. Thus, by adding a client to the "grouping", we are simply tagging the client with the "@" token\&.
330
+ .sp
331
+ Now that we have put some clients into the "grouping", let us move all clients in the grouping to the floating area in the current view:
332
+ .sp
333
+ .if n \{\
334
+ .RS 4
335
+ .\}
336
+ .nf
337
+ grouping\&.each {|c| c\&.send "toggle" }
338
+ .fi
339
+ .if n \{\
340
+ .RE
341
+ .\}
342
+ .sp
343
+ Neat! Let us bring them back into the managed area:
344
+ .sp
345
+ .if n \{\
346
+ .RS 4
347
+ .\}
348
+ .nf
349
+ grouping\&.each {|c| c\&.send "toggle" }
350
+ .fi
351
+ .if n \{\
352
+ .RE
353
+ .\}
354
+ .sp
355
+ Close the terminals we launched earlier:
356
+ .sp
357
+ .if n \{\
358
+ .RS 4
359
+ .\}
360
+ .nf
361
+ terms = curr_view\&.clients\&.select {|c| colors\&.include? c\&.label\&.read }
362
+ terms\&.each {|c| c\&.kill }
363
+ .fi
364
+ .if n \{\
365
+ .RE
366
+ .\}
367
+ .sp
368
+ In summary, you can select multiple clients (by adding them to the "grouping") and perform operations on them\&. This is useful when you want to do something with a group of clients but do not want to manually focus one, perform the action, focus the next one, and so on\&.
369
+ .sp
370
+ Another important aspect is that selected clients stay selected until they are unselected\&. This allows you to continue performing tasks on the selection without having to reselect the same clients after every operation\&.
371
+ .SS "Easy column manipulation"
372
+ .sp
373
+ Launch a few terminals so that we have something to work with:
374
+ .sp
375
+ .if n \{\
376
+ .RS 4
377
+ .\}
378
+ .nf
379
+ colors = %w[ red green blue black orange brown gray navy gold ]
380
+ colors\&.each {|c| system "xterm \-bg #{c} \-title #{c} \-e sh \-c read &" }
381
+ .fi
382
+ .if n \{\
383
+ .RE
384
+ .\}
385
+ .sp
386
+ You can insert a group of clients to the top, bottom, or after the currently focused client of \fIany\fR column using Array\-like methods\&.
387
+ .sp
388
+ Give each client its own column (one client per column):
389
+ .sp
390
+ .if n \{\
391
+ .RS 4
392
+ .\}
393
+ .nf
394
+ curr_view\&.each_column {|c| c\&.length = 1 }
395
+ .fi
396
+ .if n \{\
397
+ .RE
398
+ .\}
399
+ .sp
400
+ Put (at most) three clients in every column:
401
+ .sp
402
+ .if n \{\
403
+ .RS 4
404
+ .\}
405
+ .nf
406
+ curr_view\&.each_column {|c| c\&.length = 3 }
407
+ .fi
408
+ .if n \{\
409
+ .RE
410
+ .\}
411
+ .sp
412
+ Move the red, green, and blue clients into the floating area:
413
+ .sp
414
+ .if n \{\
415
+ .RS 4
416
+ .\}
417
+ .nf
418
+ rgb = %w[red green blue]
419
+ terms = curr_view\&.clients\&.select {|c| rgb\&.include? c\&.label\&.read }
420
+ curr_view\&.areas[0]\&.push terms
421
+ .fi
422
+ .if n \{\
423
+ .RE
424
+ .\}
425
+ .sp
426
+ Slurp all floating clients into the last column:
427
+ .sp
428
+ .if n \{\
429
+ .RS 4
430
+ .\}
431
+ .nf
432
+ list = curr_view\&.areas
433
+ a, b = list\&.first, list\&.last
434
+ b\&.concat a
435
+ .fi
436
+ .if n \{\
437
+ .RE
438
+ .\}
439
+ .sp
440
+ Set the last column\(cqs layout to stacking mode:
441
+ .sp
442
+ .if n \{\
443
+ .RS 4
444
+ .\}
445
+ .nf
446
+ b\&.layout = \'stack\'
447
+ .fi
448
+ .if n \{\
449
+ .RE
450
+ .\}
451
+ .sp
452
+ Move the red, green, and blue clients to the top of the second column:
453
+ .sp
454
+ .if n \{\
455
+ .RS 4
456
+ .\}
457
+ .nf
458
+ curr_view\&.areas[2]\&.unshift terms
459
+ .fi
460
+ .if n \{\
461
+ .RE
462
+ .\}
463
+ .sp
464
+ Move the red, green, and blue clients to the bottom of the third column:
465
+ .sp
466
+ .if n \{\
467
+ .RS 4
468
+ .\}
469
+ .nf
470
+ curr_view\&.areas[3]\&.push terms
471
+ .fi
472
+ .if n \{\
473
+ .RE
474
+ .\}
475
+ .sp
476
+ Close the terminals we launched earlier:
477
+ .sp
478
+ .if n \{\
479
+ .RS 4
480
+ .\}
481
+ .nf
482
+ terms = curr_view\&.clients\&.select {|c| colors\&.include? c\&.label\&.read }
483
+ terms\&.each {|c| c\&.kill }
484
+ .fi
485
+ .if n \{\
486
+ .RE
487
+ .\}
488
+ .SS "Easy client manipulation"
489
+ .sp
490
+ Launch a few terminals so that we have something to work with:
491
+ .sp
492
+ .if n \{\
493
+ .RS 4
494
+ .\}
495
+ .nf
496
+ colors = %w[ red green blue black orange brown gray navy gold ]
497
+ colors\&.each {|c| system "xterm \-bg #{c} \-title #{c} \-e sh \-c read &" }
498
+ .fi
499
+ .if n \{\
500
+ .RE
501
+ .\}
502
+ .sp
503
+ Obtain a reference to the red client:
504
+ .sp
505
+ .if n \{\
506
+ .RS 4
507
+ .\}
508
+ .nf
509
+ red = curr_view\&.clients\&.find {|c| c\&.label\&.read == "red" }
510
+ .fi
511
+ .if n \{\
512
+ .RE
513
+ .\}
514
+ .sp
515
+ Show the red client\(cqs current tags:
516
+ .sp
517
+ .if n \{\
518
+ .RS 4
519
+ .\}
520
+ .nf
521
+ red\&.tags
522
+ .fi
523
+ .if n \{\
524
+ .RE
525
+ .\}
526
+ .sp
527
+ Add the "foo" and "bar" tags to the red client:
528
+ .sp
529
+ .if n \{\
530
+ .RS 4
531
+ .\}
532
+ .nf
533
+ red\&.tag "foo", "bar"
534
+ .fi
535
+ .if n \{\
536
+ .RE
537
+ .\}
538
+ .sp
539
+ Remove the "bar" tag from the red client:
540
+ .sp
541
+ .if n \{\
542
+ .RS 4
543
+ .\}
544
+ .nf
545
+ red\&.untag "bar"
546
+ .fi
547
+ .if n \{\
548
+ .RE
549
+ .\}
550
+ .sp
551
+ Do complex operations on the red client\(cqs tags:
552
+ .sp
553
+ .if n \{\
554
+ .RS 4
555
+ .\}
556
+ .nf
557
+ red\&.with_tags { concat %w[a b c]; push \'z\'; delete \'c\' }
558
+ .fi
559
+ .if n \{\
560
+ .RE
561
+ .\}
562
+ .sp
563
+ Focus the next client after the red client:
564
+ .sp
565
+ .if n \{\
566
+ .RS 4
567
+ .\}
568
+ .nf
569
+ red\&.next\&.focus
570
+ curr_client == red\&.next #=> true
571
+ .fi
572
+ .if n \{\
573
+ .RE
574
+ .\}
575
+ .sp
576
+ Notice that by focusing a client, we make it the current client\&.
577
+ .sp
578
+ Focus the red client on a different view:
579
+ .sp
580
+ .if n \{\
581
+ .RS 4
582
+ .\}
583
+ .nf
584
+ orig = curr_view
585
+ v = red\&.views\&.last
586
+ red\&.focus v
587
+ .fi
588
+ .if n \{\
589
+ .RE
590
+ .\}
591
+ .sp
592
+ Return to the original view:
593
+ .sp
594
+ .if n \{\
595
+ .RS 4
596
+ .\}
597
+ .nf
598
+ orig\&.focus
599
+ .fi
600
+ .if n \{\
601
+ .RE
602
+ .\}
603
+ .sp
604
+ Send the red client to the last column:
605
+ .sp
606
+ .if n \{\
607
+ .RS 4
608
+ .\}
609
+ .nf
610
+ red\&.send curr_view\&.areas\&.last
611
+ .fi
612
+ .if n \{\
613
+ .RE
614
+ .\}
615
+ .sp
616
+ Close the terminals we launched earlier:
617
+ .sp
618
+ .if n \{\
619
+ .RS 4
620
+ .\}
621
+ .nf
622
+ terms = curr_view\&.clients\&.select {|c| colors\&.include? c\&.label\&.read }
623
+ terms\&.each {|c| c\&.kill }
624
+ .fi
625
+ .if n \{\
626
+ .RE
627
+ .\}
628
+ .SS "Traversing the file system"
629
+ .sp
630
+ Show the root node of wmii\(cqs IXP file system:
631
+ .sp
632
+ .if n \{\
633
+ .RS 4
634
+ .\}
635
+ .nf
636
+ fs
637
+ .fi
638
+ .if n \{\
639
+ .RE
640
+ .\}
641
+ .sp
642
+ Show the names of all files at the root level:
643
+ .sp
644
+ .if n \{\
645
+ .RS 4
646
+ .\}
647
+ .nf
648
+ fs\&.entries
649
+ .fi
650
+ .if n \{\
651
+ .RE
652
+ .\}
653
+ .sp
654
+ Show the parent of the root node:
655
+ .sp
656
+ .if n \{\
657
+ .RS 4
658
+ .\}
659
+ .nf
660
+ fs\&.parent
661
+ .fi
662
+ .if n \{\
663
+ .RE
664
+ .\}
665
+ .sp
666
+ Show the children of the root node:
667
+ .sp
668
+ .if n \{\
669
+ .RS 4
670
+ .\}
671
+ .nf
672
+ fs\&.children
673
+ .fi
674
+ .if n \{\
675
+ .RE
676
+ .\}
677
+ .sp
678
+ Navigate into to the /lbar/ directory:
679
+ .sp
680
+ .if n \{\
681
+ .RS 4
682
+ .\}
683
+ .nf
684
+ n1 = fs\&.lbar
685
+ n2 = fs[\'lbar\']
686
+ n1 == n2 #=> true
687
+ left_bar = n1
688
+ .fi
689
+ .if n \{\
690
+ .RE
691
+ .\}
692
+ .sp
693
+ Notice that you can traverse the file system hierarchy by simply calling methods on node objects\&. Alternatively, you can traverse by specifying an arbitrary sub\-path (relative path) using the [] operator on a node\&.
694
+ .sp
695
+ Create a new temporary button:
696
+ .sp
697
+ .if n \{\
698
+ .RS 4
699
+ .\}
700
+ .nf
701
+ b = left_bar\&.rumai_example # path of new button
702
+ b\&.exist? #=> false
703
+ b\&.create
704
+ b\&.exist? #=> true
705
+ .fi
706
+ .if n \{\
707
+ .RE
708
+ .\}
709
+ .sp
710
+ You should now see an empty button on the left\-hand side of the wmii bar\&.
711
+ .sp
712
+ Color the button black\-on\-white and label it as "hello world":
713
+ .sp
714
+ .if n \{\
715
+ .RS 4
716
+ .\}
717
+ .nf
718
+ content = "#000000 #ffffff #000000 hello world"
719
+ b\&.write content
720
+ b\&.read == content #=> true
721
+ .fi
722
+ .if n \{\
723
+ .RE
724
+ .\}
725
+ .sp
726
+ Remove the temporary button:
727
+ .sp
728
+ .if n \{\
729
+ .RS 4
730
+ .\}
731
+ .nf
732
+ b\&.remove
733
+ b\&.exist? #=> false
734
+ .fi
735
+ .if n \{\
736
+ .RE
737
+ .\}
738
+ .SH "HACKING"
739
+ .SS "Prerequisites"
740
+ .sp
741
+ Install Ruby libraries necessary for development:
742
+ .sp
743
+ .if n \{\
744
+ .RS 4
745
+ .\}
746
+ .nf
747
+ gem install rumai \-\-development
748
+ .fi
749
+ .if n \{\
750
+ .RE
751
+ .\}
752
+ .SS "Infrastructure"
753
+ .sp
754
+ [Inochi] serves as the project infrastructure for Rumai\&. It handles tasks such as building this help manual and API documentation, and packaging, announcing, and publishing new releases\&. See its help manual and list of tasks to get started:
755
+ .sp
756
+ .if n \{\
757
+ .RS 4
758
+ .\}
759
+ .nf
760
+ inochi \-\-help # display help manual
761
+ inochi \-\-tasks # list available tasks
762
+ .fi
763
+ .if n \{\
764
+ .RE
765
+ .\}
766
+ .SS "$LOAD_PATH setup"
767
+ .sp
768
+ Ensure that the lib/ directory is listed in Ruby\(cqs $LOAD_PATH before you use any libraries therein or run any executables in the bin/ directory\&.
769
+ .sp
770
+ This can be achieved by passing an option to Ruby:
771
+ .sp
772
+ .if n \{\
773
+ .RS 4
774
+ .\}
775
+ .nf
776
+ ruby \-Ilib bin/rumai
777
+ irb \-Ilib \-r rumai
778
+ .fi
779
+ .if n \{\
780
+ .RE
781
+ .\}
782
+ .sp
783
+ Or by setting the $RUBYLIB environment variable:
784
+ .sp
785
+ .if n \{\
786
+ .RS 4
787
+ .\}
788
+ .nf
789
+ export RUBYLIB=lib # bash, ksh, zsh
790
+ setenv RUBYLIB lib # csh
791
+ set \-x RUBYLIB lib # fish
792
+
793
+ ruby bin/rumai
794
+ irb \-r rumai
795
+ .fi
796
+ .if n \{\
797
+ .RE
798
+ .\}
799
+ .sp
800
+ Or by running Ruby through the \m[blue]\fBruby\-wrapper\fR\m[]\&\s-2\u[3]\d\s+2 tool\&.
801
+ .SS "RubyGems setup"
802
+ .sp
803
+ If you use Ruby 1\&.8 or older, then ensure that RubyGems is activated before you use any libraries in the lib/ directory or run any executables in the bin/ directory\&.
804
+ .sp
805
+ This can be achieved by passing an option to Ruby:
806
+ .sp
807
+ .if n \{\
808
+ .RS 4
809
+ .\}
810
+ .nf
811
+ ruby \-rubygems bin/rumai
812
+ irb \-rubygems \-r rumai
813
+ .fi
814
+ .if n \{\
815
+ .RE
816
+ .\}
817
+ .sp
818
+ Or by setting the $RUBYOPT environment variable:
819
+ .sp
820
+ .if n \{\
821
+ .RS 4
822
+ .\}
823
+ .nf
824
+ export RUBYOPT=\-rubygems # bash, ksh, zsh
825
+ setenv RUBYOPT \-rubygems # csh
826
+ set \-x RUBYOPT \-rubygems # fish
827
+ .fi
828
+ .if n \{\
829
+ .RE
830
+ .\}
831
+ .SS "Running tests"
832
+ .sp
833
+ Simply execute the included test runner, which sets up Ruby\(cqs $LOAD_PATH for testing, loads the test/helper\&.rb file, and then evaluates all test/**/*_test\&.rb files:
834
+ .sp
835
+ .if n \{\
836
+ .RS 4
837
+ .\}
838
+ .nf
839
+ ruby test/runner
840
+ .fi
841
+ .if n \{\
842
+ .RE
843
+ .\}
844
+ .sp
845
+ Its exit status will indicate whether all tests have passed\&. It may also print additional pass/fail information depending on the testing library used in the test/helper\&.rb file\&.
846
+ .SS "Contributing"
847
+ .sp
848
+ \m[blue]\fBFork this project on GitHub\fR\m[] and send a pull request\&.
849
+ .SH "HISTORY"
850
+ .SS "Version 3\&.3\&.1 (2010\-08\-11)"
851
+ .sp
852
+ This release fixes a bug regarding the $WMII_ADDRESS environment variable\&.
853
+ .PP
854
+ \fBBug fixes\fR
855
+ .sp
856
+ .RS 4
857
+ .ie n \{\
858
+ \h'-04'\(bu\h'+03'\c
859
+ .\}
860
+ .el \{\
861
+ .sp -1
862
+ .IP \(bu 2.3
863
+ .\}
864
+ Fix incorrect syntax when amending error message about the
865
+ $WMII_ADDRESS
866
+ environment variable not being set\&.
867
+ .RE
868
+ .PP
869
+ \fBHousekeeping\fR
870
+ .sp
871
+ .RS 4
872
+ .ie n \{\
873
+ \h'-04'\(bu\h'+03'\c
874
+ .\}
875
+ .el \{\
876
+ .sp -1
877
+ .IP \(bu 2.3
878
+ .\}
879
+ Dump 9P2000 packets if
880
+ $VERBOSE, not if
881
+ $DEBUG, in unit tests\&.
882
+ .RE
883
+ .sp
884
+ .RS 4
885
+ .ie n \{\
886
+ \h'-04'\(bu\h'+03'\c
887
+ .\}
888
+ .el \{\
889
+ .sp -1
890
+ .IP \(bu 2.3
891
+ .\}
892
+ Upgrade to Inochi 5\&.0\&.2; the help manual is now written in AsciiDoc\&.
893
+ .RE
894
+ .SS "Version 3\&.3\&.0 (2010\-07\-16)"
895
+ .sp
896
+ This release adds support for growing and nudging clients, adds an abstraction for status bar applets, and beautifies the source code\&.
897
+ .PP
898
+ \fBNew features\fR
899
+ .sp
900
+ .RS 4
901
+ .ie n \{\
902
+ \h'-04'\(bu\h'+03'\c
903
+ .\}
904
+ .el \{\
905
+ .sp -1
906
+ .IP \(bu 2.3
907
+ .\}
908
+ Add
909
+ Rumai::Barlet
910
+ class for easier status bar applets\&. It exposes the new, independent
911
+ colors
912
+ and
913
+ label
914
+ attributes introduced into the bar file format by wmii\-hg2743\&. It is also backwards\-compatible with older wmii versions where the aforementioned attributes were conjoined\&.
915
+ .RE
916
+ .sp
917
+ .RS 4
918
+ .ie n \{\
919
+ \h'-04'\(bu\h'+03'\c
920
+ .\}
921
+ .el \{\
922
+ .sp -1
923
+ .IP \(bu 2.3
924
+ .\}
925
+ Add
926
+ Rumai::Client#grow
927
+ and
928
+ Rumai::Client#nudge
929
+ methods
930
+ \m[blue]\fBrequested by Nathan Neff\fR\m[]\&\s-2\u[4]\d\s+2\&. See "The /tag/ Hierarchy" in the wmii manpage for usage information\&.
931
+ .RE
932
+ .PP
933
+ \fBBug fixes\fR
934
+ .sp
935
+ .RS 4
936
+ .ie n \{\
937
+ \h'-04'\(bu\h'+03'\c
938
+ .\}
939
+ .el \{\
940
+ .sp -1
941
+ .IP \(bu 2.3
942
+ .\}
943
+ Add workaround for the
944
+ \m[blue]\fBwmii\-hg2734 color tuple bug\fR\m[]\&\s-2\u[5]\d\s+2
945
+ in the test suite\&.
946
+ .RE
947
+ .PP
948
+ \fBHousekeeping\fR
949
+ .sp
950
+ .RS 4
951
+ .ie n \{\
952
+ \h'-04'\(bu\h'+03'\c
953
+ .\}
954
+ .el \{\
955
+ .sp -1
956
+ .IP \(bu 2.3
957
+ .\}
958
+ Found real names for some anonymous contributors\&.
959
+ .RE
960
+ .sp
961
+ .RS 4
962
+ .ie n \{\
963
+ \h'-04'\(bu\h'+03'\c
964
+ .\}
965
+ .el \{\
966
+ .sp -1
967
+ .IP \(bu 2.3
968
+ .\}
969
+ Clean up the source code formatting and organization\&.
970
+ .RE
971
+ .SS "Version 3\&.2\&.4 (2010\-06\-06)"
972
+ .sp
973
+ This release fixes an IXP transport layer bug under Ruby 1\&.8\&.7\&.
974
+ .PP
975
+ \fBBug fixes\fR
976
+ .sp
977
+ .RS 4
978
+ .ie n \{\
979
+ \h'-04'\(bu\h'+03'\c
980
+ .\}
981
+ .el \{\
982
+ .sp -1
983
+ .IP \(bu 2.3
984
+ .\}
985
+
986
+ IO#ungetc
987
+ does not accept a one\-character string in Ruby 1\&.8\&.7\&. Thanks to Sebastian Chmielewski for reporting
988
+ \m[blue]\fBthis issue\fR\m[]\&\s-2\u[6]\d\s+2\&.
989
+ .RE
990
+ .SS "Version 3\&.2\&.3 (2010\-04\-28)"
991
+ .sp
992
+ This release adds a UNIX manual page and requires wmii 3\&.9 or newer\&.
993
+ .PP
994
+ \fBBug fixes\fR
995
+ .sp
996
+ .RS 4
997
+ .ie n \{\
998
+ \h'-04'\(bu\h'+03'\c
999
+ .\}
1000
+ .el \{\
1001
+ .sp -1
1002
+ .IP \(bu 2.3
1003
+ .\}
1004
+
1005
+ Rumai::Area#unshift
1006
+ needs wmii 3\&.9 or newer\&. The help manual has been corrected accordingly\&. Thanks to Mattia Gheda for reporting
1007
+ \m[blue]\fBthis issue\fR\m[]\&\s-2\u[7]\d\s+2\&.
1008
+ .RE
1009
+ .PP
1010
+ \fBHousekeeping\fR
1011
+ .sp
1012
+ .RS 4
1013
+ .ie n \{\
1014
+ \h'-04'\(bu\h'+03'\c
1015
+ .\}
1016
+ .el \{\
1017
+ .sp -1
1018
+ .IP \(bu 2.3
1019
+ .\}
1020
+ Upgrade to Inochi 3\&.0\&.0\&. Run
1021
+ rumai \-\-help
1022
+ to see the UNIX manual page!
1023
+ .RE
1024
+ .sp
1025
+ .RS 4
1026
+ .ie n \{\
1027
+ \h'-04'\(bu\h'+03'\c
1028
+ .\}
1029
+ .el \{\
1030
+ .sp -1
1031
+ .IP \(bu 2.3
1032
+ .\}
1033
+ Move IRB session creation code from rumai(1) into
1034
+ rumai/irb
1035
+ sub\-library\&.
1036
+ .RE
1037
+ .SS "Version 3\&.2\&.2 (2010\-04\-01)"
1038
+ .sp
1039
+ This release fixes some warnings that appeared during installation and performs some minor housekeeping\&.
1040
+ .PP
1041
+ \fBBug fixes\fR
1042
+ .sp
1043
+ .RS 4
1044
+ .ie n \{\
1045
+ \h'-04'\(bu\h'+03'\c
1046
+ .\}
1047
+ .el \{\
1048
+ .sp -1
1049
+ .IP \(bu 2.3
1050
+ .\}
1051
+ Warnings of the following form appeared during gem installation:
1052
+ .sp
1053
+ .if n \{\
1054
+ .RS 4
1055
+ .\}
1056
+ .nf
1057
+ Unrecognized directive \'\&.\&.\&.\' in lib/rumai/inochi\&.yaml
1058
+ .fi
1059
+ .if n \{\
1060
+ .RE
1061
+ .\}
1062
+ .sp
1063
+ Thanks to Mattia Gheda for reporting this\&.
1064
+ .RE
1065
+ .PP
1066
+ \fBHousekeeping\fR
1067
+ .sp
1068
+ .RS 4
1069
+ .ie n \{\
1070
+ \h'-04'\(bu\h'+03'\c
1071
+ .\}
1072
+ .el \{\
1073
+ .sp -1
1074
+ .IP \(bu 2.3
1075
+ .\}
1076
+ Upgrade to Inochi 2\&.0\&.0\-rc2 for managing this project\&.
1077
+ .RE
1078
+ .SS "Version 3\&.2\&.1 (2010\-03\-22)"
1079
+ .sp
1080
+ This release improves multi\-threading support in Rumai\(cqs pure\-Ruby implementation of the IXP file\-system interface\&.
1081
+ .PP
1082
+ \fBThank you\fR
1083
+ .sp
1084
+ .RS 4
1085
+ .ie n \{\
1086
+ \h'-04'\(bu\h'+03'\c
1087
+ .\}
1088
+ .el \{\
1089
+ .sp -1
1090
+ .IP \(bu 2.3
1091
+ .\}
1092
+ Kenneth De Winter reported the issue of status bar applets not refreshing according to their prescribed schedule (this is particularly noticable in the clock applet) and verified my fix for the problem\&.
1093
+ .RE
1094
+ .PP
1095
+ \fBBug fixes\fR
1096
+ .sp
1097
+ .RS 4
1098
+ .ie n \{\
1099
+ \h'-04'\(bu\h'+03'\c
1100
+ .\}
1101
+ .el \{\
1102
+ .sp -1
1103
+ .IP \(bu 2.3
1104
+ .\}
1105
+ Perform a blocking I/O read to recieve a 9P2000 message in
1106
+ Rumai::IXP::Agent#recv
1107
+ only if recieve buffer is empty\&. This gives other threads a chance to check the recieve buffer for their response\&. instead of being blocked by us as we greedily hold on to the 9P2000 message stream until our expected response arrives\&.
1108
+ .RE
1109
+ .PP
1110
+ \fBHousekeeping\fR
1111
+ .sp
1112
+ .RS 4
1113
+ .ie n \{\
1114
+ \h'-04'\(bu\h'+03'\c
1115
+ .\}
1116
+ .el \{\
1117
+ .sp -1
1118
+ .IP \(bu 2.3
1119
+ .\}
1120
+ Upgrade to Inochi 2\&.0\&.0\-rc1 and Dfect 2\&.0\&.0\&.
1121
+ .RE
1122
+ .SS "Version 3\&.2\&.0 (2009\-11\-17)"
1123
+ .sp
1124
+ This release adds a new automated view arrangement, simplifies the IXP transport layer, and cleans up the code and API documentation\&.
1125
+ .PP
1126
+ \fBNew features\fR
1127
+ .sp
1128
+ .RS 4
1129
+ .ie n \{\
1130
+ \h'-04'\(bu\h'+03'\c
1131
+ .\}
1132
+ .el \{\
1133
+ .sp -1
1134
+ .IP \(bu 2.3
1135
+ .\}
1136
+ Add
1137
+ Rumai::View#arrange_in_stacks
1138
+ automated view arrangement\&.
1139
+ .RE
1140
+ .sp
1141
+ .RS 4
1142
+ .ie n \{\
1143
+ \h'-04'\(bu\h'+03'\c
1144
+ .\}
1145
+ .el \{\
1146
+ .sp -1
1147
+ .IP \(bu 2.3
1148
+ .\}
1149
+ Convert
1150
+ :stack
1151
+ and
1152
+ :max
1153
+ arguments into wmii 3\&.9 syntax in
1154
+ Rumai::Area#layout=\&.
1155
+ .RE
1156
+ .PP
1157
+ \fBBug fixes\fR
1158
+ .sp
1159
+ .RS 4
1160
+ .ie n \{\
1161
+ \h'-04'\(bu\h'+03'\c
1162
+ .\}
1163
+ .el \{\
1164
+ .sp -1
1165
+ .IP \(bu 2.3
1166
+ .\}
1167
+ Rewrote IXP transport layer (Rumai::IXP::Agent) to
1168
+ \fInot\fR
1169
+ use a background thread, according to
1170
+ the XCB cookie approach\&.
1171
+ .RE
1172
+ .PP
1173
+ \fBHousekeeping\fR
1174
+ .sp
1175
+ .RS 4
1176
+ .ie n \{\
1177
+ \h'-04'\(bu\h'+03'\c
1178
+ .\}
1179
+ .el \{\
1180
+ .sp -1
1181
+ .IP \(bu 2.3
1182
+ .\}
1183
+ Clean up some code and API docs\&.
1184
+ .RE
1185
+ .sp
1186
+ .RS 4
1187
+ .ie n \{\
1188
+ \h'-04'\(bu\h'+03'\c
1189
+ .\}
1190
+ .el \{\
1191
+ .sp -1
1192
+ .IP \(bu 2.3
1193
+ .\}
1194
+ Reduce amount of string concatenation in
1195
+ Struct#to_9p\&.
1196
+ .RE
1197
+ .SS "Version 3\&.1\&.1 (2009\-11\-16)"
1198
+ .sp
1199
+ This release fixes bugs in automated view arrangements and updates the user manual\&.
1200
+ .PP
1201
+ \fBBug fixes\fR
1202
+ .sp
1203
+ .RS 4
1204
+ .ie n \{\
1205
+ \h'-04'\(bu\h'+03'\c
1206
+ .\}
1207
+ .el \{\
1208
+ .sp -1
1209
+ .IP \(bu 2.3
1210
+ .\}
1211
+ The relative order of clients was not being preserved during view arrangements\&. Thanks to Nathan Neff for reporting this\&.
1212
+ .RE
1213
+ .sp
1214
+ .RS 4
1215
+ .ie n \{\
1216
+ \h'-04'\(bu\h'+03'\c
1217
+ .\}
1218
+ .el \{\
1219
+ .sp -1
1220
+ .IP \(bu 2.3
1221
+ .\}
1222
+ Focus on the current view was lost after automated view arrangement was applied if the current view was not the first view on which the initially focused (before the automated arrangement was applied) client appeared\&.
1223
+ .RE
1224
+ .SS "Version 3\&.1\&.0 (2009\-10\-02)"
1225
+ .sp
1226
+ This release adds new methods, fixes some bugs, and revises the manual\&.
1227
+ .PP
1228
+ \fBNew features\fR
1229
+ .sp
1230
+ .RS 4
1231
+ .ie n \{\
1232
+ \h'-04'\(bu\h'+03'\c
1233
+ .\}
1234
+ .el \{\
1235
+ .sp -1
1236
+ .IP \(bu 2.3
1237
+ .\}
1238
+ Add
1239
+ Client#float
1240
+ methods to manipulate floating status\&.
1241
+ .RE
1242
+ .sp
1243
+ .RS 4
1244
+ .ie n \{\
1245
+ \h'-04'\(bu\h'+03'\c
1246
+ .\}
1247
+ .el \{\
1248
+ .sp -1
1249
+ .IP \(bu 2.3
1250
+ .\}
1251
+ Add
1252
+ Client#manage
1253
+ methods to manipulate managed status\&.
1254
+ .RE
1255
+ .sp
1256
+ .RS 4
1257
+ .ie n \{\
1258
+ \h'-04'\(bu\h'+03'\c
1259
+ .\}
1260
+ .el \{\
1261
+ .sp -1
1262
+ .IP \(bu 2.3
1263
+ .\}
1264
+ The
1265
+ Client#tags=
1266
+ method now accepts
1267
+ \fI~\fR
1268
+ and
1269
+ \fI!\fR
1270
+ tag prefixes\&.
1271
+ .RE
1272
+ .PP
1273
+ \fBBug fixes\fR
1274
+ .sp
1275
+ .RS 4
1276
+ .ie n \{\
1277
+ \h'-04'\(bu\h'+03'\c
1278
+ .\}
1279
+ .el \{\
1280
+ .sp -1
1281
+ .IP \(bu 2.3
1282
+ .\}
1283
+ There is no
1284
+ View#move_focus
1285
+ method, only
1286
+ View#select\&.
1287
+ .RE
1288
+ .sp
1289
+ .RS 4
1290
+ .ie n \{\
1291
+ \h'-04'\(bu\h'+03'\c
1292
+ .\}
1293
+ .el \{\
1294
+ .sp -1
1295
+ .IP \(bu 2.3
1296
+ .\}
1297
+ Assertion failure in test suite because all files in
1298
+ /rbar
1299
+ (inside wmii\(cqs IXP filesystem) contain an automatic color header when read\&.
1300
+ .RE
1301
+ .PP
1302
+ \fBHousekeeping\fR
1303
+ .sp
1304
+ .RS 4
1305
+ .ie n \{\
1306
+ \h'-04'\(bu\h'+03'\c
1307
+ .\}
1308
+ .el \{\
1309
+ .sp -1
1310
+ .IP \(bu 2.3
1311
+ .\}
1312
+ Use simpler Copyright reminder at the top of every file\&.
1313
+ .RE
1314
+ .sp
1315
+ .RS 4
1316
+ .ie n \{\
1317
+ \h'-04'\(bu\h'+03'\c
1318
+ .\}
1319
+ .el \{\
1320
+ .sp -1
1321
+ .IP \(bu 2.3
1322
+ .\}
1323
+ Open source is for fun, so speak of "related works", not "competitors"\&.
1324
+ .RE
1325
+ .SS "Version 3\&.0\&.0 (2009\-05\-11)"
1326
+ .sp
1327
+ This release revises method names, adds new methods, and fixes a bug\&.
1328
+ .PP
1329
+ \fBIncompatible changes\fR
1330
+ .sp
1331
+ .RS 4
1332
+ .ie n \{\
1333
+ \h'-04'\(bu\h'+03'\c
1334
+ .\}
1335
+ .el \{\
1336
+ .sp -1
1337
+ .IP \(bu 2.3
1338
+ .\}
1339
+ Rename
1340
+ #toggle_
1341
+ methods to use
1342
+ !
1343
+ suffix in their names\&.
1344
+ .RE
1345
+ .sp
1346
+ .RS 4
1347
+ .ie n \{\
1348
+ \h'-04'\(bu\h'+03'\c
1349
+ .\}
1350
+ .el \{\
1351
+ .sp -1
1352
+ .IP \(bu 2.3
1353
+ .\}
1354
+ Rename
1355
+ #float
1356
+ methods to
1357
+ #floating\&.
1358
+ .RE
1359
+ .sp
1360
+ .RS 4
1361
+ .ie n \{\
1362
+ \h'-04'\(bu\h'+03'\c
1363
+ .\}
1364
+ .el \{\
1365
+ .sp -1
1366
+ .IP \(bu 2.3
1367
+ .\}
1368
+ Rename
1369
+ View#floater
1370
+ method to
1371
+ View#floating_area\&.
1372
+ .RE
1373
+ .PP
1374
+ \fBNew features\fR
1375
+ .sp
1376
+ .RS 4
1377
+ .ie n \{\
1378
+ \h'-04'\(bu\h'+03'\c
1379
+ .\}
1380
+ .el \{\
1381
+ .sp -1
1382
+ .IP \(bu 2.3
1383
+ .\}
1384
+ Add
1385
+ Client#stick
1386
+ methods to manipulate sticky status\&.
1387
+ .RE
1388
+ .sp
1389
+ .RS 4
1390
+ .ie n \{\
1391
+ \h'-04'\(bu\h'+03'\c
1392
+ .\}
1393
+ .el \{\
1394
+ .sp -1
1395
+ .IP \(bu 2.3
1396
+ .\}
1397
+ Add
1398
+ Client#fullscreen
1399
+ methods to manipulate fullscreen status\&.
1400
+ .RE
1401
+ .sp
1402
+ .RS 4
1403
+ .ie n \{\
1404
+ \h'-04'\(bu\h'+03'\c
1405
+ .\}
1406
+ .el \{\
1407
+ .sp -1
1408
+ .IP \(bu 2.3
1409
+ .\}
1410
+ Add
1411
+ Client#slay
1412
+ method which is a forceful version of
1413
+ #kill\&.
1414
+ .RE
1415
+ .sp
1416
+ .RS 4
1417
+ .ie n \{\
1418
+ \h'-04'\(bu\h'+03'\c
1419
+ .\}
1420
+ .el \{\
1421
+ .sp -1
1422
+ .IP \(bu 2.3
1423
+ .\}
1424
+ Add
1425
+ View#select
1426
+ method to move focus relatively inside a view\&.
1427
+ .RE
1428
+ .sp
1429
+ .RS 4
1430
+ .ie n \{\
1431
+ \h'-04'\(bu\h'+03'\c
1432
+ .\}
1433
+ .el \{\
1434
+ .sp -1
1435
+ .IP \(bu 2.3
1436
+ .\}
1437
+ Add
1438
+ Area::floating
1439
+ method for symmetry with
1440
+ Area::curr\&.
1441
+ .RE
1442
+ .sp
1443
+ .RS 4
1444
+ .ie n \{\
1445
+ \h'-04'\(bu\h'+03'\c
1446
+ .\}
1447
+ .el \{\
1448
+ .sp -1
1449
+ .IP \(bu 2.3
1450
+ .\}
1451
+ Add
1452
+ View#managed_area
1453
+ aliases for
1454
+ View#column
1455
+ methods\&.
1456
+ .RE
1457
+ .PP
1458
+ \fBBug fixes\fR
1459
+ .sp
1460
+ .RS 4
1461
+ .ie n \{\
1462
+ \h'-04'\(bu\h'+03'\c
1463
+ .\}
1464
+ .el \{\
1465
+ .sp -1
1466
+ .IP \(bu 2.3
1467
+ .\}
1468
+ Fix error when unzooming clients from temporary view\&.
1469
+ .RE
1470
+ .sp
1471
+ .RS 4
1472
+ .ie n \{\
1473
+ \h'-04'\(bu\h'+03'\c
1474
+ .\}
1475
+ .el \{\
1476
+ .sp -1
1477
+ .IP \(bu 2.3
1478
+ .\}
1479
+ Fix code that launches temporary terminals in the Tutorial\&.
1480
+ .sp
1481
+ Use the
1482
+ /bin/sh
1483
+ version of the read(1) command for portability\&.
1484
+ .RE
1485
+ .PP
1486
+ \fBHousekeeping\fR
1487
+ .sp
1488
+ .RS 4
1489
+ .ie n \{\
1490
+ \h'-04'\(bu\h'+03'\c
1491
+ .\}
1492
+ .el \{\
1493
+ .sp -1
1494
+ .IP \(bu 2.3
1495
+ .\}
1496
+ Use
1497
+ Client#send
1498
+ instead of
1499
+ #swap
1500
+ in automated arrangements because it causes less traffic on /event/\&.
1501
+ .RE
1502
+ .sp
1503
+ .RS 4
1504
+ .ie n \{\
1505
+ \h'-04'\(bu\h'+03'\c
1506
+ .\}
1507
+ .el \{\
1508
+ .sp -1
1509
+ .IP \(bu 2.3
1510
+ .\}
1511
+ Add old release notes from blog to user manual\&.
1512
+ .RE
1513
+ .SS "Version 2\&.1\&.0 (2009\-05\-09)"
1514
+ .sp
1515
+ This release improves client arrangement, fixes several bugs, and cleans up the code\&.
1516
+ .PP
1517
+ \fBThank you\fR
1518
+ .sp
1519
+ .RS 4
1520
+ .ie n \{\
1521
+ \h'-04'\(bu\h'+03'\c
1522
+ .\}
1523
+ .el \{\
1524
+ .sp -1
1525
+ .IP \(bu 2.3
1526
+ .\}
1527
+ Simon Hafner reported several bugs\&.
1528
+ .RE
1529
+ .sp
1530
+ .RS 4
1531
+ .ie n \{\
1532
+ \h'-04'\(bu\h'+03'\c
1533
+ .\}
1534
+ .el \{\
1535
+ .sp -1
1536
+ .IP \(bu 2.3
1537
+ .\}
1538
+ Michael Andrus verified bug fixes\&.
1539
+ .RE
1540
+ .PP
1541
+ \fBNew features\fR
1542
+ .sp
1543
+ .RS 4
1544
+ .ie n \{\
1545
+ \h'-04'\(bu\h'+03'\c
1546
+ .\}
1547
+ .el \{\
1548
+ .sp -1
1549
+ .IP \(bu 2.3
1550
+ .\}
1551
+ Focus is now restored on the initially focused client after applying automated client arrangements\&.
1552
+ .RE
1553
+ .sp
1554
+ .RS 4
1555
+ .ie n \{\
1556
+ \h'-04'\(bu\h'+03'\c
1557
+ .\}
1558
+ .el \{\
1559
+ .sp -1
1560
+ .IP \(bu 2.3
1561
+ .\}
1562
+ The
1563
+ push(),
1564
+ insert(), and
1565
+ unshift()
1566
+ instance methods of the
1567
+ Rumai::Area
1568
+ class now preserve the order of inserted clients\&.
1569
+ .RE
1570
+ .sp
1571
+ .RS 4
1572
+ .ie n \{\
1573
+ \h'-04'\(bu\h'+03'\c
1574
+ .\}
1575
+ .el \{\
1576
+ .sp -1
1577
+ .IP \(bu 2.3
1578
+ .\}
1579
+ The
1580
+ Rumai::View#arrange_in_grid()
1581
+ method now accepts 1 as a parameter\&. This invocation causes every column to contain at most 1 client\&.
1582
+ .RE
1583
+ .PP
1584
+ \fBBug fixes\fR
1585
+ .sp
1586
+ .RS 4
1587
+ .ie n \{\
1588
+ \h'-04'\(bu\h'+03'\c
1589
+ .\}
1590
+ .el \{\
1591
+ .sp -1
1592
+ .IP \(bu 2.3
1593
+ .\}
1594
+ Fix error caused by focusing the top/bottom client in the destination area before sending new clients into that area\&.
1595
+ .RE
1596
+ .sp
1597
+ .RS 4
1598
+ .ie n \{\
1599
+ \h'-04'\(bu\h'+03'\c
1600
+ .\}
1601
+ .el \{\
1602
+ .sp -1
1603
+ .IP \(bu 2.3
1604
+ .\}
1605
+ Fix error when importing clients into an empty area\&.
1606
+ .RE
1607
+ .PP
1608
+ \fBHousekeeping\fR
1609
+ .sp
1610
+ .RS 4
1611
+ .ie n \{\
1612
+ \h'-04'\(bu\h'+03'\c
1613
+ .\}
1614
+ .el \{\
1615
+ .sp -1
1616
+ .IP \(bu 2.3
1617
+ .\}
1618
+ Use snake_case instead of camelCase for variable names\&.
1619
+ .RE
1620
+ .sp
1621
+ .RS 4
1622
+ .ie n \{\
1623
+ \h'-04'\(bu\h'+03'\c
1624
+ .\}
1625
+ .el \{\
1626
+ .sp -1
1627
+ .IP \(bu 2.3
1628
+ .\}
1629
+ Add copyright notice at the top of every file\&.
1630
+ .RE
1631
+ .sp
1632
+ .RS 4
1633
+ .ie n \{\
1634
+ \h'-04'\(bu\h'+03'\c
1635
+ .\}
1636
+ .el \{\
1637
+ .sp -1
1638
+ .IP \(bu 2.3
1639
+ .\}
1640
+ Plenty of code formatting and beautification\&.
1641
+ .RE
1642
+ .SS "Version 2\&.0\&.2 (2009\-02\-26)"
1643
+ .sp
1644
+ This release fixes a connection bug\&.
1645
+ .PP
1646
+ \fBBug fixes\fR
1647
+ .sp
1648
+ .RS 4
1649
+ .ie n \{\
1650
+ \h'-04'\(bu\h'+03'\c
1651
+ .\}
1652
+ .el \{\
1653
+ .sp -1
1654
+ .IP \(bu 2.3
1655
+ .\}
1656
+ wmii omits the fractional portion of
1657
+ $DISPLAY
1658
+ in its socket file path\&. Rumai was trying to connect with the entire
1659
+ $DISPLAY
1660
+ value (including the fractional portion) and thus could not find wmii\(cqs socket file\&.
1661
+ .sp
1662
+ Thanks to Simon Hafner for reporting this bug\&.
1663
+ .RE
1664
+ .SS "Version 2\&.0\&.1 (2009\-01\-25)"
1665
+ .sp
1666
+ This release simplifies project administrivia using [Inochi], improves the unit tests, and revises the user manual\&.
1667
+ .PP
1668
+ \fBBug fixes\fR
1669
+ .sp
1670
+ .RS 4
1671
+ .ie n \{\
1672
+ \h'-04'\(bu\h'+03'\c
1673
+ .\}
1674
+ .el \{\
1675
+ .sp -1
1676
+ .IP \(bu 2.3
1677
+ .\}
1678
+ The
1679
+ rumai/ixp/message
1680
+ library\(cqs unit test failed if
1681
+ /rbar/status
1682
+ did not already exist in wmii\&.
1683
+ .RE
1684
+ .PP
1685
+ \fBHousekeeping\fR
1686
+ .sp
1687
+ .RS 4
1688
+ .ie n \{\
1689
+ \h'-04'\(bu\h'+03'\c
1690
+ .\}
1691
+ .el \{\
1692
+ .sp -1
1693
+ .IP \(bu 2.3
1694
+ .\}
1695
+ Store IXP socket address in
1696
+ Rumai::IXP_SOCK_ADDR\&.
1697
+ .RE
1698
+ .sp
1699
+ .RS 4
1700
+ .ie n \{\
1701
+ \h'-04'\(bu\h'+03'\c
1702
+ .\}
1703
+ .el \{\
1704
+ .sp -1
1705
+ .IP \(bu 2.3
1706
+ .\}
1707
+ Added missing test cases for (TR)create and (TR)remove messages in the unit test for the
1708
+ rumai/ixp/message
1709
+ library\&.
1710
+ .RE
1711
+ .SS "Version 2\&.0\&.0 (2008\-02\-04)"
1712
+ .sp
1713
+ This release adds support for wmii 3\&.6, improves the performance of the IXP library, and fixes some bugs\&.
1714
+ .PP
1715
+ \fBThank you\fR
1716
+ .sp
1717
+ .RS 4
1718
+ .ie n \{\
1719
+ \h'-04'\(bu\h'+03'\c
1720
+ .\}
1721
+ .el \{\
1722
+ .sp -1
1723
+ .IP \(bu 2.3
1724
+ .\}
1725
+ Christoph Blank tested Rumai 1\&.0\&.0 under wmii 3\&.6 and reported bugs\&.
1726
+ .RE
1727
+ .PP
1728
+ \fBIncompatible changes\fR
1729
+ .sp
1730
+ .RS 4
1731
+ .ie n \{\
1732
+ \h'-04'\(bu\h'+03'\c
1733
+ .\}
1734
+ .el \{\
1735
+ .sp -1
1736
+ .IP \(bu 2.3
1737
+ .\}
1738
+ wmii version 3\&.6 or newer is now required\&.
1739
+ .RE
1740
+ .sp
1741
+ .RS 4
1742
+ .ie n \{\
1743
+ \h'-04'\(bu\h'+03'\c
1744
+ .\}
1745
+ .el \{\
1746
+ .sp -1
1747
+ .IP \(bu 2.3
1748
+ .\}
1749
+ The
1750
+ Rumai::IXP::Agent::FidStream#read_partial
1751
+ method has been replaced by
1752
+ Rumai::IXP::Agent::FidStream#read(true)
1753
+ for efficiency\&.
1754
+ .RE
1755
+ .sp
1756
+ .RS 4
1757
+ .ie n \{\
1758
+ \h'-04'\(bu\h'+03'\c
1759
+ .\}
1760
+ .el \{\
1761
+ .sp -1
1762
+ .IP \(bu 2.3
1763
+ .\}
1764
+ The
1765
+ Rumai::IXP::Agent::FidStream#write
1766
+ method no longer writes to the beginning of the stream\&. Instead, it writes to the current position in the stream\&.
1767
+ .RE
1768
+ .sp
1769
+ .RS 4
1770
+ .ie n \{\
1771
+ \h'-04'\(bu\h'+03'\c
1772
+ .\}
1773
+ .el \{\
1774
+ .sp -1
1775
+ .IP \(bu 2.3
1776
+ .\}
1777
+ The
1778
+ Rumai::View#floating_area
1779
+ method has been renamed to
1780
+ Rumai::View#floater
1781
+ for brevity\&.
1782
+ .RE
1783
+ .PP
1784
+ \fBNew features\fR
1785
+ .sp
1786
+ .RS 4
1787
+ .ie n \{\
1788
+ \h'-04'\(bu\h'+03'\c
1789
+ .\}
1790
+ .el \{\
1791
+ .sp -1
1792
+ .IP \(bu 2.3
1793
+ .\}
1794
+ Added several more methods (such as
1795
+ rewind,
1796
+ pos=,
1797
+ eof?, and so on) from Ruby\(cqs IO class to the
1798
+ Rumai::IXP::Agent::FidStream
1799
+ class\&.
1800
+ .RE
1801
+ .sp
1802
+ .RS 4
1803
+ .ie n \{\
1804
+ \h'-04'\(bu\h'+03'\c
1805
+ .\}
1806
+ .el \{\
1807
+ .sp -1
1808
+ .IP \(bu 2.3
1809
+ .\}
1810
+ Added the
1811
+ Rumai::Client#kill
1812
+ method to simplify client termination\&.
1813
+ .RE
1814
+ .PP
1815
+ \fBBug fixes\fR
1816
+ .sp
1817
+ .RS 4
1818
+ .ie n \{\
1819
+ \h'-04'\(bu\h'+03'\c
1820
+ .\}
1821
+ .el \{\
1822
+ .sp -1
1823
+ .IP \(bu 2.3
1824
+ .\}
1825
+ Fixed a race condition in
1826
+ Rumai::Agent#talk
1827
+ which would cause Rumai to hang when multiple threads used it\&.
1828
+ .RE
1829
+ .SS "Version 1\&.0\&.0 (2008\-01\-26)"
1830
+ .sp
1831
+ This is the first release of Rumai, the evolution of \m[blue]\fBwmii\-irb\fR\m[]\&\s-2\u[8]\d\s+2, which lets you manipulate the [wmii] window manager through [Ruby]\&. Enjoy!
1832
+ .SH "AUTHORS"
1833
+ .sp
1834
+ Suraj N\&. Kurapati
1835
+ .SS "Credits"
1836
+ .sp
1837
+ Christoph Blank, Kenneth De Winter, Mattia Gheda, Michael Andrus, Nathan Neff, Sebastian Chmielewski, Simon Hafner
1838
+ .SS "License"
1839
+ .sp
1840
+ (the ISC license)
1841
+ .sp
1842
+ Copyright 2006 Suraj N\&. Kurapati <\m[blue]\fBsunaku@gmail\&.com\fR\m[]\&\s-2\u[9]\d\s+2>
1843
+ .sp
1844
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies\&.
1845
+ .sp
1846
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\&. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE\&.
1847
+ .SH "SEE ALSO"
1848
+ .sp
1849
+ irb(1), wmiir(1), wmii(1)
1850
+ .SS "References"
1851
+ .TS
1852
+ tab(:);
1853
+ lt lt
1854
+ lt lt
1855
+ lt lt
1856
+ lt lt
1857
+ lt lt
1858
+ lt lt
1859
+ lt lt.
1860
+ T{
1861
+ .sp
1862
+ [Inochi]
1863
+ T}:T{
1864
+ .sp
1865
+ \m[blue]\fBhttp://snk\&.tuxfamily\&.org/lib/inochi/\fR\m[]
1866
+ T}
1867
+ T{
1868
+ .sp
1869
+ [libixp]
1870
+ T}:T{
1871
+ .sp
1872
+ \m[blue]\fBhttp://libs\&.suckless\&.org/libixp\fR\m[]
1873
+ T}
1874
+ T{
1875
+ .sp
1876
+ [p9p]
1877
+ T}:T{
1878
+ .sp
1879
+ \m[blue]\fBhttp://cm\&.bell\-labs\&.com/magic/man2html/5/intro\fR\m[]
1880
+ T}
1881
+ T{
1882
+ .sp
1883
+ [RubyGems]
1884
+ T}:T{
1885
+ .sp
1886
+ \m[blue]\fBhttp://rubygems\&.org\fR\m[]
1887
+ T}
1888
+ T{
1889
+ .sp
1890
+ [Ruby]
1891
+ T}:T{
1892
+ .sp
1893
+ \m[blue]\fBhttp://ruby\-lang\&.org\fR\m[]
1894
+ T}
1895
+ T{
1896
+ .sp
1897
+ [wmii]
1898
+ T}:T{
1899
+ .sp
1900
+ \m[blue]\fBhttp://wmii\&.suckless\&.org\fR\m[]
1901
+ T}
1902
+ T{
1903
+ .sp
1904
+ [XCB\-cookies]
1905
+ T}:T{
1906
+ .sp
1907
+ \m[blue]\fBhttp://www\&.x\&.org/releases/X11R7\&.5/doc/libxcb/tutorial/#requestsreplies\fR\m[]
1908
+ T}
1909
+ .TE
1910
+ .sp 1
1911
+ .SH "NOTES"
1912
+ .IP " 1." 4
1913
+ my personal
1914
+ .RS 4
1915
+ \%http://github.com/sunaku/wmiirc
1916
+ .RE
1917
+ .IP " 2." 4
1918
+ many others
1919
+ .RS 4
1920
+ \%http://github.com/sunaku/wmiirc/network
1921
+ .RE
1922
+ .IP " 3." 4
1923
+ ruby-wrapper
1924
+ .RS 4
1925
+ \%http://github.com/chneukirchen/rup/blob/master/ruby-wrapper
1926
+ .RE
1927
+ .IP " 4." 4
1928
+ requested by Nathan Neff
1929
+ .RS 4
1930
+ \%http://github.com/sunaku/rumai/issues/6
1931
+ .RE
1932
+ .IP " 5." 4
1933
+ wmii-hg2734 color tuple bug
1934
+ .RS 4
1935
+ \%http://code.google.com/p/wmii/issues/detail?id=206
1936
+ .RE
1937
+ .IP " 6." 4
1938
+ this issue
1939
+ .RS 4
1940
+ \%http://github.com/sunaku/rumai/issues/3
1941
+ .RE
1942
+ .IP " 7." 4
1943
+ this issue
1944
+ .RS 4
1945
+ \%http://github.com/sunaku/wmiirc/issues/8
1946
+ .RE
1947
+ .IP " 8." 4
1948
+ wmii-irb
1949
+ .RS 4
1950
+ \%http://article.gmane.org/gmane.comp.window-managers.wmii/1704
1951
+ .RE
1952
+ .IP " 9." 4
1953
+ sunaku@gmail.com
1954
+ .RS 4
1955
+ \%mailto:sunaku@gmail.com
1956
+ .RE