rumai 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. data/LICENSE +23 -0
  2. data/README +1 -0
  3. data/Rakefile +58 -0
  4. data/bin/rumai +38 -0
  5. data/doc/api/classes/IO.html +120 -0
  6. data/doc/api/classes/Integer.html +142 -0
  7. data/doc/api/classes/Integer.src/M000002.html +18 -0
  8. data/doc/api/classes/Object.html +113 -0
  9. data/doc/api/classes/Rumai.html +530 -0
  10. data/doc/api/classes/Rumai.src/M000007.html +18 -0
  11. data/doc/api/classes/Rumai.src/M000008.html +18 -0
  12. data/doc/api/classes/Rumai.src/M000009.html +18 -0
  13. data/doc/api/classes/Rumai.src/M000010.html +18 -0
  14. data/doc/api/classes/Rumai.src/M000011.html +18 -0
  15. data/doc/api/classes/Rumai.src/M000012.html +18 -0
  16. data/doc/api/classes/Rumai.src/M000013.html +18 -0
  17. data/doc/api/classes/Rumai.src/M000014.html +20 -0
  18. data/doc/api/classes/Rumai.src/M000015.html +18 -0
  19. data/doc/api/classes/Rumai.src/M000016.html +18 -0
  20. data/doc/api/classes/Rumai.src/M000017.html +18 -0
  21. data/doc/api/classes/Rumai.src/M000018.html +18 -0
  22. data/doc/api/classes/Rumai.src/M000019.html +18 -0
  23. data/doc/api/classes/Rumai.src/M000020.html +18 -0
  24. data/doc/api/classes/Rumai.src/M000021.html +18 -0
  25. data/doc/api/classes/Rumai.src/M000022.html +18 -0
  26. data/doc/api/classes/Rumai.src/M000023.html +18 -0
  27. data/doc/api/classes/Rumai.src/M000024.html +18 -0
  28. data/doc/api/classes/Rumai.src/M000025.html +18 -0
  29. data/doc/api/classes/Rumai.src/M000026.html +18 -0
  30. data/doc/api/classes/Rumai/Area.html +461 -0
  31. data/doc/api/classes/Rumai/Area.src/M000080.html +19 -0
  32. data/doc/api/classes/Rumai/Area.src/M000081.html +18 -0
  33. data/doc/api/classes/Rumai/Area.src/M000082.html +18 -0
  34. data/doc/api/classes/Rumai/Area.src/M000083.html +18 -0
  35. data/doc/api/classes/Rumai/Area.src/M000084.html +18 -0
  36. data/doc/api/classes/Rumai/Area.src/M000085.html +18 -0
  37. data/doc/api/classes/Rumai/Area.src/M000086.html +18 -0
  38. data/doc/api/classes/Rumai/Area.src/M000087.html +18 -0
  39. data/doc/api/classes/Rumai/Area.src/M000088.html +18 -0
  40. data/doc/api/classes/Rumai/Area.src/M000089.html +18 -0
  41. data/doc/api/classes/Rumai/Area.src/M000090.html +18 -0
  42. data/doc/api/classes/Rumai/Area.src/M000091.html +22 -0
  43. data/doc/api/classes/Rumai/Area.src/M000093.html +23 -0
  44. data/doc/api/classes/Rumai/Area.src/M000094.html +28 -0
  45. data/doc/api/classes/Rumai/Area.src/M000095.html +18 -0
  46. data/doc/api/classes/Rumai/Area.src/M000096.html +31 -0
  47. data/doc/api/classes/Rumai/Chain.html +179 -0
  48. data/doc/api/classes/Rumai/Chain.src/M000077.html +18 -0
  49. data/doc/api/classes/Rumai/Chain.src/M000078.html +18 -0
  50. data/doc/api/classes/Rumai/Chain.src/M000079.html +18 -0
  51. data/doc/api/classes/Rumai/Client.html +463 -0
  52. data/doc/api/classes/Rumai/Client.src/M000114.html +18 -0
  53. data/doc/api/classes/Rumai/Client.src/M000115.html +18 -0
  54. data/doc/api/classes/Rumai/Client.src/M000116.html +18 -0
  55. data/doc/api/classes/Rumai/Client.src/M000117.html +39 -0
  56. data/doc/api/classes/Rumai/Client.src/M000118.html +28 -0
  57. data/doc/api/classes/Rumai/Client.src/M000119.html +19 -0
  58. data/doc/api/classes/Rumai/Client.src/M000120.html +18 -0
  59. data/doc/api/classes/Rumai/Client.src/M000121.html +18 -0
  60. data/doc/api/classes/Rumai/Client.src/M000122.html +18 -0
  61. data/doc/api/classes/Rumai/Client.src/M000123.html +19 -0
  62. data/doc/api/classes/Rumai/Client.src/M000124.html +20 -0
  63. data/doc/api/classes/Rumai/Client.src/M000125.html +20 -0
  64. data/doc/api/classes/Rumai/Client.src/M000126.html +22 -0
  65. data/doc/api/classes/Rumai/Client.src/M000127.html +18 -0
  66. data/doc/api/classes/Rumai/Client.src/M000128.html +20 -0
  67. data/doc/api/classes/Rumai/Client.src/M000129.html +18 -0
  68. data/doc/api/classes/Rumai/Client.src/M000130.html +22 -0
  69. data/doc/api/classes/Rumai/ClientContainer.html +180 -0
  70. data/doc/api/classes/Rumai/ClientContainer.src/M000027.html +18 -0
  71. data/doc/api/classes/Rumai/ClientContainer.src/M000028.html +18 -0
  72. data/doc/api/classes/Rumai/ClientContainer.src/M000029.html +18 -0
  73. data/doc/api/classes/Rumai/ExportInstMethods.html +119 -0
  74. data/doc/api/classes/Rumai/IXP.html +149 -0
  75. data/doc/api/classes/Rumai/IXP/Agent.html +447 -0
  76. data/doc/api/classes/Rumai/IXP/Agent.src/M000046.html +47 -0
  77. data/doc/api/classes/Rumai/IXP/Agent.src/M000047.html +44 -0
  78. data/doc/api/classes/Rumai/IXP/Agent.src/M000048.html +39 -0
  79. data/doc/api/classes/Rumai/IXP/Agent.src/M000049.html +20 -0
  80. data/doc/api/classes/Rumai/IXP/Agent.src/M000050.html +22 -0
  81. data/doc/api/classes/Rumai/IXP/Agent.src/M000051.html +20 -0
  82. data/doc/api/classes/Rumai/IXP/Agent.src/M000052.html +33 -0
  83. data/doc/api/classes/Rumai/IXP/Agent.src/M000053.html +19 -0
  84. data/doc/api/classes/Rumai/IXP/Agent.src/M000054.html +18 -0
  85. data/doc/api/classes/Rumai/IXP/Agent.src/M000055.html +21 -0
  86. data/doc/api/classes/Rumai/IXP/Agent.src/M000056.html +20 -0
  87. data/doc/api/classes/Rumai/IXP/Agent.src/M000057.html +20 -0
  88. data/doc/api/classes/Rumai/IXP/Agent.src/M000058.html +22 -0
  89. data/doc/api/classes/Rumai/IXP/Agent.src/M000059.html +23 -0
  90. data/doc/api/classes/Rumai/IXP/Agent.src/M000060.html +19 -0
  91. data/doc/api/classes/Rumai/IXP/Agent/FidStream.html +254 -0
  92. data/doc/api/classes/Rumai/IXP/Agent/FidStream.src/M000062.html +22 -0
  93. data/doc/api/classes/Rumai/IXP/Agent/FidStream.src/M000063.html +21 -0
  94. data/doc/api/classes/Rumai/IXP/Agent/FidStream.src/M000064.html +42 -0
  95. data/doc/api/classes/Rumai/IXP/Agent/FidStream.src/M000065.html +26 -0
  96. data/doc/api/classes/Rumai/IXP/Agent/FidStream.src/M000066.html +36 -0
  97. data/doc/api/classes/Rumai/IXP/Agent/MODES.html +130 -0
  98. data/doc/api/classes/Rumai/IXP/Agent/MODES.src/M000061.html +22 -0
  99. data/doc/api/classes/Rumai/IXP/Agent/RangedPool.html +203 -0
  100. data/doc/api/classes/Rumai/IXP/Agent/RangedPool.src/M000068.html +23 -0
  101. data/doc/api/classes/Rumai/IXP/Agent/RangedPool.src/M000069.html +32 -0
  102. data/doc/api/classes/Rumai/IXP/Agent/RangedPool.src/M000070.html +20 -0
  103. data/doc/api/classes/Rumai/IXP/Error.html +117 -0
  104. data/doc/api/classes/Rumai/IXP/Fcall.html +261 -0
  105. data/doc/api/classes/Rumai/IXP/Fcall.src/M000071.html +20 -0
  106. data/doc/api/classes/Rumai/IXP/Fcall.src/M000072.html +25 -0
  107. data/doc/api/classes/Rumai/IXP/Fcall.src/M000073.html +18 -0
  108. data/doc/api/classes/Rumai/IXP/Fcall.src/M000074.html +18 -0
  109. data/doc/api/classes/Rumai/IXP/Qid.html +184 -0
  110. data/doc/api/classes/Rumai/IXP/Rattach.html +119 -0
  111. data/doc/api/classes/Rumai/IXP/Rauth.html +119 -0
  112. data/doc/api/classes/Rumai/IXP/Rclunk.html +119 -0
  113. data/doc/api/classes/Rumai/IXP/Rcreate.html +119 -0
  114. data/doc/api/classes/Rumai/IXP/Rerror.html +119 -0
  115. data/doc/api/classes/Rumai/IXP/Rflush.html +119 -0
  116. data/doc/api/classes/Rumai/IXP/Ropen.html +119 -0
  117. data/doc/api/classes/Rumai/IXP/Rread.html +119 -0
  118. data/doc/api/classes/Rumai/IXP/Rremove.html +119 -0
  119. data/doc/api/classes/Rumai/IXP/Rstat.html +119 -0
  120. data/doc/api/classes/Rumai/IXP/Rversion.html +119 -0
  121. data/doc/api/classes/Rumai/IXP/Rwalk.html +119 -0
  122. data/doc/api/classes/Rumai/IXP/Rwrite.html +119 -0
  123. data/doc/api/classes/Rumai/IXP/Rwstat.html +119 -0
  124. data/doc/api/classes/Rumai/IXP/Stat.html +248 -0
  125. data/doc/api/classes/Rumai/IXP/Stat.src/M000076.html +18 -0
  126. data/doc/api/classes/Rumai/IXP/Stream.html +158 -0
  127. data/doc/api/classes/Rumai/IXP/Stream.src/M000045.html +19 -0
  128. data/doc/api/classes/Rumai/IXP/Struct.html +257 -0
  129. data/doc/api/classes/Rumai/IXP/Struct.src/M000030.html +19 -0
  130. data/doc/api/classes/Rumai/IXP/Struct.src/M000031.html +18 -0
  131. data/doc/api/classes/Rumai/IXP/Struct.src/M000032.html +18 -0
  132. data/doc/api/classes/Rumai/IXP/Struct.src/M000033.html +18 -0
  133. data/doc/api/classes/Rumai/IXP/Struct.src/M000034.html +20 -0
  134. data/doc/api/classes/Rumai/IXP/Struct.src/M000035.html +57 -0
  135. data/doc/api/classes/Rumai/IXP/Struct/Field.html +304 -0
  136. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000036.html +21 -0
  137. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000037.html +21 -0
  138. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000038.html +20 -0
  139. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000039.html +29 -0
  140. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000040.html +18 -0
  141. data/doc/api/classes/Rumai/IXP/Struct/Field.src/M000041.html +18 -0
  142. data/doc/api/classes/Rumai/IXP/Struct/Field/CounteeField.html +152 -0
  143. data/doc/api/classes/Rumai/IXP/Struct/Field/CounteeField.src/M000043.html +24 -0
  144. data/doc/api/classes/Rumai/IXP/Struct/Field/CounteeField.src/M000044.html +25 -0
  145. data/doc/api/classes/Rumai/IXP/Struct/Field/CounterField.html +137 -0
  146. data/doc/api/classes/Rumai/IXP/Struct/Field/CounterField.src/M000042.html +18 -0
  147. data/doc/api/classes/Rumai/IXP/Tattach.html +120 -0
  148. data/doc/api/classes/Rumai/IXP/Tauth.html +119 -0
  149. data/doc/api/classes/Rumai/IXP/Tclunk.html +119 -0
  150. data/doc/api/classes/Rumai/IXP/Tcreate.html +120 -0
  151. data/doc/api/classes/Rumai/IXP/Terror.html +145 -0
  152. data/doc/api/classes/Rumai/IXP/Terror.src/M000075.html +18 -0
  153. data/doc/api/classes/Rumai/IXP/Tflush.html +119 -0
  154. data/doc/api/classes/Rumai/IXP/Topen.html +193 -0
  155. data/doc/api/classes/Rumai/IXP/Tread.html +119 -0
  156. data/doc/api/classes/Rumai/IXP/Tremove.html +119 -0
  157. data/doc/api/classes/Rumai/IXP/Tstat.html +119 -0
  158. data/doc/api/classes/Rumai/IXP/Tversion.html +137 -0
  159. data/doc/api/classes/Rumai/IXP/Twalk.html +120 -0
  160. data/doc/api/classes/Rumai/IXP/Twrite.html +120 -0
  161. data/doc/api/classes/Rumai/IXP/Twstat.html +119 -0
  162. data/doc/api/classes/Rumai/Node.html +461 -0
  163. data/doc/api/classes/Rumai/Node.src/M000097.html +18 -0
  164. data/doc/api/classes/Rumai/Node.src/M000098.html +18 -0
  165. data/doc/api/classes/Rumai/Node.src/M000099.html +22 -0
  166. data/doc/api/classes/Rumai/Node.src/M000100.html +18 -0
  167. data/doc/api/classes/Rumai/Node.src/M000101.html +18 -0
  168. data/doc/api/classes/Rumai/Node.src/M000102.html +18 -0
  169. data/doc/api/classes/Rumai/Node.src/M000103.html +18 -0
  170. data/doc/api/classes/Rumai/Node.src/M000104.html +22 -0
  171. data/doc/api/classes/Rumai/Node.src/M000105.html +18 -0
  172. data/doc/api/classes/Rumai/Node.src/M000106.html +18 -0
  173. data/doc/api/classes/Rumai/Node.src/M000107.html +18 -0
  174. data/doc/api/classes/Rumai/Node.src/M000108.html +18 -0
  175. data/doc/api/classes/Rumai/Node.src/M000109.html +18 -0
  176. data/doc/api/classes/Rumai/Node.src/M000110.html +18 -0
  177. data/doc/api/classes/Rumai/Node.src/M000111.html +18 -0
  178. data/doc/api/classes/Rumai/Node.src/M000112.html +20 -0
  179. data/doc/api/classes/Rumai/Node.src/M000113.html +27 -0
  180. data/doc/api/classes/Rumai/View.html +436 -0
  181. data/doc/api/classes/Rumai/View.src/M000131.html +18 -0
  182. data/doc/api/classes/Rumai/View.src/M000132.html +18 -0
  183. data/doc/api/classes/Rumai/View.src/M000133.html +18 -0
  184. data/doc/api/classes/Rumai/View.src/M000134.html +18 -0
  185. data/doc/api/classes/Rumai/View.src/M000135.html +18 -0
  186. data/doc/api/classes/Rumai/View.src/M000136.html +18 -0
  187. data/doc/api/classes/Rumai/View.src/M000137.html +18 -0
  188. data/doc/api/classes/Rumai/View.src/M000138.html +28 -0
  189. data/doc/api/classes/Rumai/View.src/M000139.html +18 -0
  190. data/doc/api/classes/Rumai/View.src/M000140.html +18 -0
  191. data/doc/api/classes/Rumai/View.src/M000141.html +18 -0
  192. data/doc/api/classes/Rumai/View.src/M000142.html +18 -0
  193. data/doc/api/classes/Rumai/View.src/M000143.html +29 -0
  194. data/doc/api/classes/Rumai/View.src/M000144.html +20 -0
  195. data/doc/api/classes/Rumai/View.src/M000145.html +33 -0
  196. data/doc/api/classes/Rumai/View.src/M000146.html +50 -0
  197. data/doc/api/classes/String.html +169 -0
  198. data/doc/api/classes/String.src/M000005.html +18 -0
  199. data/doc/api/classes/String.src/M000006.html +19 -0
  200. data/doc/api/classes/StringIO.html +120 -0
  201. data/doc/api/classes/Time.html +163 -0
  202. data/doc/api/classes/Time.src/M000003.html +18 -0
  203. data/doc/api/classes/Time.src/M000004.html +18 -0
  204. data/doc/api/created.rid +1 -0
  205. data/doc/api/files/lib/rumai/fs_rb.html +115 -0
  206. data/doc/api/files/lib/rumai/ixp/message_rb.html +120 -0
  207. data/doc/api/files/lib/rumai/ixp/message_spec_rb.html +175 -0
  208. data/doc/api/files/lib/rumai/ixp/message_spec_rb.src/M000001.html +37 -0
  209. data/doc/api/files/lib/rumai/ixp/transport_rb.html +115 -0
  210. data/doc/api/files/lib/rumai/ixp_rb.html +116 -0
  211. data/doc/api/files/lib/rumai/nfo_rb.html +107 -0
  212. data/doc/api/files/lib/rumai/wm_rb.html +115 -0
  213. data/doc/api/files/lib/rumai_rb.html +115 -0
  214. data/doc/api/fr_class_index.html +82 -0
  215. data/doc/api/fr_file_index.html +34 -0
  216. data/doc/api/fr_method_index.html +172 -0
  217. data/doc/api/index.html +24 -0
  218. data/doc/api/rdoc-style.css +208 -0
  219. data/doc/guide.erb +390 -0
  220. data/doc/guide.html +2035 -0
  221. data/doc/index.html +2035 -0
  222. data/lib/rumai.rb +9 -0
  223. data/lib/rumai/fs.rb +170 -0
  224. data/lib/rumai/ixp.rb +9 -0
  225. data/lib/rumai/ixp/message.rb +642 -0
  226. data/lib/rumai/ixp/message_spec.rb +247 -0
  227. data/lib/rumai/ixp/transport.rb +382 -0
  228. data/lib/rumai/nfo.rb +24 -0
  229. data/lib/rumai/wm.rb +780 -0
  230. metadata +320 -0
data/doc/guide.erb ADDED
@@ -0,0 +1,390 @@
1
+ <%
2
+ require 'lib/rumai/nfo'
3
+
4
+ # local variables for this document
5
+ download_url = 'http://rubyforge.org/frs/?group_id=5005'
6
+ source_repo_url = File.join(Rumai::NFO[:website], 'src')
7
+ feed_url = File.join(Rumai::NFO[:website], 'news.xml')
8
+
9
+ ruby_url = 'http://ruby-lang.org'
10
+ wmii_url = 'http://www.suckless.org/wiki/wmii'
11
+ wmii_ixp_url = 'http://www.suckless.org/wiki/libs/libixp'
12
+ p9p_url = 'http://cm.bell-labs.com/magic/man2html/5/intro'
13
+
14
+ # parameters for the HTML format
15
+ $title = "#{Rumai::NFO} user guide"
16
+ $authors = { 'Suraj N. Kurapati' => 'http://snk.tuxfamily.org' }
17
+ $feeds = { feed_url => :rss }
18
+
19
+ # parameters for Gerbil
20
+ $unindent = ' '
21
+ %>
22
+
23
+ <% chapter "Introduction" do %>
24
+ Rumai is a library for manipulating the "wmii":<%= wmii_url %> window manager through "Ruby":<%= ruby_url %>. It excels at *dynamic arrangement* of clients, columns, views, and tags.
25
+
26
+ Rumai also provides (1) an <%= xref 'shell', 'interactive shell' %> for live entertainment, and (2) a *pure Ruby client* for the "9P2000 protocol":<%= p9p_url %>, which it uses to communicate with wmii's "IXP file-system interface":<%= wmii_ixp_url %>.
27
+
28
+ Rumai is *open-source software* (see <%= xref "License" %>) so feel free to contribute your improvements to and discuss your ideas with the author. You can obtain the source code from the project "Darcs":http://darcs.net repository by running the following command:
29
+
30
+ darcs get <%= source_repo_url %> rumai
31
+
32
+ <% section "Resources" do %>
33
+ * "News feed":<%= feed_url %>
34
+ - project news and release announcements.
35
+ * "Download area":<%= download_url %>
36
+ - place to obtain release packages.
37
+ * "API reference":api/index.html
38
+ - documentation for all provided Ruby code.
39
+ * Support / feedback
40
+ - send an e-mail to the author (see address in <%= xref "License" %>).
41
+ <% end %>
42
+
43
+ <% section "License" do %>
44
+ <%=h File.read('LICENSE') %>
45
+ <% end %>
46
+ <% end %>
47
+
48
+ <% chapter "Setup" do %>
49
+ <% section "Requirements" do %>
50
+ Your system needs the following software to run Rumai.
51
+
52
+ |_. Software |_. Notes |
53
+ | "Ruby":<%= ruby_url %> | Version 1.8.x is required. |
54
+ | "wmii":<%= wmii_url %> | wmii-snap20070516 or newer is required. |
55
+ <% end %>
56
+
57
+ <% section "Installation" do %>
58
+ If your system has "RubyGems":http://rubygems.org/, then you can install Rumai by running the following commands:
59
+
60
+ gem install rumai
61
+ rumai -v
62
+
63
+ Otherwise, follow these instructions:
64
+ # Download the newest release package from "the download area":<%= download_url %>.
65
+ # Extract the release package anywhere you want on your system.
66
+ # Go inside the extracted directory and run the following command:
67
+
68
+ ruby bin/rumai -v
69
+
70
+ If the installation was successful, then you will see output like this: <pre><%=h `ruby bin/rumai -v` %></pre>
71
+
72
+ Otherwise, you can e-mail the author (see address in <%= xref "License" %>) for help.
73
+ <% end %>
74
+
75
+ <% section "Manifest" do %>
76
+ Now that Rumai is installed on your system, let us examine its installation directory.
77
+ * If you installed Rumai manually, then you already know the location of its installation directory.
78
+ * If you installed Rumai using RubyGems, then run <pre>rumai -v</pre> and select the right-most item in the output--that is the path of Rumai's installation directory.
79
+
80
+ Inside Rumai's installation directory, you will see (among other things) the following items:
81
+ * <tt>bin/</tt> - contains executable programs.
82
+ ** <tt>rumai</tt> - the interactive shell.
83
+ * <tt>lib/</tt>
84
+ ** <tt>rumai.rb</tt> - the main Rumai library.
85
+ ** <tt>rumai/</tt>
86
+ *** <tt>ixp.rb</tt> - the pure Ruby client for the "9P2000 protocol":<%= p9p_url %>.
87
+ * <tt>doc/</tt> - contains the user guide and other documentation.
88
+ ** <tt>guide.erb</tt> - the source file of this user guide.
89
+ ** <tt>api/</tt> - contains API reference documentation.
90
+ * <tt>LICENSE</tt> - the project license and copyright notice.
91
+ <% end %>
92
+
93
+ <% section 'Version numbering system' do %>
94
+ Rumai uses the "RubyGems rational versioning policy":http://www.rubygems.org/read/chapter/7 to number its releases. This *major.minor.patch* numbering policy "is summarized":http://ablog.apress.com/?p=738 as follows.
95
+
96
+ | Version number components: |_. Major |_. Minor |_. Patch |
97
+ |_. Backwards compatible? | no | yes | yes |
98
+ |_. New features? | yes | yes | no |
99
+ |_. Bug fixes? | yes | yes | yes |
100
+ <% end %>
101
+ <% end %>
102
+
103
+ <% chapter "Usage" do %>
104
+ <% section "Concepts" do %>
105
+ If you wish to wield the power of Rumai more effectively, you should understand the following basic concepts:
106
+ * A *client* is any graphical program that is running in your X session. In other words, any *window* in your wmii session is a *client*.
107
+ * A *tag* is an arbitrary string (a label) that can be associated with one or more clients.
108
+ * A *view* is a graphical representation of a *tag*. It shows all clients associated with a particular tag.
109
+ * An *area* is a region inside a *view*. It contains clients.
110
+ ** A *managed area* or *column* is a region where clients cannot overlap each other.
111
+ ** The *floating area* is an area whose clients (1) can overlap each other and (2) _float above_ the managed areas.
112
+ <% end %>
113
+
114
+ <% section "Interactive shell", 'shell' do %>
115
+ Run the following command to start Rumai's interactive shell (IRB):
116
+
117
+ rumai
118
+
119
+ You should now see a command prompt like this:
120
+
121
+ irb(Rumai):001:0>
122
+
123
+ The "irb(*Rumai*)" token in the prompt indicates that commands will be evaluated _inside_ the @Rumai@ module. As a result, you can omit the "Rumai" prefix from your commands if you wish.
124
+
125
+ For example, to get the current client object, you can type @curr_client@ instead of having to type @Rumai.curr_client@ at the prompt. However, note that both commands both achieve the same effect and are thereby equivalent.
126
+
127
+ The next thing to note is that *tab completion* is enabled by default. Consequently, you can type part of a command and press the TAB key to see a list of possible completions.
128
+
129
+ Finally, the interactive shell is a standard IRB session. As a result your <tt>~/.irbrc</tt> file is read and processed by default. Furthermore, you can pass the standard IRB command-line options to the *rumai* command.
130
+
131
+ <% section "Live demonstration" do %>
132
+ Now that you have a command prompt, let us walk through a quick demonstration that highlights the main features of Rumai. You can follow along by copying & pasting the presented commands into the interactive shell.
133
+
134
+ <%
135
+ open_terms = %q{
136
+ Launch a few terminals so that we have something to work with:
137
+ <code>
138
+ colors = %w[ red green blue black orange brown gray navy gold ]
139
+ colors.each {|c| system "xterm -bg #{c} -title #{c} -e read &" }
140
+ </code>
141
+ }.gsub(/^\s+/, '')
142
+
143
+ close_terms = %q{
144
+ Close the terminals we launched earlier:
145
+ <code>
146
+ terms = curr_view.clients.select {|c| colors.include? c.label.read }
147
+ terms.each {|c| c.ctl.write "kill" }
148
+ </code>
149
+ }.gsub(/^\s+/, '')
150
+ %>
151
+
152
+ <% section "Automated client arrangement" do %>
153
+ <%= open_terms %>
154
+
155
+ Arrange all clients in a grid:
156
+ <code>
157
+ curr_view.arrange_in_grid
158
+ </code>
159
+
160
+ Arrange all clients in a diamond shape:
161
+ <code>
162
+ curr_view.arrange_in_diamond
163
+ </code>
164
+
165
+ Arrange all clients like LarsWM does:
166
+ <code>
167
+ curr_view.arrange_as_larswm
168
+ </code>
169
+
170
+ <%= close_terms %>
171
+ <% end %>
172
+
173
+ <% section "Multiple client grouping" do %>
174
+ <%= open_terms %>
175
+
176
+ Add the red, green, and blue terminals into the "grouping":
177
+ <code>
178
+ terms = curr_view.clients.select {|c| %w[red green blue].include? c.label.read }
179
+ terms.each {|c| c.group }
180
+ </code>
181
+
182
+ You should now see a new button labelled as "<notextile>@</notextile>" on the left-hand side of wmii's bar, indicating that there is now a new view labelled "<notextile>@</notextile>" in wmii. Let us inspect what clients this mysterious view contains:
183
+ <code>
184
+ v = View.new "@"
185
+ puts v.clients.map {|c| c.label.read }
186
+ </code>
187
+
188
+ 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.
189
+
190
+ 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:
191
+ <code>
192
+ grouping.each {|c| c.send "toggle" }
193
+ </code>
194
+
195
+ Neat! Let us bring them back into the managed area:
196
+ <code>
197
+ grouping.each {|c| c.send "toggle" }
198
+ </code>
199
+
200
+ <%= close_terms %>
201
+
202
+ 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.
203
+
204
+ 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.
205
+ <% end %>
206
+
207
+ <% section "Easy column manipulation" do %>
208
+ <%= open_terms %>
209
+
210
+ You can insert a group of clients to the top, bottom, or after the currently focused client of _any_ column using Array-like methods.
211
+
212
+ Give each client its own column (one client per column):
213
+ <code>
214
+ curr_view.each_column {|c| c.length = 1 }
215
+ </code>
216
+
217
+ Put (at most) three clients in every column:
218
+ <code>
219
+ curr_view.each_column {|c| c.length = 3 }
220
+ </code>
221
+
222
+ Move the red, green, and blue clients into the floating area:
223
+ <code>
224
+ terms = curr_view.clients.select {|c| %w[red green blue].include? c.label.read }
225
+ curr_view.areas[0].push terms
226
+ </code>
227
+
228
+ Slurp all floating clients into the last column:
229
+ <code>
230
+ list = curr_view.areas
231
+ a, b = list.first, list.last
232
+ b.concat a
233
+ </code>
234
+
235
+ Set the last column's layout to stacking mode:
236
+ <code>
237
+ b.layout = 'stack'
238
+ </code>
239
+
240
+ Move the red, green, and blue clients to the top of the second column:
241
+ <code>
242
+ curr_view.areas[2].unshift terms
243
+ </code>
244
+
245
+ Move the red, green, and blue clients to the bottom of the third column:
246
+ <code>
247
+ curr_view.areas[3].push terms
248
+ </code>
249
+
250
+ <%= close_terms %>
251
+ <% end %>
252
+
253
+ <% section "Easy client manipulation" do %>
254
+ <%= open_terms %>
255
+
256
+ Obtain a reference to the red client:
257
+ <code>
258
+ red = curr_view.clients.find {|c| c.label.read == "red" }
259
+ </code>
260
+
261
+ Show the red client's current tags:
262
+ <code>
263
+ red.tags
264
+ </code>
265
+
266
+ Add the "foo" and "bar" tags to the red client:
267
+ <code>
268
+ red.tag "foo", "bar"
269
+ </code>
270
+
271
+ Remove the "bar" tag from the red client:
272
+ <code>
273
+ red.untag "bar"
274
+ </code>
275
+
276
+ Do complex operations on the red client's tags:
277
+ <code>
278
+ red.with_tags { concat %w[a b c]; push 'z'; delete 'c' }
279
+ </code>
280
+
281
+ Focus the next client after the red client:
282
+ <code>
283
+ red.next.focus ; curr_client == red.next #=> true
284
+ </code>
285
+
286
+ Notice that by focusing a client, we make it the current client.
287
+
288
+ Focus the red client on a different view:
289
+ <code>
290
+ orig = curr_view
291
+ v = red.views.last
292
+ red.focus v
293
+ </code>
294
+
295
+ Return to the original view:
296
+ <code>
297
+ orig.focus
298
+ </code>
299
+
300
+ Send the red client to the last column:
301
+ <code>
302
+ red.send curr_view.areas.last
303
+ </code>
304
+
305
+ <%= close_terms %>
306
+ <% end %>
307
+
308
+ <% section "Traversing the file system" do %>
309
+ Show the root node of wmii's IXP file system:
310
+ <code>
311
+ fs
312
+ </code>
313
+
314
+ Show the names of all files at the root level:
315
+ <code>
316
+ fs.entries
317
+ </code>
318
+
319
+ Show the parent of the root node:
320
+ <code>
321
+ fs.parent
322
+ </code>
323
+
324
+ Show the children of the root node:
325
+ <code>
326
+ fs.children
327
+ </code>
328
+
329
+ Navigate into to the <tt>/lbar/</tt> directory:
330
+ <code>
331
+ n1 = fs.lbar
332
+ n2 = fs['lbar']
333
+ n1 == n2 #=> true
334
+ left_bar = n1
335
+ </code>
336
+
337
+ 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.
338
+
339
+ Create a new temporary button:
340
+ <code>
341
+ b = left_bar.rumai_example # path of new button
342
+ b.exist? #=> false
343
+ b.create
344
+ b.exist? #=> true
345
+ </code>
346
+
347
+ You should now see an empty button on the left-hand side of the wmii bar.
348
+
349
+ Color the button black-on-white and label it as "hello world":
350
+ <code>
351
+ content = "#000000 #ffffff #000000 hello world"
352
+ b.write content
353
+ b.read == content #=> true
354
+ </code>
355
+
356
+ Remove the temporary button:
357
+ <code>
358
+ b.remove
359
+ b.exist? #=> false
360
+ </code>
361
+ <% end %>
362
+ <% end %>
363
+
364
+ <% section "Available commands" do %>
365
+ The following table lists all methods provided by the @Rumai@ module and its subordinates. See the "API documentation":api/index.html for more extensive documentation.
366
+
367
+ |_. Method declaration |_. Description |
368
+ <%
369
+ # load library for parsing method documentation
370
+ require 'gerbil/rdoc'
371
+
372
+ Dir['lib/rumai/*.rb'].each do |f|
373
+ RDoc::TopLevel.parse_file f
374
+ end
375
+
376
+ RDoc::TopLevel.all_methods.sort_by {|m| m.full_name }.each do |m|
377
+ %>
378
+ | <code><%= m.decl %></code> | <noformat><%= m.comment_html %></noformat> |
379
+ <% end %>
380
+ <% end %>
381
+ <% end %>
382
+
383
+ <% section "Scripting your wmiirc", 'wmiirc' do %>
384
+ One important application of Rumai is the support of Ruby-based <tt>wmiirc</tt> configuration files. For a solid example of such application, take a look at my personal <tt>wmiirc</tt> which uses Rumai extensively:
385
+
386
+ darcs get http://snk.tuxfamily.org/src/wmiirc
387
+
388
+ Alternatively, you can "browse the contents of the above repository":http://snk.tuxfamily.org/src/wmiirc in your web browser.
389
+ <% end %>
390
+ <% end %>
data/doc/guide.html ADDED
@@ -0,0 +1,2035 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
5
+ <meta name="date" content="26 January 2008"/>
6
+ <meta name="author" content="Suraj N. Kurapati"/>
7
+ <meta name="generator" content="Gerbil 1.1.0"/>
8
+ <link rel="alternate" type="application/rss+xml" href="http://rumai.rubyforge.org/news.xml"/>
9
+ <title>Rumai 1.0.0 user guide</title>
10
+
11
+ <style type="text/css" media="screen">
12
+ body
13
+ {
14
+ color : #000000;
15
+ background-color : #FFFFFF;
16
+ line-height : 1.5em;
17
+ font-family : Calibri, Verdana, sans-serif;
18
+ }
19
+
20
+ /* emphasis */
21
+
22
+ em,
23
+ blockquote
24
+ {
25
+ font-family : Cambria, Georgia, serif;
26
+ }
27
+
28
+ /* headings */
29
+
30
+ h1,
31
+ h2,
32
+ h3,
33
+ h4,
34
+ h5,
35
+ h6,
36
+ .title
37
+ {
38
+ font-weight : lighter;
39
+ font-family : Constantia, "Book Antiqua", "URW Bookman L", serif;
40
+ }
41
+
42
+ #lof h1,
43
+ #lof h2,
44
+ #lof h3,
45
+ #lof h4,
46
+ #lof h5,
47
+ #lof h6
48
+ {
49
+ margin-top : 1.25em;
50
+ }
51
+
52
+ #content h1,
53
+ #content h2,
54
+ #content h3,
55
+ #content h4,
56
+ #content h5,
57
+ #content h6
58
+ {
59
+ margin-top : 2.5em;
60
+ line-height : 1.25em;
61
+ }
62
+
63
+ #content h1
64
+ {
65
+ font-size : 2.0em;
66
+ }
67
+
68
+ #content h2
69
+ {
70
+ font-size : 1.8em;
71
+ }
72
+
73
+ #content h3
74
+ {
75
+ font-size : 1.6em;
76
+ }
77
+
78
+ #content h4
79
+ {
80
+ font-size : 1.4em;
81
+ }
82
+
83
+ #content h5
84
+ {
85
+ font-size : 1.2em;
86
+ }
87
+
88
+ #content h6
89
+ {
90
+ font-size : 1.0em;
91
+ }
92
+
93
+ /* tables */
94
+
95
+ table
96
+ {
97
+ border : none;
98
+ margin : auto; /* center horizontally */
99
+ margin-top : 1em;
100
+ }
101
+
102
+ th,
103
+ td
104
+ {
105
+ padding : 1em;
106
+ border : 1px solid #C0C0C0;
107
+ vertical-align : top;
108
+ background-color : #FFFFFF;
109
+ }
110
+
111
+ th
112
+ {
113
+ background-color : #F5F5F5;
114
+ }
115
+
116
+ /* document structure */
117
+
118
+ #header
119
+ {
120
+ margin-bottom : 5em;
121
+ text-align : center;
122
+ }
123
+
124
+ #abstract
125
+ {
126
+ margin-bottom : 5em;
127
+ }
128
+
129
+ #toc li
130
+ {
131
+ list-style-type : none;
132
+ }
133
+
134
+ #toc li ul
135
+ {
136
+ padding-bottom : 1em;
137
+ border-left : thick solid #F5F5F5;
138
+ _border-left : none; /* for IE6 */
139
+ }
140
+
141
+ #toc li ul:hover
142
+ {
143
+ border-color : #DCDCDC;
144
+ }
145
+
146
+ #toc > ul
147
+ {
148
+ padding-left : 1em;
149
+ }
150
+
151
+ #references
152
+ {
153
+ margin-top : 5em;
154
+ }
155
+
156
+ #footer
157
+ {
158
+ border-top : thick dotted #DCDCDC;
159
+ padding-top : 1em;
160
+ margin-top : 5em;
161
+ text-align : center;
162
+ }
163
+
164
+ /* document nodes */
165
+
166
+ .part > .title,
167
+ .chapter > .title
168
+ {
169
+ padding-bottom : 0.5em;
170
+ }
171
+
172
+ .part > .title > big,
173
+ .chapter > .title > big
174
+ {
175
+ display : block;
176
+ margin-top : 0.25em;
177
+ }
178
+
179
+ .part .title big,
180
+ .chapter .title big
181
+ {
182
+ _display : block; /* for IE6 */
183
+ _margin-top : 0.25em; /* for IE6 */
184
+ _margin-bottom : 0.75em; /* for IE6 */
185
+ }
186
+
187
+ .paragraph > .title,
188
+ .tip > .title,
189
+ .note > .title,
190
+ .caution > .title,
191
+ .warning > .title,
192
+ .important > .title,
193
+ .figure > .title,
194
+ .table > .title,
195
+ .example > .title,
196
+ .equation > .title,
197
+ .procedure > .title
198
+ {
199
+ font-size : large;
200
+ margin-top : 2em;
201
+ }
202
+
203
+ .paragraph .title,
204
+ .tip .title,
205
+ .note .title,
206
+ .caution .title,
207
+ .warning .title,
208
+ .important .title,
209
+ .figure .title,
210
+ .table .title,
211
+ .example .title,
212
+ .equation .title,
213
+ .procedure .title
214
+ {
215
+ _font-size : large; /* for IE6 */
216
+ _font-weight : bold; /* large is not bold in IE6 */
217
+ _margin-top : 2em; /* for IE6 */
218
+ }
219
+
220
+ .tip ,
221
+ .note ,
222
+ .caution ,
223
+ .warning ,
224
+ .important,
225
+ .figure ,
226
+ .table ,
227
+ .example ,
228
+ .equation ,
229
+ .procedure
230
+ {
231
+ margin : 3em;
232
+ }
233
+
234
+ .tip > .icon,
235
+ .note > .icon,
236
+ .caution > .icon,
237
+ .warning > .icon,
238
+ .important > .icon
239
+ {
240
+ float : left;
241
+ margin : 0 1em 1em 0; /* top right bottom left */
242
+ }
243
+
244
+ .tip .icon,
245
+ .note .icon,
246
+ .caution .icon,
247
+ .warning .icon,
248
+ .important .icon
249
+ {
250
+ _display : none; /* IE6 cannot display embedded images */
251
+ }
252
+
253
+ .figure > .title
254
+ {
255
+ text-align : center;
256
+ }
257
+
258
+ .figure .title
259
+ {
260
+ _text-align : center; /* for IE6 */
261
+ }
262
+
263
+ .figure > .content img
264
+ {
265
+ display : block;
266
+ margin : auto;
267
+ }
268
+
269
+ .figure .content img
270
+ {
271
+ _display : block; /* for IE6 */
272
+ _margin : auto; /* for IE6 */
273
+ }
274
+
275
+ body
276
+ {
277
+ margin : auto;
278
+ padding : 0.5em;
279
+ max-width : 36em;
280
+ }
281
+
282
+ /* hyperlinks */
283
+
284
+ a
285
+ {
286
+ color : #0000FF;
287
+ text-decoration : none;
288
+ }
289
+
290
+ a:visited
291
+ {
292
+ color : #800080;
293
+ }
294
+
295
+ a:hover
296
+ {
297
+ color : #FF0000;
298
+ text-decoration : underline;
299
+ }
300
+
301
+ a:target
302
+ {
303
+ color : #FF0000;
304
+ text-decoration : underline;
305
+ }
306
+
307
+ a.toc:link,
308
+ a.toc:visited
309
+ {
310
+ text-decoration : none;
311
+ z-index : 1;
312
+ }
313
+
314
+ a img
315
+ {
316
+ border : none;
317
+ }
318
+
319
+ /*
320
+ mark external links with a symbol to help the user
321
+ distinguish between internal and external links
322
+ */
323
+ a:after
324
+ {
325
+ content: "∗";
326
+ }
327
+
328
+ a[href^="#"]:after
329
+ {
330
+ content: "";
331
+ }
332
+
333
+ /* source code */
334
+
335
+ tt,
336
+ code,
337
+ pre
338
+ {
339
+ font-family : Consolas, "Lucida Console", monospace;
340
+ }
341
+
342
+ tt
343
+ {
344
+ font-weight : bold;
345
+ color : #A52A2A;
346
+ background-color : #FFFAF0;
347
+ }
348
+
349
+ /* output of syntax colorizer */
350
+ .code
351
+ {
352
+ background-color : #FFFFF0;
353
+ }
354
+
355
+ pre
356
+ {
357
+ line-height : normal;
358
+ border : 1px dashed #C0C0C0;
359
+ background-color : #F5FFDF;
360
+ padding : 1em;
361
+ overflow : auto;
362
+ cursor : text;
363
+ }
364
+
365
+ /*
366
+ pre:hover
367
+ {
368
+ border : none;
369
+ position : fixed;
370
+ z-index : 1;
371
+ margin : 0;
372
+ top : 0;
373
+ left : 0;
374
+ right : 0;
375
+ bottom : 0;
376
+ overflow : auto;
377
+ cursor : text;
378
+ }
379
+ */
380
+
381
+ /* emphasis */
382
+
383
+ blockquote
384
+ {
385
+ margin : 1em;
386
+ border : 5px dotted #C0C0C0;
387
+ padding : 1em;
388
+ color : #444;
389
+ }
390
+
391
+ hr
392
+ {
393
+ color : #FF0000; /* for IE6 */
394
+ background-color : #FF0000; /* for Firefox */
395
+ }
396
+
397
+ </style>
398
+ <style type="text/css" media="print">
399
+ body
400
+ {
401
+ color : #000000;
402
+ background-color : #FFFFFF;
403
+ line-height : 1.5em;
404
+ font-family : Calibri, Verdana, sans-serif;
405
+ }
406
+
407
+ /* emphasis */
408
+
409
+ em,
410
+ blockquote
411
+ {
412
+ font-family : Cambria, Georgia, serif;
413
+ }
414
+
415
+ /* headings */
416
+
417
+ h1,
418
+ h2,
419
+ h3,
420
+ h4,
421
+ h5,
422
+ h6,
423
+ .title
424
+ {
425
+ font-weight : lighter;
426
+ font-family : Constantia, "Book Antiqua", "URW Bookman L", serif;
427
+ }
428
+
429
+ #lof h1,
430
+ #lof h2,
431
+ #lof h3,
432
+ #lof h4,
433
+ #lof h5,
434
+ #lof h6
435
+ {
436
+ margin-top : 1.25em;
437
+ }
438
+
439
+ #content h1,
440
+ #content h2,
441
+ #content h3,
442
+ #content h4,
443
+ #content h5,
444
+ #content h6
445
+ {
446
+ margin-top : 2.5em;
447
+ line-height : 1.25em;
448
+ }
449
+
450
+ #content h1
451
+ {
452
+ font-size : 2.0em;
453
+ }
454
+
455
+ #content h2
456
+ {
457
+ font-size : 1.8em;
458
+ }
459
+
460
+ #content h3
461
+ {
462
+ font-size : 1.6em;
463
+ }
464
+
465
+ #content h4
466
+ {
467
+ font-size : 1.4em;
468
+ }
469
+
470
+ #content h5
471
+ {
472
+ font-size : 1.2em;
473
+ }
474
+
475
+ #content h6
476
+ {
477
+ font-size : 1.0em;
478
+ }
479
+
480
+ /* tables */
481
+
482
+ table
483
+ {
484
+ border : none;
485
+ margin : auto; /* center horizontally */
486
+ margin-top : 1em;
487
+ }
488
+
489
+ th,
490
+ td
491
+ {
492
+ padding : 1em;
493
+ border : 1px solid #C0C0C0;
494
+ vertical-align : top;
495
+ background-color : #FFFFFF;
496
+ }
497
+
498
+ th
499
+ {
500
+ background-color : #F5F5F5;
501
+ }
502
+
503
+ /* document structure */
504
+
505
+ #header
506
+ {
507
+ margin-bottom : 5em;
508
+ text-align : center;
509
+ }
510
+
511
+ #abstract
512
+ {
513
+ margin-bottom : 5em;
514
+ }
515
+
516
+ #toc li
517
+ {
518
+ list-style-type : none;
519
+ }
520
+
521
+ #toc li ul
522
+ {
523
+ padding-bottom : 1em;
524
+ border-left : thick solid #F5F5F5;
525
+ _border-left : none; /* for IE6 */
526
+ }
527
+
528
+ #toc li ul:hover
529
+ {
530
+ border-color : #DCDCDC;
531
+ }
532
+
533
+ #toc > ul
534
+ {
535
+ padding-left : 1em;
536
+ }
537
+
538
+ #references
539
+ {
540
+ margin-top : 5em;
541
+ }
542
+
543
+ #footer
544
+ {
545
+ border-top : thick dotted #DCDCDC;
546
+ padding-top : 1em;
547
+ margin-top : 5em;
548
+ text-align : center;
549
+ }
550
+
551
+ /* document nodes */
552
+
553
+ .part > .title,
554
+ .chapter > .title
555
+ {
556
+ padding-bottom : 0.5em;
557
+ }
558
+
559
+ .part > .title > big,
560
+ .chapter > .title > big
561
+ {
562
+ display : block;
563
+ margin-top : 0.25em;
564
+ }
565
+
566
+ .part .title big,
567
+ .chapter .title big
568
+ {
569
+ _display : block; /* for IE6 */
570
+ _margin-top : 0.25em; /* for IE6 */
571
+ _margin-bottom : 0.75em; /* for IE6 */
572
+ }
573
+
574
+ .paragraph > .title,
575
+ .tip > .title,
576
+ .note > .title,
577
+ .caution > .title,
578
+ .warning > .title,
579
+ .important > .title,
580
+ .figure > .title,
581
+ .table > .title,
582
+ .example > .title,
583
+ .equation > .title,
584
+ .procedure > .title
585
+ {
586
+ font-size : large;
587
+ margin-top : 2em;
588
+ }
589
+
590
+ .paragraph .title,
591
+ .tip .title,
592
+ .note .title,
593
+ .caution .title,
594
+ .warning .title,
595
+ .important .title,
596
+ .figure .title,
597
+ .table .title,
598
+ .example .title,
599
+ .equation .title,
600
+ .procedure .title
601
+ {
602
+ _font-size : large; /* for IE6 */
603
+ _font-weight : bold; /* large is not bold in IE6 */
604
+ _margin-top : 2em; /* for IE6 */
605
+ }
606
+
607
+ .tip ,
608
+ .note ,
609
+ .caution ,
610
+ .warning ,
611
+ .important,
612
+ .figure ,
613
+ .table ,
614
+ .example ,
615
+ .equation ,
616
+ .procedure
617
+ {
618
+ margin : 3em;
619
+ }
620
+
621
+ .tip > .icon,
622
+ .note > .icon,
623
+ .caution > .icon,
624
+ .warning > .icon,
625
+ .important > .icon
626
+ {
627
+ float : left;
628
+ margin : 0 1em 1em 0; /* top right bottom left */
629
+ }
630
+
631
+ .tip .icon,
632
+ .note .icon,
633
+ .caution .icon,
634
+ .warning .icon,
635
+ .important .icon
636
+ {
637
+ _display : none; /* IE6 cannot display embedded images */
638
+ }
639
+
640
+ .figure > .title
641
+ {
642
+ text-align : center;
643
+ }
644
+
645
+ .figure .title
646
+ {
647
+ _text-align : center; /* for IE6 */
648
+ }
649
+
650
+ .figure > .content img
651
+ {
652
+ display : block;
653
+ margin : auto;
654
+ }
655
+
656
+ .figure .content img
657
+ {
658
+ _display : block; /* for IE6 */
659
+ _margin : auto; /* for IE6 */
660
+ }
661
+
662
+ /* headings */
663
+
664
+ h1,
665
+ h2,
666
+ h3,
667
+ h4,
668
+ h5,
669
+ h6
670
+ {
671
+ font-weight : normal;
672
+ }
673
+
674
+ /* hyperlinks */
675
+
676
+ a:link,
677
+ a:visited,
678
+ a:active
679
+ {
680
+ color : #0000FF;
681
+ font-weight : bold;
682
+ text-decoration : underline;
683
+ }
684
+
685
+ a:after
686
+ {
687
+ content : " (" attr(href) ")";
688
+ font-family : sans-serif;
689
+ font-weight : normal;
690
+ font-size : 90%;
691
+ }
692
+
693
+ a[href^="#"]:after
694
+ {
695
+ content : "";
696
+ }
697
+
698
+ a[href^="#"]
699
+ {
700
+ color : #A52A2A;
701
+ font-weight : lighter;
702
+ text-decoration : none;
703
+ font-style : italic;
704
+ }
705
+
706
+ a.toc:link,
707
+ a.toc:visited
708
+ {
709
+ color : inherit;
710
+ .color : #000000; /* for IE6 and IE7 */
711
+ font-weight : inherit;
712
+ text-decoration : none;
713
+ font-style : normal;
714
+ }
715
+
716
+ /* source code */
717
+
718
+ tt
719
+ {
720
+ color : inherit;
721
+ background-color : inherit;
722
+ font-weight : normal;
723
+ }
724
+
725
+ pre,
726
+ .code
727
+ {
728
+ border : none;
729
+ overflow : visible;
730
+ background-color : inherit;
731
+ }
732
+
733
+ /* document structure */
734
+
735
+ #lof
736
+ {
737
+ display : none;
738
+ }
739
+
740
+ /* document nodes */
741
+
742
+ .part > .title > big,
743
+ .chapter > .title > big
744
+ {
745
+ padding-bottom : 0.5em;
746
+ }
747
+
748
+ .part .title big,
749
+ .chapter .title big
750
+ {
751
+ _padding-bottom : 0.5em; /* for IE6 */
752
+ }
753
+
754
+ </style>
755
+ </head>
756
+ <body>
757
+ <div id="header">
758
+
759
+ <h1 class="title">Rumai 1.0.0 user guide</h1>
760
+ <h2 class="authors"><a href="http://snk.tuxfamily.org">Suraj N. Kurapati</a></h2>
761
+ <h3 class="date">26 January 2008</h3>
762
+ </div>
763
+
764
+
765
+ <div id="toc"><h1>Contents</h1> <ul><li>1&nbsp;&nbsp;<a id="a-606956178" href="#Introduction">Introduction</a><ul><li>1.1&nbsp;&nbsp;<a id="a-606960438" href="#Resources">Resources</a></li><li>1.2&nbsp;&nbsp;<a id="a-606963908" href="#License">License</a></li></ul></li><li>2&nbsp;&nbsp;<a id="a-606966618" href="#Setup">Setup</a><ul><li>2.1&nbsp;&nbsp;<a id="a-606968098" href="#Requirements">Requirements</a></li><li>2.2&nbsp;&nbsp;<a id="a-606970128" href="#Installation">Installation</a></li><li>2.3&nbsp;&nbsp;<a id="a-606973738" href="#Manifest">Manifest</a></li><li>2.4&nbsp;&nbsp;<a id="a-606975918" href="#Version-numbering-system">Version numbering system</a></li></ul></li><li>3&nbsp;&nbsp;<a id="a-606978438" href="#Usage">Usage</a><ul><li>3.1&nbsp;&nbsp;<a id="a-606979948" href="#Concepts">Concepts</a></li><li>3.2&nbsp;&nbsp;<a id="a-606981988" href="#shell">Interactive shell</a><ul><li>3.2.1&nbsp;&nbsp;<a id="a-606983728" href="#Live-demonstration">Live demonstration</a><ul><li>3.2.1.1&nbsp;&nbsp;<a id="a-606985418" href="#Automated-client-arrangement">Automated client arrangement</a></li><li>3.2.1.2&nbsp;&nbsp;<a id="a-606092078" href="#Multiple-client-grouping">Multiple client grouping</a></li><li>3.2.1.3&nbsp;&nbsp;<a id="a-606113088" href="#Easy-column-manipulation">Easy column manipulation</a></li><li>3.2.1.4&nbsp;&nbsp;<a id="a-606129268" href="#Easy-client-manipulation">Easy client manipulation</a></li><li>3.2.1.5&nbsp;&nbsp;<a id="a-606134168" href="#Traversing-the-file-system">Traversing the file system</a></li></ul></li><li>3.2.2&nbsp;&nbsp;<a id="a-606141278" href="#Available-commands">Available commands</a></li></ul></li><li>3.3&nbsp;&nbsp;<a id="a-607083858" href="#wmiirc">Scripting your wmiirc</a></li></ul></li></ul></div>
766
+
767
+
768
+
769
+ <div id="content">
770
+ <div class="chapter">
771
+ <h1 class="title">
772
+ Chapter
773
+ <a class="toc" id="Introduction" href="#a-606956178">1</a>
774
+
775
+ <br/>
776
+
777
+ <big>Introduction</big>
778
+ </h1>
779
+
780
+ <div class="content"><p>Rumai is a library for manipulating the <a href="http://www.suckless.org/wiki/wmii">wmii</a> window manager through <a href="http://ruby-lang.org">Ruby</a>. It excels at <strong>dynamic arrangement</strong> of clients, columns, views, and tags.</p>
781
+
782
+
783
+ <p>Rumai also provides (1) an <a class="xref" href="#shell">interactive shell</a> for live entertainment, and (2) a <strong>pure Ruby client</strong> for the <a href="http://cm.bell-labs.com/magic/man2html/5/intro">9P2000 protocol</a>, which it uses to communicate with wmii&#8217;s <a href="http://www.suckless.org/wiki/libs/libixp">IXP file-system interface</a>.</p>
784
+
785
+
786
+ <p>Rumai is <strong>open-source software</strong> (see <a class="xref" href="#License">Section 1.2: <em>License</em></a>) so feel free to contribute your improvements to and discuss your ideas with the author. You can obtain the source code from the project <a href="http://darcs.net">Darcs</a> repository by running the following command:</p>
787
+
788
+
789
+ <pre>darcs get http://rumai.rubyforge.org/src rumai</pre>
790
+
791
+
792
+ <p><div class="section">
793
+ <h2 class="title">
794
+ <a class="toc" id="Resources" href="#a-606960438">1.1</a>&nbsp;&nbsp;Resources
795
+ </h2>
796
+ <div class="content"><ul>
797
+ <li><a href="http://rumai.rubyforge.org/news.xml">News feed</a>
798
+ &#8211; project news and release announcements.</li>
799
+ <li><a href="http://rubyforge.org/frs/?group_id=5005">Download area</a>
800
+ &#8211; place to obtain release packages.</li>
801
+ <li><a href="api/index.html">API reference</a>
802
+ &#8211; documentation for all provided Ruby code.</li>
803
+ <li>Support / feedback
804
+ &#8211; send an e-mail to the author (see address in <a class="xref" href="#License">Section 1.2: <em>License</em></a>).</li>
805
+ </ul></div>
806
+ </div>
807
+ <div class="section">
808
+ <h2 class="title">
809
+ <a class="toc" id="License" href="#a-606963908">1.2</a>&nbsp;&nbsp;License
810
+ </h2>
811
+ <div class="content"><p>Copyright 2006 Suraj N. Kurapati &lt;SNK at GNA dot ORG&gt;</p>
812
+
813
+
814
+ <p>Permission is hereby granted, free of charge, to any person obtaining a
815
+ copy of this software and associated documentation files (the &quot;Software&quot;),
816
+ to deal in the Software without restriction, including without limitation
817
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
818
+ and/or sell copies of the Software, and to permit persons to whom the
819
+ Software is furnished to do so, subject to the following conditions:</p>
820
+
821
+
822
+ <ul>
823
+ <li>All copies and substantial portions of the Software (the &quot;Derivatives&quot;)
824
+ and their corresponding machine-readable source code (the &quot;Code&quot;) must
825
+ include the above copyright notice and this permission notice.</li>
826
+ </ul>
827
+
828
+
829
+ <ul>
830
+ <li>Upon distribution, the Derivatives must be accompanied either by the Code
831
+ or&mdash;provided that the Code is obtainable for no more than the cost of
832
+ distribution plus a nominal fee&mdash;by information on how to obtain the Code.</li>
833
+ </ul>
834
+
835
+
836
+ <p><span class="caps">THE SOFTWARE IS PROVIDED</span> &quot;AS IS&quot;, <span class="caps">WITHOUT WARRANTY OF ANY KIND</span>, EXPRESS OR
837
+ IMPLIED, INCLUDING <span class="caps">BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY</span>, FITNESS
838
+ <span class="caps">FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT</span>. IN <span class="caps">NO EVENT SHALL THE AUTHORS OR</span>
839
+ <span class="caps">COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM</span>, DAMAGES <span class="caps">OR OTHER LIABILITY</span>, WHETHER
840
+ <span class="caps">IN AN ACTION OF CONTRACT</span>, TORT <span class="caps">OR OTHERWISE</span>, ARISING FROM, OUT <span class="caps">OF OR IN</span>
841
+ <span class="caps">CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE</span>.</p></div>
842
+ </div></p></div>
843
+ </div>
844
+ <div class="chapter">
845
+ <h1 class="title">
846
+ Chapter
847
+ <a class="toc" id="Setup" href="#a-606966618">2</a>
848
+
849
+ <br/>
850
+
851
+ <big>Setup</big>
852
+ </h1>
853
+
854
+ <div class="content"><div class="section">
855
+ <h2 class="title">
856
+ <a class="toc" id="Requirements" href="#a-606968098">2.1</a>&nbsp;&nbsp;Requirements
857
+ </h2>
858
+ <div class="content">Your system needs the following software to run Rumai.
859
+
860
+
861
+ <table border="1">
862
+ <tr>
863
+ <th>Software </th>
864
+ <th>Notes </th>
865
+ </tr>
866
+ <tr>
867
+ <td> <a href="http://ruby-lang.org">Ruby</a> </td>
868
+ <td> Version 1.8.x is required. </td>
869
+ </tr>
870
+ <tr>
871
+ <td> <a href="http://www.suckless.org/wiki/wmii">wmii</a> </td>
872
+ <td> wmii-snap20070516 or newer is required. </td>
873
+ </tr>
874
+ </table></div>
875
+ </div>
876
+ <div class="section">
877
+ <h2 class="title">
878
+ <a class="toc" id="Installation" href="#a-606970128">2.2</a>&nbsp;&nbsp;Installation
879
+ </h2>
880
+ <div class="content"><p>If your system has <a href="http://rubygems.org/">RubyGems</a>, then you can install Rumai by running the following commands:</p>
881
+
882
+
883
+ <pre>gem install rumai
884
+ rumai -v</pre>
885
+
886
+
887
+ Otherwise, follow these instructions:
888
+ <ol>
889
+ <li>Download the newest release package from <a href="http://rubyforge.org/frs/?group_id=5005">the download area</a>.</li>
890
+ <li>Extract the release package anywhere you want on your system.</li>
891
+ <li>Go inside the extracted directory and run the following command:</li>
892
+ </ol>
893
+
894
+
895
+ <pre>ruby bin/rumai -v</pre>
896
+
897
+
898
+ <p>If the installation was successful, then you will see output like this: <pre>Rumai 1.0.0 (2008-01-26) http://rumai.rubyforge.org /home/sun/src/rumai
899
+ </pre></p>
900
+
901
+
902
+ <p>Otherwise, you can e-mail the author (see address in <a class="xref" href="#License">Section 1.2: <em>License</em></a>) for help.</p></div>
903
+ </div>
904
+ <div class="section">
905
+ <h2 class="title">
906
+ <a class="toc" id="Manifest" href="#a-606973738">2.3</a>&nbsp;&nbsp;Manifest
907
+ </h2>
908
+ <div class="content">Now that Rumai is installed on your system, let us examine its installation directory.
909
+ <ul>
910
+ <li>If you installed Rumai manually, then you already know the location of its installation directory.</li>
911
+ <li>If you installed Rumai using RubyGems, then run <pre>rumai -v</pre> and select the right-most item in the output&mdash;that is the path of Rumai&#8217;s installation directory.</li>
912
+ </ul>
913
+
914
+
915
+ Inside Rumai&#8217;s installation directory, you will see (among other things) the following items:
916
+ <ul>
917
+ <li><tt>bin/</tt> &#8211; contains executable programs.
918
+ <ul>
919
+ <li><tt>rumai</tt> &#8211; the interactive shell.</li>
920
+ </ul>
921
+ </li>
922
+ <li><tt>lib/</tt>
923
+ <ul>
924
+ <li><tt>rumai.rb</tt> &#8211; the main Rumai library.</li>
925
+ <li><tt>rumai/</tt>
926
+ <ul>
927
+ <li><tt>ixp.rb</tt> &#8211; the pure Ruby client for the <a href="http://cm.bell-labs.com/magic/man2html/5/intro">9P2000 protocol</a>.</li>
928
+ </ul>
929
+ </li>
930
+ </ul>
931
+ </li>
932
+ <li><tt>doc/</tt> &#8211; contains the user guide and other documentation.
933
+ <ul>
934
+ <li><tt>guide.erb</tt> &#8211; the source file of this user guide.</li>
935
+ <li><tt>api/</tt> &#8211; contains API reference documentation.</li>
936
+ </ul>
937
+ </li>
938
+ <li><tt>LICENSE</tt> &#8211; the project license and copyright notice.</li>
939
+ </ul></div>
940
+ </div>
941
+ <div class="section">
942
+ <h2 class="title">
943
+ <a class="toc" id="Version-numbering-system" href="#a-606975918">2.4</a>&nbsp;&nbsp;Version numbering system
944
+ </h2>
945
+ <div class="content">Rumai uses the <a href="http://www.rubygems.org/read/chapter/7">RubyGems rational versioning policy</a> to number its releases. This <strong>major.minor.patch</strong> numbering policy <a href="http://ablog.apress.com/?p=738">is summarized</a> as follows.
946
+
947
+
948
+ <table border="1">
949
+ <tr>
950
+ <td> Version number components: </td>
951
+ <th>Major </th>
952
+ <th>Minor </th>
953
+ <th>Patch </th>
954
+ </tr>
955
+ <tr>
956
+ <th>Backwards compatible? </th>
957
+ <td> no </td>
958
+ <td> yes </td>
959
+ <td> yes </td>
960
+ </tr>
961
+ <tr>
962
+ <th>New features? </th>
963
+ <td> yes </td>
964
+ <td> yes </td>
965
+ <td> no </td>
966
+ </tr>
967
+ <tr>
968
+ <th>Bug fixes? </th>
969
+ <td> yes </td>
970
+ <td> yes </td>
971
+ <td> yes </td>
972
+ </tr>
973
+ </table></div>
974
+ </div></div>
975
+ </div>
976
+ <div class="chapter">
977
+ <h1 class="title">
978
+ Chapter
979
+ <a class="toc" id="Usage" href="#a-606978438">3</a>
980
+
981
+ <br/>
982
+
983
+ <big>Usage</big>
984
+ </h1>
985
+
986
+ <div class="content"><div class="section">
987
+ <h2 class="title">
988
+ <a class="toc" id="Concepts" href="#a-606979948">3.1</a>&nbsp;&nbsp;Concepts
989
+ </h2>
990
+ <div class="content">If you wish to wield the power of Rumai more effectively, you should understand the following basic concepts:
991
+ <ul>
992
+ <li>A <strong>client</strong> is any graphical program that is running in your X session. In other words, any <strong>window</strong> in your wmii session is a <strong>client</strong>.</li>
993
+ <li>A <strong>tag</strong> is an arbitrary string (a label) that can be associated with one or more clients.</li>
994
+ <li>A <strong>view</strong> is a graphical representation of a <strong>tag</strong>. It shows all clients associated with a particular tag.</li>
995
+ <li>An <strong>area</strong> is a region inside a <strong>view</strong>. It contains clients.
996
+ <ul>
997
+ <li>A <strong>managed area</strong> or <strong>column</strong> is a region where clients cannot overlap each other.</li>
998
+ <li>The <strong>floating area</strong> is an area whose clients (1) can overlap each other and (2) <em>float above</em> the managed areas.</li>
999
+ </ul></li>
1000
+ </ul></div>
1001
+ </div>
1002
+ <div class="section">
1003
+ <h2 class="title">
1004
+ <a class="toc" id="shell" href="#a-606981988">3.2</a>&nbsp;&nbsp;Interactive shell
1005
+ </h2>
1006
+ <div class="content"><p>Run the following command to start Rumai&#8217;s interactive shell (IRB):</p>
1007
+
1008
+
1009
+ <pre>rumai</pre>
1010
+
1011
+
1012
+ <p>You should now see a command prompt like this:</p>
1013
+
1014
+
1015
+ <pre>irb(Rumai):001:0&gt;</pre>
1016
+
1017
+
1018
+ <p>The &#8220;irb(<strong>Rumai</strong>)&#8221; token in the prompt indicates that commands will be evaluated <em>inside</em> the <code class="code"><span style="color:#036; font-weight:bold">Rumai</span></code> module. As a result, you can omit the &#8220;Rumai&#8221; prefix from your commands if you wish.</p>
1019
+
1020
+
1021
+ <p>For example, to get the current client object, you can type <code class="code">curr_client</code> instead of having to type <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>.curr_client</code> at the prompt. However, note that both commands both achieve the same effect and are thereby equivalent.</p>
1022
+
1023
+
1024
+ <p>The next thing to note is that <strong>tab completion</strong> is enabled by default. Consequently, you can type part of a command and press the TAB key to see a list of possible completions.</p>
1025
+
1026
+
1027
+ <p>Finally, the interactive shell is a standard IRB session. As a result your <tt>~/.irbrc</tt> file is read and processed by default. Furthermore, you can pass the standard IRB command-line options to the <strong>rumai</strong> command.</p>
1028
+
1029
+
1030
+ <p><div class="section">
1031
+ <h3 class="title">
1032
+ <a class="toc" id="Live-demonstration" href="#a-606983728">3.2.1</a>&nbsp;&nbsp;Live demonstration
1033
+ </h3>
1034
+ <div class="content"><p>Now that you have a command prompt, let us walk through a quick demonstration that highlights the main features of Rumai. You can follow along by copying &#38; pasting the presented commands into the interactive shell.</p>
1035
+
1036
+
1037
+ <p><div class="section">
1038
+ <h4 class="title">
1039
+ <a class="toc" id="Automated-client-arrangement" href="#a-606985418">3.2.1.1</a>&nbsp;&nbsp;Automated client arrangement
1040
+ </h4>
1041
+ <div class="content"><p>Launch a few terminals so that we have something to work with:
1042
+ <pre class="code">
1043
+ colors = <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20"> red green blue black orange brown gray navy gold </span><span style="color:#710">]</span></span>
1044
+ colors.each {|c| system <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">xterm -bg </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -title </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -e read &amp;</span><span style="color:#710">&quot;</span></span> }
1045
+ </pre></p>
1046
+
1047
+
1048
+ <p>Arrange all clients in a grid:
1049
+ <pre class="code">
1050
+ curr_view.arrange_in_grid
1051
+ </pre></p>
1052
+
1053
+
1054
+ <p>Arrange all clients in a diamond shape:
1055
+ <pre class="code">
1056
+ curr_view.arrange_in_diamond
1057
+ </pre></p>
1058
+
1059
+
1060
+ <p>Arrange all clients like LarsWM does:
1061
+ <pre class="code">
1062
+ curr_view.arrange_as_larswm
1063
+ </pre></p>
1064
+
1065
+
1066
+ <p>Close the terminals we launched earlier:
1067
+ <pre class="code">
1068
+ terms = curr_view.clients.select {|c| colors.include? c.label.read }
1069
+ terms.each {|c| c.ctl.write <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">kill</span><span style="color:#710">&quot;</span></span> }
1070
+ </pre></p></div>
1071
+ </div>
1072
+ <div class="section">
1073
+ <h4 class="title">
1074
+ <a class="toc" id="Multiple-client-grouping" href="#a-606092078">3.2.1.2</a>&nbsp;&nbsp;Multiple client grouping
1075
+ </h4>
1076
+ <div class="content"><p>Launch a few terminals so that we have something to work with:
1077
+ <pre class="code">
1078
+ colors = <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20"> red green blue black orange brown gray navy gold </span><span style="color:#710">]</span></span>
1079
+ colors.each {|c| system <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">xterm -bg </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -title </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -e read &amp;</span><span style="color:#710">&quot;</span></span> }
1080
+ </pre></p>
1081
+
1082
+
1083
+ <p>Add the red, green, and blue terminals into the &#8220;grouping&#8221;:
1084
+ <pre class="code">
1085
+ terms = curr_view.clients.select {|c| <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20">red green blue</span><span style="color:#710">]</span></span>.include? c.label.read }
1086
+ terms.each {|c| c.group }
1087
+ </pre></p>
1088
+
1089
+
1090
+ <p>You should now see a new button labelled as &#8220;@&#8221; on the left-hand side of wmii&#8217;s bar, indicating that there is now a new view labelled &#8220;@&#8221; in wmii. Let us inspect what clients this mysterious view contains:
1091
+ <pre class="code">
1092
+ v = <span style="color:#036; font-weight:bold">View</span>.new <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">@</span><span style="color:#710">&quot;</span></span>
1093
+ puts v.clients.map {|c| c.label.read }
1094
+ </pre></p>
1095
+
1096
+
1097
+ <p>Aha! The mysterious view contains the red, green, and blue clients we recently &#8220;grouped&#8221;. Thus, by adding a client to the &#8220;grouping&#8221;, we are simply tagging the client with the &#8221;@&#8221; token.</p>
1098
+
1099
+
1100
+ <p>Now that we have put some clients into the &#8220;grouping&#8221;, let us move all clients in the grouping to the floating area in the current view:
1101
+ <pre class="code">
1102
+ grouping.each {|c| c.send <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">toggle</span><span style="color:#710">&quot;</span></span> }
1103
+ </pre></p>
1104
+
1105
+
1106
+ <p>Neat! Let us bring them back into the managed area:
1107
+ <pre class="code">
1108
+ grouping.each {|c| c.send <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">toggle</span><span style="color:#710">&quot;</span></span> }
1109
+ </pre></p>
1110
+
1111
+
1112
+ <p>Close the terminals we launched earlier:
1113
+ <pre class="code">
1114
+ terms = curr_view.clients.select {|c| colors.include? c.label.read }
1115
+ terms.each {|c| c.ctl.write <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">kill</span><span style="color:#710">&quot;</span></span> }
1116
+ </pre></p>
1117
+
1118
+
1119
+ <p>In summary, you can select multiple clients (by adding them to the &#8220;grouping&#8221;) 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.</p>
1120
+
1121
+
1122
+ <p>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.</p></div>
1123
+ </div>
1124
+ <div class="section">
1125
+ <h4 class="title">
1126
+ <a class="toc" id="Easy-column-manipulation" href="#a-606113088">3.2.1.3</a>&nbsp;&nbsp;Easy column manipulation
1127
+ </h4>
1128
+ <div class="content"><p>Launch a few terminals so that we have something to work with:
1129
+ <pre class="code">
1130
+ colors = <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20"> red green blue black orange brown gray navy gold </span><span style="color:#710">]</span></span>
1131
+ colors.each {|c| system <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">xterm -bg </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -title </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -e read &amp;</span><span style="color:#710">&quot;</span></span> }
1132
+ </pre></p>
1133
+
1134
+
1135
+ <p>You can insert a group of clients to the top, bottom, or after the currently focused client of <em>any</em> column using Array-like methods.</p>
1136
+
1137
+
1138
+ <p>Give each client its own column (one client per column):
1139
+ <pre class="code">
1140
+ curr_view.each_column {|c| c.length = <span style="color:#00D; font-weight:bold">1</span> }
1141
+ </pre></p>
1142
+
1143
+
1144
+ <p>Put (at most) three clients in every column:
1145
+ <pre class="code">
1146
+ curr_view.each_column {|c| c.length = <span style="color:#00D; font-weight:bold">3</span> }
1147
+ </pre></p>
1148
+
1149
+
1150
+ <p>Move the red, green, and blue clients into the floating area:
1151
+ <pre class="code">
1152
+ terms = curr_view.clients.select {|c| <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20">red green blue</span><span style="color:#710">]</span></span>.include? c.label.read }
1153
+ curr_view.areas[<span style="color:#00D; font-weight:bold">0</span>].push terms
1154
+ </pre></p>
1155
+
1156
+
1157
+ <p>Slurp all floating clients into the last column:
1158
+ <pre class="code">
1159
+ list = curr_view.areas
1160
+ a, b = list.first, list.last
1161
+ b.concat a
1162
+ </pre></p>
1163
+
1164
+
1165
+ <p>Set the last column&#8217;s layout to stacking mode:
1166
+ <pre class="code">
1167
+ b.layout = <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">stack</span><span style="color:#710">'</span></span>
1168
+ </pre></p>
1169
+
1170
+
1171
+ <p>Move the red, green, and blue clients to the top of the second column:
1172
+ <pre class="code">
1173
+ curr_view.areas[<span style="color:#00D; font-weight:bold">2</span>].unshift terms
1174
+ </pre></p>
1175
+
1176
+
1177
+ <p>Move the red, green, and blue clients to the bottom of the third column:
1178
+ <pre class="code">
1179
+ curr_view.areas[<span style="color:#00D; font-weight:bold">3</span>].push terms
1180
+ </pre></p>
1181
+
1182
+
1183
+ <p>Close the terminals we launched earlier:
1184
+ <pre class="code">
1185
+ terms = curr_view.clients.select {|c| colors.include? c.label.read }
1186
+ terms.each {|c| c.ctl.write <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">kill</span><span style="color:#710">&quot;</span></span> }
1187
+ </pre></p></div>
1188
+ </div>
1189
+ <div class="section">
1190
+ <h4 class="title">
1191
+ <a class="toc" id="Easy-client-manipulation" href="#a-606129268">3.2.1.4</a>&nbsp;&nbsp;Easy client manipulation
1192
+ </h4>
1193
+ <div class="content"><p>Launch a few terminals so that we have something to work with:
1194
+ <pre class="code">
1195
+ colors = <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20"> red green blue black orange brown gray navy gold </span><span style="color:#710">]</span></span>
1196
+ colors.each {|c| system <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">xterm -bg </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -title </span><span style="background: #eee"><span style="font-weight: bold; color: #888">#{</span>c<span style="font-weight: bold; color: #888">}</span></span><span style="color:#D20"> -e read &amp;</span><span style="color:#710">&quot;</span></span> }
1197
+ </pre></p>
1198
+
1199
+
1200
+ <p>Obtain a reference to the red client:
1201
+ <pre class="code">
1202
+ red = curr_view.clients.find {|c| c.label.read == <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">red</span><span style="color:#710">&quot;</span></span> }
1203
+ </pre></p>
1204
+
1205
+
1206
+ <p>Show the red client&#8217;s current tags:
1207
+ <pre class="code">
1208
+ red.tags
1209
+ </pre></p>
1210
+
1211
+
1212
+ <p>Add the &#8220;foo&#8221; and &#8220;bar&#8221; tags to the red client:
1213
+ <pre class="code">
1214
+ red.tag <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">foo</span><span style="color:#710">&quot;</span></span>, <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">bar</span><span style="color:#710">&quot;</span></span>
1215
+ </pre></p>
1216
+
1217
+
1218
+ <p>Remove the &#8220;bar&#8221; tag from the red client:
1219
+ <pre class="code">
1220
+ red.untag <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">bar</span><span style="color:#710">&quot;</span></span>
1221
+ </pre></p>
1222
+
1223
+
1224
+ <p>Do complex operations on the red client&#8217;s tags:
1225
+ <pre class="code">
1226
+ red.with_tags { concat <span style="background-color:#fff0f0"><span style="color:#710">%w[</span><span style="color:#D20">a b c</span><span style="color:#710">]</span></span>; push <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">z</span><span style="color:#710">'</span></span>; delete <span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">c</span><span style="color:#710">'</span></span> }
1227
+ </pre></p>
1228
+
1229
+
1230
+ <p>Focus the next client after the red client:
1231
+ <pre class="code">
1232
+ red.next.focus ; curr_client == red.next <span style="color:#888">#=&gt; true</span>
1233
+ </pre></p>
1234
+
1235
+
1236
+ <p>Notice that by focusing a client, we make it the current client.</p>
1237
+
1238
+
1239
+ <p>Focus the red client on a different view:
1240
+ <pre class="code">
1241
+ orig = curr_view
1242
+ v = red.views.last
1243
+ red.focus v
1244
+ </pre></p>
1245
+
1246
+
1247
+ <p>Return to the original view:
1248
+ <pre class="code">
1249
+ orig.focus
1250
+ </pre></p>
1251
+
1252
+
1253
+ <p>Send the red client to the last column:
1254
+ <pre class="code">
1255
+ red.send curr_view.areas.last
1256
+ </pre></p>
1257
+
1258
+
1259
+ <p>Close the terminals we launched earlier:
1260
+ <pre class="code">
1261
+ terms = curr_view.clients.select {|c| colors.include? c.label.read }
1262
+ terms.each {|c| c.ctl.write <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">kill</span><span style="color:#710">&quot;</span></span> }
1263
+ </pre></p></div>
1264
+ </div>
1265
+ <div class="section">
1266
+ <h4 class="title">
1267
+ <a class="toc" id="Traversing-the-file-system" href="#a-606134168">3.2.1.5</a>&nbsp;&nbsp;Traversing the file system
1268
+ </h4>
1269
+ <div class="content"><p>Show the root node of wmii&#8217;s IXP file system:
1270
+ <pre class="code">
1271
+ fs
1272
+ </pre></p>
1273
+
1274
+
1275
+ <p>Show the names of all files at the root level:
1276
+ <pre class="code">
1277
+ fs.entries
1278
+ </pre></p>
1279
+
1280
+
1281
+ <p>Show the parent of the root node:
1282
+ <pre class="code">
1283
+ fs.parent
1284
+ </pre></p>
1285
+
1286
+
1287
+ <p>Show the children of the root node:
1288
+ <pre class="code">
1289
+ fs.children
1290
+ </pre></p>
1291
+
1292
+
1293
+ <p>Navigate into to the <tt>/lbar/</tt> directory:
1294
+ <pre class="code">
1295
+ n1 = fs.lbar
1296
+ n2 = fs[<span style="background-color:#fff0f0"><span style="color:#710">'</span><span style="color:#D20">lbar</span><span style="color:#710">'</span></span>]
1297
+ n1 == n2 <span style="color:#888">#=&gt; true</span>
1298
+ left_bar = n1
1299
+ </pre></p>
1300
+
1301
+
1302
+ <p>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 <code class="code">[]</code> operator on a node.</p>
1303
+
1304
+
1305
+ <p>Create a new temporary button:
1306
+ <pre class="code">
1307
+ b = left_bar.rumai_example <span style="color:#888"># path of new button</span>
1308
+ b.exist? <span style="color:#888">#=&gt; false</span>
1309
+ b.create
1310
+ b.exist? <span style="color:#888">#=&gt; true</span>
1311
+ </pre></p>
1312
+
1313
+
1314
+ <p>You should now see an empty button on the left-hand side of the wmii bar.</p>
1315
+
1316
+
1317
+ <p>Color the button black-on-white and label it as &#8220;hello world&#8221;:
1318
+ <pre class="code">
1319
+ content = <span style="background-color:#fff0f0"><span style="color:#710">&quot;</span><span style="color:#D20">#000000 #ffffff #000000 hello world</span><span style="color:#710">&quot;</span></span>
1320
+ b.write content
1321
+ b.read == content <span style="color:#888">#=&gt; true</span>
1322
+ </pre></p>
1323
+
1324
+
1325
+ <p>Remove the temporary button:
1326
+ <pre class="code">
1327
+ b.remove
1328
+ b.exist? <span style="color:#888">#=&gt; false</span>
1329
+ </pre></p></div>
1330
+ </div></p></div>
1331
+ </div>
1332
+ <div class="section">
1333
+ <h3 class="title">
1334
+ <a class="toc" id="Available-commands" href="#a-606141278">3.2.2</a>&nbsp;&nbsp;Available commands
1335
+ </h3>
1336
+ <div class="content">The following table lists all methods provided by the <code class="code"><span style="color:#036; font-weight:bold">Rumai</span></code> module and its subordinates. See the <a href="api/index.html">API documentation</a> for more extensive documentation.
1337
+
1338
+
1339
+ <table border="1">
1340
+ <tr>
1341
+ <th>Method declaration </th>
1342
+ <th>Description </th>
1343
+ </tr>
1344
+ <tr>
1345
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#client_ids()</span></code> </td>
1346
+ <td> <p>
1347
+ Returns the IDs of the current set of clients.
1348
+ </p>
1349
+ </td>
1350
+ </tr>
1351
+ <tr>
1352
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#curr_area()</span></code> </td>
1353
+ <td> </td>
1354
+ </tr>
1355
+ <tr>
1356
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#curr_client()</span></code> </td>
1357
+ <td> </td>
1358
+ </tr>
1359
+ <tr>
1360
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#curr_tag()</span></code> </td>
1361
+ <td> <p>
1362
+ Returns the name of the currently focused tag.
1363
+ </p>
1364
+ </td>
1365
+ </tr>
1366
+ <tr>
1367
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#curr_view()</span></code> </td>
1368
+ <td> </td>
1369
+ </tr>
1370
+ <tr>
1371
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#focus_area(aId)</span></code> </td>
1372
+ <td> </td>
1373
+ </tr>
1374
+ <tr>
1375
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#focus_client(aId)</span></code> </td>
1376
+ <td> </td>
1377
+ </tr>
1378
+ <tr>
1379
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#focus_view(aId)</span></code> </td>
1380
+ <td> </td>
1381
+ </tr>
1382
+ <tr>
1383
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#fs()</span></code> </td>
1384
+ <td> <p>
1385
+ Returns the root of IXP file system hierarchy.
1386
+ </p>
1387
+ </td>
1388
+ </tr>
1389
+ <tr>
1390
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#grouping()</span></code> </td>
1391
+ <td> <p>
1392
+ Returns a list of all grouped clients in the currently focused view. If
1393
+ there are no grouped clients, then the currently focused client is returned
1394
+ in the list.
1395
+ </p>
1396
+ </td>
1397
+ </tr>
1398
+ <tr>
1399
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#next_area()</span></code> </td>
1400
+ <td> </td>
1401
+ </tr>
1402
+ <tr>
1403
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#next_client()</span></code> </td>
1404
+ <td> </td>
1405
+ </tr>
1406
+ <tr>
1407
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#next_tag()</span></code> </td>
1408
+ <td> <p>
1409
+ Returns the name of the next tag.
1410
+ </p>
1411
+ </td>
1412
+ </tr>
1413
+ <tr>
1414
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#next_view()</span></code> </td>
1415
+ <td> </td>
1416
+ </tr>
1417
+ <tr>
1418
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#prev_area()</span></code> </td>
1419
+ <td> </td>
1420
+ </tr>
1421
+ <tr>
1422
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#prev_client()</span></code> </td>
1423
+ <td> </td>
1424
+ </tr>
1425
+ <tr>
1426
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#prev_tag()</span></code> </td>
1427
+ <td> <p>
1428
+ Returns the name of the previous tag.
1429
+ </p>
1430
+ </td>
1431
+ </tr>
1432
+ <tr>
1433
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#prev_view()</span></code> </td>
1434
+ <td> </td>
1435
+ </tr>
1436
+ <tr>
1437
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#tags()</span></code> </td>
1438
+ <td> <p>
1439
+ Returns the current set of tags.
1440
+ </p>
1441
+ </td>
1442
+ </tr>
1443
+ <tr>
1444
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span><span style="color:#888">#views()</span></code> </td>
1445
+ <td> <p>
1446
+ Returns the current set of views.
1447
+ </p>
1448
+ </td>
1449
+ </tr>
1450
+ <tr>
1451
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#&lt;&lt;(*aClients)</span></code> </td>
1452
+ <td> <p>
1453
+ Alias for push
1454
+ </p>
1455
+ </td>
1456
+ </tr>
1457
+ <tr>
1458
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#chain()</span></code> </td>
1459
+ <td> </td>
1460
+ </tr>
1461
+ <tr>
1462
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#client_ids()</span></code> </td>
1463
+ <td> <p>
1464
+ Returns the IDs of the clients in this area.
1465
+ </p>
1466
+ </td>
1467
+ </tr>
1468
+ <tr>
1469
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#column?()</span></code> </td>
1470
+ <td> <p>
1471
+ Checks if this area is a column in the managed area.
1472
+ </p>
1473
+ </td>
1474
+ </tr>
1475
+ <tr>
1476
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#concat(aArea)</span></code> </td>
1477
+ <td> <p>
1478
+ Concatenates the given area to the bottom of this area.
1479
+ </p>
1480
+ </td>
1481
+ </tr>
1482
+ <tr>
1483
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#ctl_id()</span></code> </td>
1484
+ <td> <p>
1485
+ Makes the ID usable in wmii&#8216;s /ctl commands.
1486
+ </p>
1487
+ </td>
1488
+ </tr>
1489
+ <tr>
1490
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#each(&amp;aBlock)</span></code> </td>
1491
+ <td> <p>
1492
+ Iterates through each client in this container.
1493
+ </p>
1494
+ </td>
1495
+ </tr>
1496
+ <tr>
1497
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#exist?()</span></code> </td>
1498
+ <td> <p>
1499
+ Checks if this object exists in the chain.
1500
+ </p>
1501
+ </td>
1502
+ </tr>
1503
+ <tr>
1504
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#float?()</span></code> </td>
1505
+ <td> <p>
1506
+ Checks if this area is the floating area.
1507
+ </p>
1508
+ </td>
1509
+ </tr>
1510
+ <tr>
1511
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#focus()</span></code> </td>
1512
+ <td> <p>
1513
+ Puts focus on this area.
1514
+ </p>
1515
+ </td>
1516
+ </tr>
1517
+ <tr>
1518
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#fringe()</span></code> </td>
1519
+ <td> <p>
1520
+ Returns the next area, which may or may not exist.
1521
+ </p>
1522
+ </td>
1523
+ </tr>
1524
+ <tr>
1525
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#import_client(c)</span></code> </td>
1526
+ <td> <p>
1527
+ Moves the given client into this area.
1528
+ </p>
1529
+ </td>
1530
+ </tr>
1531
+ <tr>
1532
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#insert(*aClients)</span></code> </td>
1533
+ <td> <p>
1534
+ Inserts the given clients after the currently focused client in this area.
1535
+ </p>
1536
+ </td>
1537
+ </tr>
1538
+ <tr>
1539
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#layout=(aMode)</span></code> </td>
1540
+ <td> <p>
1541
+ Sets the layout of clients in this column.
1542
+ </p>
1543
+ </td>
1544
+ </tr>
1545
+ <tr>
1546
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#length()</span></code> </td>
1547
+ <td> <p>
1548
+ Returns the number of clients in this area.
1549
+ </p>
1550
+ </td>
1551
+ </tr>
1552
+ <tr>
1553
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#length=(aMaxClients)</span></code> </td>
1554
+ <td> <p>
1555
+ Ensures that this area has at most the given number of clients. Areas to
1556
+ the right of this one serve as a buffer into which excess clients are
1557
+ evicted and from which deficit clients are imported.
1558
+ </p>
1559
+ </td>
1560
+ </tr>
1561
+ <tr>
1562
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#push(*aClients)</span></code> </td>
1563
+ <td> <p>
1564
+ Inserts the given clients at the bottom of this area.
1565
+ </p>
1566
+ </td>
1567
+ </tr>
1568
+ <tr>
1569
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span><span style="color:#888">#unshift(*aClients)</span></code> </td>
1570
+ <td> <p>
1571
+ Inserts the given clients at the top of this area.
1572
+ </p>
1573
+ </td>
1574
+ </tr>
1575
+ <tr>
1576
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span>::curr()</code> </td>
1577
+ <td> <p>
1578
+ Returns the currently focused area.
1579
+ </p>
1580
+ </td>
1581
+ </tr>
1582
+ <tr>
1583
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Area</span>::new(aAreaId, aView = <span style="color:#036; font-weight:bold">View</span>.curr)</code> </td>
1584
+ <td> <table border="1">
1585
+ <tr><td valign="top">aView:</td><td>the view which contains this area.
1586
+
1587
+ </td></tr>
1588
+ </table>
1589
+ </td>
1590
+ </tr>
1591
+ <tr>
1592
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Chain</span><span style="color:#888">#chain()</span></code> </td>
1593
+ <td> <p>
1594
+ Returns an array of objects related to this one.
1595
+ </p>
1596
+ </td>
1597
+ </tr>
1598
+ <tr>
1599
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Chain</span><span style="color:#888">#next()</span></code> </td>
1600
+ <td> <p>
1601
+ Returns the object after this one in the chain.
1602
+ </p>
1603
+ </td>
1604
+ </tr>
1605
+ <tr>
1606
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Chain</span><span style="color:#888">#prev()</span></code> </td>
1607
+ <td> <p>
1608
+ Returns the object before this one in the chain.
1609
+ </p>
1610
+ </td>
1611
+ </tr>
1612
+ <tr>
1613
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Chain</span><span style="color:#888">#sibling(aOffset)</span></code> </td>
1614
+ <td> </td>
1615
+ </tr>
1616
+ <tr>
1617
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#area(aView = View.curr)</span></code> </td>
1618
+ <td> <p>
1619
+ Returns the area that contains this client within the given view.
1620
+ </p>
1621
+ </td>
1622
+ </tr>
1623
+ <tr>
1624
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#area_to_id(aAreaOrId)</span></code> </td>
1625
+ <td> </td>
1626
+ </tr>
1627
+ <tr>
1628
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#chain()</span></code> </td>
1629
+ <td> <p>
1630
+ Returns a list of clients in the current view.
1631
+ </p>
1632
+ </td>
1633
+ </tr>
1634
+ <tr>
1635
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#focus(aView = nil)</span></code> </td>
1636
+ <td> <p>
1637
+ Focuses this client within the given view.
1638
+ </p>
1639
+ </td>
1640
+ </tr>
1641
+ <tr>
1642
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#group()</span></code> </td>
1643
+ <td> <p>
1644
+ Adds this client to the current grouping.
1645
+ </p>
1646
+ </td>
1647
+ </tr>
1648
+ <tr>
1649
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#group?()</span></code> </td>
1650
+ <td> <p>
1651
+ Checks if this client is included in the current grouping.
1652
+ </p>
1653
+ </td>
1654
+ </tr>
1655
+ <tr>
1656
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#send(aAreaOrId, aView = View.curr)</span></code> </td>
1657
+ <td> <p>
1658
+ Sends this client to the given destination within the given view.
1659
+ </p>
1660
+ </td>
1661
+ </tr>
1662
+ <tr>
1663
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#swap(aAreaOrId, aView = View.curr)</span></code> </td>
1664
+ <td> <p>
1665
+ Swaps this client with the given destination within the given view.
1666
+ </p>
1667
+ </td>
1668
+ </tr>
1669
+ <tr>
1670
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#tag(*aTags)</span></code> </td>
1671
+ <td> <p>
1672
+ Adds the given tags to this client.
1673
+ </p>
1674
+ </td>
1675
+ </tr>
1676
+ <tr>
1677
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#tags()</span></code> </td>
1678
+ <td> <p>
1679
+ Returns the tags associated with this client.
1680
+ </p>
1681
+ </td>
1682
+ </tr>
1683
+ <tr>
1684
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#tags=(*aTags)</span></code> </td>
1685
+ <td> <p>
1686
+ Modifies the tags associated with this client.
1687
+ </p>
1688
+ </td>
1689
+ </tr>
1690
+ <tr>
1691
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#toggle_group()</span></code> </td>
1692
+ <td> <p>
1693
+ Toggles the presence of this client in the current grouping.
1694
+ </p>
1695
+ </td>
1696
+ </tr>
1697
+ <tr>
1698
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#ungroup()</span></code> </td>
1699
+ <td> <p>
1700
+ Removes this client to the current grouping.
1701
+ </p>
1702
+ </td>
1703
+ </tr>
1704
+ <tr>
1705
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#untag(*aTags)</span></code> </td>
1706
+ <td> <p>
1707
+ Removes the given tags from this client.
1708
+ </p>
1709
+ </td>
1710
+ </tr>
1711
+ <tr>
1712
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#views()</span></code> </td>
1713
+ <td> <p>
1714
+ Returns the views that contain this client.
1715
+ </p>
1716
+ </td>
1717
+ </tr>
1718
+ <tr>
1719
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span><span style="color:#888">#with_tags(&amp;aBlock)</span></code> </td>
1720
+ <td> <p>
1721
+ Evaluates the given block within the context of this client&#8216;s list of
1722
+ tags.
1723
+ </p>
1724
+ </td>
1725
+ </tr>
1726
+ <tr>
1727
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span>::curr()</code> </td>
1728
+ <td> <p>
1729
+ Returns the currently focused client.
1730
+ </p>
1731
+ </td>
1732
+ </tr>
1733
+ <tr>
1734
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Client</span>::new(aClientId)</code> </td>
1735
+ <td> </td>
1736
+ </tr>
1737
+ <tr>
1738
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">ClientContainer</span><span style="color:#888">#client_ids()</span></code> </td>
1739
+ <td> <p>
1740
+ Returns the IDs of the clients in this container.
1741
+ </p>
1742
+ </td>
1743
+ </tr>
1744
+ <tr>
1745
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">ClientContainer</span><span style="color:#888">#clients()</span></code> </td>
1746
+ <td> <p>
1747
+ Returns the clients contained in this container.
1748
+ </p>
1749
+ </td>
1750
+ </tr>
1751
+ <tr>
1752
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">ClientContainer</span><span style="color:#888">#grouping()</span></code> </td>
1753
+ <td> <p>
1754
+ Returns all grouped clients in this container.
1755
+ </p>
1756
+ </td>
1757
+ </tr>
1758
+ <tr>
1759
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#[](aSubPath)</span></code> </td>
1760
+ <td> <p>
1761
+ Returns the given sub-path as a Node object.
1762
+ </p>
1763
+ </td>
1764
+ </tr>
1765
+ <tr>
1766
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#children()</span></code> </td>
1767
+ <td> <p>
1768
+ Returns all child nodes of this node.
1769
+ </p>
1770
+ </td>
1771
+ </tr>
1772
+ <tr>
1773
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#clear()</span></code> </td>
1774
+ <td> <p>
1775
+ Deletes all child nodes.
1776
+ </p>
1777
+ </td>
1778
+ </tr>
1779
+ <tr>
1780
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#create(*aArgs)</span></code> </td>
1781
+ <td> <p>
1782
+ Creates a file corresponding to this node on the IXP server. See
1783
+ Rumai::IXP::Client#create for details.
1784
+ </p>
1785
+ </td>
1786
+ </tr>
1787
+ <tr>
1788
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#directory?()</span></code> </td>
1789
+ <td> <p>
1790
+ Tests if this node is a directory.
1791
+ </p>
1792
+ </td>
1793
+ </tr>
1794
+ <tr>
1795
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#each(&amp;aBlock)</span></code> </td>
1796
+ <td> <p>
1797
+ Iterates through each child of this directory.
1798
+ </p>
1799
+ </td>
1800
+ </tr>
1801
+ <tr>
1802
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#each_line(&amp;aBlock) {|line| ... }</span></code> </td>
1803
+ <td> <p>
1804
+ Invokes the given block for every line in the content of this node.
1805
+ </p>
1806
+ </td>
1807
+ </tr>
1808
+ <tr>
1809
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#entries()</span></code> </td>
1810
+ <td> <p>
1811
+ Returns the names of all files in this directory.
1812
+ </p>
1813
+ </td>
1814
+ </tr>
1815
+ <tr>
1816
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#exist?()</span></code> </td>
1817
+ <td> <p>
1818
+ Tests if this node exists on the IXP server.
1819
+ </p>
1820
+ </td>
1821
+ </tr>
1822
+ <tr>
1823
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#method_missing(aMeth, *aArgs)</span></code> </td>
1824
+ <td> <p>
1825
+ Provides access to child nodes through method calls.
1826
+ </p>
1827
+ </td>
1828
+ </tr>
1829
+ <tr>
1830
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#open(aMode = 'r', &amp;aBlock)</span></code> </td>
1831
+ <td> <p>
1832
+ Opens this node for I/O access. See Rumai::IXP::Client#open for details.
1833
+ </p>
1834
+ </td>
1835
+ </tr>
1836
+ <tr>
1837
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#parent()</span></code> </td>
1838
+ <td> <p>
1839
+ Returns the parent node of this node.
1840
+ </p>
1841
+ </td>
1842
+ </tr>
1843
+ <tr>
1844
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#read()</span></code> </td>
1845
+ <td> <p>
1846
+ Returns the entire content of this node. See Rumai::IXP::Client#read for
1847
+ details.
1848
+ </p>
1849
+ </td>
1850
+ </tr>
1851
+ <tr>
1852
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#remove()</span></code> </td>
1853
+ <td> <p>
1854
+ Deletes the file corresponding to this node on the IXP server.
1855
+ </p>
1856
+ </td>
1857
+ </tr>
1858
+ <tr>
1859
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#stat()</span></code> </td>
1860
+ <td> <p>
1861
+ Returns file statistics about this node. See Rumai::IXP::Client#stat for
1862
+ details.
1863
+ </p>
1864
+ </td>
1865
+ </tr>
1866
+ <tr>
1867
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span><span style="color:#888">#write(aContent)</span></code> </td>
1868
+ <td> <p>
1869
+ Writes the given content to this node.
1870
+ </p>
1871
+ </td>
1872
+ </tr>
1873
+ <tr>
1874
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">Node</span>::new(aPath)</code> </td>
1875
+ <td> </td>
1876
+ </tr>
1877
+ <tr>
1878
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#area_ids()</span></code> </td>
1879
+ <td> <p>
1880
+ Returns the IDs of all areas in this view.
1881
+ </p>
1882
+ </td>
1883
+ </tr>
1884
+ <tr>
1885
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#area_of_client(aClientOrId)</span></code> </td>
1886
+ <td> <p>
1887
+ Returns the area which contains the given client in this view.
1888
+ </p>
1889
+ </td>
1890
+ </tr>
1891
+ <tr>
1892
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#areas()</span></code> </td>
1893
+ <td> <p>
1894
+ Returns all areas in this view.
1895
+ </p>
1896
+ </td>
1897
+ </tr>
1898
+ <tr>
1899
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#arrange_as_larswm()</span></code> </td>
1900
+ <td> <p>
1901
+ Arranges the clients in this view, while maintaining their relative order,
1902
+ in the tiling fashion of LarsWM. Only the first client in the primary
1903
+ column is kept; all others are evicted to the <b>top</b> of the secondary
1904
+ column. Any subsequent columns are squeezed into the <b>bottom</b> of the
1905
+ secondary column.
1906
+ </p>
1907
+ </td>
1908
+ </tr>
1909
+ <tr>
1910
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#arrange_in_diamond()</span></code> </td>
1911
+ <td> <p>
1912
+ Arranges the clients in this view, while maintaining their relative order,
1913
+ in a (at best) equilateral triangle. However, the resulting arrangement
1914
+ appears like a diamond because wmii does not waste screen space.
1915
+ </p>
1916
+ </td>
1917
+ </tr>
1918
+ <tr>
1919
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#arrange_in_grid(aMaxClientsPerColumn = nil)</span></code> </td>
1920
+ <td> <p>
1921
+ Arranges the clients in this view, while maintaining their relative order,
1922
+ in a (at best) square grid.
1923
+ </p>
1924
+ </td>
1925
+ </tr>
1926
+ <tr>
1927
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#chain()</span></code> </td>
1928
+ <td> </td>
1929
+ </tr>
1930
+ <tr>
1931
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#client_ids(aAreaId = '\S+')</span></code> </td>
1932
+ <td> <p>
1933
+ Returns the IDs of the clients contained in the given area within this
1934
+ view.
1935
+ </p>
1936
+ </td>
1937
+ </tr>
1938
+ <tr>
1939
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#columns()</span></code> </td>
1940
+ <td> <p>
1941
+ Returns all columns (managed areas) in this view.
1942
+ </p>
1943
+ </td>
1944
+ </tr>
1945
+ <tr>
1946
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#each(&amp;aBlock)</span></code> </td>
1947
+ <td> <p>
1948
+ Iterates through each area in this view.
1949
+ </p>
1950
+ </td>
1951
+ </tr>
1952
+ <tr>
1953
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#each_column(aStartingColumnId = 1) {|a| ... }</span></code> </td>
1954
+ <td> <p>
1955
+ Resiliently iterates through possibly destructive changes to each column.
1956
+ That is, if the given block creates new columns, then those will also be
1957
+ processed in the iteration.
1958
+ </p>
1959
+ </td>
1960
+ </tr>
1961
+ <tr>
1962
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#floating_area()</span></code> </td>
1963
+ <td> <p>
1964
+ Returns the floating area of this view.
1965
+ </p>
1966
+ </td>
1967
+ </tr>
1968
+ <tr>
1969
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#focus()</span></code> </td>
1970
+ <td> <p>
1971
+ Focuses this view.
1972
+ </p>
1973
+ </td>
1974
+ </tr>
1975
+ <tr>
1976
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#manifest()</span></code> </td>
1977
+ <td> <p>
1978
+ Returns the manifest of all areas and clients in this view.
1979
+ </p>
1980
+ </td>
1981
+ </tr>
1982
+ <tr>
1983
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#num_managed_clients()</span></code> </td>
1984
+ <td> <p>
1985
+ Returns the number of clients in the non-floating areas of this view.
1986
+ </p>
1987
+ </td>
1988
+ </tr>
1989
+ <tr>
1990
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span><span style="color:#888">#squeeze(aAreas)</span></code> </td>
1991
+ <td> <p>
1992
+ Smashes the given list of areas into the first one. The relative ordering
1993
+ of clients is preserved.
1994
+ </p>
1995
+ </td>
1996
+ </tr>
1997
+ <tr>
1998
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span>::curr()</code> </td>
1999
+ <td> <p>
2000
+ Returns the currently focused view.
2001
+ </p>
2002
+ </td>
2003
+ </tr>
2004
+ <tr>
2005
+ <td> <code class="code"><span style="color:#036; font-weight:bold">Rumai</span>::<span style="color:#036; font-weight:bold">View</span>::new(aViewId)</code> </td>
2006
+ <td> </td>
2007
+ </tr>
2008
+ </table></div>
2009
+ </div></p></div>
2010
+ </div>
2011
+ <div class="section">
2012
+ <h2 class="title">
2013
+ <a class="toc" id="wmiirc" href="#a-607083858">3.3</a>&nbsp;&nbsp;Scripting your wmiirc
2014
+ </h2>
2015
+ <div class="content"><p>One important application of Rumai is the support of Ruby-based <tt>wmiirc</tt> configuration files. For a solid example of such application, take a look at my personal <tt>wmiirc</tt> which uses Rumai extensively:</p>
2016
+
2017
+
2018
+ <pre>darcs get http://snk.tuxfamily.org/src/wmiirc</pre>
2019
+
2020
+
2021
+ <p>Alternatively, you can <a href="http://snk.tuxfamily.org/src/wmiirc">browse the contents of the above repository</a> in your web browser.</p></div>
2022
+ </div></div>
2023
+ </div></div>
2024
+
2025
+
2026
+ <br style="display: none"/>
2027
+ <hr style="display: none"/>
2028
+ <br style="display: none"/>
2029
+
2030
+ <div id="footer">
2031
+ Generated on Sat Jan 26 19:52:45 -0800 2008 by <a href="http://gerbil.rubyforge.org">Gerbil</a> 1.1.0.
2032
+
2033
+ </div>
2034
+ </body>
2035
+ </html>