wnck 0.1.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.tar.gz.sig +0 -0
- data/Manifest +6 -0
- data/README.rdoc +14 -0
- data/Rakefile +15 -0
- data/lib/wnck.rb +327 -0
- data/spec/wnck_screen_spec.rb +100 -0
- data/spec/wnck_window_spec.rb +170 -0
- data/wnck.gemspec +38 -0
- metadata +128 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
Binary file
|
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
= WNCK for Ruby
|
2
|
+
|
3
|
+
Use the GNOME Window Navigator Construction Kit library with Ruby.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install rezonant-wnck --source http://gems.github.com/
|
8
|
+
|
9
|
+
|
10
|
+
== Usage
|
11
|
+
|
12
|
+
This gem provides two classes Wnck::Screen and Wnck::Window which provide access to the
|
13
|
+
services of libwnck. Alternatively you may use the direct C-style bindings from the Wnck
|
14
|
+
module, such as Wnck::wnck_screen_get_default.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('wnck', '0.1.0') do |p|
|
6
|
+
p.description = "Use the GNOME Window Navigator Construction Kit from Ruby"
|
7
|
+
p.url = "http://github.com/rezonant/wnck"
|
8
|
+
p.author = "William Lahti"
|
9
|
+
p.email = "wilahti@gmail.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*", "*.bak", "*.swp", "*~"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
p.runtime_dependencies = ["gtk2", "ffi"]
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
data/lib/wnck.rb
ADDED
@@ -0,0 +1,327 @@
|
|
1
|
+
#
|
2
|
+
# wnck for ruby
|
3
|
+
#
|
4
|
+
# Copyright © 2010 William Lahti
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files (the "Software"), to deal
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
# THE SOFTWARE.
|
23
|
+
#
|
24
|
+
|
25
|
+
#require 'rubygems'
|
26
|
+
require 'gtk2' # gtk initialization must be done or wnck functions segfault
|
27
|
+
require 'ffi'
|
28
|
+
|
29
|
+
module Wnck
|
30
|
+
module GLib
|
31
|
+
extend FFI::Library
|
32
|
+
ffi_lib "libglib-2.0.so"
|
33
|
+
attach_function :g_list_nth_data, [:pointer, :uint32], :pointer
|
34
|
+
attach_function :g_list_length, [:pointer], :uint
|
35
|
+
end
|
36
|
+
|
37
|
+
extend FFI::Library
|
38
|
+
ffi_lib "libwnck-1.so.22"
|
39
|
+
|
40
|
+
|
41
|
+
# Shortcuts for C types used by the API
|
42
|
+
ptr = :pointer; ul = :ulong; str = :string; bool = :bool; int = :int;
|
43
|
+
uint = :uint; void = :void; u32 = :uint32; u = :uint;
|
44
|
+
|
45
|
+
# Enumerations
|
46
|
+
module WindowState
|
47
|
+
%w{NORMAL DESKTOP DOCK DIALOG TOOLBAR MENU UTILITY SPLASHSCREEN
|
48
|
+
}.inject(0) { |value,state| 1 + eval("#{state} = value") }
|
49
|
+
end
|
50
|
+
|
51
|
+
module WindowActions
|
52
|
+
%w{MOVE RESIZE SHADE STICK MAXIMIZE_HORIZONTALLY MAXIMIZE_VERTICALLY CHANGE_WORKSPACE CLOSE UNMAXIMIZE_HORIZONTALLY
|
53
|
+
UNMAXIMIZE_VERTICALLY UNSHADE UNSTICK MINIMIZE UNMINIMIZE MAXIMIZE UNMAXIMIZE FULLSCREEN ABOVE BELOW
|
54
|
+
}.inject(1) { |value,state| (eval "#{state} = value") << 1 }
|
55
|
+
end
|
56
|
+
|
57
|
+
module WindowGravity
|
58
|
+
%w{CURRENT NORTHWEST NORTH NORTHEAST WEST CENTER EAST SOUTHWEST SOUTH SOUTHEAST STATIC
|
59
|
+
}.inject(0) { |value,state| 1 + (eval "#{state} = value") }
|
60
|
+
end
|
61
|
+
|
62
|
+
module WnckWindowMoveResizeMask
|
63
|
+
%w{CHANGE_X CHANGE_Y CHANGE_WIDTH CHANGE_HEIGHT
|
64
|
+
}.inject(1) { |value,state| (eval "#{state} = value") << 1 }
|
65
|
+
end
|
66
|
+
|
67
|
+
# class WnckScreen
|
68
|
+
attach_function :wnck_screen_get_default, [], ptr
|
69
|
+
attach_function :wnck_screen_get, [int], ptr
|
70
|
+
attach_function :wnck_screen_get_for_root, [ul], ptr
|
71
|
+
attach_function :wnck_screen_get_number, [ptr], int
|
72
|
+
attach_function :wnck_screen_get_width, [ptr], int
|
73
|
+
attach_function :wnck_screen_get_height, [ptr], int
|
74
|
+
attach_function :wnck_screen_force_update, [ptr], void
|
75
|
+
attach_function :wnck_screen_get_window_manager_name, [ptr], str
|
76
|
+
attach_function :wnck_screen_net_wm_supports, [ptr, str], bool
|
77
|
+
attach_function :wnck_screen_get_active_window, [ptr], ptr
|
78
|
+
attach_function :wnck_screen_get_previously_active_window, [ptr], ptr
|
79
|
+
attach_function :wnck_screen_get_windows, [ptr], ptr
|
80
|
+
attach_function :wnck_screen_get_windows_stacked, [ptr], ptr
|
81
|
+
attach_function :wnck_screen_get_active_workspace, [ptr], ptr
|
82
|
+
attach_function :wnck_screen_get_workspaces, [ptr], ptr
|
83
|
+
attach_function :wnck_screen_get_workspace, [ptr, int], ptr
|
84
|
+
attach_function :wnck_screen_get_workspace_index, [ptr, ptr], int
|
85
|
+
attach_function :wnck_screen_get_workspace_neighbor, [ptr, ptr, int], int
|
86
|
+
attach_function :wnck_screen_toggle_showing_desktop, [ptr, bool], void
|
87
|
+
|
88
|
+
# class WnckWindow
|
89
|
+
attach_function :wnck_window_get, [ul], ptr
|
90
|
+
attach_function :wnck_window_get_screen, [ptr], ptr
|
91
|
+
attach_function :wnck_window_has_name, [ptr], bool
|
92
|
+
attach_function :wnck_window_get_name, [ptr], str
|
93
|
+
attach_function :wnck_window_has_icon_name, [ptr], bool
|
94
|
+
attach_function :wnck_window_get_icon_name, [ptr], str
|
95
|
+
attach_function :wnck_window_get_icon_is_fallback, [ptr], bool
|
96
|
+
attach_function :wnck_window_get_icon, [ptr], ptr
|
97
|
+
attach_function :wnck_window_get_mini_icon, [ptr], ptr
|
98
|
+
attach_function :wnck_window_get_application, [ptr], ptr
|
99
|
+
attach_function :wnck_window_get_transient, [ptr], ptr
|
100
|
+
attach_function :wnck_window_get_group_leader, [ptr], ul
|
101
|
+
attach_function :wnck_window_get_xid, [ptr], ul
|
102
|
+
attach_function :wnck_window_get_class_group, [ptr], ptr
|
103
|
+
attach_function :wnck_window_get_session_id, [ptr], str
|
104
|
+
attach_function :wnck_window_get_session_id_utf8, [ptr], str
|
105
|
+
attach_function :wnck_window_get_pid, [ptr], int
|
106
|
+
attach_function :wnck_window_get_sort_order, [ptr], int
|
107
|
+
attach_function :wnck_window_set_sort_order, [ptr, int], void
|
108
|
+
attach_function :wnck_window_get_window_type, [ptr], int
|
109
|
+
attach_function :wnck_window_set_window_type, [ptr, int], void
|
110
|
+
attach_function :wnck_window_get_state, [ptr], int
|
111
|
+
attach_function :wnck_window_is_minimized, [ptr], bool
|
112
|
+
attach_function :wnck_window_is_maximized_horizontally, [ptr], bool
|
113
|
+
attach_function :wnck_window_is_maximized_vertically, [ptr], bool
|
114
|
+
attach_function :wnck_window_is_maximized, [ptr], bool
|
115
|
+
attach_function :wnck_window_is_shaded, [ptr], bool
|
116
|
+
attach_function :wnck_window_is_pinned, [ptr], bool
|
117
|
+
attach_function :wnck_window_is_sticky, [ptr], bool
|
118
|
+
attach_function :wnck_window_is_above, [ptr], bool
|
119
|
+
attach_function :wnck_window_is_below, [ptr], bool
|
120
|
+
attach_function :wnck_window_is_skip_pager, [ptr], bool
|
121
|
+
attach_function :wnck_window_is_skip_tasklist, [ptr], bool
|
122
|
+
attach_function :wnck_window_is_fullscreen, [ptr], bool
|
123
|
+
attach_function :wnck_window_needs_attention, [ptr], bool
|
124
|
+
attach_function :wnck_window_or_transient_needs_attention, [ptr], bool
|
125
|
+
attach_function :wnck_window_minimize, [ptr], void
|
126
|
+
attach_function :wnck_window_get_actions, [ptr], int
|
127
|
+
attach_function :wnck_window_maximize_horizontally, [ptr], void
|
128
|
+
attach_function :wnck_window_unminimize, [ptr, uint], void
|
129
|
+
attach_function :wnck_window_unmaximize_horizontally, [ptr], void
|
130
|
+
attach_function :wnck_window_maximize_vertically, [ptr], void
|
131
|
+
attach_function :wnck_window_unmaximize_vertically, [ptr], void
|
132
|
+
attach_function :wnck_window_maximize, [ptr], void
|
133
|
+
attach_function :wnck_window_unmaximize, [ptr], void
|
134
|
+
attach_function :wnck_window_shade, [ptr], void
|
135
|
+
attach_function :wnck_window_unshade, [ptr], void
|
136
|
+
attach_function :wnck_window_pin, [ptr], void
|
137
|
+
attach_function :wnck_window_unpin, [ptr], void
|
138
|
+
attach_function :wnck_window_stick, [ptr], void
|
139
|
+
attach_function :wnck_window_unstick, [ptr], void
|
140
|
+
attach_function :wnck_window_make_above, [ptr], void
|
141
|
+
attach_function :wnck_window_unmake_above, [ptr], void
|
142
|
+
attach_function :wnck_window_make_below, [ptr], void
|
143
|
+
attach_function :wnck_window_unmake_below, [ptr], void
|
144
|
+
attach_function :wnck_window_set_skip_pager, [ptr, bool], void
|
145
|
+
attach_function :wnck_window_set_skip_tasklist, [ptr, bool], void
|
146
|
+
attach_function :wnck_window_set_fullscreen, [ptr, bool], void
|
147
|
+
attach_function :wnck_window_close, [ptr, u32], void
|
148
|
+
attach_function :wnck_window_get_workspace, [ptr], ptr
|
149
|
+
attach_function :wnck_window_is_on_workspace, [ptr, ptr], bool
|
150
|
+
|
151
|
+
attach_function :wnck_window_is_visible_on_workspace, [ptr, ptr], bool
|
152
|
+
attach_function :wnck_window_move_to_workspace, [ptr, ptr], void
|
153
|
+
attach_function :wnck_window_is_in_viewport, [ptr, ptr], bool
|
154
|
+
attach_function :wnck_window_activate, [ptr, u32], void
|
155
|
+
attach_function :wnck_window_is_active, [ptr], bool
|
156
|
+
attach_function :wnck_window_is_most_recently_activated, [ptr], bool
|
157
|
+
attach_function :wnck_window_activate_transient, [ptr, u32], void
|
158
|
+
attach_function :wnck_window_transient_is_most_recently_activated, [ptr], bool
|
159
|
+
attach_function :wnck_window_set_icon_geometry, [ptr, int, int, int, int], void
|
160
|
+
attach_function :wnck_window_get_client_window_geometry, [ptr, ptr, ptr, ptr, ptr], void
|
161
|
+
attach_function :wnck_window_get_geometry, [ptr, ptr, ptr, ptr, ptr], void
|
162
|
+
attach_function :wnck_window_set_geometry, [ptr, int, int, int, int, int, int], void
|
163
|
+
attach_function :wnck_window_keyboard_move, [ptr], void
|
164
|
+
attach_function :wnck_window_keyboard_size, [ptr], void
|
165
|
+
|
166
|
+
class Screen
|
167
|
+
def initialize(handle)
|
168
|
+
@handle = handle
|
169
|
+
Wnck::wnck_screen_force_update handle
|
170
|
+
end
|
171
|
+
|
172
|
+
def self.new(handle)
|
173
|
+
return get(handle) if handle.kind_of? Integer
|
174
|
+
return nil if handle.null?
|
175
|
+
super handle
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.default() Screen.new(Wnck::wnck_screen_get_default) end
|
179
|
+
def self.count() i = 0; i += 1 while get i; i end
|
180
|
+
def self.screens() (0 ... Screen.count).collect { |i| Screen.get(i) } end
|
181
|
+
def self.each(&b) screens.each &b end
|
182
|
+
def self.get(i)
|
183
|
+
h = Wnck::wnck_screen_get(i)
|
184
|
+
(h.null?) ? nil : Screen.new(h)
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
def self.add_accessor(method, native = "get_#{method}")
|
189
|
+
return method.each { |pair| add_accessor *pair } if method.kind_of? Hash
|
190
|
+
eval "define_method(method) { r = Wnck.send(:wnck_screen_#{native}, @handle); (yield self, r if block_given?) or r }"
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.add_accessors(*names, &b)
|
194
|
+
names.each do |n|
|
195
|
+
((n.kind_of?(Hash) and n.length > 1) ?
|
196
|
+
n.each { |pair| add_accessor *pair, &b } :
|
197
|
+
add_accessor(n, &b))
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
public
|
202
|
+
attr_reader :handle
|
203
|
+
|
204
|
+
def net_wm_supports?(atom) Wnck::wnck_screen_net_wm_supports(@handle, atom) end
|
205
|
+
|
206
|
+
add_accessors :width, :height, :number,
|
207
|
+
:force_update => 'force_update',
|
208
|
+
:name => 'get_window_manager_name',
|
209
|
+
:toggle_show_desktop => 'toggle_showing_desktop'
|
210
|
+
|
211
|
+
add_accessors(:active_window => 'get_active_window',
|
212
|
+
:previously_active_window => 'get_previously_active_window'
|
213
|
+
) { |s,handle| Window.new s, handle }
|
214
|
+
|
215
|
+
# def force_update() Wnck::wnck_screen_force_update(@handle) end
|
216
|
+
# def width() Wnck::wnck_screen_get_width(@handle) end
|
217
|
+
# def height() Wnck::wnck_screen_get_height(@handle) end
|
218
|
+
# def number() Wnck::wnck_screen_get_number(@handle) end
|
219
|
+
# def name() Wnck::wnck_screen_get_window_manager_name(@handle) end
|
220
|
+
# def active_window() Window.new(self, Wnck::wnck_screen_get_active_window(@handle)) end
|
221
|
+
# def previously_active_window() Window.new(self, Wnck::wnck_screen_get_previously_active_window(@handle)) end
|
222
|
+
# def toggle_show_desktop() Wnck::wnck_screen_toggle_showing_desktop(@handle) end
|
223
|
+
def workspace_at(index) Workspace.new Wnck::wnck_screen_get_workspace(@handle, index) end
|
224
|
+
def workspace_index(ws) Wnck::wnck_screen_get_workspace_index(@handle, ws.handle) end
|
225
|
+
|
226
|
+
{ :workspaces => proc { |s,d| Workspace.new s, d },
|
227
|
+
:windows => proc { |s,d| Window.new d },
|
228
|
+
}.each do |name, generator|
|
229
|
+
define_method(name) do
|
230
|
+
list = Wnck.send "wnck_screen_get_#{name}", @handle
|
231
|
+
items = []
|
232
|
+
|
233
|
+
GLib::g_list_length(list).times do |i|
|
234
|
+
items << (generator.call self, GLib::g_list_nth_data(list, i))
|
235
|
+
end
|
236
|
+
|
237
|
+
items
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
class Window
|
243
|
+
def initialize(handle)
|
244
|
+
screen = self.class.prepare_screen(Screen.new(Wnck::wnck_window_get_screen(handle)))
|
245
|
+
@screen = screen
|
246
|
+
@handle = handle
|
247
|
+
end
|
248
|
+
|
249
|
+
def self.new(handle)
|
250
|
+
return get(handle) if handle.kind_of? Integer
|
251
|
+
return nil if handle.null?
|
252
|
+
super handle
|
253
|
+
end
|
254
|
+
|
255
|
+
attr_reader :handle, :screen
|
256
|
+
|
257
|
+
private
|
258
|
+
def self.prepare_screen(scr) scr.kind_of?(Integer) ? Screen.get(scr) : scr end
|
259
|
+
|
260
|
+
public
|
261
|
+
def self.get(xid)
|
262
|
+
screen = prepare_screen(screen)
|
263
|
+
h = Wnck::wnck_window_get(xid)
|
264
|
+
return nil if h.null?
|
265
|
+
Window.new(h)
|
266
|
+
end
|
267
|
+
|
268
|
+
def maximize_horizontally() Wnck::wnck_window_maximize_horizontally(@handle) end
|
269
|
+
def unminimize() Wnck::wnck_window_unminimize(@handle) end
|
270
|
+
def unmaximize_horizontally() Wnck::wnck_window_unmaximize_horizontally(@handle) end
|
271
|
+
def maximize_vertically() Wnck::wnck_window_maximize_vertically(@handle) end
|
272
|
+
def unmaximize_vertically() Wnck::wnck_window_unmaximize_vertically(@handle) end
|
273
|
+
def maximize() Wnck::wnck_window_maximize(@handle) end
|
274
|
+
def unmaximize() Wnck::wnck_window_unmaximize(@handle) end
|
275
|
+
def shade() Wnck::wnck_window_shade(@handle) end
|
276
|
+
def unshade() Wnck::wnck_window_unshade(@handle) end
|
277
|
+
def pin() Wnck::wnck_window_pin(@handle) end
|
278
|
+
def unpin() Wnck::wnck_window_unpin(@handle) end
|
279
|
+
def stick() Wnck::wnck_window_stick(@handle) end
|
280
|
+
def unstick() Wnck::wnck_window_unstick(@handle) end
|
281
|
+
def make_above() Wnck::wnck_window_make_above(@handle) end
|
282
|
+
def unmake_above() Wnck::wnck_window_unmake_above(@handle) end
|
283
|
+
def unmake_below() Wnck::wnck_window_unmake_below(@handle) end
|
284
|
+
def make_below() Wnck::wnck_window_make_below(@handle) end
|
285
|
+
def close() Wnck::wnck_window_close(@handle) end
|
286
|
+
def minimize() Wnck::wnck_window_minimize(@handle) end
|
287
|
+
def maximize() Wnck::wnck_window_maximize(@handle) end
|
288
|
+
def unmaximize() Wnck::wnck_window_unmaximize(@handle) end
|
289
|
+
def unminimize(ts) Wnck::wnck_window_unminimize(@handle, ts) end
|
290
|
+
|
291
|
+
def actions() Wnck::wnck_window_get_actions(@handle) end
|
292
|
+
def name() Wnck::wnck_window_get_name(@handle) end
|
293
|
+
def icon_name() Wnck::wnck_window_get_name(@handle) end
|
294
|
+
def skip_pager=(v) Wnck::wnck_window_set_skip_pager(@handle, v) end
|
295
|
+
def skip_tasklist=(v) Wnck::wnck_window_set_skip_tasklist(@handle, v) end
|
296
|
+
def fullscreen=(v) Wnck::wnck_window_set_fullscreen(@handle, v) end
|
297
|
+
|
298
|
+
private
|
299
|
+
def self.add_accessor(name, custom_name = nil) # Add Window#method for Wnck::window_method()
|
300
|
+
custom_name = name unless name
|
301
|
+
define_method(custom_name) do
|
302
|
+
Wnck.send("wnck_window_#{name}", @handle)
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
def self.add_predicate(name) # Add Window#pred? for Wnck::window_is_pred()
|
307
|
+
name = name.to_s
|
308
|
+
add_accessor "is_#{name[0,name.length - 1]}", name
|
309
|
+
end
|
310
|
+
public
|
311
|
+
|
312
|
+
add_accessor :has_name, :has_name?
|
313
|
+
add_accessor :has_icon_name, :has_icon_name?
|
314
|
+
add_predicate :minimized?
|
315
|
+
add_predicate :maximized?
|
316
|
+
add_predicate :maximized_horizontally?
|
317
|
+
add_predicate :maximized_vertically?
|
318
|
+
add_predicate :shaded?
|
319
|
+
add_predicate :above?
|
320
|
+
add_predicate :pinned?
|
321
|
+
add_predicate :skip_pager?
|
322
|
+
add_predicate :skip_tasklist?
|
323
|
+
add_predicate :fullscreen?
|
324
|
+
add_predicate :sticky?
|
325
|
+
add_predicate :below?
|
326
|
+
end
|
327
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require ::File.dirname(__FILE__) + '/../lib/wnck.rb'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
# NOTE: Run these from an environment with DISPLAY set to a valid, listening X11 server!
|
5
|
+
|
6
|
+
describe Wnck do
|
7
|
+
def self.it_wraps(method, pred = {})
|
8
|
+
it "wraps #{method}" do
|
9
|
+
Wnck.should respond_to method
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it_wraps "wnck_screen_get_default"
|
14
|
+
it_wraps "wnck_screen_get"
|
15
|
+
it_wraps "wnck_screen_get_windows"
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Wnck::Screen do
|
19
|
+
it "can retrieve the default screen" do
|
20
|
+
screen = Wnck::Screen.default
|
21
|
+
screen.should be_a_kind_of Wnck::Screen
|
22
|
+
end
|
23
|
+
|
24
|
+
it "knows how many screens there are" do
|
25
|
+
Wnck::Screen.count.should be_a Numeric
|
26
|
+
end
|
27
|
+
|
28
|
+
it "gives a realistic number for screen count" do
|
29
|
+
Wnck::Screen.count.should > 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can retrieve screens by index" do
|
33
|
+
Wnck::Screen.count.times { |i| Wnck::Screen.get(i).should be_a Wnck::Screen }
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe Wnck::Screen do
|
39
|
+
before(:each) do
|
40
|
+
@screen = Wnck::Screen.default
|
41
|
+
end
|
42
|
+
|
43
|
+
it "knows its own height" do
|
44
|
+
@screen.height.should be_a_kind_of Numeric
|
45
|
+
end
|
46
|
+
|
47
|
+
it "knows its own width" do
|
48
|
+
@screen.width.should be_a_kind_of Numeric
|
49
|
+
end
|
50
|
+
|
51
|
+
it "knows the name given to it by the window manager" do
|
52
|
+
@screen.name
|
53
|
+
end
|
54
|
+
|
55
|
+
it "gives a reasonable width for the default screen" do
|
56
|
+
@screen.width.should >= 320
|
57
|
+
@screen.width.should < 250000
|
58
|
+
end
|
59
|
+
|
60
|
+
it "gives a reasonable height for the default screen" do
|
61
|
+
@screen.height.should >= 240
|
62
|
+
@screen.height.should < 250000
|
63
|
+
end
|
64
|
+
|
65
|
+
it "provides toggle_show_desktop" do
|
66
|
+
@screen.should respond_to :toggle_show_desktop
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can provide the active window" do
|
70
|
+
@screen.should respond_to :active_window
|
71
|
+
@screen.active_window
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can provide the previously active window" do
|
75
|
+
@screen.should respond_to :previously_active_window
|
76
|
+
@screen.previously_active_window
|
77
|
+
end
|
78
|
+
|
79
|
+
it "can list its windows" do
|
80
|
+
windows = @screen.windows
|
81
|
+
windows.should be_true
|
82
|
+
windows.should respond_to :each
|
83
|
+
end
|
84
|
+
|
85
|
+
it "gives a realistic number of total windows amongst all screens" do
|
86
|
+
total = 0
|
87
|
+
Wnck::Screen.count.times { |i| total += Wnck::Screen.get(i).windows.length }
|
88
|
+
total.should > 1
|
89
|
+
end
|
90
|
+
|
91
|
+
it "can query the window manager for supported features" do
|
92
|
+
@screen.should respond_to :net_wm_supports?
|
93
|
+
@screen.net_wm_supports? "_NET_WM_STATE_STICKY"
|
94
|
+
end
|
95
|
+
|
96
|
+
it "can force the list of windows to be updated." do
|
97
|
+
@screen.should respond_to :force_update
|
98
|
+
@screen.force_update
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require ::File.dirname(__FILE__) + '/../lib/wnck.rb'
|
2
|
+
|
3
|
+
describe Wnck::Window do
|
4
|
+
before(:all) do
|
5
|
+
Gtk.init
|
6
|
+
gw = Gtk::Window.new
|
7
|
+
gw.title = "WnckTestWindow"
|
8
|
+
gw.realize
|
9
|
+
gw.present
|
10
|
+
|
11
|
+
10.times { Gtk.main_iteration; Wnck::Screen.default.force_update; sleep 1 }
|
12
|
+
@window = Wnck::Window.new(gw.window.xid)
|
13
|
+
|
14
|
+
raise Exception.new "Could not find test window!" unless @window
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.it_has_predicate(p)
|
18
|
+
it "knows if it's #{p.to_s.gsub('_', ' ')}" do
|
19
|
+
@window.should respond_to p
|
20
|
+
@window.send p
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it_has_predicate :minimized?
|
25
|
+
it_has_predicate :maximized?
|
26
|
+
it_has_predicate :maximized_horizontally?
|
27
|
+
it_has_predicate :maximized_vertically?
|
28
|
+
it_has_predicate :shaded?
|
29
|
+
it_has_predicate :above?
|
30
|
+
it_has_predicate :pinned?
|
31
|
+
it_has_predicate :skip_pager?
|
32
|
+
it_has_predicate :skip_tasklist?
|
33
|
+
it_has_predicate :fullscreen?
|
34
|
+
it_has_predicate :sticky?
|
35
|
+
it_has_predicate :below?
|
36
|
+
it_has_predicate :has_name?
|
37
|
+
it_has_predicate :has_icon_name?
|
38
|
+
|
39
|
+
it "can horizontally maximize itself" do
|
40
|
+
@window.should respond_to :maximize_horizontally
|
41
|
+
@window.maximize_horizontally
|
42
|
+
end
|
43
|
+
|
44
|
+
it "can unminimize itself" do
|
45
|
+
@window.should respond_to :unminimize
|
46
|
+
@window.unminimize Gtk.current_event_time
|
47
|
+
end
|
48
|
+
|
49
|
+
it "can horizontally unmaximize itself" do
|
50
|
+
@window.should respond_to :unmaximize_horizontally
|
51
|
+
@window.unmaximize_horizontally
|
52
|
+
end
|
53
|
+
|
54
|
+
it "can vertically maximize itself" do
|
55
|
+
@window.should respond_to :maximize_vertically
|
56
|
+
@window.maximize_vertically
|
57
|
+
end
|
58
|
+
|
59
|
+
it "can vertically unmaximize itself" do
|
60
|
+
@window.should respond_to :unmaximize_vertically
|
61
|
+
@window.unmaximize_vertically
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can maximize itself" do
|
65
|
+
@window.should respond_to :maximize
|
66
|
+
@window.maximize
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can unmaximize itself" do
|
70
|
+
@window.should respond_to :unmaximize
|
71
|
+
@window.unmaximize
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can shade itself" do
|
75
|
+
@window.should respond_to :shade
|
76
|
+
@window.shade
|
77
|
+
end
|
78
|
+
|
79
|
+
it "can unshade itself" do
|
80
|
+
@window.should respond_to :unshade
|
81
|
+
@window.unshade
|
82
|
+
end
|
83
|
+
|
84
|
+
it "can pin itself" do
|
85
|
+
@window.should respond_to :pin
|
86
|
+
@window.pin
|
87
|
+
end
|
88
|
+
|
89
|
+
it "can unpin itself" do
|
90
|
+
@window.should respond_to :unpin
|
91
|
+
@window.unpin
|
92
|
+
end
|
93
|
+
|
94
|
+
it "can stick itself" do
|
95
|
+
@window.should respond_to :stick
|
96
|
+
@window.stick
|
97
|
+
end
|
98
|
+
|
99
|
+
it "can unstick itself" do
|
100
|
+
@window.should respond_to :unstick
|
101
|
+
@window.unstick
|
102
|
+
end
|
103
|
+
|
104
|
+
it "can put itself above other windows" do
|
105
|
+
@window.should respond_to :make_above
|
106
|
+
@window.make_above
|
107
|
+
end
|
108
|
+
|
109
|
+
it "can stop itself from being above other windows" do
|
110
|
+
@window.should respond_to :unmake_above
|
111
|
+
@window.unmake_above
|
112
|
+
end
|
113
|
+
|
114
|
+
it "can stop itself from being below other windows" do
|
115
|
+
@window.should respond_to :unmake_below
|
116
|
+
@window.unmake_below
|
117
|
+
end
|
118
|
+
|
119
|
+
it "can put itself below other windows" do
|
120
|
+
@window.should respond_to :make_below
|
121
|
+
@window.make_below
|
122
|
+
end
|
123
|
+
|
124
|
+
it "can close itself" do
|
125
|
+
@window.should respond_to :close
|
126
|
+
#@window.close # this really doesn't seem like a nice thing to do to testers...
|
127
|
+
end
|
128
|
+
|
129
|
+
it "can minimize itself" do
|
130
|
+
@window.should respond_to :minimize
|
131
|
+
@window.minimize
|
132
|
+
end
|
133
|
+
|
134
|
+
it "can maximize itself" do
|
135
|
+
@window.should respond_to :maximize
|
136
|
+
@window.maximize
|
137
|
+
end
|
138
|
+
|
139
|
+
it "can unmaximize itself" do
|
140
|
+
@window.should respond_to :unmaximize
|
141
|
+
@window.unmaximize
|
142
|
+
end
|
143
|
+
|
144
|
+
it "can minimize itself" do
|
145
|
+
@window.should respond_to :minimize
|
146
|
+
@window.minimize
|
147
|
+
end
|
148
|
+
|
149
|
+
it "knows its icon name" do
|
150
|
+
@window.should respond_to :icon_name
|
151
|
+
@window.icon_name.should be_an_instance_of String
|
152
|
+
end
|
153
|
+
|
154
|
+
it "knows its name" do
|
155
|
+
@window.should respond_to :name
|
156
|
+
@window.name.should be_an_instance_of String
|
157
|
+
end
|
158
|
+
|
159
|
+
it "can maximize and unmaximize a window" do
|
160
|
+
@window.should respond_to :maximize
|
161
|
+
@window.should respond_to :unmaximize
|
162
|
+
if @window.maximized? # Might as well try not to screw up the tester's desktop too badly :-)
|
163
|
+
@window.unmaximize
|
164
|
+
@window.maximize
|
165
|
+
else
|
166
|
+
@window.maximize
|
167
|
+
@window.unmaximize
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
data/wnck.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{wnck}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["William Lahti"]
|
9
|
+
s.cert_chain = ["/home/liam/.gemcert/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2010-11-02}
|
11
|
+
s.description = %q{Use the GNOME Window Navigator Construction Kit from Ruby}
|
12
|
+
s.email = %q{wilahti@gmail.com}
|
13
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/wnck.rb"]
|
14
|
+
s.files = ["README.rdoc", "Rakefile", "lib/wnck.rb", "spec/wnck_screen_spec.rb", "spec/wnck_window_spec.rb", "Manifest", "wnck.gemspec"]
|
15
|
+
s.homepage = %q{http://github.com/rezonant/wnck}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Wnck", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{wnck}
|
19
|
+
s.rubygems_version = %q{1.3.5}
|
20
|
+
s.signing_key = %q{/home/liam/.gemcert/gem-private_key.pem}
|
21
|
+
s.summary = %q{Use the GNOME Window Navigator Construction Kit from Ruby}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<gtk2>, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<ffi>, [">= 0"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<gtk2>, [">= 0"])
|
32
|
+
s.add_dependency(%q<ffi>, [">= 0"])
|
33
|
+
end
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<gtk2>, [">= 0"])
|
36
|
+
s.add_dependency(%q<ffi>, [">= 0"])
|
37
|
+
end
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wnck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- William Lahti
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain:
|
17
|
+
- |
|
18
|
+
-----BEGIN CERTIFICATE-----
|
19
|
+
MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MRAwDgYDVQQDDAd3aWxh
|
20
|
+
aHRpMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
21
|
+
HhcNMTAxMTAxMTQ0MzQ5WhcNMTExMTAxMTQ0MzQ5WjA+MRAwDgYDVQQDDAd3aWxh
|
22
|
+
aHRpMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
23
|
+
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVnqmTO3Nluq+BOeFWZivA
|
24
|
+
B6nEQD9IR8uuAAib1s16fmxpxh72kyvvriqeMUcr+d3efY/lMQKEzq4s/4gbYVkX
|
25
|
+
y/ijfsXuYo4O3gIP/Jz8sjZ0U1X9OR5QsT8piCDjWtvAVbHZcwtQ4JJkBcGCbeHG
|
26
|
+
jb9YllCyYpyoLTPe/PsRiyep+O4niZu22e9StWqR94DqBe2WT7BHIM5yGWL5yn2F
|
27
|
+
d/tly9IG3UjZsTfmm//E5/j1o65JPnVzvPIsXKtrlSagQhYc7inS5h3lpPybZCOW
|
28
|
+
4ynsCpSwZuFTWKXLpImJB8+cYJnkpCAByLZlV2Gg3VXNY0K2IVxot4pK2emgn7IR
|
29
|
+
AgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBRLrs/u
|
30
|
+
JL88+1zz4lVD9fTBYjrmmTANBgkqhkiG9w0BAQUFAAOCAQEAPgvQyOGqq+4Lw7wR
|
31
|
+
XCoYp5MwjEmjv+2lmYEvrLwkzzQYcR2IPKFVn2wxK2Oh/RY1MbH4+b9qZh90hwfp
|
32
|
+
Jrr01B4C4IK/WirWWjlfu3Cfe0SGWRNn4BDjfBPC6/cA0AqT6AUBXNXPDvxL/Jua
|
33
|
+
hYOr19fk7sVbqPErUDE4uOUu7U3cH4xXipD47ZqlAnd1/uuSd8HQJUpdo451bo4Z
|
34
|
+
iaE1u3oCobV/iRFncxRGWBTjxyzXif+SXm9YOHaq6XxyFIu+uhNojKzeqBA9TdmM
|
35
|
+
z+kqh3j5Vvja8aeb1n8eRFf92wc8Pyt0oNKtIpM21d6z8RxlC2JpdpTWCWHlVu28
|
36
|
+
uUq8NQ==
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
|
39
|
+
date: 2010-11-02 00:00:00 -04:00
|
40
|
+
default_executable:
|
41
|
+
dependencies:
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: gtk2
|
44
|
+
prerelease: false
|
45
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
hash: 3
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id001
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: ffi
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 3
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
type: :runtime
|
69
|
+
version_requirements: *id002
|
70
|
+
description: Use the GNOME Window Navigator Construction Kit from Ruby
|
71
|
+
email: wilahti@gmail.com
|
72
|
+
executables: []
|
73
|
+
|
74
|
+
extensions: []
|
75
|
+
|
76
|
+
extra_rdoc_files:
|
77
|
+
- README.rdoc
|
78
|
+
- lib/wnck.rb
|
79
|
+
files:
|
80
|
+
- README.rdoc
|
81
|
+
- Rakefile
|
82
|
+
- lib/wnck.rb
|
83
|
+
- spec/wnck_screen_spec.rb
|
84
|
+
- spec/wnck_window_spec.rb
|
85
|
+
- Manifest
|
86
|
+
- wnck.gemspec
|
87
|
+
has_rdoc: true
|
88
|
+
homepage: http://github.com/rezonant/wnck
|
89
|
+
licenses: []
|
90
|
+
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options:
|
93
|
+
- --line-numbers
|
94
|
+
- --inline-source
|
95
|
+
- --title
|
96
|
+
- Wnck
|
97
|
+
- --main
|
98
|
+
- README.rdoc
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
107
|
+
segments:
|
108
|
+
- 0
|
109
|
+
version: "0"
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 11
|
116
|
+
segments:
|
117
|
+
- 1
|
118
|
+
- 2
|
119
|
+
version: "1.2"
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project: wnck
|
123
|
+
rubygems_version: 1.3.7
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: Use the GNOME Window Navigator Construction Kit from Ruby
|
127
|
+
test_files: []
|
128
|
+
|
metadata.gz.sig
ADDED
Binary file
|