x11 0.0.1a2 → 0.0.1a3

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.
Files changed (245) hide show
  1. data/lib/X11/X.rb +14 -9
  2. data/lib/X11/X/c.rb +21 -20
  3. data/lib/X11/XKBlib.rb +29 -0
  4. data/lib/X11/Xatom.rb +152 -136
  5. data/lib/X11/Xatom/c.rb +15 -15
  6. data/lib/X11/Xdefs.rb +7 -7
  7. data/lib/X11/Xdefs/c.rb +20 -20
  8. data/lib/X11/Xlib.rb +19 -7
  9. data/lib/X11/Xlib/c.rb +21 -8
  10. data/lib/X11/Xlib/c/functions.rb +373 -27
  11. data/lib/X11/Xlib/c/type/any_event.rb +13 -13
  12. data/lib/X11/Xlib/c/type/button_event.rb +23 -23
  13. data/lib/X11/Xlib/c/type/circulate_event.rb +15 -15
  14. data/lib/X11/Xlib/c/type/circulate_request_event.rb +15 -15
  15. data/lib/X11/Xlib/c/type/client_message_event.rb +22 -22
  16. data/lib/X11/Xlib/c/type/colormap_event.rb +16 -16
  17. data/lib/X11/Xlib/c/type/configure_event.rb +21 -21
  18. data/lib/X11/Xlib/c/type/configure_request_event.rb +22 -22
  19. data/lib/X11/Xlib/c/type/create_window_event.rb +20 -20
  20. data/lib/X11/Xlib/c/type/crossing_event.rb +25 -25
  21. data/lib/X11/Xlib/c/type/destroy_window_event.rb +14 -14
  22. data/lib/X11/Xlib/c/type/display.rb +52 -52
  23. data/lib/X11/Xlib/c/type/error_event.rb +15 -15
  24. data/lib/X11/Xlib/c/type/event.rb +43 -43
  25. data/lib/X11/Xlib/c/type/expose_event.rb +18 -18
  26. data/lib/X11/Xlib/c/type/focus_change_event.rb +15 -15
  27. data/lib/X11/Xlib/c/type/gc.rb +10 -10
  28. data/lib/X11/Xlib/c/type/gc_values.rb +54 -0
  29. data/lib/X11/Xlib/c/type/generic_event.rb +14 -14
  30. data/lib/X11/Xlib/c/type/generic_event_cookie.rb +16 -16
  31. data/lib/X11/Xlib/c/type/graphics_expose_event.rb +21 -21
  32. data/lib/X11/Xlib/c/type/gravity_event.rb +16 -16
  33. data/lib/X11/Xlib/c/type/image.rb +56 -0
  34. data/lib/X11/Xlib/c/type/key_event.rb +23 -23
  35. data/lib/X11/Xlib/c/type/key_sym.rb +15 -15
  36. data/lib/X11/Xlib/c/type/keymap_event.rb +14 -14
  37. data/lib/X11/Xlib/c/type/map_event.rb +15 -15
  38. data/lib/X11/Xlib/c/type/map_request_event.rb +18 -18
  39. data/lib/X11/Xlib/c/type/mapping_event.rb +16 -16
  40. data/lib/X11/Xlib/c/type/motion_event.rb +23 -23
  41. data/lib/X11/Xlib/c/type/no_expose_event.rb +15 -15
  42. data/lib/X11/Xlib/c/type/point.rb +33 -0
  43. data/lib/X11/Xlib/c/type/property_event.rb +16 -16
  44. data/lib/X11/Xlib/c/type/reparent_event.rb +18 -18
  45. data/lib/X11/Xlib/c/type/resize_request_event.rb +15 -15
  46. data/lib/X11/Xlib/c/type/screen.rb +27 -27
  47. data/lib/X11/Xlib/c/type/selection_clear_event.rb +15 -15
  48. data/lib/X11/Xlib/c/type/selection_event.rb +17 -17
  49. data/lib/X11/Xlib/c/type/selection_request_event.rb +18 -18
  50. data/lib/X11/Xlib/c/type/status.rb +15 -15
  51. data/lib/X11/Xlib/c/type/unmap_event.rb +15 -15
  52. data/lib/X11/Xlib/c/type/visibility_event.rb +14 -14
  53. data/lib/X11/Xlib/c/type/visual.rb +16 -16
  54. data/lib/X11/Xlib/c/type/window_attributes.rb +31 -31
  55. data/lib/X11/Xlib/c/types.rb +9 -7
  56. data/lib/X11/Xlib/display.rb +257 -174
  57. data/lib/X11/Xlib/display/extensions.rb +56 -0
  58. data/lib/X11/Xlib/drawable.rb +48 -0
  59. data/lib/X11/Xlib/error.rb +100 -0
  60. data/lib/X11/Xlib/event.rb +66 -37
  61. data/lib/X11/Xlib/event/any.rb +8 -10
  62. data/lib/X11/Xlib/event/button_press.rb +9 -20
  63. data/lib/X11/Xlib/event/button_release.rb +9 -20
  64. data/lib/X11/Xlib/event/circulate_notify.rb +11 -12
  65. data/lib/X11/Xlib/event/circulate_request.rb +11 -12
  66. data/lib/X11/Xlib/event/client_message.rb +11 -13
  67. data/lib/X11/Xlib/event/colormap_notify.rb +12 -13
  68. data/lib/X11/Xlib/event/configure_notify.rb +17 -18
  69. data/lib/X11/Xlib/event/configure_request.rb +18 -19
  70. data/lib/X11/Xlib/event/create_notify.rb +16 -17
  71. data/lib/X11/Xlib/event/destroy_notify.rb +10 -11
  72. data/lib/X11/Xlib/event/enter_notify.rb +10 -8
  73. data/lib/X11/Xlib/event/expose.rb +15 -16
  74. data/lib/X11/Xlib/event/focus_in.rb +9 -12
  75. data/lib/X11/Xlib/event/focus_out.rb +9 -12
  76. data/lib/X11/Xlib/event/generic.rb +35 -0
  77. data/lib/X11/Xlib/event/generic/button.rb +46 -0
  78. data/lib/X11/Xlib/event/generic/crossing.rb +48 -0
  79. data/lib/X11/Xlib/{window/properties/property/class.rb → event/generic/focus_change.rb} +16 -14
  80. data/lib/X11/Xlib/event/generic/key.rb +46 -0
  81. data/lib/X11/Xlib/event/generic/motion.rb +46 -0
  82. data/lib/X11/Xlib/event/generic_event.rb +12 -14
  83. data/lib/X11/Xlib/event/graphics_expose.rb +15 -14
  84. data/lib/X11/Xlib/event/gravity_notify.rb +12 -13
  85. data/lib/X11/Xlib/event/helper.rb +123 -91
  86. data/lib/X11/Xlib/event/key_press.rb +9 -20
  87. data/lib/X11/Xlib/event/key_release.rb +9 -20
  88. data/lib/X11/Xlib/event/keymap_notify.rb +13 -14
  89. data/lib/X11/Xlib/event/leave_notify.rb +10 -20
  90. data/lib/X11/Xlib/event/map_notify.rb +11 -12
  91. data/lib/X11/Xlib/event/map_request.rb +10 -11
  92. data/lib/X11/Xlib/event/mapping_notify.rb +11 -13
  93. data/lib/X11/Xlib/event/motion_notify.rb +10 -20
  94. data/lib/X11/Xlib/event/no_expose.rb +8 -9
  95. data/lib/X11/Xlib/event/property_notify.rb +12 -13
  96. data/lib/X11/Xlib/event/reparent_notify.rb +14 -15
  97. data/lib/X11/Xlib/event/resize_request.rb +11 -12
  98. data/lib/X11/Xlib/event/selection_clear.rb +10 -12
  99. data/lib/X11/Xlib/event/selection_notify.rb +13 -15
  100. data/lib/X11/Xlib/event/selection_request.rb +14 -16
  101. data/lib/X11/Xlib/event/unmap_notify.rb +11 -12
  102. data/lib/X11/Xlib/event/visibility_notify.rb +10 -11
  103. data/lib/X11/Xlib/events.rb +11 -7
  104. data/lib/X11/Xlib/exceptions.rb +10 -10
  105. data/lib/X11/Xlib/graphic_context.rb +69 -0
  106. data/lib/X11/Xlib/graphic_context/functions.rb +50 -0
  107. data/lib/X11/Xlib/{window/properties/property/command.rb → graphic_context/values.rb} +17 -13
  108. data/lib/X11/Xlib/hints.rb +19 -18
  109. data/lib/X11/Xlib/hints/flags.rb +15 -15
  110. data/lib/X11/Xlib/hints/icon.rb +14 -16
  111. data/lib/X11/Xlib/id.rb +75 -0
  112. data/lib/X11/Xlib/image.rb +64 -0
  113. data/lib/X11/Xlib/keysym.rb +53 -26
  114. data/lib/X11/Xlib/mask.rb +81 -55
  115. data/lib/X11/Xlib/pixmap.rb +60 -0
  116. data/lib/X11/Xlib/planes.rb +50 -0
  117. data/lib/X11/Xlib/revert_to.rb +10 -10
  118. data/lib/X11/Xlib/screen.rb +48 -31
  119. data/lib/X11/Xlib/status.rb +56 -56
  120. data/lib/X11/Xlib/transform.rb +25 -25
  121. data/lib/X11/Xlib/visual.rb +19 -19
  122. data/lib/X11/Xlib/window.rb +399 -188
  123. data/lib/X11/Xlib/window/attributes.rb +74 -41
  124. data/lib/X11/Xlib/window/properties.rb +57 -38
  125. data/lib/X11/Xlib/window/properties/property.rb +135 -70
  126. data/lib/X11/Xlib/window/properties/property/net_virtual_root.rb +13 -13
  127. data/lib/X11/Xlib/window/properties/property/parser.rb +45 -35
  128. data/lib/X11/Xlib/window/properties/property/parser/arc.rb +18 -16
  129. data/lib/X11/Xlib/window/properties/property/parser/atom.rb +14 -10
  130. data/lib/X11/Xlib/window/properties/property/parser/cardinal.rb +14 -9
  131. data/lib/X11/Xlib/window/properties/property/parser/hints.rb +17 -16
  132. data/lib/X11/Xlib/window/properties/property/parser/integer.rb +39 -0
  133. data/lib/X11/Xlib/window/properties/property/parser/state.rb +39 -0
  134. data/lib/X11/Xlib/window/properties/property/parser/string.rb +59 -0
  135. data/lib/X11/Xlib/window/properties/property/parser/window.rb +39 -0
  136. data/lib/X11/Xmd.rb +7 -7
  137. data/lib/X11/Xmd/c.rb +19 -19
  138. data/lib/X11/Xregion.rb +32 -0
  139. data/lib/X11/Xregion/c.rb +29 -0
  140. data/lib/X11/Xregion/c/type/box.rb +35 -0
  141. data/lib/X11/Xregion/c/type/point_block.rb +33 -0
  142. data/lib/X11/Xregion/c/type/rectangle.rb +35 -0
  143. data/lib/X11/Xregion/c/type/region.rb +35 -0
  144. data/lib/X11/Xregion/c/types.rb +32 -0
  145. data/lib/X11/Xutil.rb +12 -17
  146. data/lib/X11/Xutil/c.rb +7 -10
  147. data/lib/X11/Xutil/c/functions.rb +7 -7
  148. data/lib/X11/Xutil/c/type/class_hint.rb +10 -10
  149. data/lib/X11/Xutil/c/type/region.rb +31 -0
  150. data/lib/X11/Xutil/c/type/text_property.rb +12 -12
  151. data/lib/X11/Xutil/c/types.rb +8 -7
  152. data/lib/X11/Xutil/state.rb +43 -0
  153. data/lib/X11/Xutil/window.rb +28 -28
  154. data/lib/X11/cursorfont.rb +7 -7
  155. data/lib/X11/cursorfont/c.rb +8 -8
  156. data/lib/X11/cursorfont/font.rb +113 -113
  157. data/lib/X11/extension.rb +65 -0
  158. data/lib/X11/extensions.rb +105 -126
  159. data/lib/X11/extensions/Xrandr.rb +49 -0
  160. data/lib/X11/extensions/Xrandr/c.rb +30 -0
  161. data/lib/X11/extensions/Xrandr/c/functions.rb +106 -0
  162. data/lib/X11/extensions/Xrandr/c/type/crtc_gamma.rb +35 -0
  163. data/lib/X11/extensions/Xrandr/c/type/crtc_info.rb +43 -0
  164. data/lib/X11/extensions/Xrandr/c/type/crtc_transform_attributes.rb +39 -0
  165. data/lib/X11/extensions/Xrandr/c/type/mode_info.rb +45 -0
  166. data/lib/X11/extensions/Xrandr/c/type/output_info.rb +46 -0
  167. data/lib/X11/extensions/Xrandr/c/type/panning.rb +44 -0
  168. data/lib/X11/extensions/Xrandr/c/type/property_info.rb +36 -0
  169. data/lib/X11/extensions/Xrandr/c/type/screen_resources.rb +39 -0
  170. data/lib/X11/extensions/Xrandr/c/type/screen_size.rb +35 -0
  171. data/lib/X11/extensions/Xrandr/c/types.rb +48 -0
  172. data/lib/X11/extensions/Xrandr/crtc.rb +70 -0
  173. data/lib/X11/extensions/Xrandr/crtc/gamma.rb +100 -0
  174. data/lib/X11/extensions/Xrandr/crtc/info.rb +62 -0
  175. data/lib/X11/extensions/Xrandr/crtc/panning.rb +74 -0
  176. data/lib/X11/extensions/Xrandr/event.rb +29 -0
  177. data/lib/X11/extensions/Xrandr/output.rb +59 -0
  178. data/lib/X11/extensions/Xrandr/output/info.rb +105 -0
  179. data/lib/X11/extensions/Xrandr/output/properties.rb +78 -0
  180. data/lib/X11/extensions/Xrandr/output/properties/property.rb +161 -0
  181. data/lib/X11/extensions/Xrandr/output/properties/property/info.rb +73 -0
  182. data/lib/X11/extensions/Xrandr/output/properties/property/parser.rb +73 -0
  183. data/lib/X11/extensions/Xrandr/output/properties/property/parser/atom.rb +39 -0
  184. data/lib/X11/extensions/Xrandr/output/properties/property/parser/integer.rb +43 -0
  185. data/lib/X11/extensions/Xrandr/screen.rb +49 -0
  186. data/lib/X11/extensions/Xrandr/screen/backlight.rb +76 -0
  187. data/lib/X11/extensions/Xrandr/screen_resources.rb +81 -0
  188. data/lib/X11/extensions/Xrandr/window.rb +41 -0
  189. data/lib/X11/extensions/Xrender.rb +34 -0
  190. data/lib/X11/extensions/Xrender/c.rb +30 -0
  191. data/lib/X11/extensions/Xrender/c/functions.rb +50 -0
  192. data/lib/X11/extensions/Xrender/c/type/anim_cursor.rb +33 -0
  193. data/lib/X11/extensions/Xrender/c/type/circle.rb +34 -0
  194. data/lib/X11/extensions/Xrender/c/type/conical_gradient.rb +33 -0
  195. data/lib/X11/extensions/Xrender/c/type/filters.rb +35 -0
  196. data/lib/X11/extensions/Xrender/c/type/glyph_elt16.rb +36 -0
  197. data/lib/X11/extensions/Xrender/c/type/glyph_elt32.rb +36 -0
  198. data/lib/X11/extensions/Xrender/c/type/glyph_elt8.rb +36 -0
  199. data/lib/X11/extensions/Xrender/c/type/glyph_info.rb +37 -0
  200. data/lib/X11/extensions/Xrender/c/type/index_value.rb +36 -0
  201. data/lib/X11/extensions/Xrender/c/type/line_fixed.rb +33 -0
  202. data/lib/X11/extensions/Xrender/c/type/linear_gradient.rb +33 -0
  203. data/lib/X11/extensions/Xrender/c/type/point_double.rb +33 -0
  204. data/lib/X11/extensions/Xrender/c/type/point_fixed.rb +33 -0
  205. data/lib/X11/extensions/Xrender/c/type/radial_gradient.rb +33 -0
  206. data/lib/X11/extensions/Xrender/c/type/render_color.rb +35 -0
  207. data/lib/X11/extensions/Xrender/c/type/render_direct_format.rb +39 -0
  208. data/lib/X11/extensions/Xrender/c/type/render_pict_format.rb +36 -0
  209. data/lib/X11/extensions/Xrender/c/type/render_picture_attributes.rb +44 -0
  210. data/lib/X11/extensions/Xrender/c/type/span_fix.rb +34 -0
  211. data/lib/X11/extensions/Xrender/c/type/transform.rb +32 -0
  212. data/lib/X11/extensions/Xrender/c/type/trap.rb +33 -0
  213. data/lib/X11/extensions/Xrender/c/type/trapezoid.rb +35 -0
  214. data/lib/X11/extensions/Xrender/c/type/triangle.rb +34 -0
  215. data/lib/X11/extensions/Xrender/c/types.rb +56 -0
  216. data/lib/X11/extensions/Xrender/mask.rb +48 -0
  217. data/lib/X11/extensions/randr.rb +29 -0
  218. data/lib/X11/extensions/randr/c.rb +38 -0
  219. data/lib/X11/extensions/render.rb +29 -0
  220. data/lib/X11/extensions/render/c.rb +34 -0
  221. data/lib/X11/extensions/xf86vmode.rb +42 -0
  222. data/lib/X11/extensions/xf86vmode/c.rb +30 -0
  223. data/lib/X11/extensions/xf86vmode/c/functions.rb +59 -0
  224. data/lib/X11/extensions/xf86vmode/c/type/gamma.rb +34 -0
  225. data/lib/X11/extensions/xf86vmode/c/type/mode_info.rb +44 -0
  226. data/lib/X11/extensions/xf86vmode/c/type/mode_line.rb +43 -0
  227. data/lib/X11/extensions/xf86vmode/c/type/monitor.rb +38 -0
  228. data/lib/X11/extensions/xf86vmode/c/type/sync_range.rb +33 -0
  229. data/lib/X11/extensions/xf86vmode/c/types.rb +36 -0
  230. data/lib/X11/extensions/xf86vmode/screen.rb +53 -0
  231. data/lib/X11/extensions/xf86vmode/screen/gamma.rb +79 -0
  232. data/lib/X11/extensions/xf86vmode/screen/gamma/ramp.rb +86 -0
  233. data/lib/X11/keysym.rb +7 -25
  234. data/lib/X11/misc/temperature.rb +458 -0
  235. data/lib/X11/simple.rb +8 -7
  236. data/lib/X11/simple/display.rb +35 -37
  237. data/lib/X11/simple/window.rb +39 -19
  238. data/lib/X11/window_manager.rb +32 -0
  239. data/lib/X11/window_manager/desktops.rb +82 -0
  240. data/lib/X11/window_manager/desktops/desktop.rb +78 -0
  241. data/lib/X11/window_manager/supports.rb +56 -0
  242. data/lib/X11/window_manager/supports/feature.rb +46 -0
  243. data/lib/X11/window_manager/window.rb +102 -0
  244. data/lib/X11/window_manager/window_manager.rb +73 -0
  245. metadata +216 -66
@@ -1,26 +1,26 @@
1
1
  #--
2
2
  # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
- #
3
+ #
4
4
  # Redistribution and use in source and binary forms, with or without modification, are
5
5
  # permitted provided that the following conditions are met:
6
- #
6
+ #
7
7
  # 1. Redistributions of source code must retain the above copyright notice, this list of
8
8
  # conditions and the following disclaimer.
9
- #
9
+ #
10
10
  # 2. Redistributions in binary form must reproduce the above copyright notice, this list
11
11
  # of conditions and the following disclaimer in the documentation and/or other materials
12
12
  # provided with the distribution.
13
- #
14
- # THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY EXPRESS OR IMPLIED
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY meh ''AS IS'' AND ANY EXPRESS OR IMPLIED
15
15
  # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
- # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
16
+ # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL meh OR
17
17
  # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
18
  # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
19
  # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
20
  # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21
21
  # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22
22
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
- #
23
+ #
24
24
  # The views and conclusions contained in the software and documentation are those of the
25
25
  # authors and should not be interpreted as representing official policies, either expressed
26
26
  # or implied.
@@ -29,30 +29,30 @@
29
29
  module X11
30
30
 
31
31
  class Transform
32
- attr_reader :name
32
+ attr_reader :name
33
33
 
34
- def initialize (name, &block)
35
- @name = name
36
- @callbacks = {}
34
+ def initialize (name, &block)
35
+ @name = name
36
+ @callbacks = {}
37
37
 
38
- instance_eval &block
39
- end
38
+ instance_eval &block
39
+ end
40
40
 
41
- def for (*args)
42
- @for = args
41
+ def for (*args)
42
+ @for = args
43
43
 
44
- self
45
- end
44
+ self
45
+ end
46
46
 
47
- def method_missing (name, *args, &block)
48
- if block
49
- @callbacks[name] = block
50
- else
51
- return super unless @callbacks[name]
47
+ def method_missing (name, *args, &block)
48
+ if block
49
+ @callbacks[name] = block
50
+ else
51
+ return super unless @callbacks[name]
52
52
 
53
- @callbacks[name].call(*@for, *args)
54
- end
55
- end
53
+ @callbacks[name].call(*@for, *args)
54
+ end
55
+ end
56
56
  end
57
57
 
58
58
  end
@@ -1,26 +1,26 @@
1
1
  #--
2
2
  # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
- #
3
+ #
4
4
  # Redistribution and use in source and binary forms, with or without modification, are
5
5
  # permitted provided that the following conditions are met:
6
- #
6
+ #
7
7
  # 1. Redistributions of source code must retain the above copyright notice, this list of
8
8
  # conditions and the following disclaimer.
9
- #
9
+ #
10
10
  # 2. Redistributions in binary form must reproduce the above copyright notice, this list
11
11
  # of conditions and the following disclaimer in the documentation and/or other materials
12
12
  # provided with the distribution.
13
- #
14
- # THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY EXPRESS OR IMPLIED
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY meh ''AS IS'' AND ANY EXPRESS OR IMPLIED
15
15
  # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
- # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
16
+ # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL meh OR
17
17
  # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
18
  # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
19
  # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
20
  # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21
21
  # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22
22
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
- #
23
+ #
24
24
  # The views and conclusions contained in the software and documentation are those of the
25
25
  # authors and should not be interpreted as representing official policies, either expressed
26
26
  # or implied.
@@ -29,20 +29,20 @@
29
29
  module X11
30
30
 
31
31
  class Visual
32
- def initialize (visual)
33
- visual = visual.typecast(C::Visual) unless visual.is_a?(C::Visual)
34
- @visual = visual
35
- end
32
+ def initialize (visual)
33
+ visual = visual.typecast(C::Visual) unless visual.is_a?(C::Visual)
34
+ @visual = visual
35
+ end
36
36
 
37
- C::Visual.layout.members.each_with_index {|name, index|
38
- define_method name do
39
- @visual[name]
40
- end
41
- }
37
+ C::Visual.layout.members.each_with_index {|name, index|
38
+ define_method name do
39
+ @visual[name]
40
+ end
41
+ }
42
42
 
43
- def visual_id
44
- @visual[:VisualID]
45
- end
43
+ def visual_id
44
+ @visual[:VisualID]
45
+ end
46
46
  end
47
47
 
48
48
  end
@@ -1,26 +1,26 @@
1
1
  #--
2
2
  # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
- #
3
+ #
4
4
  # Redistribution and use in source and binary forms, with or without modification, are
5
5
  # permitted provided that the following conditions are met:
6
- #
6
+ #
7
7
  # 1. Redistributions of source code must retain the above copyright notice, this list of
8
8
  # conditions and the following disclaimer.
9
- #
9
+ #
10
10
  # 2. Redistributions in binary form must reproduce the above copyright notice, this list
11
11
  # of conditions and the following disclaimer in the documentation and/or other materials
12
12
  # provided with the distribution.
13
- #
14
- # THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY EXPRESS OR IMPLIED
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY meh ''AS IS'' AND ANY EXPRESS OR IMPLIED
15
15
  # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
- # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
16
+ # FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL meh OR
17
17
  # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
18
  # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
19
  # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
20
  # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21
21
  # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22
22
  # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
- #
23
+ #
24
24
  # The views and conclusions contained in the software and documentation are those of the
25
25
  # authors and should not be interpreted as representing official policies, either expressed
26
26
  # or implied.
@@ -31,187 +31,398 @@ require 'X11/Xlib/window/properties'
31
31
 
32
32
  module X11
33
33
 
34
- class Window
35
- attr_reader :display, :parent, :revert_to
36
-
37
- def initialize (display, window)
38
- @display = display
39
- @window = window
40
-
41
- self.revert_to = nil
42
- end
43
-
44
- def root
45
- root = FFI::MemoryPointer.new :Window
46
- parent = FFI::MemoryPointer.new :Window
47
- number = FFI::MemoryPointer.new :uint
48
- children = FFI::MemoryPointer.new :pointer
49
-
50
- C::XQueryTree(display.to_ffi, id, root, parent, children, number)
51
- C::XFree(children.typecast(:pointer))
52
-
53
- Window.new(display, root.typecast(:Window))
54
- end
55
-
56
- def parent
57
- root = FFI::MemoryPointer.new :Window
58
- parent = FFI::MemoryPointer.new :Window
59
- number = FFI::MemoryPointer.new :uint
60
- children = FFI::MemoryPointer.new :pointer
61
-
62
- C::XQueryTree(display.to_ffi, id, root, parent, children, number)
63
- C::XFree(children.typecast(:pointer))
64
-
65
- Window.new(display, parent.typecast(:Window))
66
- end
67
-
68
- def id
69
- @window
70
- end; alias hash id
71
-
72
- def == (value)
73
- id == value.id
74
- end
75
-
76
- def nil?
77
- id.zero?
78
- end
79
-
80
- def revert_to= (value)
81
- @revert_to = if value.is_a?(Integer)
82
- RevertTo.key(value)
83
- else
84
- self.revert_to = RevertTo[value] || 0
85
- end
86
- end
87
-
88
- def attributes
89
- attr = FFI::MemoryPointer.new(C::XWindowAttributes)
90
-
91
- C::XGetWindowAttributes(display.to_ffi, to_ffi, attr)
92
-
93
- Attributes.new(attr)
94
- end
95
-
96
- def properties
97
- Properties.new(self)
98
- end
99
-
100
- def move (x, y)
101
- C::XMoveWindow(display.to_ffi, to_ffi, x, y)
102
-
103
- display.flush
104
- end
105
-
106
- def resize (width, height)
107
- C::XResizeWindow(display.to_ffi, to_ffi, width, height)
108
-
109
- display.flush
110
- end
111
-
112
- def raise
113
- C::XRaiseWindow(display.to_ffi, to_ffi)
114
-
115
- display.flush
116
- end
117
-
118
- def subwindows
119
- result = []
120
- root = FFI::MemoryPointer.new :Window
121
- parent = FFI::MemoryPointer.new :Window
122
- number = FFI::MemoryPointer.new :uint
123
- children = FFI::MemoryPointer.new :pointer
124
-
125
- C::XQueryTree(display.to_ffi, id, root, parent, children, number)
126
-
127
- return result if children.typecast(:pointer).null?
128
-
129
- children.typecast(:pointer).read_array_of(:Window, number.typecast(:uint)).each {|win|
130
- result << Window.new(display, win)
131
- }
132
-
133
- C::XFree(children.typecast(:pointer))
134
-
135
- result
136
- end
137
-
138
- def grab_pointer (owner_events=true, event_mask=Mask::Event[:NoEvent], pointer_mode=:sync, keyboard_mode=:async, confine_to=0, cursor=0, time=0)
139
- C::XGrabPointer(display.to_ffi, to_ffi, !!owner_events, event_mask.to_ffi, mode2int(pointer_mode), mode2int(keyboard_mode), confine_to.to_ffi, cursor.to_ffi, time).zero?
140
- end
141
-
142
- def ungrab_pointer (time=0)
143
- display.ungrab_pointer(time)
144
- end
145
-
146
- def keysym_to_keycode (keysym)
147
- C::XKeysymToKeycode(to_ffi, keysym)
148
- end
149
-
150
- def grab_key (keycode, modifiers=0, owner_events=true, pointer_mode=:async, keyboard_mode=:sync)
151
- C::XGrabKey(display.to_ffi, keycode.to_keycode, modifiers, to_ffi, !!owner_events, mode2int(pointer_mode), mode2int(keyboard_mode))
152
- end
153
-
154
- def ungrab_key (keycode, modifiers=0)
155
- C::XUngrabKey(display.to_ffi, keycode.to_keycode, modifiers, to_ffi)
156
- end
157
-
158
- def grab_button (button, modifiers=0, owner_events=true, event_mask=Mask::Event[:ButtonPress], pointer_mode=:async, keyboard_mode=:sync, confine_to=0, cursor=0)
159
- C::XGrabButton(display.to_ffi, button, modifiers, to_ffi, !!owner_events, event_mask.to_ffi, mode2int(pointer_mode), mode2int(keyboard_mode), confine_to.to_ffi, cursor.to_ffi)
160
- end
161
-
162
- def ungrab_button (button, modifiers=0)
163
- C::XUngrabButton(display.to_ffi, button, modifiers, to_ffi)
164
- end
165
-
166
- def pointer_on?
167
- root = FFI::MemoryPointer.new :Window
168
- child = FFI::MemoryPointer.new :Window
169
- dummy = FFI::MemoryPointer.new :int
170
-
171
- C::XQueryPointer(display.to_ffi, to_ffi, root, child, dummy, dummy, dummy, dummy, dummy)
172
-
173
- Window.new(display, child.typecast(:Window))
174
- end
175
-
176
- def pointer_at? (on_root=false)
177
- dummy = FFI::MemoryPointer.new :Window
178
- y = FFI::MemoryPointer.new :int
179
- x = FFI::MemoryPointer.new :int
180
-
181
- if on_root
182
- C::XQueryPointer(display.to_ffi, to_ffi, dummy, dummy, x, y, dummy, dummy, dummy)
183
- else
184
- C::XQueryPointer(display.to_ffi, to_ffi, dummy, dummy, dummy, dummy, x, y, dummy)
185
- end
186
-
187
- [x.typecast(:int), y.typecast(:int)]
188
- end
189
-
190
- def next_event (mask=Mask::Event[:NoEvent])
191
- event = FFI::MemoryPointer.new(C::XEvent)
192
-
193
- C::XWindowEvent(display.to_ffi, to_ffi, mask.to_ffi, event)
194
-
195
- Event.new(event)
196
- end
197
-
198
- def to_ffi
199
- id
200
- end
201
-
202
- def inspect
203
- with attributes do |attr|
204
- "#<X11::Window: #{attr.width}x#{attr.height} (#{attr.x}; #{attr.y})>"
205
- end
206
- end
207
-
208
- private
209
-
210
- GRAB_MODE = { :sync => false, :async => true }
211
-
212
- def mode2int (mode)
213
- (mode == true or GRAB_MODE[mode]) ? 1 : 0
214
- end
34
+ class Window < Drawable
35
+ singleton_named :display, :parent, :x, :y, :width, :height, :border_width, :depth, :input_only?, :visual, :attributes, :optional => 1 .. -1, :alias => { :w => :width, :h => :height }
36
+ def self.create (display, parent=nil, x=nil, y=nil, width=nil, height=nil, border_width=nil, depth=nil, input_only=nil, visual=nil, attributes=nil)
37
+ parent ||= display.root_window
38
+ x ||= display.width / 2
39
+ y ||= display.height / 2
40
+ width ||= 320
41
+ height ||= 200
42
+ border_width ||= 0
43
+ depth ||= :copy
44
+ input_only ||= :copy
45
+ visual ||= :copy
46
+ attributes ||= Attributes.new
47
+ end
48
+
49
+ include ForwardTo
50
+
51
+ attr_reader :display, :parent, :reported_events
52
+ forward_to :attributes
53
+
54
+ def initialize (display, value)
55
+ super
56
+
57
+ @reported_events = Mask::Event[]
58
+
59
+ revert_to
60
+ end
61
+
62
+ def parent
63
+ root = FFI::MemoryPointer.new :Window
64
+ parent = FFI::MemoryPointer.new :Window
65
+ number = FFI::MemoryPointer.new :uint
66
+ children = FFI::MemoryPointer.new :pointer
67
+
68
+ C::XQueryTree(display.to_ffi, id, root, parent, children, number)
69
+ C::XFree(children.typecast(:pointer))
70
+
71
+ Window.new(display, parent.typecast(:Window))
72
+ end
73
+
74
+ named :parent, :x, :y, :optional => [:x, :y]
75
+ def reparent (parent, x=nil, y=nil)
76
+ position.tap {|p|
77
+ x ||= p.x
78
+ y ||= p.y
79
+ }
80
+
81
+ parent.tap {
82
+ C::XReparentWindow(display.to_ffi, to_ffi, parent.to_ffi, x, y)
83
+ }
84
+ end
85
+
86
+ def revert_to?
87
+ @revert_to
88
+ end
89
+
90
+ def revert_to (value=nil)
91
+ @revert_to = if value.is_a?(Integer)
92
+ RevertTo.key(value)
93
+ else
94
+ revert_to RevertTo[value] || 0
95
+ end
96
+ end
97
+
98
+ def attributes
99
+ FFI::MemoryPointer.new(C::XWindowAttributes).tap! {|attr|
100
+ C::XGetWindowAttributes(display.to_ffi, to_ffi, attr)
101
+
102
+ Attributes.new(self, attr)
103
+ }
104
+ end
105
+
106
+ def viewable?
107
+ attributes.tap! {|attr|
108
+ !attr.input_only? && attr.viewable?
109
+ }
110
+ end
111
+
112
+ def properties
113
+ Properties.new(self)
114
+ end
115
+
116
+ def size
117
+ attributes.tap! {|attr|
118
+ Struct.new(:width, :height).new(attr.width, attr.height)
119
+ }
120
+ end
121
+
122
+ def position
123
+ child = FFI::MemoryPointer.new :Window
124
+ x = FFI::MemoryPointer.new :int
125
+ y = FFI::MemoryPointer.new :int
126
+
127
+ C::XTranslateCoordinates(display.to_ffi, to_ffi, root.to_ffi, 0, 0, x, y, child)
128
+
129
+ Struct.new(:x, :y).new(x.typecast(:int), y.typecast(:int))
130
+ end
131
+
132
+ named :x, :y, :optional => [:x, :y]
133
+ def move (x=nil, y=nil)
134
+ position.tap {|p|
135
+ x ||= p.x
136
+ y ||= p.y
137
+ }
138
+
139
+ C::XMoveWindow(display.to_ffi, to_ffi, x, y)
140
+
141
+ display.flush
142
+
143
+ self
144
+ end
145
+
146
+ named :width, :height, :optional => [:width, :height], :alias => { :w => :width, :h => :height }
147
+ def resize (width=nil, height=nil)
148
+ attributes.tap {|attr|
149
+ width ||= attr.width
150
+ height ||= attr.height
151
+ }
152
+
153
+ C::XResizeWindow(display.to_ffi, to_ffi, width, height)
154
+
155
+ display.flush
156
+
157
+ self
158
+ end
159
+
160
+ def raise
161
+ C::XRaiseWindow(display.to_ffi, to_ffi)
162
+ display.flush
163
+ self
164
+ end
165
+
166
+ def iconify
167
+ C::XIconifyWindow(display.to_ffi, to_ffi, screen.to_i)
168
+ display.flush
169
+ self
170
+ end
171
+
172
+ def withdraw
173
+ C::XWithdrawWindow(display.to_ffi, to_ffi, screen.to_i)
174
+ display.flush
175
+ self
176
+ end
177
+
178
+ def lower
179
+ C::XLowerWindow(display.to_ffi, to_ffi)
180
+ display.flush
181
+ self
182
+ end
183
+
184
+ def map (subwindows=false)
185
+ if subwindows
186
+ C::XMapSubwindows(display.to_ffi, to_ffi)
187
+ else
188
+ C::XMapWindow(display.to_ffi, to_ffi)
189
+ end
190
+
191
+ display.flush
192
+
193
+ self
194
+ end
195
+
196
+ def unmap (subwindows=false)
197
+ if subwindows
198
+ C::XMapSubwindows(display.to_ffi, to_ffi)
199
+ else
200
+ C::XMapWindow(display.to_ffi, to_ffi)
201
+ end
202
+
203
+ self
204
+ end
205
+
206
+ def destroy (subwindows=false)
207
+ if subwindows
208
+ C::XDetroyWindow(display.to_ffi, to_ffi)
209
+ else
210
+ C::XDestroySubwindows(display.to_ffi, to_ffi)
211
+ end
212
+
213
+ display.flush
214
+ make_unusable
215
+
216
+ self
217
+ end
218
+
219
+ def subwindows (deep=false)
220
+ Enumerator.new do |e|
221
+ root = FFI::MemoryPointer.new :Window
222
+ parent = FFI::MemoryPointer.new :Window
223
+ number = FFI::MemoryPointer.new :uint
224
+ children = FFI::MemoryPointer.new :pointer
225
+
226
+ C::XQueryTree(display.to_ffi, id, root, parent, children, number)
227
+
228
+ next if children.typecast(:pointer).null?
229
+
230
+ children.typecast(:pointer).read_array_of(:Window, number.typecast(:uint)).each {|win|
231
+ Window.new(display, win).tap! {|win|
232
+ e.yield win
233
+
234
+ if deep
235
+ win.subwindows(true).each {|win|
236
+ e.yield win
237
+ }
238
+ end
239
+ }
240
+ }
241
+
242
+ C::XFree(children.typecast(:pointer))
243
+ end
244
+ end
245
+
246
+ named :normal?, :mask, :pointer, :keyboard, :confine_to, :cursor, :time, :optional => 0 .. -1
247
+ def grab_pointer (owner_events=true, event_mask=Mask::Event[:NoEvent], pointer_mode=:sync, keyboard_mode=:async, confine_to=0, cursor=0, time=0, &block)
248
+ result = C::XGrabPointer(display.to_ffi, to_ffi, !!owner_events, event_mask.to_ffi, mode_to_int(pointer_mode), mode_to_int(keyboard_mode), confine_to.to_ffi, cursor.to_ffi, time).zero?
249
+
250
+ if block && result
251
+ begin
252
+ result = block.call self
253
+ ensure
254
+ ungrab_pointer
255
+ end
256
+ end
257
+
258
+ result
259
+ end
260
+
261
+ def ungrab_pointer (time=0)
262
+ display.ungrab_pointer(time)
263
+ end
264
+
265
+ named :key, :modifiers, :normal?, :pointer, :keyboard, :optional => 1 .. -1
266
+ def grab_key (keycode, modifiers=0, owner_events=true, pointer_mode=:async, keyboard_mode=:sync)
267
+ C::XGrabKey(display.to_ffi, Keysym[keycode, display].to_keycode, modifiers, to_ffi, !!owner_events, mode_to_int(pointer_mode), mode_to_int(keyboard_mode))
268
+ end
269
+
270
+ def ungrab_key (keycode, modifiers=0)
271
+ C::XUngrabKey(display.to_ffi, Keysym[keycode, display].to_keycode, modifiers, to_ffi)
272
+ end
273
+
274
+ named :button, :modifiers, :normal?, :mask, :pointer, :keyboard, :confine_to, :cursor, :optional => 0 .. -1
275
+ def grab_button (button, modifiers=0, owner_events=true, event_mask=Mask::Event[:ButtonPress], pointer_mode=:async, keyboard_mode=:sync, confine_to=0, cursor=0)
276
+ C::XGrabButton(display.to_ffi, button, modifiers, to_ffi, !!owner_events, event_mask.to_ffi, mode_to_int(pointer_mode), mode_to_int(keyboard_mode), confine_to.to_ffi, cursor.to_ffi)
277
+ end
278
+
279
+ def ungrab_button (button, modifiers=0)
280
+ C::XUngrabButton(display.to_ffi, button, modifiers, to_ffi)
281
+ end
282
+
283
+ def under_pointer
284
+ root = FFI::MemoryPointer.new :Window
285
+ child = FFI::MemoryPointer.new :Window
286
+ dummy = FFI::MemoryPointer.new :int
287
+
288
+ C::XQueryPointer(display.to_ffi, to_ffi, root, child, dummy, dummy, dummy, dummy, dummy)
289
+
290
+ Window.new(display, child.typecast(:Window))
291
+ end
292
+
293
+ def pointer_at? (on_root=false)
294
+ dummy = FFI::MemoryPointer.new :Window
295
+ y = FFI::MemoryPointer.new :int
296
+ x = FFI::MemoryPointer.new :int
297
+
298
+ if on_root
299
+ C::XQueryPointer(display.to_ffi, to_ffi, dummy, dummy, x, y, dummy, dummy, dummy)
300
+ else
301
+ C::XQueryPointer(display.to_ffi, to_ffi, dummy, dummy, dummy, dummy, x, y, dummy)
302
+ end
303
+
304
+ [x.typecast(:int), y.typecast(:int)]
305
+ end
306
+
307
+ def reported_events= (mask)
308
+ mask = Mask::Event[mask] unless mask.is_a?(Bitmap::Value)
309
+
310
+ (@reported_events = mask).tap {
311
+ C::XSelectInput(display.to_ffi, to_ffi, mask.to_ffi)
312
+ }
313
+ end; alias select_input reported_events=
314
+
315
+ def next_event (what=nil, options=nil, &block)
316
+ what, options = if what.is_a?(Hash)
317
+ [Mask::Event.all, what]
318
+ else
319
+ [what, options || {}]
320
+ end
321
+
322
+
323
+ # this would be cool, but it's slow as hell, if anyone finds a way to optimize it, let me know
324
+ =begin
325
+ mask = Event.mask_for(what)
326
+
327
+ old, self.reported_events = if options[:select] != false && !reported_events.has?(mask)
328
+ [reported_events, mask]
329
+ end
330
+
331
+ display.next_event(what, options) {|event|
332
+ if event.window == self
333
+ block ? block.call(event) : true
334
+ end
335
+ }.tap {
336
+ self.reported_events = old if old
337
+ }
338
+ =end
339
+
340
+ event = FFI::MemoryPointer.new(C::XEvent)
341
+
342
+ if block
343
+ callback = FFI::Function.new(:Bool, [:pointer, :pointer, :pointer]) do |_, event|
344
+ block.call Event.new(event) if event.window == self
345
+ end
346
+
347
+ @reported_events.tap {|old|
348
+ self.reported_events = Mask::Event.all unless options[:select] == false
349
+
350
+ begin
351
+ if options[:blocking?] == false
352
+ C::XCheckIfEvent(display.to_ffi, event, callback, nil) or return
353
+ else
354
+ if options[:delete] != false
355
+ C::XIfEvent(display.to_ffi, event, callback, nil)
356
+ else
357
+ C::XPeekIfEvent(display.to_ffi, event, callback, nil)
358
+ end
359
+ end
360
+ ensure
361
+ self.reported_events = old unless options[:select] == false
362
+ end
363
+ }
364
+ else
365
+ if what.is_a?(Symbol) && options[:blocking?] == false
366
+ Kernel.raise ArgumentError, 'cannot look for event by type and block'
367
+ end
368
+
369
+ if what.is_a?(Symbol)
370
+ C::XCheckTypedWindowEvent(display.to_ffi, to_ffi, Event.index(what), event) or return
371
+ else
372
+ old = reported_events
373
+ what = Mask::Event.all if what.nil?
374
+
375
+ self.reported_events += what unless options[:select] == false || old.has?(what)
376
+
377
+ if options[:blocking?] == false
378
+ C::XCheckWindowEvent(display.to_ffi, to_ffi, what.to_ffi, event) or return
379
+ else
380
+ C::XWindowEvent(display.to_ffi, to_ffi, what.to_ffi, event)
381
+ end
382
+
383
+ if options[:delete] == false
384
+ C::XPutBackEvent(to_ffi, event.to_ffi)
385
+ end
386
+
387
+ self.reported_events = old unless reported_events == old
388
+ end
389
+ end
390
+
391
+ Event.new(event)
392
+ end
393
+
394
+ def each_event (what=nil, options=nil, &block)
395
+ return unless block
396
+
397
+ catch(:skip) {
398
+ loop {
399
+ next_event(what, options).tap {|event|
400
+ if !event
401
+ return if options[:blocking] == false
402
+ next
403
+ end
404
+
405
+ block.call event
406
+ }
407
+ }
408
+ }
409
+ end
410
+
411
+ def inspect
412
+ begin
413
+ attributes.tap! {|attr|
414
+ "#<X11::Window(#{id}): #{attr.width}x#{attr.height} (#{attr.x}; #{attr.y})>"
415
+ }
416
+ rescue BadWindow
417
+ "#<X11::Window: invalid window>"
418
+ end
419
+ end
420
+
421
+ protected
422
+
423
+ def mode_to_int (mode)
424
+ (mode == true || mode == :async) ? 1 : 0
425
+ end
215
426
  end
216
427
 
217
428
  end