uh 2.0.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f3cb33e2f659ada575a93f36094c2755530caffa
4
- data.tar.gz: 4dc89c17b1b893192d39345f671ab2a6ff2abcb6
2
+ SHA256:
3
+ metadata.gz: 007c6cd4275c8fb92d69dd672ae7860fca0d947ea0b3073c8b75eab843e21915
4
+ data.tar.gz: 8f07c400caa8a07f5f8d0c5c2706091639b8d5f39acbf55d87d5fe62d40289cd
5
5
  SHA512:
6
- metadata.gz: 50393d467337936e5342d52144915d7c5f92b7326cdf1b89f8f68bfccebb6bea8a322ce437323a29d541e3774147281bfdc0fce3c6715707f54ea61f1a5ffcba
7
- data.tar.gz: 1edb62261e49e49c9e8fb333478a9d4f2671422660efc901495973e5ba7cb779e8590fd46382d1f0cf4bf8c45a93b2d34f20baba8b4089a2a0a898b75da4ef08
6
+ metadata.gz: 7b9afbebfe3cf8e5f67d05ea990d7968956549d9b94d71278de802508f73988b005e4a4b8147bcd71503c776758ab175b7188761f4b109acf5938a5040001ac1
7
+ data.tar.gz: b36c9e3f1d360a2f350258a36e306b069ec692e0811dfb707e3b77b2ba94d31af2845284992c7be5c00d0ec8e96f6cb8b3b18cd2c8eee44505c29e18a9b7e356
data/README.md CHANGED
@@ -1,18 +1,19 @@
1
1
  uh
2
2
  ==
3
3
 
4
- [![Version ][badge-version-img]][badge-version-uri]
5
- [![Build status ][badge-build-img]][badge-build-uri]
6
- [![Code Climate ][badge-cclimate-img]][badge-cclimate-uri]
7
-
8
-
9
4
  Minimalistic Xlib toolkit.
10
5
 
11
6
 
7
+ Similar or related code
8
+ -----------------------
12
9
 
13
- [badge-version-img]: https://img.shields.io/gem/v/uh.svg?style=flat-square
14
- [badge-version-uri]: https://rubygems.org/gems/uh
15
- [badge-build-img]: https://img.shields.io/travis/tjouan/uh/master.svg?style=flat-square
16
- [badge-build-uri]: https://travis-ci.org/tjouan/uh
17
- [badge-cclimate-img]: https://img.shields.io/codeclimate/github/tjouan/uh.svg?style=flat-square
18
- [badge-cclimate-uri]: https://codeclimate.com/github/tjouan/uh
10
+ * https://github.com/meh/ruby-x11 (gem, FFI, WM)
11
+ * https://github.com/ayanko/x11_client (gem, C ext)
12
+ * https://github.com/frankhale/ruby-window-management (C ext, WM)
13
+ * https://github.com/christopheraue/ruby-xlib (gem, FFI)
14
+ * https://github.com/rkh/ruby-xlib (C ext)
15
+ * https://github.com/rramsden/ruby-x11 (pure ruby)
16
+ * http://ruby-xlib-wrap.sourceforge.net/ (ext, SWIG)
17
+ * http://www.moriq.com/ruby/xlib/
18
+ * http://artengine.ca/matju/RubyX11/
19
+ * https://github.com/mhanne/ruby-xcb (XCB, FFI)
@@ -11,6 +11,7 @@
11
11
  VALUE rdisplay_error_handler = Qnil;
12
12
 
13
13
  int display_x_error_handler(Display *dpy, XErrorEvent *e);
14
+ int display_x_io_error_handler(Display *dpy);
14
15
 
15
16
 
16
17
  VALUE display_s_on_error(VALUE klass) {
@@ -132,10 +133,11 @@ VALUE display_open(VALUE self) {
132
133
  SET_DISPLAY(self);
133
134
 
134
135
  if (!(DPY = XOpenDisplay(NULL))) {
135
- rb_raise(eDisplayError, "cannot open display");
136
+ rb_raise(eDisplayError, "cannot open display %s", getenv("DISPLAY"));
136
137
  }
137
138
 
138
139
  XSetErrorHandler(display_x_error_handler);
140
+ XSetIOErrorHandler(display_x_io_error_handler);
139
141
 
140
142
  return self;
141
143
  }
@@ -146,7 +148,7 @@ VALUE display_opened_p(VALUE self) {
146
148
  return DPY ? Qtrue : Qfalse;
147
149
  }
148
150
 
149
- VALUE display_pending_p(VALUE self) {
151
+ VALUE display_pending(VALUE self) {
150
152
  SET_DISPLAY(self);
151
153
 
152
154
  rb_funcall(self, rb_intern("check!"), 0);
@@ -220,3 +222,9 @@ int display_x_error_handler(Display *dpy, XErrorEvent *e) {
220
222
 
221
223
  return 0;
222
224
  }
225
+
226
+ int display_x_io_error_handler(Display *dpy) {
227
+ rb_funcall(rdisplay_error_handler, rb_intern("call"), 0);
228
+
229
+ return 0;
230
+ }
@@ -7,7 +7,9 @@
7
7
 
8
8
 
9
9
  VALUE event_make_event(VALUE klass, XEvent *xev);
10
+ void event_make_configure_notify(VALUE self);
10
11
  void event_make_configure_request(VALUE self);
12
+ void event_make_expose(VALUE self);
11
13
  void event_make_key_any(VALUE self);
12
14
  void event_make_win_any(VALUE self);
13
15
 
@@ -19,9 +21,10 @@ VALUE event_make(XEvent *xev) {
19
21
  void (*function)(VALUE self);
20
22
  } EvClass;
21
23
  EvClass ev_classes[] = {
24
+ {ConfigureNotify, cConfigureNotify, event_make_configure_notify},
22
25
  {ConfigureRequest, cConfigureRequest, event_make_configure_request},
23
26
  {DestroyNotify, cDestroyNotify, NULL},
24
- {Expose, cExpose, NULL},
27
+ {Expose, cExpose, event_make_expose},
25
28
  {KeyPress, cKeyPress, event_make_key_any},
26
29
  {KeyRelease, cKeyRelease, event_make_key_any},
27
30
  {MapRequest, cMapRequest, NULL},
@@ -93,6 +96,15 @@ VALUE event_make_event(VALUE klass, XEvent *xev) {
93
96
  return event;
94
97
  }
95
98
 
99
+ void event_make_configure_notify(VALUE self) {
100
+ SET_XEV(self);
101
+
102
+ rb_ivar_set(self, rb_intern("@x"), INT2FIX(xev->xconfigure.x));
103
+ rb_ivar_set(self, rb_intern("@y"), INT2FIX(xev->xconfigure.y));
104
+ rb_ivar_set(self, rb_intern("@width"), INT2FIX(xev->xconfigure.width));
105
+ rb_ivar_set(self, rb_intern("@height"), INT2FIX(xev->xconfigure.height));
106
+ }
107
+
96
108
  void event_make_configure_request(VALUE self) {
97
109
  SET_XEV(self);
98
110
 
@@ -118,6 +130,15 @@ void event_make_configure_request(VALUE self) {
118
130
  LONG2NUM(xev->xconfigurerequest.detail));
119
131
  }
120
132
 
133
+ void event_make_expose(VALUE self) {
134
+ SET_XEV(self);
135
+
136
+ rb_ivar_set(self, rb_intern("@x"), INT2FIX(xev->xexpose.x));
137
+ rb_ivar_set(self, rb_intern("@y"), INT2FIX(xev->xexpose.y));
138
+ rb_ivar_set(self, rb_intern("@width"), INT2FIX(xev->xexpose.width));
139
+ rb_ivar_set(self, rb_intern("@height"), INT2FIX(xev->xexpose.height));
140
+ }
141
+
121
142
  void event_make_key_any(VALUE self) {
122
143
  KeySym ks;
123
144
  SET_XEV(self);
@@ -3,7 +3,7 @@ require 'mkmf'
3
3
  %w[X11 Xinerama].each { |e| fail "lib#{e} is required" unless have_library e }
4
4
 
5
5
  $CFLAGS << ' -std=c99 -Wall'
6
- if %w[DEBUG VALGRIND].any? { |e| ENV.key? e }
6
+ if ENV.key? 'DEBUG'
7
7
  $CFLAGS.gsub! /-O\d\s/, '-g '
8
8
  end
9
9
 
@@ -0,0 +1,74 @@
1
+ #include "uh.h"
2
+
3
+
4
+ #define SET_IMAGE(x) \
5
+ UhImage *image;\
6
+ Data_Get_Struct(x, UhImage, image);
7
+
8
+ #define DPY image->dpy
9
+ #define IMAGE image->image
10
+ #define GC image->gc
11
+
12
+
13
+ void image_deallocate(UhImage *image);
14
+
15
+
16
+ VALUE image_s_new(VALUE klass, VALUE rdisplay, VALUE rwidth, VALUE rheight, VALUE rdata) {
17
+ VALUE rimage;
18
+ SET_DISPLAY(rdisplay);
19
+
20
+ rb_funcall(rdisplay, rb_intern("check!"), 0);
21
+
22
+ StringValue(rdata);
23
+ rimage = image_make(
24
+ display->dpy,
25
+ FIX2INT(rwidth),
26
+ FIX2INT(rheight),
27
+ RSTRING_PTR(rdata)
28
+ );
29
+
30
+ return rimage;
31
+ }
32
+
33
+
34
+ VALUE image_put(VALUE self, VALUE rwindow) {
35
+ SET_IMAGE(self);
36
+
37
+ XPutImage(
38
+ DPY,
39
+ FIX2INT(rb_funcall(rwindow, rb_intern("id"), 0)),
40
+ GC,
41
+ IMAGE,
42
+ 0, 0,
43
+ 0, 0,
44
+ IMAGE->width, IMAGE->height
45
+ );
46
+
47
+ return Qnil;
48
+ }
49
+
50
+
51
+ VALUE image_make(Display *dpy, int width, int height, char *data) {
52
+ UhImage *image;
53
+ VALUE rimage;
54
+
55
+ rimage = Data_Make_Struct(cImage, UhImage, 0, image_deallocate, image);
56
+ image->dpy = dpy;
57
+ image->gc = XCreateGC(dpy, ROOT_DEFAULT, 0, NULL);
58
+ image->image = XCreateImage(
59
+ DPY,
60
+ DefaultVisual(DPY, DefaultScreen(DPY)),
61
+ DEPTH_DEFAULT,
62
+ ZPixmap, 0,
63
+ data, width, height,
64
+ 32, 0
65
+ );
66
+
67
+ return rimage;
68
+ }
69
+
70
+
71
+ void image_deallocate(UhImage *image) {
72
+ XDestroyImage(IMAGE);
73
+ free(image);
74
+ }
@@ -8,7 +8,6 @@
8
8
  #define DPY pixmap->dpy
9
9
  #define PIXMAP pixmap->pixmap
10
10
  #define GC pixmap->gc
11
- #define DEPTH_DEFAULT DefaultDepth(DPY, SCREEN_DEFAULT)
12
11
 
13
12
 
14
13
  void pixmap_deallocate(UhPixmap *p);
@@ -1,10 +1,23 @@
1
1
  #include "uh.h"
2
2
 
3
3
 
4
+ VALUE mUh, mEvents,
5
+ cColor,
6
+ cDisplay,
7
+ cEvent, cConfigureNotify, cConfigureRequest, cDestroyNotify, cExpose,
8
+ cKeyPress, cKeyRelease, cMapRequest, cPropertyNotify, cUnmapNotify,
9
+ cFont,
10
+ cImage,
11
+ cPixmap,
12
+ cScreen,
13
+ cWindow,
14
+ eError, eRuntimeError, eArgumentError, eDisplayError;
15
+
4
16
  void uh_color();
5
17
  void uh_display();
6
18
  void uh_events();
7
19
  void uh_font();
20
+ void uh_image();
8
21
  void uh_pixmap();
9
22
  void uh_screen();
10
23
  void uh_window();
@@ -22,6 +35,7 @@ void Init_uh(void) {
22
35
  uh_display();
23
36
  uh_events();
24
37
  uh_font();
38
+ uh_image();
25
39
  uh_pixmap();
26
40
  uh_screen();
27
41
  uh_window();
@@ -48,7 +62,7 @@ void uh_display() {
48
62
  rb_define_method(cDisplay, "next_event", display_next_event, 0);
49
63
  rb_define_method(cDisplay, "open", display_open, 0);
50
64
  rb_define_method(cDisplay, "opened?", display_opened_p, 0);
51
- rb_define_method(cDisplay, "pending", display_pending_p, 0);
65
+ rb_define_method(cDisplay, "pending", display_pending, 0);
52
66
  rb_define_method(cDisplay, "root", display_root, 0);
53
67
  rb_define_method(cDisplay, "screens", display_screens, 0);
54
68
  rb_define_method(cDisplay, "sync", display_sync, 1);
@@ -61,6 +75,12 @@ void uh_events() {
61
75
  rb_define_attr(cEvent, "type", 1, 0);
62
76
  rb_define_attr(cEvent, "window", 1, 0);
63
77
 
78
+ cConfigureNotify = rb_define_class_under(mEvents, "ConfigureNotify", cEvent);
79
+ rb_define_attr(cConfigureNotify, "x", 1, 0);
80
+ rb_define_attr(cConfigureNotify, "y", 1, 0);
81
+ rb_define_attr(cConfigureNotify, "width", 1, 0);
82
+ rb_define_attr(cConfigureNotify, "height", 1, 0);
83
+
64
84
  cConfigureRequest = rb_define_class_under(mEvents, "ConfigureRequest", cEvent);
65
85
  rb_define_attr(cConfigureRequest, "x", 1, 0);
66
86
  rb_define_attr(cConfigureRequest, "y", 1, 0);
@@ -73,6 +93,10 @@ void uh_events() {
73
93
  cDestroyNotify = rb_define_class_under(mEvents, "DestroyNotify", cEvent);
74
94
 
75
95
  cExpose = rb_define_class_under(mEvents, "Expose", cEvent);
96
+ rb_define_attr(cExpose, "x", 1, 0);
97
+ rb_define_attr(cExpose, "y", 1, 0);
98
+ rb_define_attr(cExpose, "width", 1, 0);
99
+ rb_define_attr(cExpose, "height", 1, 0);
76
100
 
77
101
  cKeyPress = rb_define_class_under(mEvents, "KeyPress", cEvent);
78
102
  rb_define_attr(cKeyPress, "key", 1, 0);
@@ -97,6 +121,12 @@ void uh_font() {
97
121
  rb_define_attr(cFont, "descent", 1, 0);
98
122
  }
99
123
 
124
+ void uh_image() {
125
+ cImage = rb_define_class_under(mUh, "Image", rb_cObject);
126
+ rb_define_singleton_method(cImage, "new", image_s_new, 4);
127
+ rb_define_method(cImage, "put", image_put, 1);
128
+ }
129
+
100
130
  void uh_pixmap() {
101
131
  cPixmap = rb_define_class_under(mUh, "Pixmap", rb_cObject);
102
132
  rb_define_singleton_method(cPixmap, "new", pixmap_s_new, 3);
@@ -128,6 +158,7 @@ void uh_window() {
128
158
  rb_define_method(cWindow, "configure_event", window_configure_event, 1);
129
159
  rb_define_method(cWindow, "create", window_create, 1);
130
160
  rb_define_method(cWindow, "create_sub", window_create_sub, 1);
161
+ rb_define_method(cWindow, "cursor=", window_cursor_set, 1);
131
162
  rb_define_method(cWindow, "destroy", window_destroy, 0);
132
163
  rb_define_method(cWindow, "focus", window_focus, 0);
133
164
  rb_define_method(cWindow, "icccm_wm_delete", window_icccm_wm_delete, 0);
@@ -144,4 +175,5 @@ void uh_window() {
144
175
  rb_define_method(cWindow, "raise", window_raise, 0);
145
176
  rb_define_method(cWindow, "unmap", window_unmap, 0);
146
177
  rb_define_method(cWindow, "wclass", window_wclass, 0);
178
+ rb_define_method(cWindow, "wclass=", window_wclass_set, 1);
147
179
  }
@@ -15,9 +15,11 @@
15
15
 
16
16
  #define ROOT_DEFAULT DefaultRootWindow(DPY)
17
17
  #define SCREEN_DEFAULT DefaultScreen(DPY)
18
+ #define DEPTH_DEFAULT DefaultDepth(DPY, SCREEN_DEFAULT)
18
19
 
19
20
 
20
21
  typedef struct s_display UhDisplay;
22
+ typedef struct s_image UhImage;
21
23
  typedef struct s_pixmap UhPixmap;
22
24
  typedef struct s_window UhWindow;
23
25
 
@@ -25,6 +27,12 @@ struct s_display {
25
27
  Display *dpy;
26
28
  };
27
29
 
30
+ struct s_image {
31
+ Display *dpy;
32
+ GC gc;
33
+ XImage *image;
34
+ };
35
+
28
36
  struct s_pixmap {
29
37
  Display *dpy;
30
38
  Pixmap pixmap;
@@ -37,12 +45,13 @@ struct s_window {
37
45
  };
38
46
 
39
47
 
40
- VALUE mUh, mEvents,
48
+ extern VALUE mUh, mEvents,
41
49
  cColor,
42
50
  cDisplay,
43
- cEvent, cConfigureRequest, cDestroyNotify, cExpose, cKeyPress, cKeyRelease,
44
- cMapRequest, cPropertyNotify, cUnmapNotify,
51
+ cEvent, cConfigureNotify, cConfigureRequest, cDestroyNotify, cExpose,
52
+ cKeyPress, cKeyRelease, cMapRequest, cPropertyNotify, cUnmapNotify,
45
53
  cFont,
54
+ cImage,
46
55
  cPixmap,
47
56
  cScreen,
48
57
  cWindow,
@@ -62,7 +71,7 @@ VALUE display_listen_events(int argc, VALUE *argv, VALUE self);
62
71
  VALUE display_next_event(VALUE self);
63
72
  VALUE display_open(VALUE self);
64
73
  VALUE display_opened_p(VALUE self);
65
- VALUE display_pending_p(VALUE self);
74
+ VALUE display_pending(VALUE self);
66
75
  VALUE display_root(VALUE self);
67
76
  VALUE display_root_change_attributes(VALUE self, VALUE mask);
68
77
  VALUE display_screens(VALUE self);
@@ -72,6 +81,10 @@ VALUE event_make(XEvent *xev);
72
81
 
73
82
  VALUE font_s_new(VALUE klass, VALUE rdisplay);
74
83
 
84
+ VALUE image_s_new(VALUE klass, VALUE rdisplay, VALUE rwidth, VALUE rheight, VALUE rdata);
85
+ VALUE image_make(Display *dpy, int w, int h, char *data);
86
+ VALUE image_put(VALUE self, VALUE rwindow);
87
+
75
88
  VALUE pixmap_s_new(VALUE klass, VALUE rdisplay, VALUE rwidth, VALUE rheight);
76
89
  VALUE pixmap_copy(VALUE self, VALUE rwindow);
77
90
  VALUE pixmap_draw_rect(VALUE self, VALUE x, VALUE y, VALUE w, VALUE h);
@@ -88,6 +101,7 @@ VALUE window_configure(VALUE self, VALUE rgeo);
88
101
  VALUE window_configure_event(VALUE self, VALUE rgeo);
89
102
  VALUE window_create(VALUE self, VALUE rgeo);
90
103
  VALUE window_create_sub(VALUE self, VALUE rgeo);
104
+ VALUE window_cursor_set(VALUE self, VALUE cursor);
91
105
  VALUE window_destroy(VALUE self);
92
106
  VALUE window_focus(VALUE self);
93
107
  VALUE window_icccm_wm_delete(VALUE self);
@@ -103,6 +117,7 @@ VALUE window_override_redirect(VALUE self);
103
117
  VALUE window_raise(VALUE self);
104
118
  VALUE window_unmap(VALUE self);
105
119
  VALUE window_wclass(VALUE self);
120
+ VALUE window_wclass_set(VALUE self, VALUE rwclass);
106
121
  int window_id(VALUE window);
107
122
  VALUE window_make(Display *display, Window window_id);
108
123
 
@@ -92,6 +92,16 @@ VALUE window_create_sub(VALUE self, VALUE rgeo) {
92
92
  return window_make(DPY, sub_win);
93
93
  }
94
94
 
95
+ VALUE window_cursor_set(VALUE self, VALUE rcursor) {
96
+ Cursor cursor;
97
+ SET_WINDOW(self);
98
+
99
+ cursor = XCreateFontCursor(DPY, FIX2INT(rcursor));
100
+ XDefineCursor(DPY, WINDOW, cursor);
101
+
102
+ return Qnil;
103
+ }
104
+
95
105
  VALUE window_destroy(VALUE self) {
96
106
  SET_WINDOW(self);
97
107
 
@@ -257,6 +267,26 @@ VALUE window_wclass(VALUE self) {
257
267
  return wclass;
258
268
  }
259
269
 
270
+ VALUE window_wclass_set(VALUE self, VALUE rwclass) {
271
+ XClassHint *ch;
272
+ VALUE rres_name;
273
+ VALUE rres_class;
274
+ SET_WINDOW(self);
275
+
276
+ rres_name = rb_ary_entry(rwclass, 0);
277
+ StringValue(rres_name);
278
+ rres_class = rb_ary_entry(rwclass, 1);
279
+ StringValue(rres_class);
280
+ if ((ch = XAllocClassHint())) {
281
+ ch->res_name = RSTRING_PTR(rres_name);
282
+ ch->res_class = RSTRING_PTR(rres_class);
283
+ XSetClassHint(DPY, WINDOW, ch);
284
+ XFree(ch);
285
+ }
286
+
287
+ return Qnil;
288
+ }
289
+
260
290
 
261
291
  int window_id(VALUE self) {
262
292
  SET_WINDOW(self);
data/lib/uh.rb CHANGED
@@ -10,6 +10,87 @@ require 'uh/version'
10
10
  require 'uh/window'
11
11
 
12
12
  module Uh
13
+ CURSORS = {
14
+ num_glyphs: 154,
15
+ x_cursor: 0,
16
+ arrow: 2,
17
+ based_arrow_down: 4,
18
+ based_arrow_up: 6,
19
+ boat: 8,
20
+ bogosity: 10,
21
+ bottom_left_corner: 12,
22
+ bottom_right_corner: 14,
23
+ bottom_side: 16,
24
+ bottom_tee: 18,
25
+ box_spiral: 20,
26
+ center_ptr: 22,
27
+ circle: 24,
28
+ clock: 26,
29
+ coffee_mug: 28,
30
+ cross: 30,
31
+ cross_reverse: 32,
32
+ crosshair: 34,
33
+ diamond_cross: 36,
34
+ dot: 38,
35
+ dotbox: 40,
36
+ double_arrow: 42,
37
+ draft_large: 44,
38
+ draft_small: 46,
39
+ draped_box: 48,
40
+ exchange: 50,
41
+ fleur: 52,
42
+ gobbler: 54,
43
+ gumby: 56,
44
+ hand1: 58,
45
+ hand2: 60,
46
+ heart: 62,
47
+ icon: 64,
48
+ iron_cross: 66,
49
+ left_ptr: 68,
50
+ left_side: 70,
51
+ left_tee: 72,
52
+ leftbutton: 74,
53
+ ll_angle: 76,
54
+ lr_angle: 78,
55
+ man: 80,
56
+ middlebutton: 82,
57
+ mouse: 84,
58
+ pencil: 86,
59
+ pirate: 88,
60
+ plus: 90,
61
+ question_arrow: 92,
62
+ right_ptr: 94,
63
+ right_side: 96,
64
+ right_tee: 98,
65
+ rightbutton: 100,
66
+ rtl_logo: 102,
67
+ sailboat: 104,
68
+ sb_down_arrow: 106,
69
+ sb_h_double_arrow: 108,
70
+ sb_left_arrow: 110,
71
+ sb_right_arrow: 112,
72
+ sb_up_arrow: 114,
73
+ sb_v_double_arrow: 116,
74
+ shuttle: 118,
75
+ sizing: 120,
76
+ spider: 122,
77
+ spraycan: 124,
78
+ star: 126,
79
+ target: 128,
80
+ tcross: 130,
81
+ top_left_arrow: 132,
82
+ top_left_corner: 134,
83
+ top_right_corner: 136,
84
+ top_side: 138,
85
+ top_tee: 140,
86
+ trek: 142,
87
+ ul_angle: 144,
88
+ umbrella: 146,
89
+ ur_angle: 148,
90
+ watch: 150,
91
+ xterm: 152,
92
+ }
93
+
13
94
  KEY_MODIFIERS = {
14
95
  shift: 1 << 0,
15
96
  lock: 1 << 1,
@@ -20,4 +101,15 @@ module Uh
20
101
  mod4: 1 << 6,
21
102
  mod5: 1 << 7
22
103
  }.freeze
104
+
105
+ class << self
106
+ def open
107
+ display = Display.new.tap &:open
108
+ begin
109
+ yield display
110
+ ensure
111
+ display.close
112
+ end
113
+ end
114
+ end
23
115
  end
@@ -8,19 +8,23 @@ module Uh
8
8
  fail DisplayError, 'display not opened' unless opened?
9
9
  end
10
10
 
11
- def color_by_name(color_name)
12
- Color.new(self, color_name)
11
+ def color_by_name color_name
12
+ Color.new self, color_name
13
13
  end
14
14
 
15
- def create_pixmap(width, height)
16
- Pixmap.new(self, width, height)
15
+ def create_image width, height, image
16
+ Image.new self, width, height, image
17
17
  end
18
18
 
19
- def create_window(geo)
19
+ def create_pixmap width, height
20
+ Pixmap.new self, width, height
21
+ end
22
+
23
+ def create_window geo
20
24
  root.create geo
21
25
  end
22
26
 
23
- def create_subwindow(geo)
27
+ def create_subwindow geo
24
28
  root.create_sub geo
25
29
  end
26
30
 
@@ -33,7 +37,20 @@ module Uh
33
37
  end
34
38
 
35
39
  def query_font
36
- Font.new(self)
40
+ Font.new self
41
+ end
42
+
43
+ def window **opts
44
+ window = create_window Geo.new 0, 0, 320, 240
45
+ listen_events window, opts[:events] if opts.key? :events
46
+ window.cursor opts[:cursor] if opts.key? :cursor
47
+ window.map
48
+ begin
49
+ yield window
50
+ ensure
51
+ window.unmap
52
+ window.destroy
53
+ end
37
54
  end
38
55
  end
39
56
  end
@@ -1,7 +1,7 @@
1
1
  module Uh
2
- class Geo < Struct.new(:x, :y, :width, :height)
2
+ class Geo < Struct.new :x, :y, :width, :height
3
3
  class << self
4
- def format_xgeometry(x, y, width, height)
4
+ def format_xgeometry x, y, width, height
5
5
  '%sx%s+%s+%s' % [
6
6
  width ? width.to_s : ??,
7
7
  height ? height.to_s : ??,
@@ -11,7 +11,7 @@ module Uh
11
11
  end
12
12
  end
13
13
 
14
- def initialize(*args)
14
+ def initialize *args
15
15
  super
16
16
  %i[width height].each do |dimension|
17
17
  check_value dimension, send(dimension)
@@ -22,20 +22,20 @@ module Uh
22
22
  self.class.format_xgeometry *values
23
23
  end
24
24
 
25
- def width=(value)
25
+ def width= value
26
26
  check_value :width, value
27
27
  super value
28
28
  end
29
29
 
30
- def height=(value)
30
+ def height= value
31
31
  check_value :height, value
32
32
  super value
33
33
  end
34
34
 
35
35
 
36
- private
36
+ private
37
37
 
38
- def check_value(name, value)
38
+ def check_value name, value
39
39
  return if value.nil?
40
40
  fail ArgumentError, "invalid #{name.to_s}: #{value}" unless value > 0
41
41
  end
@@ -1,7 +1,7 @@
1
1
  module Uh
2
2
  class Screen
3
3
  def geo
4
- @geo ||= Geo.new(x, y, width, height)
4
+ @geo ||= Geo.new x, y, width, height
5
5
  end
6
6
  end
7
7
  end
@@ -1,3 +1,3 @@
1
1
  module Uh
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.1.1'.freeze
3
3
  end
@@ -4,8 +4,12 @@ module Uh
4
4
  id.to_s
5
5
  end
6
6
 
7
- def ==(other)
7
+ def == other
8
8
  id == other.id
9
9
  end
10
+
11
+ def cursor cursor_name
12
+ self.cursor = Uh::CURSORS[cursor_name]
13
+ end
10
14
  end
11
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uh
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thibault Jouan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-28 00:00:00.000000000 Z
11
+ date: 2020-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '10.4'
19
+ version: '10'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '10.4'
26
+ version: '10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake-compiler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.9'
33
+ version: '1.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.9'
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,21 +66,7 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
- - !ruby/object:Gem::Dependency
70
- name: headless
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.0'
83
- description: uh
69
+ description:
84
70
  email: tj@a13.fr
85
71
  executables: []
86
72
  extensions:
@@ -94,6 +80,7 @@ files:
94
80
  - ext/uh/event.c
95
81
  - ext/uh/extconf.rb
96
82
  - ext/uh/font.c
83
+ - ext/uh/image.c
97
84
  - ext/uh/pixmap.c
98
85
  - ext/uh/screen.c
99
86
  - ext/uh/uh.c
@@ -113,7 +100,7 @@ homepage: https://rubygems.org/gems/uh
113
100
  licenses:
114
101
  - BSD-3-Clause
115
102
  metadata: {}
116
- post_install_message:
103
+ post_install_message:
117
104
  rdoc_options: []
118
105
  require_paths:
119
106
  - lib
@@ -128,9 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
115
  - !ruby/object:Gem::Version
129
116
  version: '0'
130
117
  requirements: []
131
- rubyforge_project:
132
- rubygems_version: 2.4.5
133
- signing_key:
118
+ rubygems_version: 3.0.6
119
+ signing_key:
134
120
  specification_version: 4
135
121
  summary: Xlib simplified toolkit
136
122
  test_files: []