ruby-wmctrl 0.0.1 → 0.0.2

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/.gitignore CHANGED
@@ -7,3 +7,5 @@ ext/*.so
7
7
  ext/*.o
8
8
  ext/Makefile
9
9
  ext/mkmf.log
10
+ doc
11
+ .yardoc
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ -m
2
+ markdown
3
+ lib/**/*.rb
4
+ ext/**/*.c
5
+ -
6
+ COPYING
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # ruby-wmctrl
2
+
3
+ Ruby bindings to control windows in EWMH and NetWM compatible X Window manager.
4
+
5
+ - <http://rubygems.org/gems/ruby-wmctrl>
6
+ - <https://github.com/ytaka/ruby-wmctrl>
7
+
8
+ ## Compilation
9
+
10
+ ruby-wmctrl is a C extended library, which uses glib and x11.
11
+ For ubuntu 11.04, we should install packages.
12
+
13
+ apt-get install libx11-dev libglib2.0-dev
14
+
15
+ ## License
16
+
17
+ GPLv2
18
+
19
+ ## Copyright
20
+
21
+ ### wmctrl
22
+
23
+ ruby-wmctrl is created from source code of wmctrl <http://sweb.cz/tripie/utils/wmctrl/>.
24
+
25
+ The copyright of originl wmctrl:
26
+
27
+ Author, current maintainer: Tomas Styblo tripie@cpan.org
28
+ Copyright (C) 2003
29
+
30
+ ### ruby-wmctrl
31
+
32
+ Takayuki YAMAGUCHI d@ytak.info Copyright (C) 2011
data/Rakefile CHANGED
@@ -1 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'yard'
4
+ YARD::Rake::YardocTask.new
data/ext/wmctrl.c CHANGED
@@ -26,8 +26,32 @@
26
26
 
27
27
  #define envir_utf8 TRUE
28
28
 
29
+ static int client_msg(Display *disp, Window win, const char *msg,
30
+ unsigned long data0, unsigned long data1,
31
+ unsigned long data2, unsigned long data3,
32
+ unsigned long data4);
33
+ static gchar *get_property (Display *disp, Window win,
34
+ Atom xa_prop_type, const gchar *prop_name, unsigned long *size);
35
+ static Window *get_client_list (Display *disp, unsigned long *size);
36
+ static gchar *get_window_class (Display *disp, Window win);
37
+ static gchar *get_window_title (Display *disp, Window win);
38
+ static int activate_window (Display *disp, Window win, gboolean switch_desktop);
39
+ static int close_window (Display *disp, Window win);
40
+ static gboolean wm_supports (Display *disp, const gchar *prop);
41
+ static int window_move_resize (Display *disp, Window win, signed long grav,
42
+ signed long x, signed long y, signed long w, signed long h);
43
+ static int window_state (Display *disp, Window win,
44
+ const char *action_str, const char *prop1_str, const char *prop2_str);
45
+ static int window_to_desktop (Display *disp, Window win, int desktop);
46
+ static void window_set_title (Display *disp, Window win, char *title, char mode);
47
+ static int action_window (Display *disp, Window win, char mode, int argc, VALUE *argv);
48
+ static Window Select_Window(Display *dpy);
49
+ static Window get_active_window(Display *disp);
50
+ static Window get_target_window (Display *disp, VALUE obj);
51
+
52
+
29
53
  static VALUE rb_wmctrl_class, key_id, key_title, key_pid, key_geometry,
30
- key_class, key_client_machine, key_desktop,
54
+ key_active, key_class, key_client_machine, key_desktop,
31
55
  key_viewport, key_workarea, key_current, key_showing_desktop, key_name;
32
56
 
33
57
  static ID id_select, id_active, id_activate, id_close, id_move_resize,
@@ -59,7 +83,8 @@ static VALUE rb_wmctrl_initialize(int argc, VALUE *argv, VALUE self)
59
83
  static int client_msg(Display *disp, Window win, const char *msg,
60
84
  unsigned long data0, unsigned long data1,
61
85
  unsigned long data2, unsigned long data3,
62
- unsigned long data4) {
86
+ unsigned long data4)
87
+ {
63
88
  XEvent event;
64
89
  long mask = SubstructureRedirectMask | SubstructureNotifyMask;
65
90
 
@@ -84,7 +109,8 @@ static int client_msg(Display *disp, Window win, const char *msg,
84
109
 
85
110
  /* Copy from debian package for 64bit support. */
86
111
  static gchar *get_property (Display *disp, Window win,
87
- Atom xa_prop_type, const gchar *prop_name, unsigned long *size) {
112
+ Atom xa_prop_type, const gchar *prop_name, unsigned long *size)
113
+ {
88
114
  Atom xa_prop_name;
89
115
  Atom xa_ret_type;
90
116
  int ret_format;
@@ -140,7 +166,8 @@ static gchar *get_property (Display *disp, Window win,
140
166
  return ret;
141
167
  }
142
168
 
143
- static Window *get_client_list (Display *disp, unsigned long *size) {
169
+ static Window *get_client_list (Display *disp, unsigned long *size)
170
+ {
144
171
  Window *client_list;
145
172
 
146
173
  if ((client_list = (Window *)get_property(disp, DefaultRootWindow(disp),
@@ -157,7 +184,8 @@ static Window *get_client_list (Display *disp, unsigned long *size) {
157
184
  return client_list;
158
185
  }
159
186
 
160
- static gchar *get_window_class (Display *disp, Window win) {
187
+ static gchar *get_window_class (Display *disp, Window win)
188
+ {
161
189
  gchar *class_utf8;
162
190
  gchar *wm_class;
163
191
  unsigned long size;
@@ -179,7 +207,8 @@ static gchar *get_window_class (Display *disp, Window win) {
179
207
  return class_utf8;
180
208
  }
181
209
 
182
- static gchar *get_window_title (Display *disp, Window win) {
210
+ static gchar *get_window_title (Display *disp, Window win)
211
+ {
183
212
  gchar *title_utf8;
184
213
  gchar *wm_name;
185
214
  gchar *net_wm_name;
@@ -206,9 +235,11 @@ static gchar *get_window_title (Display *disp, Window win) {
206
235
  return title_utf8;
207
236
  }
208
237
 
238
+ /* Get list of information of windows. */
209
239
  static VALUE rb_wmctrl_list_windows (VALUE self) {
210
240
  Display **ptr, *disp;
211
241
  Window *client_list;
242
+ Window window_active;
212
243
  unsigned long client_list_size;
213
244
  unsigned int i;
214
245
  VALUE window_ary;
@@ -221,6 +252,7 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
221
252
  return Qfalse;
222
253
  }
223
254
 
255
+ window_active = get_active_window(disp);
224
256
  window_ary = rb_ary_new2(client_list_size);
225
257
 
226
258
  for (i = 0; i < client_list_size / sizeof(Window); i++) {
@@ -240,6 +272,12 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
240
272
  rb_hash_aset(window_obj, key_title, (title_utf8 ? RB_UTF8_STRING_NEW2(title_utf8) : Qnil));
241
273
  rb_hash_aset(window_obj, key_class, (class_out ? RB_UTF8_STRING_NEW2(class_out) : Qnil));
242
274
 
275
+ if (window_active == client_list[i]) {
276
+ rb_hash_aset(window_obj, key_active, Qtrue);
277
+ } else {
278
+ rb_hash_aset(window_obj, key_active, Qnil);
279
+ }
280
+
243
281
  /* desktop ID */
244
282
  if ((desktop = (unsigned long *)get_property(disp, client_list[i],
245
283
  XA_CARDINAL, "_NET_WM_DESKTOP", NULL)) == NULL) {
@@ -277,6 +315,7 @@ static VALUE rb_wmctrl_list_windows (VALUE self) {
277
315
  return window_ary;
278
316
  }
279
317
 
318
+ /* Get list of information of desktops. */
280
319
  static VALUE rb_wmctrl_list_desktops (VALUE self) {
281
320
  Display **ptr, *disp;
282
321
  unsigned long *num_desktops = NULL;
@@ -498,6 +537,7 @@ static VALUE rb_wmctrl_list_desktops (VALUE self) {
498
537
  return ret;
499
538
  }
500
539
 
540
+ /* Switch desktop. */
501
541
  static VALUE rb_wmctrl_switch_desktop (VALUE self, VALUE desktop_id) {
502
542
  int target;
503
543
  Display **ptr, *disp;
@@ -512,6 +552,7 @@ static VALUE rb_wmctrl_switch_desktop (VALUE self, VALUE desktop_id) {
512
552
  return Qtrue;
513
553
  }
514
554
 
555
+ /* Get hash of information of window manager. */
515
556
  static VALUE rb_wmctrl_info (VALUE self) {
516
557
  Display **ptr, *disp;
517
558
  Window *sup_window = NULL;
@@ -582,6 +623,7 @@ static VALUE rb_wmctrl_info (VALUE self) {
582
623
  return ret;
583
624
  }
584
625
 
626
+ /* Minimize windows to show desktop. */
585
627
  static VALUE rb_wmctrl_showing_desktop (VALUE self, VALUE state) {
586
628
  Display **ptr, *disp;
587
629
  Data_Get_Struct(self, Display*, ptr);
@@ -618,6 +660,7 @@ static VALUE rb_wmctrl_change_geometry (VALUE self, VALUE xnum, VALUE ynum) {
618
660
  return Qtrue;
619
661
  }
620
662
 
663
+ /* Change number of desktops. */
621
664
  static VALUE rb_wmctrl_change_number_of_desktops (VALUE self, VALUE num) {
622
665
  long n;
623
666
  Display **ptr, *disp;
@@ -631,7 +674,8 @@ static VALUE rb_wmctrl_change_number_of_desktops (VALUE self, VALUE num) {
631
674
  return Qtrue;
632
675
  }
633
676
 
634
- static int activate_window (Display *disp, Window win, gboolean switch_desktop) {
677
+ static int activate_window (Display *disp, Window win, gboolean switch_desktop)
678
+ {
635
679
  unsigned long *desktop;
636
680
 
637
681
  /* desktop ID */
@@ -658,11 +702,13 @@ static int activate_window (Display *disp, Window win, gboolean switch_desktop)
658
702
  return True;
659
703
  }
660
704
 
661
- static int close_window (Display *disp, Window win) {
705
+ static int close_window (Display *disp, Window win)
706
+ {
662
707
  return client_msg(disp, win, "_NET_CLOSE_WINDOW", 0, 0, 0, 0, 0);
663
708
  }
664
709
 
665
- static gboolean wm_supports (Display *disp, const gchar *prop) {
710
+ static gboolean wm_supports (Display *disp, const gchar *prop)
711
+ {
666
712
  Atom xa_prop = XInternAtom(disp, prop, False);
667
713
  Atom *list;
668
714
  unsigned long size;
@@ -686,7 +732,8 @@ static gboolean wm_supports (Display *disp, const gchar *prop) {
686
732
  }
687
733
 
688
734
  static int window_move_resize (Display *disp, Window win, signed long grav,
689
- signed long x, signed long y, signed long w, signed long h) {
735
+ signed long x, signed long y, signed long w, signed long h)
736
+ {
690
737
  unsigned long grflags;
691
738
  grflags = grav;
692
739
  if (x != -1) grflags |= (1 << 8);
@@ -716,7 +763,8 @@ static int window_move_resize (Display *disp, Window win, signed long grav,
716
763
  }
717
764
 
718
765
  static int window_state (Display *disp, Window win,
719
- const char *action_str, const char *prop1_str, const char *prop2_str) {
766
+ const char *action_str, const char *prop1_str, const char *prop2_str)
767
+ {
720
768
  unsigned long action;
721
769
  Atom prop1 = 0;
722
770
  Atom prop2 = 0;
@@ -754,7 +802,8 @@ static int window_state (Display *disp, Window win,
754
802
  return client_msg(disp, win, "_NET_WM_STATE", action, (unsigned long)prop1, (unsigned long)prop2, 0, 0);
755
803
  }
756
804
 
757
- static int window_to_desktop (Display *disp, Window win, int desktop) {
805
+ static int window_to_desktop (Display *disp, Window win, int desktop)
806
+ {
758
807
  unsigned long *cur_desktop = NULL;
759
808
  Window root = DefaultRootWindow(disp);
760
809
 
@@ -776,7 +825,8 @@ static int window_to_desktop (Display *disp, Window win, int desktop) {
776
825
  return client_msg(disp, win, "_NET_WM_DESKTOP", (unsigned long)desktop, 0, 0, 0, 0);
777
826
  }
778
827
 
779
- static void window_set_title (Display *disp, Window win, char *title, char mode) {
828
+ static void window_set_title (Display *disp, Window win, char *title, char mode)
829
+ {
780
830
  gchar *title_utf8;
781
831
  gchar *title_local;
782
832
 
@@ -823,7 +873,8 @@ static void window_set_title (Display *disp, Window win, char *title, char mode)
823
873
  g_free(title_local);
824
874
  }
825
875
 
826
- static int action_window (Display *disp, Window win, char mode, int argc, VALUE *argv) {
876
+ static int action_window (Display *disp, Window win, char mode, int argc, VALUE *argv)
877
+ {
827
878
  p_verbose("Using window: 0x%.8lx\n", win);
828
879
  switch (mode) {
829
880
  case 'a':
@@ -887,7 +938,8 @@ static int action_window (Display *disp, Window win, char mode, int argc, VALUE
887
938
  rb_raise(rb_eArgError, "Invalid argument of action_window.");
888
939
  }
889
940
 
890
- static Window Select_Window(Display *dpy) {
941
+ static Window Select_Window(Display *dpy)
942
+ {
891
943
  /*
892
944
  * Routine to let user select a window using the mouse
893
945
  * Taken from xfree86.
@@ -943,7 +995,8 @@ static Window Select_Window(Display *dpy) {
943
995
  return(target_win);
944
996
  }
945
997
 
946
- static Window get_active_window(Display *disp) {
998
+ static Window get_active_window(Display *disp)
999
+ {
947
1000
  char *prop;
948
1001
  unsigned long size;
949
1002
  Window ret = (Window)0;
@@ -957,7 +1010,8 @@ static Window get_active_window(Display *disp) {
957
1010
  return(ret);
958
1011
  }
959
1012
 
960
- static Window get_target_window (Display *disp, VALUE obj) {
1013
+ static Window get_target_window (Display *disp, VALUE obj)
1014
+ {
961
1015
  Window wid = 0;
962
1016
  switch (TYPE(obj)) {
963
1017
  case T_FIXNUM:
@@ -1041,6 +1095,19 @@ static Window get_target_window (Display *disp, VALUE obj) {
1041
1095
  /* return activate; */
1042
1096
  /* } */
1043
1097
 
1098
+ /*
1099
+ 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)
1110
+ */
1044
1111
  static VALUE rb_wmctrl_action_window(int argc, VALUE *argv, VALUE self) {
1045
1112
  Window wid;
1046
1113
  int mode;
@@ -1101,7 +1168,8 @@ void Init_wmctrl()
1101
1168
  key_id = ID2SYM(rb_intern("id"));
1102
1169
  key_title = ID2SYM(rb_intern("title"));
1103
1170
  key_pid = ID2SYM(rb_intern("pid"));
1104
- key_geometry = ID2SYM(rb_intern("geometory"));
1171
+ key_geometry = ID2SYM(rb_intern("geometry"));
1172
+ key_active = ID2SYM(rb_intern("active"));
1105
1173
  key_class = ID2SYM(rb_intern("class"));
1106
1174
  key_client_machine = ID2SYM(rb_intern("client_machine"));
1107
1175
  key_desktop = ID2SYM(rb_intern("desktop"));
@@ -1,3 +1,3 @@
1
- module WMCtrl
2
- VERSION = "0.0.1"
1
+ class WMCtrl
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/wmctrl.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'wmctrl.so'
2
+ require 'wmctrl/version'
data/sample/activate.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
data/sample/close.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
data/sample/info.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
data/sample/set_title.rb CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "../ext")))
1
2
  require 'wmctrl'
2
3
  require 'pp'
3
4
 
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.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &7209860 !ruby/object:Gem::Requirement
16
+ requirement: &11195400 !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: *7209860
24
+ version_requirements: *11195400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: yard
27
- requirement: &7209440 !ruby/object:Gem::Requirement
27
+ requirement: &11194980 !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: *7209440
35
+ version_requirements: *11194980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pkg-config
38
- requirement: &7209020 !ruby/object:Gem::Requirement
38
+ requirement: &11194560 !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: *7209020
46
+ version_requirements: *11194560
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:
@@ -54,11 +54,14 @@ extensions:
54
54
  extra_rdoc_files: []
55
55
  files:
56
56
  - .gitignore
57
+ - .yardopts
57
58
  - COPYING
58
59
  - Gemfile
60
+ - README.md
59
61
  - Rakefile
60
62
  - ext/extconf.rb
61
63
  - ext/wmctrl.c
64
+ - lib/wmctrl.rb
62
65
  - lib/wmctrl/version.rb
63
66
  - ruby-wmctrl.gemspec
64
67
  - sample/activate.rb