rumai 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/rumai +1 -1
- data/doc/api/classes/Integer.html +7 -7
- data/doc/api/classes/Rumai.html +148 -141
- data/doc/api/classes/Rumai/Area.html +135 -130
- data/doc/api/classes/Rumai/Chain.html +21 -21
- data/doc/api/classes/Rumai/Client.html +188 -189
- data/doc/api/classes/Rumai/ClientContainer.html +22 -22
- data/doc/api/classes/Rumai/IXP/Agent.html +248 -143
- data/doc/api/classes/Rumai/IXP/Agent/FidStream.html +50 -50
- data/doc/api/classes/Rumai/IXP/Agent/MODES.html +7 -7
- data/doc/api/classes/Rumai/IXP/Agent/RangedPool.html +21 -21
- data/doc/api/classes/Rumai/IXP/Fcall.html +33 -33
- data/doc/api/classes/Rumai/IXP/Qid.html +1 -1
- data/doc/api/classes/Rumai/IXP/Stat.html +8 -8
- data/doc/api/classes/Rumai/IXP/Stream.html +6 -6
- data/doc/api/classes/Rumai/IXP/Struct.html +34 -38
- data/doc/api/classes/Rumai/IXP/Struct/Field.html +42 -42
- data/doc/api/classes/Rumai/IXP/Struct/Field/CounteeField.html +14 -14
- data/doc/api/classes/Rumai/IXP/Struct/Field/CounterField.html +7 -7
- data/doc/api/classes/Rumai/IXP/Terror.html +7 -7
- data/doc/api/classes/Rumai/IXP/Topen.html +1 -1
- data/doc/api/classes/Rumai/Node.html +114 -110
- data/doc/api/classes/Rumai/View.html +184 -136
- data/doc/api/classes/String.html +15 -15
- data/doc/api/classes/Time.html +14 -14
- data/doc/api/created.rid +1 -1
- data/doc/api/files/lib/rumai/fs_rb.html +1 -1
- data/doc/api/files/lib/rumai/ixp/message_rb.html +1 -1
- data/doc/api/files/lib/rumai/ixp/transport_rb.html +1 -1
- data/doc/api/files/lib/rumai/wm_rb.html +1 -1
- data/doc/api/files/lib/rumai_rb.html +1 -1
- data/doc/api/panel/search_index.js +1 -1
- data/doc/history.erb +41 -0
- data/doc/index.html +1315 -669
- data/doc/setup.erb +82 -45
- data/doc/usage.erb +96 -132
- data/lib/rumai.rb +2 -2
- data/lib/rumai/fs.rb +11 -6
- data/lib/rumai/ixp/message.rb +31 -17
- data/lib/rumai/ixp/transport.rb +82 -36
- data/lib/rumai/wm.rb +87 -25
- metadata +5 -5
data/lib/rumai.rb
CHANGED
@@ -8,8 +8,8 @@ gem 'inochi', '~> 1'
|
|
8
8
|
require 'inochi'
|
9
9
|
|
10
10
|
Inochi.init :Rumai,
|
11
|
-
:version => '3.
|
12
|
-
:release => '2009-
|
11
|
+
:version => '3.2.0',
|
12
|
+
:release => '2009-11-17',
|
13
13
|
:website => 'http://snk.tuxfamily.org/lib/rumai/',
|
14
14
|
:tagline => 'Ruby interface to the wmii window manager',
|
15
15
|
:develop => {
|
data/lib/rumai/fs.rb
CHANGED
@@ -16,7 +16,7 @@ module Rumai
|
|
16
16
|
|
17
17
|
begin
|
18
18
|
# We use a single, global connection to wmii's IXP server.
|
19
|
-
IXP_AGENT = IXP::Agent.new
|
19
|
+
IXP_AGENT = IXP::Agent.new(UNIXSocket.new(IXP_SOCK_ADDR))
|
20
20
|
|
21
21
|
rescue => error
|
22
22
|
error.message << %{
|
@@ -71,7 +71,11 @@ module Rumai
|
|
71
71
|
# Returns the names of all files in this directory.
|
72
72
|
#
|
73
73
|
def entries
|
74
|
-
|
74
|
+
begin
|
75
|
+
IXP_AGENT.entries @path
|
76
|
+
rescue IXP::Error
|
77
|
+
[]
|
78
|
+
end
|
75
79
|
end
|
76
80
|
|
77
81
|
##
|
@@ -205,9 +209,10 @@ module Rumai
|
|
205
209
|
end
|
206
210
|
end
|
207
211
|
|
208
|
-
# We use extend() AFTER all methods have been defined
|
209
|
-
#
|
210
|
-
#
|
211
|
-
#
|
212
|
+
# NOTE: We use extend() **AFTER** all methods have been defined
|
213
|
+
# in the class so that the ExportInstanceMethods module
|
214
|
+
# can do its magic. If, instead, we include()d the module
|
215
|
+
# before all methods in the class had been defined, then
|
216
|
+
# the magic would only apply to **SOME** of the methods!
|
212
217
|
Node.extend ExportInstanceMethods
|
213
218
|
end
|
data/lib/rumai/ixp/message.rb
CHANGED
@@ -66,7 +66,7 @@ module Rumai
|
|
66
66
|
# Transforms this object into a string of 9P2000 bytes.
|
67
67
|
#
|
68
68
|
def to_9p
|
69
|
-
@fields.inject(
|
69
|
+
@fields.inject([]) {|s,f| s << f.to_9p(@values) }.join
|
70
70
|
end
|
71
71
|
|
72
72
|
##
|
@@ -85,7 +85,9 @@ module Rumai
|
|
85
85
|
#
|
86
86
|
def self.included target
|
87
87
|
class << target
|
88
|
+
##
|
88
89
|
# Returns a list of fields which compose this Struct.
|
90
|
+
#
|
89
91
|
def fields
|
90
92
|
@fields ||=
|
91
93
|
if superclass.respond_to? :fields
|
@@ -101,22 +103,24 @@ module Rumai
|
|
101
103
|
# [args] arguments for Field.new()
|
102
104
|
#
|
103
105
|
def field name, format = nil, *args
|
104
|
-
|
105
|
-
|
106
|
-
|
106
|
+
klass = Field.factory(format)
|
107
|
+
field = klass.new(name.to_sym, format, *args)
|
108
|
+
|
109
|
+
# register field as being part of this structure
|
110
|
+
fields << field
|
107
111
|
|
108
112
|
# provide accessor methods to field values
|
109
|
-
self.class_eval
|
110
|
-
def #{
|
111
|
-
@values[#{
|
113
|
+
self.class_eval <<-EOS, __FILE__, __LINE__
|
114
|
+
def #{field.name}
|
115
|
+
@values[#{field.name.inspect}]
|
112
116
|
end
|
113
117
|
|
114
|
-
def #{
|
115
|
-
@values[#{
|
118
|
+
def #{field.name}= value
|
119
|
+
@values[#{field.name.inspect}] = value
|
116
120
|
end
|
117
|
-
|
121
|
+
EOS
|
118
122
|
|
119
|
-
|
123
|
+
field
|
120
124
|
end
|
121
125
|
|
122
126
|
##
|
@@ -323,7 +327,10 @@ module Rumai
|
|
323
327
|
field :version , 4
|
324
328
|
field :path , 8
|
325
329
|
|
326
|
-
|
330
|
+
##
|
331
|
+
# The following constant definitions originate from:
|
332
|
+
# http://swtch.com/usr/local/plan9/include/libc.h
|
333
|
+
#
|
327
334
|
QTDIR = 0x80 # type bit for directories
|
328
335
|
QTAPPEND = 0x40 # type bit for append only files
|
329
336
|
QTEXCL = 0x20 # type bit for exclusive use files
|
@@ -355,7 +362,10 @@ module Rumai
|
|
355
362
|
field :gid , String
|
356
363
|
field :muid , String
|
357
364
|
|
358
|
-
|
365
|
+
##
|
366
|
+
# The following constant definitions originate from:
|
367
|
+
# http://swtch.com/usr/local/plan9/include/libc.h
|
368
|
+
#
|
359
369
|
DMDIR = 0x80000000 # mode bit for directories
|
360
370
|
DMAPPEND = 0x40000000 # mode bit for append only files
|
361
371
|
DMEXCL = 0x20000000 # mode bit for exclusive use files
|
@@ -435,8 +445,9 @@ module Rumai
|
|
435
445
|
field :msize , 4
|
436
446
|
field :version , String
|
437
447
|
|
438
|
-
VERSION
|
439
|
-
MSIZE
|
448
|
+
VERSION = '9P2000'.freeze
|
449
|
+
MSIZE = 8192 # magic number defined in Plan9
|
450
|
+
# for [TR]version and [TR]read
|
440
451
|
end
|
441
452
|
|
442
453
|
# size[4] Rversion tag[2] msize[4] version[s]
|
@@ -510,7 +521,10 @@ module Rumai
|
|
510
521
|
field :fid , 4
|
511
522
|
field :mode , 1
|
512
523
|
|
513
|
-
|
524
|
+
##
|
525
|
+
# The following constant definitions originate from:
|
526
|
+
# http://swtch.com/usr/local/plan9/include/libc.h
|
527
|
+
#
|
514
528
|
OREAD = 0 # open for read
|
515
529
|
OWRITE = 1 # write
|
516
530
|
ORDWR = 2 # read and write
|
@@ -688,7 +702,7 @@ class String
|
|
688
702
|
# given 9P2000 byte stream and returns the instance.
|
689
703
|
#
|
690
704
|
def self.from_9p stream
|
691
|
-
stream.read
|
705
|
+
stream.read stream.read_9p(2)
|
692
706
|
end
|
693
707
|
end
|
694
708
|
|
data/lib/rumai/ixp/transport.rb
CHANGED
@@ -5,30 +5,29 @@
|
|
5
5
|
#++
|
6
6
|
|
7
7
|
require 'rumai/ixp/message'
|
8
|
-
require 'thread' # for Mutex
|
8
|
+
require 'thread' # for Mutex and Queue
|
9
9
|
|
10
10
|
module Rumai
|
11
11
|
module IXP
|
12
12
|
##
|
13
|
-
# A thread-safe
|
13
|
+
# A thread-safe channel that multiplexes many
|
14
14
|
# threads onto a single 9P2000 connection.
|
15
15
|
#
|
16
|
+
# The send/recv implementation is based on the XCB cookie approach:
|
17
|
+
# http://www.x.org/releases/X11R7.5/doc/libxcb/tutorial/#requestsreplies
|
18
|
+
#
|
16
19
|
class Agent
|
17
20
|
attr_reader :msize
|
18
21
|
|
22
|
+
##
|
23
|
+
# [stream]
|
24
|
+
# I/O stream on which a 9P2000 server is listening.
|
25
|
+
#
|
19
26
|
def initialize stream
|
20
|
-
@stream
|
21
|
-
|
22
|
-
@
|
23
|
-
|
24
|
-
# background thread which continuously receives
|
25
|
-
# and dispatches messages from the 9P2000 server
|
26
|
-
Thread.new do
|
27
|
-
while true
|
28
|
-
msg = Fcall.from_9p @stream
|
29
|
-
@recv_bays[msg.tag] << msg
|
30
|
-
end
|
31
|
-
end.priority = -1
|
27
|
+
@stream = stream
|
28
|
+
|
29
|
+
@recv_buf = {} # tag => message
|
30
|
+
@recv_lock = Mutex.new
|
32
31
|
|
33
32
|
@tag_pool = RangedPool.new(0...BYTE2_MASK)
|
34
33
|
@fid_pool = RangedPool.new(0...BYTE4_MASK)
|
@@ -71,7 +70,9 @@ module Rumai
|
|
71
70
|
@pool = Queue.new
|
72
71
|
end
|
73
72
|
|
73
|
+
##
|
74
74
|
# Returns an unoccupied range member from the pool.
|
75
|
+
#
|
75
76
|
def obtain
|
76
77
|
begin
|
77
78
|
@pool.deq true
|
@@ -94,38 +95,79 @@ module Rumai
|
|
94
95
|
end
|
95
96
|
end
|
96
97
|
|
98
|
+
##
|
97
99
|
# Marks the given member as being unoccupied so
|
98
100
|
# that it may be occupied again in the future.
|
101
|
+
#
|
99
102
|
def release member
|
100
103
|
@pool << member
|
101
104
|
end
|
102
105
|
end
|
103
106
|
|
104
107
|
##
|
105
|
-
# Sends the given
|
108
|
+
# Sends the given request (Rumai::IXP::Fcall) and returns
|
109
|
+
# a ticket that you can use later to receive the reply.
|
106
110
|
#
|
107
|
-
|
108
|
-
# worrying about the details of tag collisions and thread safety.
|
109
|
-
#
|
110
|
-
def talk request
|
111
|
-
# send the request
|
111
|
+
def send request
|
112
112
|
tag = @tag_pool.obtain
|
113
|
-
bay = @recv_bays[tag]
|
114
113
|
|
115
114
|
request.tag = tag
|
116
|
-
|
117
|
-
|
118
|
-
|
115
|
+
@stream << request.to_9p
|
116
|
+
|
117
|
+
tag
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# Returns the reply for the given ticket, which was previously given
|
122
|
+
# to you when you sent the corresponding request (Rumai::IXP::Fcall).
|
123
|
+
#
|
124
|
+
def recv tag
|
125
|
+
loop do
|
126
|
+
reply = @recv_lock.synchronize do
|
127
|
+
if @recv_buf.key? tag
|
128
|
+
@recv_buf.delete tag
|
129
|
+
else
|
130
|
+
# reply was not in the receive buffer, so wait
|
131
|
+
# for the next reply... hoping that it is ours
|
132
|
+
msg = Fcall.from_9p(@stream)
|
133
|
+
|
134
|
+
if msg.tag == tag
|
135
|
+
msg
|
136
|
+
else
|
137
|
+
# we got someone else's reply, so buffer
|
138
|
+
# it (for them to receive) and try again
|
139
|
+
@recv_buf[msg.tag] = msg
|
140
|
+
nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
if reply
|
146
|
+
@tag_pool.release tag
|
147
|
+
|
148
|
+
if reply.is_a? Rerror
|
149
|
+
raise Error, reply.ename
|
150
|
+
end
|
151
|
+
|
152
|
+
return reply
|
153
|
+
else
|
154
|
+
# give other threads a chance to receive
|
155
|
+
Thread.pass
|
156
|
+
end
|
119
157
|
end
|
158
|
+
end
|
120
159
|
|
121
|
-
|
122
|
-
|
123
|
-
|
160
|
+
##
|
161
|
+
# Sends the given request (Rumai::IXP::Fcall) and returns its reply.
|
162
|
+
#
|
163
|
+
def talk request
|
164
|
+
tag = send(request)
|
124
165
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
166
|
+
begin
|
167
|
+
recv tag
|
168
|
+
rescue Error => e
|
169
|
+
e.message << " -- in reply to #{request.inspect}"
|
170
|
+
raise
|
129
171
|
end
|
130
172
|
end
|
131
173
|
|
@@ -182,7 +224,7 @@ module Rumai
|
|
182
224
|
##
|
183
225
|
# Encapsulates I/O access over a file handle (fid).
|
184
226
|
#
|
185
|
-
# NOTE: this class is NOT thread
|
227
|
+
# NOTE: this class is NOT thread safe!
|
186
228
|
#
|
187
229
|
class FidStream
|
188
230
|
attr_reader :fid, :stat
|
@@ -276,8 +318,8 @@ module Rumai
|
|
276
318
|
# Writes the given content at the current position in this stream.
|
277
319
|
#
|
278
320
|
def write content
|
279
|
-
raise '
|
280
|
-
raise '
|
321
|
+
raise 'cannot write to a closed stream' if @closed
|
322
|
+
raise 'cannot write to a directory' if @stat.directory?
|
281
323
|
|
282
324
|
data = content.to_s
|
283
325
|
limit = data.length + @pos
|
@@ -310,7 +352,10 @@ module Rumai
|
|
310
352
|
end
|
311
353
|
|
312
354
|
##
|
313
|
-
# Returns the
|
355
|
+
# Returns the basenames of all files
|
356
|
+
# inside the directory at the given path.
|
357
|
+
#
|
358
|
+
# See Dir::entries in the Ruby documentation.
|
314
359
|
#
|
315
360
|
def entries path
|
316
361
|
unless stat(path).directory?
|
@@ -321,7 +366,8 @@ module Rumai
|
|
321
366
|
end
|
322
367
|
|
323
368
|
##
|
324
|
-
#
|
369
|
+
# Writes the given content to
|
370
|
+
# the file at the given path.
|
325
371
|
#
|
326
372
|
def write path, content
|
327
373
|
open path, 'w' do |f|
|
data/lib/rumai/wm.rb
CHANGED
@@ -21,7 +21,9 @@ module Rumai
|
|
21
21
|
CLIENT_GROUPING_TAG = '@'.freeze
|
22
22
|
CLIENT_STICKY_TAG = '/./'.freeze
|
23
23
|
|
24
|
+
#-----------------------------------------------------------------------------
|
24
25
|
# abstraction of WM components
|
26
|
+
#-----------------------------------------------------------------------------
|
25
27
|
|
26
28
|
##
|
27
29
|
# NOTE: Inheritors must override the 'chain' method.
|
@@ -124,7 +126,9 @@ module Rumai
|
|
124
126
|
View.curr.clients
|
125
127
|
end
|
126
128
|
|
129
|
+
#-------------------------------------------------------------------------
|
127
130
|
# WM operations
|
131
|
+
#-------------------------------------------------------------------------
|
128
132
|
|
129
133
|
##
|
130
134
|
# Focuses this client within the given view.
|
@@ -145,7 +149,6 @@ module Rumai
|
|
145
149
|
direction = src < dst ? :down : :up
|
146
150
|
|
147
151
|
distance.times { v.select direction }
|
148
|
-
|
149
152
|
break
|
150
153
|
end
|
151
154
|
end
|
@@ -288,7 +291,9 @@ module Rumai
|
|
288
291
|
|
289
292
|
alias manage! float!
|
290
293
|
|
294
|
+
#-------------------------------------------------------------------------
|
291
295
|
# WM hierarchy
|
296
|
+
#-------------------------------------------------------------------------
|
292
297
|
|
293
298
|
##
|
294
299
|
# Returns the area that contains this client within the given view.
|
@@ -304,7 +309,9 @@ module Rumai
|
|
304
309
|
tags.map! {|t| View.new t }
|
305
310
|
end
|
306
311
|
|
312
|
+
#-------------------------------------------------------------------------
|
307
313
|
# tag manipulations
|
314
|
+
#-------------------------------------------------------------------------
|
308
315
|
|
309
316
|
TAG_DELIMITER = '+'.freeze
|
310
317
|
|
@@ -388,7 +395,9 @@ module Rumai
|
|
388
395
|
end
|
389
396
|
end
|
390
397
|
|
398
|
+
#-------------------------------------------------------------------------
|
391
399
|
# multiple client grouping
|
400
|
+
#-------------------------------------------------------------------------
|
392
401
|
|
393
402
|
##
|
394
403
|
# Checks if this client is included in the current grouping.
|
@@ -559,10 +568,17 @@ module Rumai
|
|
559
568
|
# Sets the layout of clients in this column.
|
560
569
|
#
|
561
570
|
def layout= mode
|
571
|
+
case mode
|
572
|
+
when :stack then mode = 'stack-max'
|
573
|
+
when :max then mode = 'stack+max'
|
574
|
+
end
|
575
|
+
|
562
576
|
@view.ctl.write "colmode #{@id} #{mode}"
|
563
577
|
end
|
564
578
|
|
579
|
+
#-------------------------------------------------------------------------
|
565
580
|
# WM operations
|
581
|
+
#-------------------------------------------------------------------------
|
566
582
|
|
567
583
|
##
|
568
584
|
# Puts focus on this area.
|
@@ -571,7 +587,9 @@ module Rumai
|
|
571
587
|
@view.ctl.write "select #{@id}"
|
572
588
|
end
|
573
589
|
|
590
|
+
#-------------------------------------------------------------------------
|
574
591
|
# array abstraction: area is an array of clients
|
592
|
+
#-------------------------------------------------------------------------
|
575
593
|
|
576
594
|
##
|
577
595
|
# Returns the number of clients in this area.
|
@@ -590,7 +608,7 @@ module Rumai
|
|
590
608
|
insert clients
|
591
609
|
|
592
610
|
# move inserted clients to bottom
|
593
|
-
clients.each_with_index do |c, i|
|
611
|
+
clients.reverse.each_with_index do |c, i|
|
594
612
|
until c.id == self.client_ids[-i.succ]
|
595
613
|
c.send :down
|
596
614
|
end
|
@@ -743,7 +761,9 @@ module Rumai
|
|
743
761
|
super view_id, '/tag'
|
744
762
|
end
|
745
763
|
|
764
|
+
#-------------------------------------------------------------------------
|
746
765
|
# WM operations
|
766
|
+
#-------------------------------------------------------------------------
|
747
767
|
|
748
768
|
##
|
749
769
|
# Returns the manifest of all areas and clients in this view.
|
@@ -759,7 +779,9 @@ module Rumai
|
|
759
779
|
ctl.write "select #{direction}"
|
760
780
|
end
|
761
781
|
|
782
|
+
#-------------------------------------------------------------------------
|
762
783
|
# WM hierarchy
|
784
|
+
#-------------------------------------------------------------------------
|
763
785
|
|
764
786
|
##
|
765
787
|
# Returns the area which contains the given client in this view.
|
@@ -830,7 +852,9 @@ module Rumai
|
|
830
852
|
|
831
853
|
alias each_managed_area each_column
|
832
854
|
|
855
|
+
#-------------------------------------------------------------------------
|
833
856
|
# visual arrangement of clients
|
857
|
+
#-------------------------------------------------------------------------
|
834
858
|
|
835
859
|
##
|
836
860
|
# Arranges the clients in this view, while maintaining
|
@@ -848,13 +872,7 @@ module Rumai
|
|
848
872
|
main.layout = :default
|
849
873
|
|
850
874
|
# collapse remaining areas into secondary column
|
851
|
-
extra =
|
852
|
-
|
853
|
-
if extra.length > 1
|
854
|
-
extra.reverse.each_cons(2) do |src, dst|
|
855
|
-
dst.concat src
|
856
|
-
end
|
857
|
-
end
|
875
|
+
extra = squeeze_columns(1..-1)
|
858
876
|
|
859
877
|
if dock = extra.first
|
860
878
|
dock.layout = :default
|
@@ -887,6 +905,31 @@ module Rumai
|
|
887
905
|
end
|
888
906
|
end
|
889
907
|
|
908
|
+
##
|
909
|
+
# Arranges the clients in this view, while maintaining
|
910
|
+
# their relative order, in the given number of columns.
|
911
|
+
#
|
912
|
+
def arrange_in_stacks num_stacks
|
913
|
+
return if num_stacks < 1
|
914
|
+
|
915
|
+
# compute client distribution
|
916
|
+
num_clients = num_managed_clients
|
917
|
+
return unless num_clients > 0
|
918
|
+
|
919
|
+
stack_length = num_clients / num_stacks
|
920
|
+
return if stack_length < 1
|
921
|
+
|
922
|
+
# apply the distribution
|
923
|
+
maintain_focus do
|
924
|
+
each_column do |a|
|
925
|
+
a.length = stack_length
|
926
|
+
a.layout = :stack
|
927
|
+
end
|
928
|
+
|
929
|
+
squeeze_columns num_stacks-1..-1
|
930
|
+
end
|
931
|
+
end
|
932
|
+
|
890
933
|
##
|
891
934
|
# Arranges the clients in this view, while
|
892
935
|
# maintaining their relative order, in a (at
|
@@ -934,15 +977,30 @@ module Rumai
|
|
934
977
|
|
935
978
|
private
|
936
979
|
|
980
|
+
##
|
981
|
+
# Squeezes all columns in the given index range into a single one.
|
982
|
+
#
|
983
|
+
def squeeze_columns range
|
984
|
+
extra = columns[range]
|
985
|
+
|
986
|
+
if extra.length > 1
|
987
|
+
extra.reverse.each_cons(2) do |src, dst|
|
988
|
+
dst.concat src
|
989
|
+
end
|
990
|
+
end
|
991
|
+
|
992
|
+
extra
|
993
|
+
end
|
994
|
+
|
937
995
|
##
|
938
996
|
# Executes the given block and restores
|
939
997
|
# focus to the client that had focus
|
940
998
|
# before the given block was executed.
|
941
999
|
#
|
942
1000
|
def maintain_focus
|
943
|
-
c = Client.curr
|
1001
|
+
c, v = Client.curr, View.curr
|
944
1002
|
yield
|
945
|
-
c.focus
|
1003
|
+
c.focus v
|
946
1004
|
end
|
947
1005
|
|
948
1006
|
##
|
@@ -953,7 +1011,9 @@ module Rumai
|
|
953
1011
|
end
|
954
1012
|
end
|
955
1013
|
|
1014
|
+
#-----------------------------------------------------------------------------
|
956
1015
|
# access to global WM state
|
1016
|
+
#-----------------------------------------------------------------------------
|
957
1017
|
|
958
1018
|
##
|
959
1019
|
# Returns the root of IXP file system hierarchy.
|
@@ -989,6 +1049,22 @@ module Rumai
|
|
989
1049
|
ary
|
990
1050
|
end
|
991
1051
|
|
1052
|
+
##
|
1053
|
+
# Returns a list of all grouped clients in
|
1054
|
+
# the currently focused view. If there are
|
1055
|
+
# no grouped clients, then the currently
|
1056
|
+
# focused client is returned in the list.
|
1057
|
+
#
|
1058
|
+
def grouping
|
1059
|
+
list = curr_view.clients.select {|c| c.group? }
|
1060
|
+
list << curr_client if list.empty? and curr_client.exist?
|
1061
|
+
list
|
1062
|
+
end
|
1063
|
+
|
1064
|
+
#-----------------------------------------------------------------------------
|
1065
|
+
# shortcuts for interactive WM manipulation (via IRB)
|
1066
|
+
#-----------------------------------------------------------------------------
|
1067
|
+
|
992
1068
|
def curr_client ; Client.curr ; end
|
993
1069
|
def next_client ; curr_client.next ; end
|
994
1070
|
def prev_client ; curr_client.prev ; end
|
@@ -1005,20 +1081,6 @@ module Rumai
|
|
1005
1081
|
def next_tag ; next_view.id ; end
|
1006
1082
|
def prev_tag ; prev_view.id ; end
|
1007
1083
|
|
1008
|
-
##
|
1009
|
-
# Returns a list of all grouped clients in
|
1010
|
-
# the currently focused view. If there are
|
1011
|
-
# no grouped clients, then the currently
|
1012
|
-
# focused client is returned in the list.
|
1013
|
-
#
|
1014
|
-
def grouping
|
1015
|
-
list = curr_view.clients.select {|c| c.group? }
|
1016
|
-
list << curr_client if list.empty? and curr_client.exist?
|
1017
|
-
list
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
# shortcuts for interactive WM manipulation (via IRB)
|
1021
|
-
|
1022
1084
|
# provide easy access to container state information
|
1023
1085
|
[Client, Area, View].each {|c| c.extend ExportInstanceMethods }
|
1024
1086
|
|