ruby-wmctrl 0.0.2 → 0.0.3

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.
@@ -52,7 +52,8 @@ static Window get_target_window (Display *disp, VALUE obj);
52
52
 
53
53
  static VALUE rb_wmctrl_class, key_id, key_title, key_pid, key_geometry,
54
54
  key_active, key_class, key_client_machine, key_desktop,
55
- key_viewport, key_workarea, key_current, key_showing_desktop, key_name;
55
+ key_viewport, key_workarea, key_current, key_showing_desktop, key_name,
56
+ key_state, key_frame_extents, key_strut;
56
57
 
57
58
  static ID id_select, id_active, id_activate, id_close, id_move_resize,
58
59
  id_change_state, id_move_to_desktop, id_move_to_current,
@@ -235,17 +236,25 @@ static gchar *get_window_title (Display *disp, Window win)
235
236
  return title_utf8;
236
237
  }
237
238
 
238
- /* Get list of information of windows. */
239
- static VALUE rb_wmctrl_list_windows (VALUE self) {
239
+ /*
240
+ call-seq:
241
+ wm.list_windows(get_state = nil)
242
+
243
+ Get list of information of windows.
244
+ @param get_state [Boolean] If the value is true then we get some properties at the same time
245
+ */
246
+ static VALUE rb_wmctrl_list_windows (int argc, VALUE *argv, VALUE self) {
240
247
  Display **ptr, *disp;
241
248
  Window *client_list;
242
249
  Window window_active;
243
250
  unsigned long client_list_size;
244
251
  unsigned int i;
245
- VALUE window_ary;
246
-
252
+ int get_state;
253
+ VALUE get_state_obj, window_ary;
247
254
  Data_Get_Struct(self, Display*, ptr);
248
255
  disp = *ptr;
256
+ rb_scan_args(argc, argv, "01", &get_state_obj);
257
+ get_state = RTEST(get_state_obj);
249
258
 
250
259
  if ((client_list = get_client_list(disp, &client_list_size)) == NULL) {
251
260
  /* return EXIT_FAILURE; */
@@ -260,14 +269,8 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
260
269
  gchar *title_utf8 = get_window_title(disp, client_list[i]); /* UTF8 */
261
270
  gchar *client_machine;
262
271
  gchar *class_out = get_window_class(disp, client_list[i]); /* UTF8 */
263
- unsigned long *pid;
264
272
  unsigned long *desktop;
265
- int x, y, junkx, junky;
266
- unsigned int wwidth, wheight, bw, depth;
267
- Window junkroot;
268
273
 
269
- /* Use strings of hexadecimal number? At the present we use simply integers. */
270
- /* printf("0x%.8lx", client_list[i]); */
271
274
  rb_hash_aset(window_obj, key_id, INT2NUM(client_list[i]));
272
275
  rb_hash_aset(window_obj, key_title, (title_utf8 ? RB_UTF8_STRING_NEW2(title_utf8) : Qnil));
273
276
  rb_hash_aset(window_obj, key_class, (class_out ? RB_UTF8_STRING_NEW2(class_out) : Qnil));
@@ -291,16 +294,79 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
291
294
  client_machine = get_property(disp, client_list[i], XA_STRING, "WM_CLIENT_MACHINE", NULL);
292
295
  rb_hash_aset(window_obj, key_client_machine, (client_machine ? RB_UTF8_STRING_NEW2(client_machine) : Qnil));
293
296
 
294
- /* pid */
295
- pid = (unsigned long *)get_property(disp, client_list[i], XA_CARDINAL, "_NET_WM_PID", NULL);
296
- rb_hash_aset(window_obj, key_pid, (pid ? ULONG2NUM(*pid) : Qnil));
297
-
298
- /* geometry */
299
- XGetGeometry (disp, client_list[i], &junkroot, &junkx, &junky, &wwidth, &wheight, &bw, &depth);
300
- XTranslateCoordinates (disp, client_list[i], junkroot, junkx, junky, &x, &y, &junkroot);
297
+ if (get_state) {
298
+ unsigned long *pid;
299
+ int x, y, junkx, junky;
300
+ unsigned long j;
301
+ unsigned int wwidth, wheight, bw, depth;
302
+ Window junkroot;
303
+ unsigned long state_size;
304
+ Atom *window_state;
305
+ gchar *state_name;
306
+ VALUE state_ary;
307
+ Atom *extents;
308
+ unsigned long extents_size;
309
+ VALUE extents_ary;
310
+ Atom *strut;
311
+ unsigned long strut_size;
312
+ VALUE strut_ary;
313
+
314
+ /* pid */
315
+ pid = (unsigned long *)get_property(disp, client_list[i], XA_CARDINAL, "_NET_WM_PID", NULL);
316
+ rb_hash_aset(window_obj, key_pid, (pid ? ULONG2NUM(*pid) : Qnil));
317
+ g_free(pid);
318
+
319
+ /* geometry */
320
+ XGetGeometry (disp, client_list[i], &junkroot, &junkx, &junky, &wwidth, &wheight, &bw, &depth);
321
+ XTranslateCoordinates (disp, client_list[i], junkroot, junkx, junky, &x, &y, &junkroot);
322
+
323
+ rb_hash_aset(window_obj, key_geometry,
324
+ rb_ary_new3(4, INT2NUM(x), INT2NUM(y), INT2NUM(wwidth), INT2NUM(wheight)));
325
+
326
+ /* state */
327
+ if ((window_state = (Atom *)get_property(disp, client_list[i],
328
+ XA_ATOM, "_NET_WM_STATE", &state_size)) != NULL) {
329
+ state_ary = rb_ary_new();
330
+ for (j = 0; j < state_size / sizeof(Atom); j++) {
331
+ state_name = XGetAtomName(disp, window_state[j]);
332
+ rb_ary_push(state_ary, rb_str_new2(state_name));
333
+ g_free(state_name);
334
+ }
335
+ g_free(window_state);
336
+ } else {
337
+ state_ary = Qnil;
338
+ }
339
+ rb_hash_aset(window_obj, key_state, state_ary);
340
+
341
+ /* frame extents */
342
+ if ((extents = (unsigned long *)get_property(disp, client_list[i],
343
+ XA_CARDINAL, "_NET_FRAME_EXTENTS", &extents_size)) != NULL) {
344
+ extents_ary = rb_ary_new();
345
+ for (j = 0; j < extents_size / sizeof(unsigned long); j++) {
346
+ rb_ary_push(extents_ary, ULONG2NUM(extents[j]));
347
+ }
348
+ g_free(extents);
349
+ } else {
350
+ extents_ary = Qnil;
351
+ }
352
+ rb_hash_aset(window_obj, key_frame_extents, extents_ary);
301
353
 
302
- rb_hash_aset(window_obj, key_geometry,
303
- rb_ary_new3(4, INT2NUM(x), INT2NUM(y), INT2NUM(wwidth), INT2NUM(wheight)));
354
+ /* strut partial or strut */
355
+ if ((strut = (unsigned long *)get_property(disp, client_list[i],
356
+ XA_CARDINAL, "_NET_WM_STRUT_PARTIAL", &strut_size)) == NULL) {
357
+ strut = (unsigned long *)get_property(disp, client_list[i], XA_CARDINAL, "_NET_WM_STRUT", &strut_size);
358
+ }
359
+ if (strut) {
360
+ strut_ary = rb_ary_new();
361
+ for (j = 0; j < strut_size / sizeof(unsigned long); j++) {
362
+ rb_ary_push(strut_ary, ULONG2NUM(strut[j]));
363
+ }
364
+ g_free(strut);
365
+ } else {
366
+ strut_ary = Qnil;
367
+ }
368
+ rb_hash_aset(window_obj, key_strut, strut_ary);
369
+ }
304
370
 
305
371
  rb_ary_push(window_ary, window_obj);
306
372
 
@@ -308,7 +374,6 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
308
374
  g_free(desktop);
309
375
  g_free(client_machine);
310
376
  g_free(class_out);
311
- g_free(pid);
312
377
  }
313
378
  g_free(client_list);
314
379
 
@@ -1097,16 +1162,24 @@ static Window get_target_window (Display *disp, VALUE obj)
1097
1162
 
1098
1163
  /*
1099
1164
  call-seq:
1100
- wm.action_window(wid, :close)
1101
- wm.action_window(wid, :move_resize, grav, x, y, w, h)
1102
- wm.action_window(wid, :change_state, add, prop1, prop2 = nil)
1103
- wm.action_window(wid, :change_state, remove, prop1, prop2 = nil)
1104
- wm.action_window(wid, :change_state, toggle, prop1, prop2 = nil)
1105
- wm.action_window(wid, :move_to_desktop, desktop_id)
1106
- wm.action_window(wid, :move_to_current)
1107
- wm.action_window(wid, :set_title_long, str)
1108
- wm.action_window(wid, :set_title_short, str)
1109
- wm.action_window(wid, :set_title_both, str)
1165
+ wm.action_window(wid, cmd, *args)
1166
+
1167
+ Manage windows.
1168
+ @param wid Window ID
1169
+ @param cmd [Symbol] Symbol of command
1170
+ @param args [Array] Arguments for the command
1171
+
1172
+ @example
1173
+ wm.action_window(wid, :close)
1174
+ wm.action_window(wid, :move_resize, grav, x, y, w, h)
1175
+ wm.action_window(wid, :change_state, add, prop1, prop2 = nil)
1176
+ wm.action_window(wid, :change_state, remove, prop1, prop2 = nil)
1177
+ wm.action_window(wid, :change_state, toggle, prop1, prop2 = nil)
1178
+ wm.action_window(wid, :move_to_desktop, desktop_id)
1179
+ wm.action_window(wid, :move_to_current)
1180
+ wm.action_window(wid, :set_title_long, str)
1181
+ wm.action_window(wid, :set_title_short, str)
1182
+ wm.action_window(wid, :set_title_both, str)
1110
1183
  */
1111
1184
  static VALUE rb_wmctrl_action_window(int argc, VALUE *argv, VALUE self) {
1112
1185
  Window wid;
@@ -1148,6 +1221,32 @@ static VALUE rb_wmctrl_action_window(int argc, VALUE *argv, VALUE self) {
1148
1221
  }
1149
1222
  }
1150
1223
 
1224
+ static VALUE rb_wmctrl_supported (VALUE self)
1225
+ {
1226
+ Atom *list;
1227
+ unsigned long size;
1228
+ unsigned int i;
1229
+ gchar *prop_name;
1230
+ VALUE ret;
1231
+ Display **ptr, *disp;
1232
+ Data_Get_Struct(self, Display*, ptr);
1233
+ disp = *ptr;
1234
+
1235
+
1236
+ if (!(list = (Atom *)get_property(disp, DefaultRootWindow(disp), XA_ATOM, "_NET_SUPPORTED", &size))) {
1237
+ rb_raise(rb_eStandardError, "Cannot get _NET_SUPPORTED property.");
1238
+ }
1239
+
1240
+ ret = rb_ary_new();
1241
+ for (i = 0; i < size / sizeof(Atom); i++) {
1242
+ prop_name = XGetAtomName(disp, list[i]);
1243
+ rb_ary_push(ret, rb_str_new2(prop_name));
1244
+ g_free(prop_name);
1245
+ }
1246
+ g_free(list);
1247
+ return ret;
1248
+ }
1249
+
1151
1250
  void Init_wmctrl()
1152
1251
  {
1153
1252
  rb_wmctrl_class = rb_define_class("WMCtrl", rb_cObject);
@@ -1155,7 +1254,7 @@ void Init_wmctrl()
1155
1254
  rb_define_alloc_func(rb_wmctrl_class, rb_wmctrl_alloc);
1156
1255
  rb_define_private_method(rb_wmctrl_class, "initialize", rb_wmctrl_initialize, -1);
1157
1256
 
1158
- rb_define_method(rb_wmctrl_class, "list_windows", rb_wmctrl_list_windows, 0);
1257
+ rb_define_method(rb_wmctrl_class, "list_windows", rb_wmctrl_list_windows, -1);
1159
1258
  rb_define_method(rb_wmctrl_class, "list_desktops", rb_wmctrl_list_desktops, 0);
1160
1259
  rb_define_method(rb_wmctrl_class, "switch_desktop", rb_wmctrl_switch_desktop, 1);
1161
1260
  rb_define_method(rb_wmctrl_class, "info", rb_wmctrl_info, 0);
@@ -1164,6 +1263,7 @@ void Init_wmctrl()
1164
1263
  rb_define_method(rb_wmctrl_class, "change_geometry", rb_wmctrl_change_geometry, 0);
1165
1264
  rb_define_method(rb_wmctrl_class, "change_number_of_desktops", rb_wmctrl_change_number_of_desktops, 1);
1166
1265
  rb_define_method(rb_wmctrl_class, "action_window", rb_wmctrl_action_window, -1);
1266
+ rb_define_method(rb_wmctrl_class, "supported", rb_wmctrl_supported, 0);
1167
1267
 
1168
1268
  key_id = ID2SYM(rb_intern("id"));
1169
1269
  key_title = ID2SYM(rb_intern("title"));
@@ -1178,6 +1278,9 @@ void Init_wmctrl()
1178
1278
  key_current = ID2SYM(rb_intern("current"));
1179
1279
  key_showing_desktop = ID2SYM(rb_intern("showing_desktop"));
1180
1280
  key_name = ID2SYM(rb_intern("name"));
1281
+ key_state = ID2SYM(rb_intern("state"));
1282
+ key_frame_extents = ID2SYM(rb_intern("frame_extents"));
1283
+ key_strut = ID2SYM(rb_intern("strut"));
1181
1284
 
1182
1285
  id_active = rb_intern("active");
1183
1286
  id_select = rb_intern("select");
@@ -1,3 +1,3 @@
1
1
  class WMCtrl
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -4,3 +4,7 @@ require 'pp'
4
4
 
5
5
  wm = WMCtrl.new
6
6
  pp wm.list_windows
7
+
8
+ puts "---"
9
+
10
+ pp wm.list_windows(true)
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
2
+ require 'wmctrl'
3
+ require 'pp'
4
+
5
+ wm = WMCtrl.new
6
+ pp wm.supported.sort
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-wmctrl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-17 00:00:00.000000000 Z
12
+ date: 2011-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &11195400 !ruby/object:Gem::Requirement
16
+ requirement: &9960620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *11195400
24
+ version_requirements: *9960620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: yard
27
- requirement: &11194980 !ruby/object:Gem::Requirement
27
+ requirement: &9960120 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *11194980
35
+ version_requirements: *9960120
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pkg-config
38
- requirement: &11194560 !ruby/object:Gem::Requirement
38
+ requirement: &9959580 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *11194560
46
+ version_requirements: *9959580
47
47
  description: Ruby bindings to control windows in EWMH and NetWM compatible X Window
48
48
  manager, which is created from source code of wmctrl command.
49
49
  email:
@@ -76,6 +76,7 @@ files:
76
76
  - sample/move_to_desktop.rb
77
77
  - sample/set_title.rb
78
78
  - sample/showing_desktop.rb
79
+ - sample/supported.rb
79
80
  - sample/switch_desktop.rb
80
81
  homepage: ''
81
82
  licenses: []