rumai 3.2.2 → 3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +27 -5
- data/bin/rumai +12 -37
- data/lib/rumai/inochi.rb +8 -17
- data/lib/rumai/irb.rb +21 -0
- data/man.html +914 -0
- data/man/man1/rumai.1.gz +0 -0
- metadata +19 -94
- data/HISTORY +0 -350
- data/INSTALL +0 -33
- data/MANUAL +0 -26
- data/README +0 -92
- data/USAGE +0 -297
- data/doc/ann.xml +0 -61
- data/doc/api/IO.html +0 -119
- data/doc/api/Integer.html +0 -171
- data/doc/api/Rumai.html +0 -1540
- data/doc/api/Rumai/Area.html +0 -1485
- data/doc/api/Rumai/Chain.html +0 -301
- data/doc/api/Rumai/Client.html +0 -2451
- data/doc/api/Rumai/ClientContainer.html +0 -301
- data/doc/api/Rumai/ExportInstanceMethods.html +0 -103
- data/doc/api/Rumai/IXP.html +0 -94
- data/doc/api/Rumai/IXP/Agent.html +0 -1625
- data/doc/api/Rumai/IXP/Agent/FidStream.html +0 -959
- data/doc/api/Rumai/IXP/Agent/RangedPool.html +0 -381
- data/doc/api/Rumai/IXP/Error.html +0 -110
- data/doc/api/Rumai/IXP/Fcall.html +0 -503
- data/doc/api/Rumai/IXP/Qid.html +0 -207
- data/doc/api/Rumai/IXP/Rattach.html +0 -148
- data/doc/api/Rumai/IXP/Rauth.html +0 -148
- data/doc/api/Rumai/IXP/Rclunk.html +0 -148
- data/doc/api/Rumai/IXP/Rcreate.html +0 -148
- data/doc/api/Rumai/IXP/Rerror.html +0 -148
- data/doc/api/Rumai/IXP/Rflush.html +0 -148
- data/doc/api/Rumai/IXP/Ropen.html +0 -148
- data/doc/api/Rumai/IXP/Rread.html +0 -148
- data/doc/api/Rumai/IXP/Rremove.html +0 -148
- data/doc/api/Rumai/IXP/Rstat.html +0 -148
- data/doc/api/Rumai/IXP/Rversion.html +0 -148
- data/doc/api/Rumai/IXP/Rwalk.html +0 -148
- data/doc/api/Rumai/IXP/Rwrite.html +0 -148
- data/doc/api/Rumai/IXP/Rwstat.html +0 -148
- data/doc/api/Rumai/IXP/Stat.html +0 -335
- data/doc/api/Rumai/IXP/Stream.html +0 -194
- data/doc/api/Rumai/IXP/Struct.html +0 -586
- data/doc/api/Rumai/IXP/Struct/ClassField.html +0 -242
- data/doc/api/Rumai/IXP/Struct/Field.html +0 -782
- data/doc/api/Rumai/IXP/Struct/Field/CounteeField.html +0 -227
- data/doc/api/Rumai/IXP/Struct/Field/CounterField.html +0 -153
- data/doc/api/Rumai/IXP/Struct/Integer8Field.html +0 -242
- data/doc/api/Rumai/IXP/Struct/StringField.html +0 -206
- data/doc/api/Rumai/IXP/Tattach.html +0 -148
- data/doc/api/Rumai/IXP/Tauth.html +0 -148
- data/doc/api/Rumai/IXP/Tclunk.html +0 -148
- data/doc/api/Rumai/IXP/Tcreate.html +0 -148
- data/doc/api/Rumai/IXP/Terror.html +0 -231
- data/doc/api/Rumai/IXP/Tflush.html +0 -148
- data/doc/api/Rumai/IXP/Topen.html +0 -240
- data/doc/api/Rumai/IXP/Tread.html +0 -148
- data/doc/api/Rumai/IXP/Tremove.html +0 -148
- data/doc/api/Rumai/IXP/Tstat.html +0 -148
- data/doc/api/Rumai/IXP/Tversion.html +0 -162
- data/doc/api/Rumai/IXP/Twalk.html +0 -148
- data/doc/api/Rumai/IXP/Twrite.html +0 -148
- data/doc/api/Rumai/IXP/Twstat.html +0 -148
- data/doc/api/Rumai/Node.html +0 -1406
- data/doc/api/Rumai/View.html +0 -1587
- data/doc/api/Rumai/WidgetImpl.html +0 -333
- data/doc/api/Rumai/WidgetNode.html +0 -246
- data/doc/api/String.html +0 -258
- data/doc/api/StringIO.html +0 -119
- data/doc/api/Time.html +0 -247
- data/doc/api/_index.html +0 -581
- data/doc/api/class_list.html +0 -36
- data/doc/api/css/common.css +0 -1
- data/doc/api/css/full_list.css +0 -50
- data/doc/api/css/style.css +0 -273
- data/doc/api/file.LICENSE.html +0 -73
- data/doc/api/file_list.html +0 -38
- data/doc/api/frames.html +0 -13
- data/doc/api/index.html +0 -73
- data/doc/api/js/app.js +0 -111
- data/doc/api/js/full_list.js +0 -117
- data/doc/api/js/jquery.js +0 -19
- data/doc/api/method_list.html +0 -1491
- data/doc/api/top-level-namespace.html +0 -89
- data/doc/index.html +0 -2655
- data/inochi.opts +0 -31
- data/test/rumai/ixp/message_test.rb +0 -245
- data/test/runner +0 -25
- data/test/test_helper.rb +0 -1
data/CREDITS
CHANGED
@@ -1,5 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
%#----------------------------------------------------------------------------
|
2
|
+
## AUTHORS
|
3
|
+
%#----------------------------------------------------------------------------
|
4
|
+
|
5
|
+
Suraj N. Kurapati
|
6
|
+
|
7
|
+
%#----------------------------------------------------------------------------
|
8
|
+
## CREDITS
|
9
|
+
%#----------------------------------------------------------------------------
|
10
|
+
|
11
|
+
Christoph Blank,
|
12
|
+
Simon Hafner,
|
13
|
+
Michael Andrus,
|
14
|
+
Nathan Neff,
|
15
|
+
[Gigamo],
|
16
|
+
[ghedamat]
|
17
|
+
|
18
|
+
%# XXX: only link to these contributors because they do not have real names
|
19
|
+
[Gigamo]: http://github.com/gigamo
|
20
|
+
[ghedamat]: http://github.com/ghedamat
|
21
|
+
|
22
|
+
%#----------------------------------------------------------------------------
|
23
|
+
## LICENSE
|
24
|
+
%#----------------------------------------------------------------------------
|
25
|
+
|
26
|
+
%# See the file named "LICENSE".
|
27
|
+
%< "LICENSE"
|
data/bin/rumai
CHANGED
@@ -17,25 +17,20 @@
|
|
17
17
|
# -v, --version : Show version number and exit.
|
18
18
|
#
|
19
19
|
|
20
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
21
20
|
require 'rumai'
|
22
21
|
|
23
22
|
# parse command line
|
24
23
|
if ARGV.delete('-h') or ARGV.delete('--help')
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
puts " #{Rumai::INSTDIR}/doc/index.html"
|
36
|
-
puts
|
37
|
-
puts " #{Rumai::WEBSITE}"
|
38
|
-
puts
|
24
|
+
# try to display UNIX version of help manual
|
25
|
+
man_path = File.join(Rumai::INSTDIR, 'man')
|
26
|
+
unless system 'man', '-M', man_path, '-a', 'rumai'
|
27
|
+
# try to display HTML version of help manual
|
28
|
+
man_html = man_path + '.html'
|
29
|
+
unless %w[$BROWSER open start].any? {|b| system "#{b} #{man_html}" }
|
30
|
+
# no luck; direct user to project website
|
31
|
+
puts "See #{Rumai::WEBSITE}"
|
32
|
+
end
|
33
|
+
end
|
39
34
|
exit
|
40
35
|
elsif ARGV.delete('-v') or ARGV.delete('--version')
|
41
36
|
puts Rumai::VERSION
|
@@ -43,27 +38,7 @@ elsif ARGV.delete('-v') or ARGV.delete('--version')
|
|
43
38
|
end
|
44
39
|
|
45
40
|
# start IRB session
|
46
|
-
require 'irb'
|
47
|
-
require 'irb/completion'
|
48
|
-
|
49
|
-
module IRB
|
50
|
-
##
|
51
|
-
# Starts an IRB session *inside* the given object.
|
52
|
-
#
|
53
|
-
# This code was adapted from a snippet on Massimiliano Mirra's website:
|
54
|
-
# http://www.therubymine.com/articles/2007/01/29/programmare-dallinterno
|
55
|
-
#
|
56
|
-
def self.start_session context
|
57
|
-
IRB.setup nil
|
58
|
-
|
59
|
-
env = IRB::WorkSpace.new(context)
|
60
|
-
irb = IRB::Irb.new(env)
|
61
|
-
IRB.conf[:MAIN_CONTEXT] = irb.context
|
62
|
-
|
63
|
-
catch :IRB_EXIT do
|
64
|
-
irb.eval_input
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
41
|
+
require 'rumai/irb'
|
42
|
+
require 'irb/completion'
|
68
43
|
|
69
44
|
IRB.start_session Rumai
|
data/lib/rumai/inochi.rb
CHANGED
@@ -18,12 +18,12 @@ module Rumai
|
|
18
18
|
##
|
19
19
|
# Number of this release of this project.
|
20
20
|
#
|
21
|
-
VERSION = "3.2.
|
21
|
+
VERSION = "3.2.3"
|
22
22
|
|
23
23
|
##
|
24
24
|
# Date of this release of this project.
|
25
25
|
#
|
26
|
-
RELDATE = "2010-04-
|
26
|
+
RELDATE = "2010-04-28"
|
27
27
|
|
28
28
|
##
|
29
29
|
# Description of this release of this project.
|
@@ -74,30 +74,21 @@ module Rumai
|
|
74
74
|
# }
|
75
75
|
#
|
76
76
|
DEVTIME = {
|
77
|
-
"inochi" => [ "
|
77
|
+
"inochi" => [ ">= 3.0.0", "< 4" ],
|
78
78
|
"dfect" => [ "~> 2" ], # for unit testing
|
79
79
|
}
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
#
|
86
|
-
def self.require gem_name_or_library
|
87
|
-
# prepare the correct version of the gem for loading
|
88
|
-
if respond_to? :gem
|
89
|
-
gem_name = gem_name_or_library.to_s.sub(%r{/.*$}, '')
|
90
|
-
if gem_version = RUNTIME[gem_name] || DEVTIME[gem_name]
|
81
|
+
# establish gem version dependencies
|
82
|
+
if respond_to? :gem
|
83
|
+
[RUNTIME, DEVTIME].each do |deps|
|
84
|
+
deps.each do |gem_name, gem_version|
|
91
85
|
begin
|
92
|
-
gem gem_name, *gem_version
|
86
|
+
gem gem_name, *Array(gem_version)
|
93
87
|
rescue LoadError => error
|
94
88
|
warn "#{self.inspect}: #{error}"
|
95
89
|
end
|
96
90
|
end
|
97
91
|
end
|
98
|
-
|
99
|
-
# do the loading
|
100
|
-
super
|
101
92
|
end
|
102
93
|
|
103
94
|
end
|
data/lib/rumai/irb.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'irb'
|
2
|
+
|
3
|
+
module IRB
|
4
|
+
##
|
5
|
+
# Starts an IRB session *inside* the given object.
|
6
|
+
#
|
7
|
+
# This code was adapted from a snippet on Massimiliano Mirra's website:
|
8
|
+
# http://www.therubymine.com/articles/2007/01/29/programmare-dallinterno
|
9
|
+
#
|
10
|
+
def self.start_session context
|
11
|
+
IRB.setup nil
|
12
|
+
|
13
|
+
env = IRB::WorkSpace.new(context)
|
14
|
+
irb = IRB::Irb.new(env)
|
15
|
+
IRB.conf[:MAIN_CONTEXT] = irb.context
|
16
|
+
|
17
|
+
catch :IRB_EXIT do
|
18
|
+
irb.eval_input
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/man.html
ADDED
@@ -0,0 +1,914 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
5
|
+
<meta name='generator' value='Ronn/v0.5'>
|
6
|
+
<title>rumai(1) - Ruby interface to the wmii window manager</title>
|
7
|
+
<style type='text/css'>
|
8
|
+
body {margin:0}
|
9
|
+
#man, #man code, #man pre, #man tt, #man kbd, #man samp {
|
10
|
+
font-family:consolas,monospace;
|
11
|
+
font-size:16px;
|
12
|
+
line-height:1.3;
|
13
|
+
color:#343331;
|
14
|
+
background:#fff; }
|
15
|
+
#man { max-width:87ex; margin:0 3ex 1ex 1ex; text-align:justify; }
|
16
|
+
#man div.man-navigation {
|
17
|
+
position:fixed;
|
18
|
+
top:0;
|
19
|
+
left:91ex;
|
20
|
+
height:100%;
|
21
|
+
width:100%;
|
22
|
+
padding:1ex 0 0 2ex;
|
23
|
+
border-left:0.5ex solid #DCDCDC;
|
24
|
+
background-color: #F5F5F5;
|
25
|
+
}
|
26
|
+
#man div.man-navigation a { display:block; margin-bottom:1.5ex }
|
27
|
+
#man h1, #man h2, #man h3 { color:#232221;clear:left }
|
28
|
+
#man h1 { font-size:28px; margin:15px 0 30px 0; text-align:center }
|
29
|
+
#man h2 { font-size:18px; margin-bottom:0; margin-top:10px; line-height:1.3; }
|
30
|
+
#man h3 { font-size:16px; margin:0 0 0 4ex; }
|
31
|
+
#man p, #man ul, #man ol, #man dl, #man pre { margin:0 0 18px 0; }
|
32
|
+
#man pre {
|
33
|
+
color:#333231;
|
34
|
+
background:#edeceb;
|
35
|
+
padding:5px 7px;
|
36
|
+
margin:0px 0 20px 0;
|
37
|
+
border-left:2ex solid #ddd}
|
38
|
+
#man pre + h2, #man pre + h3 {
|
39
|
+
margin-top:22px;
|
40
|
+
}
|
41
|
+
#man h2 + pre, #man h3 + pre {
|
42
|
+
margin-top:5px;
|
43
|
+
}
|
44
|
+
#man > p, #man > ul, #man > ol, #man > dl, #man > pre { margin-left:8ex; }
|
45
|
+
#man dt { margin:0; clear:left }
|
46
|
+
#man dt.flush { float:left; width:8ex }
|
47
|
+
#man dd { margin:0 0 0 9ex }
|
48
|
+
#man code, #man strong, #man b { font-weight:bold; color:#131211; }
|
49
|
+
#man pre code { font-weight:normal; color:#232221; background:inherit }
|
50
|
+
#man em, var, u {
|
51
|
+
font-style:normal; color:#333231; border-bottom:1px solid #999; }
|
52
|
+
#man h1.man-title { display:none; }
|
53
|
+
#man ol.man, #man ol.man li { margin:2px 0 10px 0; padding:0;
|
54
|
+
float:left; width:33%; list-style-type:none;
|
55
|
+
text-transform:uppercase; font-size:18px; color:#999;
|
56
|
+
letter-spacing:1px;}
|
57
|
+
#man ol.man { width:100%; }
|
58
|
+
#man ol.man li.tl { text-align:left }
|
59
|
+
#man ol.man li.tc { text-align:center;letter-spacing:4px }
|
60
|
+
#man ol.man li.tr { text-align:right; float: right }
|
61
|
+
#man ol.man a { color:#999 }
|
62
|
+
#man ol.man a:hover { color:#333231 }
|
63
|
+
#man img { display:block; margin:auto }
|
64
|
+
</style>
|
65
|
+
<style type='text/css' media='print'>
|
66
|
+
#man { max-width:none }
|
67
|
+
#man div.man-navigation { display:none }
|
68
|
+
#man a[href]:not([href^="#"]):not([data-bare-link]):after {
|
69
|
+
content:" " attr(href);
|
70
|
+
}
|
71
|
+
</style>
|
72
|
+
</head>
|
73
|
+
<body>
|
74
|
+
<div id='man'>
|
75
|
+
|
76
|
+
<div class='man-navigation'><a href='#NAME'>NAME</a> <a href='#SYNOPSIS'>SYNOPSIS</a> <a href='#DESCRIPTION'>DESCRIPTION</a> <a href='#OPTIONS'>OPTIONS</a> <a href='#EXAMPLES'>EXAMPLES</a> <a href='#HACKING'>HACKING</a> <a href='#VERSIONS'>VERSIONS</a> <a href='#AUTHORS'>AUTHORS</a> <a href='#CREDITS'>CREDITS</a> <a href='#LICENSE'>LICENSE</a> <a href='#SEE-ALSO'>SEE ALSO</a></div>
|
77
|
+
|
78
|
+
<h1 class='man-title'>rumai(1)</h1>
|
79
|
+
|
80
|
+
<ol class='head man'>
|
81
|
+
<li class='tl'>rumai(1)</li>
|
82
|
+
<li class='tc'>Version 3.2.3</li>
|
83
|
+
<li class='tr'>rumai(1)</li>
|
84
|
+
</ol>
|
85
|
+
|
86
|
+
<h2 id='NAME'>NAME</h2>
|
87
|
+
<p><code>rumai</code> - Ruby interface to the wmii window manager</p>
|
88
|
+
|
89
|
+
<p>Rumai is a pure <a href="http://ruby-lang.org">Ruby</a> interface to the <a href="http://wmii.suckless.org">wmii</a> window manager. Its name is a
|
90
|
+
portmanteau of "<em>Ru</em>by" and "w<em>mi</em>i" (which I pronounce as "vim eye").</p>
|
91
|
+
|
92
|
+
<h3 id="Features">Features</h3>
|
93
|
+
|
94
|
+
<ul>
|
95
|
+
<li><p>Provides an interactive shell for live experimentation.</p></li>
|
96
|
+
<li><p>Arranges clients, columns, views, and tags dynamically.</p></li>
|
97
|
+
<li><p>Talks directly to wmii's <a href="http://libs.suckless.org/libixp">IXP filesystem interface</a>.</p></li>
|
98
|
+
<li><p>Includes a pure Ruby client for the <a href="http://cm.bell-labs.com/magic/man2html/5/intro">9P2000 protocol</a>.</p></li>
|
99
|
+
<li><p>Powers <a href="http://github.com/sunaku/wmiirc">my personal</a> wmiirc and
|
100
|
+
<a href="http://github.com/sunaku/wmiirc/network">many others</a> like it.</p></li>
|
101
|
+
</ul>
|
102
|
+
|
103
|
+
|
104
|
+
<h3 id="Resources">Resources</h3>
|
105
|
+
|
106
|
+
<dl>
|
107
|
+
<dt>Issue tracker (report bugs, request features, get help)</dt><dd><p><a href="http://github.com/sunaku/rumai/issues" data-bare-link="true">http://github.com/sunaku/rumai/issues</a></p></dd>
|
108
|
+
<dt>Source code (browse online or obtain with <a href="http://git-scm.com">Git</a>)</dt><dd><p><a href="http://github.com/sunaku/rumai" data-bare-link="true">http://github.com/sunaku/rumai</a></p></dd>
|
109
|
+
<dt>API documentation</dt><dd><p><a href="http://snk.tuxfamily.org/lib/rumai/api/" data-bare-link="true">http://snk.tuxfamily.org/lib/rumai/api/</a></p></dd>
|
110
|
+
<dt>Announcements feed</dt><dd><p><a href="http://snk.tuxfamily.org/lib/rumai/ann.xml" data-bare-link="true">http://snk.tuxfamily.org/lib/rumai/ann.xml</a></p></dd>
|
111
|
+
<dt>Official website</dt><dd><p><a href="http://snk.tuxfamily.org/lib/ember/" data-bare-link="true">http://snk.tuxfamily.org/lib/ember/</a></p></dd>
|
112
|
+
</dl>
|
113
|
+
|
114
|
+
|
115
|
+
<h3 id="Setup">Setup</h3>
|
116
|
+
|
117
|
+
<p>Prerequisites:</p>
|
118
|
+
|
119
|
+
<ul>
|
120
|
+
<li><p><a href="http://ruby-lang.org">Ruby</a> 1.8.6 or newer.</p></li>
|
121
|
+
<li><p><a href="http://rubygems.org">RubyGems</a> 1.3.6 or newer.</p></li>
|
122
|
+
<li><p><a href="http://wmii.suckless.org">wmii</a> 3.9 or newer.</p></li>
|
123
|
+
</ul>
|
124
|
+
|
125
|
+
|
126
|
+
<p>Installing:</p>
|
127
|
+
|
128
|
+
<pre><code>gem install rumai
|
129
|
+
</code></pre>
|
130
|
+
|
131
|
+
<p>Upgrading:</p>
|
132
|
+
|
133
|
+
<pre><code>gem update rumai
|
134
|
+
</code></pre>
|
135
|
+
|
136
|
+
<p>Removing:</p>
|
137
|
+
|
138
|
+
<pre><code>gem uninstall rumai
|
139
|
+
</code></pre>
|
140
|
+
|
141
|
+
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
142
|
+
|
143
|
+
<p><code>rumai</code> [<var>OPTIONS</var>] [<var>IRB_OPTIONS</var>]</p>
|
144
|
+
|
145
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
146
|
+
|
147
|
+
<p>Starts an interactive Ruby shell (IRB) session by passing the given
|
148
|
+
<var>IRB_OPTIONS</var> to irb(1). This puts you at a command prompt as follows:</p>
|
149
|
+
|
150
|
+
<pre><code>irb(Rumai):001:0>
|
151
|
+
</code></pre>
|
152
|
+
|
153
|
+
<p>The <code>irb(Rumai)</code> token in the command prompt indicates that commands will be
|
154
|
+
evaluated <em>inside</em> the <code>Rumai</code> module. As a result, you can omit the "Rumai"
|
155
|
+
prefix from your commands if you wish.</p>
|
156
|
+
|
157
|
+
<p>For example, to get the currently selected client, you can type <code>curr_client</code>
|
158
|
+
instead of <code>Rumai.curr_client</code> at the prompt. Both commands achieve the same
|
159
|
+
effect.</p>
|
160
|
+
|
161
|
+
<p>The next thing to notice is that <em>TAB completion</em> is enabled. So you can type
|
162
|
+
part of a command and press the TAB key to see a list of possible completions.</p>
|
163
|
+
|
164
|
+
<h2 id="OPTIONS">OPTIONS</h2>
|
165
|
+
|
166
|
+
<dl>
|
167
|
+
<dt><code>-h</code>, <code>--help</code></dt><dd><p>Display this manual and exit.</p></dd>
|
168
|
+
<dt><code>-v</code>, <code>--version</code></dt><dd><p>Print version number and exit.</p></dd>
|
169
|
+
</dl>
|
170
|
+
|
171
|
+
|
172
|
+
<h2 id="EXAMPLES">EXAMPLES</h2>
|
173
|
+
|
174
|
+
<p>Now that you know how to start the interactive shell (see <strong>DESCRIPTION</strong>
|
175
|
+
above) let us walk through a series of examples that highlight the main
|
176
|
+
features of Rumai. You can follow along by copying & pasting the presented
|
177
|
+
commands into the interactive shell.</p>
|
178
|
+
|
179
|
+
<h3 id="Automated-client-arrangement">Automated client arrangement</h3>
|
180
|
+
|
181
|
+
<p>Launch a few terminals so that we have something to work with:</p>
|
182
|
+
|
183
|
+
<pre><code>colors = %w[ red green blue black orange brown gray navy gold ]
|
184
|
+
colors.each {|c| system "xterm -bg #{c} -title #{c} -e sh -c read &" }
|
185
|
+
</code></pre>
|
186
|
+
|
187
|
+
<p>Arrange all clients in a grid:</p>
|
188
|
+
|
189
|
+
<pre><code>curr_view.arrange_in_grid
|
190
|
+
</code></pre>
|
191
|
+
|
192
|
+
<p>Arrange all clients in a diamond shape:</p>
|
193
|
+
|
194
|
+
<pre><code>curr_view.arrange_in_diamond
|
195
|
+
</code></pre>
|
196
|
+
|
197
|
+
<p>Arrange all clients like LarsWM does:</p>
|
198
|
+
|
199
|
+
<pre><code>curr_view.arrange_as_larswm
|
200
|
+
</code></pre>
|
201
|
+
|
202
|
+
<p>Close the terminals we launched earlier:</p>
|
203
|
+
|
204
|
+
<pre><code>terms = curr_view.clients.select {|c| colors.include? c.label.read }
|
205
|
+
terms.each {|c| c.kill }
|
206
|
+
</code></pre>
|
207
|
+
|
208
|
+
<h3 id="Multiple-client-grouping">Multiple client grouping</h3>
|
209
|
+
|
210
|
+
<p>Launch a few terminals so that we have something to work with:</p>
|
211
|
+
|
212
|
+
<pre><code>colors = %w[ red green blue black orange brown gray navy gold ]
|
213
|
+
colors.each {|c| system "xterm -bg #{c} -title #{c} -e sh -c read &" }
|
214
|
+
</code></pre>
|
215
|
+
|
216
|
+
<p>Add the red, green, and blue terminals into the "grouping":</p>
|
217
|
+
|
218
|
+
<pre><code>terms = curr_view.clients.select do |c|
|
219
|
+
%w[red green blue].include? c.label.read
|
220
|
+
end
|
221
|
+
terms.each {|c| c.group }
|
222
|
+
</code></pre>
|
223
|
+
|
224
|
+
<p>You should now see a new button labelled as "@" on the left-hand side of
|
225
|
+
wmii's bar, indicating that there is now a new view labelled "@" in wmii.
|
226
|
+
Let us inspect what clients this mysterious view contains:</p>
|
227
|
+
|
228
|
+
<pre><code>v = View.new "@"
|
229
|
+
puts v.clients.map {|c| c.label.read }
|
230
|
+
</code></pre>
|
231
|
+
|
232
|
+
<p>Aha! The mysterious view contains the red, green, and blue clients we
|
233
|
+
recently "grouped". Thus, by adding a client to the "grouping", we are
|
234
|
+
simply tagging the client with the "@" token.</p>
|
235
|
+
|
236
|
+
<p>Now that we have put some clients into the "grouping", let us move all
|
237
|
+
clients in the grouping to the floating area in the current view:</p>
|
238
|
+
|
239
|
+
<pre><code>grouping.each {|c| c.send "toggle" }
|
240
|
+
</code></pre>
|
241
|
+
|
242
|
+
<p>Neat! Let us bring them back into the managed area:</p>
|
243
|
+
|
244
|
+
<pre><code>grouping.each {|c| c.send "toggle" }
|
245
|
+
</code></pre>
|
246
|
+
|
247
|
+
<p>Close the terminals we launched earlier:</p>
|
248
|
+
|
249
|
+
<pre><code>terms = curr_view.clients.select {|c| colors.include? c.label.read }
|
250
|
+
terms.each {|c| c.kill }
|
251
|
+
</code></pre>
|
252
|
+
|
253
|
+
<p>In summary, you can select multiple clients (by adding them to the
|
254
|
+
"grouping") and perform operations on them. This is useful when you want
|
255
|
+
to do something with a group of clients but do not want to manually focus
|
256
|
+
one, perform the action, focus the next one, and so on.</p>
|
257
|
+
|
258
|
+
<p>Another important aspect is that selected clients stay selected until they
|
259
|
+
are unselected. This allows you to continue performing tasks on the
|
260
|
+
selection without having to reselect the same clients after every
|
261
|
+
operation.</p>
|
262
|
+
|
263
|
+
<h3 id="Easy-column-manipulation">Easy column manipulation</h3>
|
264
|
+
|
265
|
+
<p>Launch a few terminals so that we have something to work with:</p>
|
266
|
+
|
267
|
+
<pre><code>colors = %w[ red green blue black orange brown gray navy gold ]
|
268
|
+
colors.each {|c| system "xterm -bg #{c} -title #{c} -e sh -c read &" }
|
269
|
+
</code></pre>
|
270
|
+
|
271
|
+
<p>You can insert a group of clients to the top, bottom, or after the
|
272
|
+
currently focused client of <em>any</em> column using Array-like methods.</p>
|
273
|
+
|
274
|
+
<p>Give each client its own column (one client per column):</p>
|
275
|
+
|
276
|
+
<pre><code>curr_view.each_column {|c| c.length = 1 }
|
277
|
+
</code></pre>
|
278
|
+
|
279
|
+
<p>Put (at most) three clients in every column:</p>
|
280
|
+
|
281
|
+
<pre><code>curr_view.each_column {|c| c.length = 3 }
|
282
|
+
</code></pre>
|
283
|
+
|
284
|
+
<p>Move the red, green, and blue clients into the floating area:</p>
|
285
|
+
|
286
|
+
<pre><code>rgb = %w[red green blue]
|
287
|
+
terms = curr_view.clients.select {|c| rgb.include? c.label.read }
|
288
|
+
curr_view.areas[0].push terms
|
289
|
+
</code></pre>
|
290
|
+
|
291
|
+
<p>Slurp all floating clients into the last column:</p>
|
292
|
+
|
293
|
+
<pre><code>list = curr_view.areas
|
294
|
+
a, b = list.first, list.last
|
295
|
+
b.concat a
|
296
|
+
</code></pre>
|
297
|
+
|
298
|
+
<p>Set the last column's layout to stacking mode:</p>
|
299
|
+
|
300
|
+
<pre><code>b.layout = 'stack'
|
301
|
+
</code></pre>
|
302
|
+
|
303
|
+
<p>Move the red, green, and blue clients to the top of the second column:</p>
|
304
|
+
|
305
|
+
<pre><code>curr_view.areas[2].unshift terms
|
306
|
+
</code></pre>
|
307
|
+
|
308
|
+
<p>Move the red, green, and blue clients to the bottom of the third column:</p>
|
309
|
+
|
310
|
+
<pre><code>curr_view.areas[3].push terms
|
311
|
+
</code></pre>
|
312
|
+
|
313
|
+
<p>Close the terminals we launched earlier:</p>
|
314
|
+
|
315
|
+
<pre><code>terms = curr_view.clients.select {|c| colors.include? c.label.read }
|
316
|
+
terms.each {|c| c.kill }
|
317
|
+
</code></pre>
|
318
|
+
|
319
|
+
<h3 id="Easy-client-manipulation">Easy client manipulation</h3>
|
320
|
+
|
321
|
+
<p>Launch a few terminals so that we have something to work with:</p>
|
322
|
+
|
323
|
+
<pre><code>colors = %w[ red green blue black orange brown gray navy gold ]
|
324
|
+
colors.each {|c| system "xterm -bg #{c} -title #{c} -e sh -c read &" }
|
325
|
+
</code></pre>
|
326
|
+
|
327
|
+
<p>Obtain a reference to the red client:</p>
|
328
|
+
|
329
|
+
<pre><code>red = curr_view.clients.find {|c| c.label.read == "red" }
|
330
|
+
</code></pre>
|
331
|
+
|
332
|
+
<p>Show the red client's current tags:</p>
|
333
|
+
|
334
|
+
<pre><code>red.tags
|
335
|
+
</code></pre>
|
336
|
+
|
337
|
+
<p>Add the "foo" and "bar" tags to the red client:</p>
|
338
|
+
|
339
|
+
<pre><code>red.tag "foo", "bar"
|
340
|
+
</code></pre>
|
341
|
+
|
342
|
+
<p>Remove the "bar" tag from the red client:</p>
|
343
|
+
|
344
|
+
<pre><code>red.untag "bar"
|
345
|
+
</code></pre>
|
346
|
+
|
347
|
+
<p>Do complex operations on the red client's tags:</p>
|
348
|
+
|
349
|
+
<pre><code>red.with_tags { concat %w[a b c]; push 'z'; delete 'c' }
|
350
|
+
</code></pre>
|
351
|
+
|
352
|
+
<p>Focus the next client after the red client:</p>
|
353
|
+
|
354
|
+
<pre><code>red.next.focus
|
355
|
+
curr_client == red.next #=> true
|
356
|
+
</code></pre>
|
357
|
+
|
358
|
+
<p>Notice that by focusing a client, we make it the current client.</p>
|
359
|
+
|
360
|
+
<p>Focus the red client on a different view:</p>
|
361
|
+
|
362
|
+
<pre><code>orig = curr_view
|
363
|
+
v = red.views.last
|
364
|
+
red.focus v
|
365
|
+
</code></pre>
|
366
|
+
|
367
|
+
<p>Return to the original view:</p>
|
368
|
+
|
369
|
+
<pre><code>orig.focus
|
370
|
+
</code></pre>
|
371
|
+
|
372
|
+
<p>Send the red client to the last column:</p>
|
373
|
+
|
374
|
+
<pre><code>red.send curr_view.areas.last
|
375
|
+
</code></pre>
|
376
|
+
|
377
|
+
<p>Close the terminals we launched earlier:</p>
|
378
|
+
|
379
|
+
<pre><code>terms = curr_view.clients.select {|c| colors.include? c.label.read }
|
380
|
+
terms.each {|c| c.kill }
|
381
|
+
</code></pre>
|
382
|
+
|
383
|
+
<h3 id="Traversing-the-file-system">Traversing the file system</h3>
|
384
|
+
|
385
|
+
<p>Show the root node of wmii's IXP file system:</p>
|
386
|
+
|
387
|
+
<pre><code>fs
|
388
|
+
</code></pre>
|
389
|
+
|
390
|
+
<p>Show the names of all files at the root level:</p>
|
391
|
+
|
392
|
+
<pre><code>fs.entries
|
393
|
+
</code></pre>
|
394
|
+
|
395
|
+
<p>Show the parent of the root node:</p>
|
396
|
+
|
397
|
+
<pre><code>fs.parent
|
398
|
+
</code></pre>
|
399
|
+
|
400
|
+
<p>Show the children of the root node:</p>
|
401
|
+
|
402
|
+
<pre><code>fs.children
|
403
|
+
</code></pre>
|
404
|
+
|
405
|
+
<p>Navigate into to the <code>/lbar/</code> directory:</p>
|
406
|
+
|
407
|
+
<pre><code>n1 = fs.lbar
|
408
|
+
n2 = fs['lbar']
|
409
|
+
n1 == n2 #=> true
|
410
|
+
left_bar = n1
|
411
|
+
</code></pre>
|
412
|
+
|
413
|
+
<p>Notice that you can traverse the file system hierarchy by simply calling
|
414
|
+
methods on node objects. Alternatively, you can traverse by specifying an
|
415
|
+
arbitrary sub-path (relative path) using the <code>[]</code> operator on a node.</p>
|
416
|
+
|
417
|
+
<p>Create a new temporary button:</p>
|
418
|
+
|
419
|
+
<pre><code>b = left_bar.rumai_example # path of new button
|
420
|
+
b.exist? #=> false
|
421
|
+
b.create
|
422
|
+
b.exist? #=> true
|
423
|
+
</code></pre>
|
424
|
+
|
425
|
+
<p>You should now see an empty button on the left-hand side of the wmii bar.</p>
|
426
|
+
|
427
|
+
<p>Color the button black-on-white and label it as "hello world":</p>
|
428
|
+
|
429
|
+
<pre><code>content = "#000000 #ffffff #000000 hello world"
|
430
|
+
b.write content
|
431
|
+
b.read == content #=> true
|
432
|
+
</code></pre>
|
433
|
+
|
434
|
+
<p>Remove the temporary button:</p>
|
435
|
+
|
436
|
+
<pre><code>b.remove
|
437
|
+
b.exist? #=> false
|
438
|
+
</code></pre>
|
439
|
+
|
440
|
+
<h2 id="HACKING">HACKING</h2>
|
441
|
+
|
442
|
+
<p>This section is meant for people who want to develop Rumai's source code.</p>
|
443
|
+
|
444
|
+
<h3 id="Prerequisites">Prerequisites</h3>
|
445
|
+
|
446
|
+
<p>Install Ruby libraries necessary for development:</p>
|
447
|
+
|
448
|
+
<pre><code>gem install rumai --development
|
449
|
+
</code></pre>
|
450
|
+
|
451
|
+
<h3 id="Infrastructure">Infrastructure</h3>
|
452
|
+
|
453
|
+
<p><a href="http://snk.tuxfamily.org/lib/inochi/">Inochi</a> serves as the project infrastructure for Rumai. It handles tasks
|
454
|
+
such as building this help manual and API documentation, and packaging,
|
455
|
+
announcing, and publishing new releases. See its help manual and list of
|
456
|
+
tasks to get started:</p>
|
457
|
+
|
458
|
+
<pre><code>inochi --help # display help manual
|
459
|
+
inochi --tasks # list available tasks
|
460
|
+
</code></pre>
|
461
|
+
|
462
|
+
<h3 id="-LOAD_PATH-setup">$LOAD_PATH setup</h3>
|
463
|
+
|
464
|
+
<p>Ensure that the <code>lib/</code> directory is listed in Ruby's <code>$LOAD_PATH</code> before you
|
465
|
+
use any libraries therein or run any executables in the <code>bin/</code> directory.</p>
|
466
|
+
|
467
|
+
<p>This can be achieved by passing an option to Ruby:</p>
|
468
|
+
|
469
|
+
<pre><code>ruby -Ilib bin/rumai
|
470
|
+
irb -Ilib -r rumai
|
471
|
+
</code></pre>
|
472
|
+
|
473
|
+
<p>Or by setting the <code>$RUBYLIB</code> environment variable:</p>
|
474
|
+
|
475
|
+
<pre><code>export RUBYLIB=lib # bash, ksh, zsh
|
476
|
+
setenv RUBYLIB lib # csh
|
477
|
+
set -x RUBYLIB lib # fish
|
478
|
+
|
479
|
+
ruby bin/rumai
|
480
|
+
irb -r rumai
|
481
|
+
</code></pre>
|
482
|
+
|
483
|
+
<p>Or by installing the <a href="http://github.com/chneukirchen/rup">ruby-wrapper</a> tool.</p>
|
484
|
+
|
485
|
+
<h3 id="RubyGems-setup">RubyGems setup</h3>
|
486
|
+
|
487
|
+
<p>If you use Ruby 1.8 or older, then ensure that RubyGems is activated before
|
488
|
+
you use any libraries in the <code>lib/</code> directory or run any executables in the
|
489
|
+
<code>bin/</code> directory.</p>
|
490
|
+
|
491
|
+
<p>This can be achieved by passing an option to Ruby:</p>
|
492
|
+
|
493
|
+
<pre><code>ruby -rubygems bin/rumai
|
494
|
+
irb -rubygems -r rumai
|
495
|
+
</code></pre>
|
496
|
+
|
497
|
+
<p>Or by setting the <code>$RUBYOPT</code> environment variable:</p>
|
498
|
+
|
499
|
+
<pre><code>export RUBYOPT=-rubygems # bash, ksh, zsh
|
500
|
+
setenv RUBYOPT -rubygems # csh
|
501
|
+
set -x RUBYOPT -rubygems # fish
|
502
|
+
</code></pre>
|
503
|
+
|
504
|
+
<h3 id="Running-tests">Running tests</h3>
|
505
|
+
|
506
|
+
<p>Simply execute the included test runner, which sets up Ruby's <code>$LOAD_PATH</code> for
|
507
|
+
testing, loads the included <code>test/test_helper.rb</code> file, and then evaluates all
|
508
|
+
<code>test/**/*_test.rb</code> files:</p>
|
509
|
+
|
510
|
+
<pre><code>test/runner
|
511
|
+
</code></pre>
|
512
|
+
|
513
|
+
<p>Its exit status will indicate whether all tests have passed. It may also
|
514
|
+
print additional pass/fail information depending on the testing library used
|
515
|
+
in the <code>test/test_helper.rb</code> file.</p>
|
516
|
+
|
517
|
+
<h3 id="Contributing">Contributing</h3>
|
518
|
+
|
519
|
+
<p>Fork this project on GitHub (see <strong>Resources</strong> above) and send a pull request.</p>
|
520
|
+
|
521
|
+
<h2 id="VERSIONS">VERSIONS</h2>
|
522
|
+
|
523
|
+
<p>This section contains release notes of current and past releases.</p>
|
524
|
+
|
525
|
+
<h3 id="Version-3-2-3-2010-04-28-">Version 3.2.3 (2010-04-28)</h3>
|
526
|
+
|
527
|
+
<p>This release adds a UNIX manual page and requires wmii 3.9 or newer.</p>
|
528
|
+
|
529
|
+
<p>Bug fixes:</p>
|
530
|
+
|
531
|
+
<ul>
|
532
|
+
<li><p><code>Rumai::Area#unshift</code> needs wmii 3.9 or newer.
|
533
|
+
The help manual has been corrected accordingly.</p>
|
534
|
+
|
535
|
+
<p>Thanks to <a href="http://github.com/ghedamat">ghedamat</a> for reporting <a href="http://github.com/sunaku/wmiirc/issues/8">this issue</a>.</p></li>
|
536
|
+
</ul>
|
537
|
+
|
538
|
+
|
539
|
+
<p>Housekeeping:</p>
|
540
|
+
|
541
|
+
<ul>
|
542
|
+
<li><p>Upgrade to Inochi 3.0.0. Run <code>rumai --help</code> to see the UNIX manual page!</p></li>
|
543
|
+
<li><p>Move IRB session creation code from rumai(1) into <code>rumai/irb</code> sub-library.</p></li>
|
544
|
+
</ul>
|
545
|
+
|
546
|
+
|
547
|
+
<h3 id="Version-3-2-2-2010-04-01-">Version 3.2.2 (2010-04-01)</h3>
|
548
|
+
|
549
|
+
<p>This release fixes some warnings that appeared during installation and
|
550
|
+
performs some minor housekeeping.</p>
|
551
|
+
|
552
|
+
<p>Bug fixes:</p>
|
553
|
+
|
554
|
+
<dl>
|
555
|
+
<dt>Warnings of the following form appeared during gem installation:</dt><dd><p></p>
|
556
|
+
|
557
|
+
<pre><code>Unrecognized directive '...' in lib/rumai/inochi.yaml
|
558
|
+
</code></pre>
|
559
|
+
|
560
|
+
<p>Thanks to <a href="http://github.com/ghedamat">ghedamat</a> for reporting this.</p></dd>
|
561
|
+
</dl>
|
562
|
+
|
563
|
+
|
564
|
+
<p>Housekeeping:</p>
|
565
|
+
|
566
|
+
<ul>
|
567
|
+
<li>Upgrade to Inochi 2.0.0-rc2 for managing this project.</li>
|
568
|
+
</ul>
|
569
|
+
|
570
|
+
|
571
|
+
<h3 id="Version-3-2-1-2010-03-22-">Version 3.2.1 (2010-03-22)</h3>
|
572
|
+
|
573
|
+
<p>This release improves multi-threading support in Rumai's pure-Ruby
|
574
|
+
implementation of the <a href="http://libs.suckless.org/libixp">IXP file-system interface</a>.</p>
|
575
|
+
|
576
|
+
<p>Thank you:</p>
|
577
|
+
|
578
|
+
<ul>
|
579
|
+
<li><a href="http://github.com/gigamo">Gigamo</a> reported the issue of status bar applets not refreshing
|
580
|
+
according to their prescribed schedule (this is particularly noticable
|
581
|
+
in the clock applet) and verified my fix for the problem.</li>
|
582
|
+
</ul>
|
583
|
+
|
584
|
+
|
585
|
+
<p>Bug fixes:</p>
|
586
|
+
|
587
|
+
<ul>
|
588
|
+
<li>Perform a blocking I/O read to recieve a 9P2000 message in
|
589
|
+
<code>Rumai::IXP::Agent#recv</code> only if recieve buffer is empty. This gives
|
590
|
+
other threads a chance to check the recieve buffer for their response.
|
591
|
+
instead of being blocked by us as we greedily hold on to the 9P2000
|
592
|
+
message stream until our expected response arrives.</li>
|
593
|
+
</ul>
|
594
|
+
|
595
|
+
|
596
|
+
<p>Housekeeping:</p>
|
597
|
+
|
598
|
+
<ul>
|
599
|
+
<li>Upgrade to Inochi 2.0.0-rc1 and Dfect 2.0.0.</li>
|
600
|
+
</ul>
|
601
|
+
|
602
|
+
|
603
|
+
<h3 id="Version-3-2-0-2009-11-17-">Version 3.2.0 (2009-11-17)</h3>
|
604
|
+
|
605
|
+
<p>This release adds a new automated view arrangement, simplifies the IXP
|
606
|
+
transport layer, and cleans up the code and API documentation.</p>
|
607
|
+
|
608
|
+
<p>New features:</p>
|
609
|
+
|
610
|
+
<ul>
|
611
|
+
<li><p>Add <code>Rumai::View#arrange_in_stacks</code> automated view arrangement.</p></li>
|
612
|
+
<li><p>Convert <code>:stack</code> and <code>:max</code> arguments into wmii 3.9 syntax in
|
613
|
+
<code>Rumai::Area#layout=</code>.</p></li>
|
614
|
+
</ul>
|
615
|
+
|
616
|
+
|
617
|
+
<p>Bug fixes:</p>
|
618
|
+
|
619
|
+
<ul>
|
620
|
+
<li>Rewrote IXP transport layer (<code>Rumai::IXP::Agent</code>) to <em>not</em> use a
|
621
|
+
background thread, according to <a href="http://www.x.org/releases/X11R7.5/doc/libxcb/tutorial/#requestsreplies">the XCB cookie approach</a>.</li>
|
622
|
+
</ul>
|
623
|
+
|
624
|
+
|
625
|
+
<p>Housekeeping:</p>
|
626
|
+
|
627
|
+
<ul>
|
628
|
+
<li><p>Clean up some code and API docs.</p></li>
|
629
|
+
<li><p>Reduce amount of string concatenation in <code>Struct#to_9p</code>.</p></li>
|
630
|
+
</ul>
|
631
|
+
|
632
|
+
|
633
|
+
<h3 id="Version-3-1-1-2009-11-16-">Version 3.1.1 (2009-11-16)</h3>
|
634
|
+
|
635
|
+
<p>This release fixes bugs in automated view arrangements and updates the user
|
636
|
+
manual.</p>
|
637
|
+
|
638
|
+
<p>Thank you:</p>
|
639
|
+
|
640
|
+
<ul>
|
641
|
+
<li>Nathan Neff reported the client ordering bug in automated view
|
642
|
+
arrangements.</li>
|
643
|
+
</ul>
|
644
|
+
|
645
|
+
|
646
|
+
<p>Bug fixes:</p>
|
647
|
+
|
648
|
+
<ul>
|
649
|
+
<li><p>The relative order of clients was not being preserved during view
|
650
|
+
arrangements.</p></li>
|
651
|
+
<li><p>Focus on the current view was lost after automated view arrangement was
|
652
|
+
applied if the current view was not the first view on which the initially
|
653
|
+
focused (before the automated arrangement was applied) client appeared.</p></li>
|
654
|
+
</ul>
|
655
|
+
|
656
|
+
|
657
|
+
<h3 id="Version-3-1-0-2009-10-02-">Version 3.1.0 (2009-10-02)</h3>
|
658
|
+
|
659
|
+
<p>This release adds new methods, fixes some bugs, and revises the manual.</p>
|
660
|
+
|
661
|
+
<p>New features:</p>
|
662
|
+
|
663
|
+
<ul>
|
664
|
+
<li><p>Add <code>Client#float</code> methods to manipulate floating status.</p></li>
|
665
|
+
<li><p>Add <code>Client#manage</code> methods to manipulate managed status.</p></li>
|
666
|
+
<li><p>The <code>Client#tags=</code> method now accepts '~' and '!' tag prefixes.</p></li>
|
667
|
+
</ul>
|
668
|
+
|
669
|
+
|
670
|
+
<p>Bug fixes:</p>
|
671
|
+
|
672
|
+
<ul>
|
673
|
+
<li><p>There is no <code>View#move_focus</code> method, only <code>View#select</code>.</p></li>
|
674
|
+
<li><p>Assertion failure in test suite because all files in <code>/rbar</code>
|
675
|
+
(inside wmii's IXP filesystem) contain an automatic color header when
|
676
|
+
read.</p></li>
|
677
|
+
</ul>
|
678
|
+
|
679
|
+
|
680
|
+
<p>Housekeeping:</p>
|
681
|
+
|
682
|
+
<ul>
|
683
|
+
<li><p>Use simpler Copyright reminder at the top of every file.</p></li>
|
684
|
+
<li><p>Open source is for fun, so <a href="http://loiclemeur.com/english/2009/03/never-criticize-your-competitors.html">be
|
685
|
+
nice</a>:
|
686
|
+
speak of "related works" instead of "competitors".</p></li>
|
687
|
+
</ul>
|
688
|
+
|
689
|
+
|
690
|
+
<h3 id="Version-3-0-0-2009-05-11-">Version 3.0.0 (2009-05-11)</h3>
|
691
|
+
|
692
|
+
<p>This release revises method names, adds new methods, and fixes a bug.</p>
|
693
|
+
|
694
|
+
<p>Incompatible changes:</p>
|
695
|
+
|
696
|
+
<ul>
|
697
|
+
<li><p>Rename <code>#toggle_</code> methods to use <code>!</code> suffix in their names.</p></li>
|
698
|
+
<li><p>Rename <code>#float</code> methods to <code>#floating</code>.</p></li>
|
699
|
+
<li><p>Rename <code>View#floater</code> method to <code>View#floating_area</code>.</p></li>
|
700
|
+
</ul>
|
701
|
+
|
702
|
+
|
703
|
+
<p>New features:</p>
|
704
|
+
|
705
|
+
<ul>
|
706
|
+
<li><p>Add <code>Client#stick</code> methods to manipulate sticky status.</p></li>
|
707
|
+
<li><p>Add <code>Client#fullscreen</code> methods to manipulate fullscreen status.</p></li>
|
708
|
+
<li><p>Add <code>Client#slay</code> method which is a forceful version of <code>#kill</code>.</p></li>
|
709
|
+
<li><p>Add <code>View#select</code> method to move focus relatively inside a view.</p></li>
|
710
|
+
<li><p>Add <code>Area::floating</code> method for symmetry with <code>Area::curr</code>.</p></li>
|
711
|
+
<li><p>Add <code>View#managed_area</code> aliases for <code>View#column</code> methods.</p></li>
|
712
|
+
</ul>
|
713
|
+
|
714
|
+
|
715
|
+
<p>Bug fixes:</p>
|
716
|
+
|
717
|
+
<ul>
|
718
|
+
<li><p>Fix error when unzooming clients from temporary view.</p></li>
|
719
|
+
<li><p>Fix code that launches temporary terminals in the Tutorial.</p>
|
720
|
+
|
721
|
+
<p>Use the <code>/bin/sh</code> version of the <strong>read</strong> command for portability.</p></li>
|
722
|
+
</ul>
|
723
|
+
|
724
|
+
|
725
|
+
<p>Housekeeping:</p>
|
726
|
+
|
727
|
+
<ul>
|
728
|
+
<li><p>Use <code>Client#send</code> instead of <code>#swap</code> in automated arrangements because
|
729
|
+
it causes less traffic on /event/.</p></li>
|
730
|
+
<li><p>Add old release notes from blog to user manual.</p></li>
|
731
|
+
</ul>
|
732
|
+
|
733
|
+
|
734
|
+
<h3 id="Version-2-1-0-2009-05-09-">Version 2.1.0 (2009-05-09)</h3>
|
735
|
+
|
736
|
+
<p>This release improves client arrangement, fixes several bugs, and cleans up
|
737
|
+
the code.</p>
|
738
|
+
|
739
|
+
<p>Thank you:</p>
|
740
|
+
|
741
|
+
<ul>
|
742
|
+
<li>Simon Hafner reported several bugs.</li>
|
743
|
+
<li>Michael Andrus verified bug fixes.</li>
|
744
|
+
</ul>
|
745
|
+
|
746
|
+
|
747
|
+
<p>New features:</p>
|
748
|
+
|
749
|
+
<ul>
|
750
|
+
<li><p>Focus is now restored on the initially focused client after applying
|
751
|
+
automated client arrangements.</p></li>
|
752
|
+
<li><p>The push(), insert(), and unshift() instance methods of the
|
753
|
+
<code>Rumai::Area</code> class now preserve the order of inserted clients.</p></li>
|
754
|
+
<li><p>The <code>Rumai::View#arrange_in_grid()</code> method now accepts 1 as a parameter.
|
755
|
+
This invocation causes every column to contain at most 1 client.</p></li>
|
756
|
+
</ul>
|
757
|
+
|
758
|
+
|
759
|
+
<p>Bug fixes:</p>
|
760
|
+
|
761
|
+
<ul>
|
762
|
+
<li><p>Fix error caused by focusing the top/bottom client in the destination
|
763
|
+
area before sending new clients into that area.</p></li>
|
764
|
+
<li><p>Fix error when importing clients into an empty area.</p></li>
|
765
|
+
</ul>
|
766
|
+
|
767
|
+
|
768
|
+
<p>Housekeeping:</p>
|
769
|
+
|
770
|
+
<ul>
|
771
|
+
<li><p>Use snake_case instead of camelCase for variable names.</p></li>
|
772
|
+
<li><p>Add copyright notice at the top of every file.</p></li>
|
773
|
+
<li><p>Plenty of code formatting and beautification.</p></li>
|
774
|
+
</ul>
|
775
|
+
|
776
|
+
|
777
|
+
<h3 id="Version-2-0-2-2009-02-26-">Version 2.0.2 (2009-02-26)</h3>
|
778
|
+
|
779
|
+
<p>This release fixes a connection bug.</p>
|
780
|
+
|
781
|
+
<p>Thank you:</p>
|
782
|
+
|
783
|
+
<ul>
|
784
|
+
<li>Simon Hafner reported and helped debug the <code>$DISPLAY</code> bug.</li>
|
785
|
+
</ul>
|
786
|
+
|
787
|
+
|
788
|
+
<p>Bug fixes:</p>
|
789
|
+
|
790
|
+
<ul>
|
791
|
+
<li>wmii omits the fractional portion of <code>$DISPLAY</code> in its socket file path.
|
792
|
+
Rumai was trying to connect with the entire <code>$DISPLAY</code> value (including
|
793
|
+
the fractional portion) and thus could not find wmii's socket file.</li>
|
794
|
+
</ul>
|
795
|
+
|
796
|
+
|
797
|
+
<h3 id="Version-2-0-1-2009-01-25-">Version 2.0.1 (2009-01-25)</h3>
|
798
|
+
|
799
|
+
<p>This release simplifies project administrivia using <a href="http://snk.tuxfamily.org/lib/inochi/">Inochi</a>, improves the unit tests, and revises the user
|
800
|
+
manual.</p>
|
801
|
+
|
802
|
+
<p>Bug fixes:</p>
|
803
|
+
|
804
|
+
<ul>
|
805
|
+
<li>The rumai/ixp/message library's unit test failed if
|
806
|
+
<code>/rbar/status</code> did not already exist in wmii.</li>
|
807
|
+
</ul>
|
808
|
+
|
809
|
+
|
810
|
+
<p>Housekeeping:</p>
|
811
|
+
|
812
|
+
<ul>
|
813
|
+
<li><p>Store IXP socket address in <code>Rumai::IXP_SOCK_ADDR</code>.</p></li>
|
814
|
+
<li><p>Added missing test cases for (TR)create and (TR)remove messages in the
|
815
|
+
unit test for the rumai/ixp/message library.</p></li>
|
816
|
+
</ul>
|
817
|
+
|
818
|
+
|
819
|
+
<h3 id="Version-2-0-0-2008-02-04-">Version 2.0.0 (2008-02-04)</h3>
|
820
|
+
|
821
|
+
<p>This release adds support for wmii 3.6, improves the performance of the IXP
|
822
|
+
library, and fixes some bugs.</p>
|
823
|
+
|
824
|
+
<p>Thank you:</p>
|
825
|
+
|
826
|
+
<ul>
|
827
|
+
<li>Christoph Blank tested Rumai 1.0.0 under wmii 3.6 and reported bugs.</li>
|
828
|
+
</ul>
|
829
|
+
|
830
|
+
|
831
|
+
<p>Incompatible changes:</p>
|
832
|
+
|
833
|
+
<ul>
|
834
|
+
<li><p>wmii version 3.6 or newer is now required.</p></li>
|
835
|
+
<li><p>The <code>Rumai::IXP::Agent::FidStream#read_partial</code> method has been replaced
|
836
|
+
by <code>Rumai::IXP::Agent::FidStream#read(true)</code> for efficiency.</p></li>
|
837
|
+
<li><p>The <code>Rumai::IXP::Agent::FidStream#write</code> method no longer writes to
|
838
|
+
the beginning of the stream. Instead, it writes to the current position
|
839
|
+
in the stream.</p></li>
|
840
|
+
<li><p>The <code>Rumai::View#floating_area</code> method has been renamed to
|
841
|
+
<code>Rumai::View#floater</code> for brevity.</p></li>
|
842
|
+
</ul>
|
843
|
+
|
844
|
+
|
845
|
+
<p>New features:</p>
|
846
|
+
|
847
|
+
<ul>
|
848
|
+
<li><p>Added several more methods (such as rewind, pos=, eof?, and so on) from
|
849
|
+
Ruby's IO class to the <code>Rumai::IXP::Agent::FidStream</code> class.</p></li>
|
850
|
+
<li><p>Added the <code>Rumai::Client#kill</code> method to simplify client termination.</p></li>
|
851
|
+
</ul>
|
852
|
+
|
853
|
+
|
854
|
+
<p>Bug fixes:</p>
|
855
|
+
|
856
|
+
<ul>
|
857
|
+
<li>Fixed a race condition in <code>Rumai::Agent#talk</code> which would cause Rumai to
|
858
|
+
hang when multiple threads used it.</li>
|
859
|
+
</ul>
|
860
|
+
|
861
|
+
|
862
|
+
<h3 id="Version-1-0-0-2008-01-26-">Version 1.0.0 (2008-01-26)</h3>
|
863
|
+
|
864
|
+
<p>This is the first release of Rumai, the evolution of
|
865
|
+
<a href="http://article.gmane.org/gmane.comp.window-managers.wmii/1704">wmii-irb</a>,
|
866
|
+
which lets you manipulate the <a href="http://wmii.suckless.org">wmii</a> window manager through <a href="http://ruby-lang.org">Ruby</a>. Enjoy!</p>
|
867
|
+
|
868
|
+
<h2 id="AUTHORS">AUTHORS</h2>
|
869
|
+
|
870
|
+
<p>Suraj N. Kurapati</p>
|
871
|
+
|
872
|
+
<h2 id="CREDITS">CREDITS</h2>
|
873
|
+
|
874
|
+
<p>Christoph Blank,
|
875
|
+
Simon Hafner,
|
876
|
+
Michael Andrus,
|
877
|
+
Nathan Neff,
|
878
|
+
<a href="http://github.com/gigamo">Gigamo</a>,
|
879
|
+
<a href="http://github.com/ghedamat">ghedamat</a></p>
|
880
|
+
|
881
|
+
<h2 id="LICENSE">LICENSE</h2>
|
882
|
+
|
883
|
+
<p>(the ISC license)</p>
|
884
|
+
|
885
|
+
<p>Copyright 2006 Suraj N. Kurapati <a href="mailto:sunaku@gmail.com" data-bare-link="true">sunaku@gmail.com</a></p>
|
886
|
+
|
887
|
+
<p>Permission to use, copy, modify, and/or distribute this software for any
|
888
|
+
purpose with or without fee is hereby granted, provided that the above
|
889
|
+
copyright notice and this permission notice appear in all copies.</p>
|
890
|
+
|
891
|
+
<p>THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
892
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
893
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
894
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
895
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
896
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
897
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</p>
|
898
|
+
|
899
|
+
<h2 id="SEE-ALSO">SEE ALSO</h2>
|
900
|
+
|
901
|
+
<p>irb(1),
|
902
|
+
wmiir(1),
|
903
|
+
wmii(1)</p>
|
904
|
+
|
905
|
+
|
906
|
+
<ol class='foot man'>
|
907
|
+
<li class='tl'></li>
|
908
|
+
<li class='tc'>April 2010</li>
|
909
|
+
<li class='tr'>rumai(1)</li>
|
910
|
+
</ol>
|
911
|
+
|
912
|
+
</div>
|
913
|
+
</body>
|
914
|
+
</html>
|