libx11 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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/README.md +2 -2
- data/bin/console +4 -11
- data/example/window_manager.rb +53 -0
- data/ext/libx11_ruby/display.c +40 -4
- data/ext/libx11_ruby/libx11_ruby.c +2 -1
- data/ext/libx11_ruby/libx11_ruby.h +2 -2
- data/ext/libx11_ruby/xerror_event.c +104 -0
- data/ext/libx11_ruby/xevent.c +132 -0
- data/lib/libx11/version.rb +1 -1
- data/libx11.gemspec +3 -2
- metadata +21 -5
- data/ext/libx11_ruby/event.c +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 996d4981cc702796abf6b30fb2b661e5361ae55b
|
4
|
+
data.tar.gz: 84f21999388262f0e1160a20edc1cd78e9aac4aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2f137d6b53df72a7b4253346eef3b438ebce9900ea88d9e0324d8390230253f138f726acc7721b0ea13991a1e9bad6130010f057c0c9bcb419b592e961a905a
|
7
|
+
data.tar.gz: 6017df38ffec47e0d79bc41f1fdfad7c2a048f220799ba8bcfe5ae0fa249a9a504dad401d56e488f2eebaf7712d224eb363bd9caeab2205160f5eb61cf1c2d30
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
data/bin/console
CHANGED
@@ -1,14 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'libx11'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
6
|
+
require 'pry'
|
7
|
+
Pry.start
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'libx11'
|
2
|
+
|
3
|
+
class XServer
|
4
|
+
def self.with_connection
|
5
|
+
display = LibX11.xopen_display
|
6
|
+
yield(display)
|
7
|
+
ensure
|
8
|
+
LibX11.xclose_display(display)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.bind_events(display, window, event_mask)
|
12
|
+
wm_detected = false
|
13
|
+
LibX11.xset_error_handler do |display, error|
|
14
|
+
if error.error_code == LibX11::XErrorEvent::BAD_ACCESS
|
15
|
+
wm_detected = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
display.xselect_input(window, event_mask)
|
20
|
+
display.xsync(false)
|
21
|
+
|
22
|
+
if wm_detected
|
23
|
+
abort "Another window manager detected!\n#{display.xdisplay_string}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
XServer.with_connection do |display|
|
29
|
+
XServer.bind_events(
|
30
|
+
display, display.default_root_window,
|
31
|
+
LibX11::XEvent::KEY_PRESS_MASK |
|
32
|
+
LibX11::XEvent::SUBSTRUCTURE_REDIRECT_MASK |
|
33
|
+
LibX11::XEvent::SUBSTRUCTURE_NOTIFY_MASK,
|
34
|
+
)
|
35
|
+
|
36
|
+
LibX11.xset_error_handler do |display, error|
|
37
|
+
$stderr.puts "Error detected: (error_code=#{error.error_code})"
|
38
|
+
end
|
39
|
+
|
40
|
+
loop do
|
41
|
+
event = LibX11.xnext_event(display)
|
42
|
+
case event.type
|
43
|
+
when LibX11::XEvent::CREATE_NOTIFY
|
44
|
+
# hook creation
|
45
|
+
when LibX11::XEvent::DESTROY_NOTIFY
|
46
|
+
# hook destruction
|
47
|
+
when LibX11::XEvent::REPARENT_NOTIFY
|
48
|
+
# hook reparenting
|
49
|
+
when LibX11::XEvent::KEY_PRESS
|
50
|
+
break
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/ext/libx11_ruby/display.c
CHANGED
@@ -27,12 +27,20 @@ const rb_data_type_t display_type = {
|
|
27
27
|
* Xlib XOpenDisplay
|
28
28
|
*/
|
29
29
|
static VALUE
|
30
|
-
rb_libx11_xopen_display(VALUE
|
30
|
+
rb_libx11_xopen_display(int argc, VALUE *argv, RB_UNUSED_VAR(VALUE self))
|
31
31
|
{
|
32
32
|
Display *display;
|
33
|
-
Check_Type(display_name, T_STRING);
|
34
33
|
|
35
|
-
|
34
|
+
if (argc == 0) {
|
35
|
+
display = XOpenDisplay(NULL);
|
36
|
+
} else {
|
37
|
+
VALUE display_name;
|
38
|
+
|
39
|
+
rb_check_arity(argc, 1, 1);
|
40
|
+
rb_scan_args(argc, argv, "10", &display_name);
|
41
|
+
Check_Type(display_name, T_STRING);
|
42
|
+
display = XOpenDisplay(RSTRING_PTR(display_name));
|
43
|
+
}
|
36
44
|
return TypedData_Wrap_Struct(rb_cDisplay, &display_type, display);
|
37
45
|
}
|
38
46
|
|
@@ -62,6 +70,18 @@ rb_display_default_screen(VALUE self)
|
|
62
70
|
return INT2NUM(DefaultScreen(display));
|
63
71
|
}
|
64
72
|
|
73
|
+
/*
|
74
|
+
* Xlib XDisplayString
|
75
|
+
*/
|
76
|
+
static VALUE
|
77
|
+
rb_display_xdisplay_string(VALUE self)
|
78
|
+
{
|
79
|
+
Display *display;
|
80
|
+
|
81
|
+
TypedData_Get_Struct(self, Display, &display_type, display);
|
82
|
+
return rb_str_new_cstr(XDisplayString(display));
|
83
|
+
}
|
84
|
+
|
65
85
|
/*
|
66
86
|
* Xlib DefaultRootWindow
|
67
87
|
*/
|
@@ -130,17 +150,33 @@ rb_display_xmap_window(VALUE self, VALUE window)
|
|
130
150
|
return INT2NUM(ret);
|
131
151
|
}
|
132
152
|
|
153
|
+
/*
|
154
|
+
* Xlib XSync
|
155
|
+
*/
|
156
|
+
static VALUE
|
157
|
+
rb_display_xsync(VALUE self, VALUE discard)
|
158
|
+
{
|
159
|
+
Display *display;
|
160
|
+
int ret;
|
161
|
+
|
162
|
+
TypedData_Get_Struct(self, Display, &display_type, display);
|
163
|
+
ret = XSync(display, RTEST(discard));
|
164
|
+
return INT2NUM(ret);
|
165
|
+
}
|
166
|
+
|
133
167
|
void
|
134
168
|
Init_libx11_display(void)
|
135
169
|
{
|
136
|
-
rb_define_singleton_method(rb_mLibX11, "xopen_display", rb_libx11_xopen_display, 1);
|
170
|
+
rb_define_singleton_method(rb_mLibX11, "xopen_display", rb_libx11_xopen_display, -1);
|
137
171
|
rb_define_singleton_method(rb_mLibX11, "xclose_display", rb_libx11_xclose_display, 1);
|
138
172
|
|
139
173
|
rb_cDisplay = rb_define_class_under(rb_mLibX11, "Display", rb_cData);
|
140
174
|
rb_define_method(rb_cDisplay, "default_root_window", rb_display_default_root_window, 0);
|
141
175
|
rb_define_method(rb_cDisplay, "default_screen", rb_display_default_screen, 0);
|
176
|
+
rb_define_method(rb_cDisplay, "xdisplay_string", rb_display_xdisplay_string, 0);
|
142
177
|
rb_define_method(rb_cDisplay, "black_pixel", rb_display_black_pixel, 1);
|
143
178
|
rb_define_method(rb_cDisplay, "white_pixel", rb_display_white_pixel, 1);
|
144
179
|
rb_define_method(rb_cDisplay, "xmap_window", rb_display_xmap_window, 1);
|
145
180
|
rb_define_method(rb_cDisplay, "xselect_input", rb_display_xselect_input, 2);
|
181
|
+
rb_define_method(rb_cDisplay, "xsync", rb_display_xsync, 1);
|
146
182
|
}
|
@@ -2,12 +2,12 @@
|
|
2
2
|
#define LIBX11_RUBY_H 1
|
3
3
|
|
4
4
|
#include "ruby.h"
|
5
|
-
#include <X11/Xlib.h>
|
6
5
|
|
7
6
|
VALUE rb_mLibX11;
|
8
7
|
|
9
8
|
void Init_libx11_display(void);
|
10
|
-
void Init_libx11_event(void);
|
11
9
|
void Init_libx11_window(void);
|
10
|
+
void Init_libx11_xerror_event(void);
|
11
|
+
void Init_libx11_xevent(void);
|
12
12
|
|
13
13
|
#endif /* LIBX11_RUBY_H */
|
@@ -0,0 +1,104 @@
|
|
1
|
+
#include "libx11_ruby.h"
|
2
|
+
#include <X11/Xlib.h>
|
3
|
+
|
4
|
+
extern VALUE rb_cDisplay;
|
5
|
+
VALUE rb_cXErrorEvent;
|
6
|
+
|
7
|
+
extern rb_data_type_t display_type;
|
8
|
+
|
9
|
+
static size_t
|
10
|
+
xerror_event_dsize(const void *arg)
|
11
|
+
{
|
12
|
+
const XErrorEvent *event = arg;
|
13
|
+
return sizeof(event);
|
14
|
+
}
|
15
|
+
|
16
|
+
const rb_data_type_t xerror_event_type = {
|
17
|
+
.wrap_struct_name = "libx11_xerror_event",
|
18
|
+
.function = {
|
19
|
+
.dmark = NULL,
|
20
|
+
.dfree = NULL,
|
21
|
+
.dsize = xerror_event_dsize,
|
22
|
+
.reserved = { NULL, NULL },
|
23
|
+
},
|
24
|
+
.parent = NULL,
|
25
|
+
.data = NULL,
|
26
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
27
|
+
};
|
28
|
+
|
29
|
+
static VALUE error_handler_proc = Qnil;
|
30
|
+
|
31
|
+
static int
|
32
|
+
error_handler_func(Display *display, XErrorEvent *event)
|
33
|
+
{
|
34
|
+
if (NIL_P(error_handler_proc)) {
|
35
|
+
return 1;
|
36
|
+
} else {
|
37
|
+
VALUE args = rb_ary_new();
|
38
|
+
rb_ary_push(args, TypedData_Wrap_Struct(rb_cDisplay, &display_type, display));
|
39
|
+
rb_ary_push(args, TypedData_Wrap_Struct(rb_cXErrorEvent, &xerror_event_type, event));
|
40
|
+
rb_proc_call(error_handler_proc, args);
|
41
|
+
return 0;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
/*
|
46
|
+
* Xlib XSetErrorHandler
|
47
|
+
*/
|
48
|
+
static VALUE
|
49
|
+
rb_libx11_xset_error_handler(int argc, VALUE *argv, VALUE self)
|
50
|
+
{
|
51
|
+
rb_check_arity(argc, 0, 0);
|
52
|
+
rb_scan_args(argc, argv, "00&", &error_handler_proc);
|
53
|
+
|
54
|
+
XSetErrorHandler(error_handler_func);
|
55
|
+
return Qnil;
|
56
|
+
}
|
57
|
+
|
58
|
+
static VALUE
|
59
|
+
rb_xerror_event_error_code(VALUE self)
|
60
|
+
{
|
61
|
+
XErrorEvent *event;
|
62
|
+
TypedData_Get_Struct(self, XErrorEvent, &xerror_event_type, event);
|
63
|
+
return INT2FIX(event->error_code);
|
64
|
+
}
|
65
|
+
|
66
|
+
static VALUE
|
67
|
+
rb_xerror_event_type(VALUE self)
|
68
|
+
{
|
69
|
+
XErrorEvent *event;
|
70
|
+
TypedData_Get_Struct(self, XErrorEvent, &xerror_event_type, event);
|
71
|
+
return INT2FIX(event->type);
|
72
|
+
}
|
73
|
+
|
74
|
+
void
|
75
|
+
Init_libx11_xerror_event(void)
|
76
|
+
{
|
77
|
+
rb_define_singleton_method(rb_mLibX11, "xset_error_handler", rb_libx11_xset_error_handler, -1);
|
78
|
+
|
79
|
+
rb_cXErrorEvent = rb_define_class_under(rb_mLibX11, "XErrorEvent", rb_cData);
|
80
|
+
rb_define_method(rb_cXErrorEvent, "error_code", rb_xerror_event_error_code, 0);
|
81
|
+
rb_define_method(rb_cXErrorEvent, "type", rb_xerror_event_type, 0);
|
82
|
+
|
83
|
+
// error codes
|
84
|
+
rb_define_const(rb_cXErrorEvent, "SUCCESS", INT2FIX(Success));
|
85
|
+
rb_define_const(rb_cXErrorEvent, "BAD_REQUEST", INT2FIX(BadRequest));
|
86
|
+
rb_define_const(rb_cXErrorEvent, "BAD_VALUE", INT2FIX(BadValue));
|
87
|
+
rb_define_const(rb_cXErrorEvent, "BAD_WINDOW", INT2FIX(BadWindow));
|
88
|
+
rb_define_const(rb_cXErrorEvent, "BAD_PIXMAP", INT2FIX(BadPixmap));
|
89
|
+
rb_define_const(rb_cXErrorEvent, "BAD_ATOM", INT2FIX(BadAtom));
|
90
|
+
rb_define_const(rb_cXErrorEvent, "BAD_CURSOR", INT2FIX(BadCursor));
|
91
|
+
rb_define_const(rb_cXErrorEvent, "BAD_FONT", INT2FIX(BadFont));
|
92
|
+
rb_define_const(rb_cXErrorEvent, "BAD_MATCH", INT2FIX(BadMatch));
|
93
|
+
rb_define_const(rb_cXErrorEvent, "BAD_DRAWABLE", INT2FIX(BadDrawable));
|
94
|
+
rb_define_const(rb_cXErrorEvent, "BAD_ACCESS", INT2FIX(BadAccess));
|
95
|
+
rb_define_const(rb_cXErrorEvent, "BAD_ALLOC", INT2FIX(BadAlloc));
|
96
|
+
rb_define_const(rb_cXErrorEvent, "BAD_COLOR", INT2FIX(BadColor));
|
97
|
+
rb_define_const(rb_cXErrorEvent, "BAD_GC", INT2FIX(BadGC));
|
98
|
+
rb_define_const(rb_cXErrorEvent, "BAD_ID_CHOICE", INT2FIX(BadIDChoice));
|
99
|
+
rb_define_const(rb_cXErrorEvent, "BAD_NAME", INT2FIX(BadName));
|
100
|
+
rb_define_const(rb_cXErrorEvent, "BAD_LENGTH", INT2FIX(BadLength));
|
101
|
+
rb_define_const(rb_cXErrorEvent, "BAD_IMPLEMENTATION", INT2FIX(BadImplementation));
|
102
|
+
rb_define_const(rb_cXErrorEvent, "FIRST_EXTENSION_ERROR", INT2FIX(FirstExtensionError));
|
103
|
+
rb_define_const(rb_cXErrorEvent, "LAST_EXTENSION_ERROR", INT2FIX(LastExtensionError));
|
104
|
+
}
|
@@ -0,0 +1,132 @@
|
|
1
|
+
#include "libx11_ruby.h"
|
2
|
+
#include <X11/Xlib.h>
|
3
|
+
|
4
|
+
VALUE rb_cXEvent;
|
5
|
+
|
6
|
+
extern rb_data_type_t display_type;
|
7
|
+
|
8
|
+
static void
|
9
|
+
xevent_dfree(void *arg)
|
10
|
+
{
|
11
|
+
XEvent *event = arg;
|
12
|
+
free(event);
|
13
|
+
}
|
14
|
+
|
15
|
+
static size_t
|
16
|
+
xevent_dsize(const void *arg)
|
17
|
+
{
|
18
|
+
const XEvent *event = arg;
|
19
|
+
return sizeof(event);
|
20
|
+
}
|
21
|
+
|
22
|
+
const rb_data_type_t xevent_type = {
|
23
|
+
.wrap_struct_name = "libx11_xevent",
|
24
|
+
.function = {
|
25
|
+
.dmark = NULL,
|
26
|
+
.dfree = xevent_dfree,
|
27
|
+
.dsize = xevent_dsize,
|
28
|
+
.reserved = { NULL, NULL },
|
29
|
+
},
|
30
|
+
.parent = NULL,
|
31
|
+
.data = NULL,
|
32
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
33
|
+
};
|
34
|
+
|
35
|
+
/*
|
36
|
+
* Xlib XNextEvent
|
37
|
+
*/
|
38
|
+
static VALUE
|
39
|
+
rb_libx11_xnext_event(VALUE self, VALUE obj)
|
40
|
+
{
|
41
|
+
Display *display;
|
42
|
+
XEvent *event;
|
43
|
+
|
44
|
+
TypedData_Get_Struct(obj, Display, &display_type, display);
|
45
|
+
|
46
|
+
event = (XEvent *)malloc(sizeof(XEvent));
|
47
|
+
XNextEvent(display, event);
|
48
|
+
return TypedData_Wrap_Struct(rb_cXEvent, &xevent_type, event);
|
49
|
+
}
|
50
|
+
|
51
|
+
static VALUE
|
52
|
+
rb_xevent_type(VALUE self)
|
53
|
+
{
|
54
|
+
XEvent *event;
|
55
|
+
|
56
|
+
TypedData_Get_Struct(self, XEvent, &xevent_type, event);
|
57
|
+
return INT2NUM(event->type);
|
58
|
+
}
|
59
|
+
|
60
|
+
void
|
61
|
+
Init_libx11_xevent(void)
|
62
|
+
{
|
63
|
+
rb_define_singleton_method(rb_mLibX11, "xnext_event", rb_libx11_xnext_event, 1);
|
64
|
+
|
65
|
+
rb_cXEvent = rb_define_class_under(rb_mLibX11, "XEvent", rb_cData);
|
66
|
+
rb_define_method(rb_cXEvent, "type", rb_xevent_type, 0);
|
67
|
+
|
68
|
+
// event masks
|
69
|
+
rb_define_const(rb_cXEvent, "NO_EVENT_MASK", LONG2NUM(NoEventMask));
|
70
|
+
rb_define_const(rb_cXEvent, "KEY_PRESS_MASK", LONG2NUM(KeyPressMask));
|
71
|
+
rb_define_const(rb_cXEvent, "KEY_RELEASE_MASK", LONG2NUM(KeyReleaseMask));
|
72
|
+
rb_define_const(rb_cXEvent, "BUTTON_PRESS_MASK", LONG2NUM(ButtonPressMask));
|
73
|
+
rb_define_const(rb_cXEvent, "BUTTON_RELEASE_MASK", LONG2NUM(ButtonReleaseMask));
|
74
|
+
rb_define_const(rb_cXEvent, "ENTER_WINDOW_MASK", LONG2NUM(EnterWindowMask));
|
75
|
+
rb_define_const(rb_cXEvent, "LEAVE_WINDOW_MASK", LONG2NUM(LeaveWindowMask));
|
76
|
+
rb_define_const(rb_cXEvent, "POINTER_MOTION_MASK", LONG2NUM(PointerMotionMask));
|
77
|
+
rb_define_const(rb_cXEvent, "POINTER_MOTION_HINT_MASK", LONG2NUM(PointerMotionHintMask));
|
78
|
+
rb_define_const(rb_cXEvent, "BUTTON1_MOTION_MASK", LONG2NUM(Button1MotionMask));
|
79
|
+
rb_define_const(rb_cXEvent, "BUTTON2_MOTION_MASK", LONG2NUM(Button2MotionMask));
|
80
|
+
rb_define_const(rb_cXEvent, "BUTTON3_MOTION_MASK", LONG2NUM(Button3MotionMask));
|
81
|
+
rb_define_const(rb_cXEvent, "BUTTON4_MOTION_MASK", LONG2NUM(Button4MotionMask));
|
82
|
+
rb_define_const(rb_cXEvent, "BUTTON5_MOTION_MASK", LONG2NUM(Button5MotionMask));
|
83
|
+
rb_define_const(rb_cXEvent, "BUTTON_MOTION_MASK", LONG2NUM(ButtonMotionMask));
|
84
|
+
rb_define_const(rb_cXEvent, "KEYMAP_STATE_MASK", LONG2NUM(KeymapStateMask));
|
85
|
+
rb_define_const(rb_cXEvent, "EXPOSURE_MASK", LONG2NUM(ExposureMask));
|
86
|
+
rb_define_const(rb_cXEvent, "VISIBILITY_CHANGE_MASK", LONG2NUM(VisibilityChangeMask));
|
87
|
+
rb_define_const(rb_cXEvent, "STRUCTURE_NOTIFY_MASK", LONG2NUM(StructureNotifyMask));
|
88
|
+
rb_define_const(rb_cXEvent, "RESIZE_REDIRECT_MASK", LONG2NUM(ResizeRedirectMask));
|
89
|
+
rb_define_const(rb_cXEvent, "SUBSTRUCTURE_NOTIFY_MASK", LONG2NUM(SubstructureNotifyMask));
|
90
|
+
rb_define_const(rb_cXEvent, "SUBSTRUCTURE_REDIRECT_MASK", LONG2NUM(SubstructureRedirectMask));
|
91
|
+
rb_define_const(rb_cXEvent, "FOCUS_CHANGE_MASK", LONG2NUM(FocusChangeMask));
|
92
|
+
rb_define_const(rb_cXEvent, "PROPERTY_CHANGE_MASK", LONG2NUM(PropertyChangeMask));
|
93
|
+
rb_define_const(rb_cXEvent, "COLORMAP_CHANGE_MASK", LONG2NUM(ColormapChangeMask));
|
94
|
+
rb_define_const(rb_cXEvent, "OWNER_GRAB_BUTTON_MASK", LONG2NUM(OwnerGrabButtonMask));
|
95
|
+
|
96
|
+
// event
|
97
|
+
rb_define_const(rb_cXEvent, "KEY_PRESS", INT2FIX(KeyPress));
|
98
|
+
rb_define_const(rb_cXEvent, "KEY_RELEASE", INT2FIX(KeyRelease));
|
99
|
+
rb_define_const(rb_cXEvent, "BUTTON_PRESS", INT2FIX(ButtonPress));
|
100
|
+
rb_define_const(rb_cXEvent, "BUTTON_RELEASE", INT2FIX(ButtonRelease));
|
101
|
+
rb_define_const(rb_cXEvent, "MOTION_NOTIFY", INT2FIX(MotionNotify));
|
102
|
+
rb_define_const(rb_cXEvent, "ENTER_NOTIFY", INT2FIX(EnterNotify));
|
103
|
+
rb_define_const(rb_cXEvent, "LEAVE_NOTIFY", INT2FIX(LeaveNotify));
|
104
|
+
rb_define_const(rb_cXEvent, "FOCUS_IN", INT2FIX(FocusIn));
|
105
|
+
rb_define_const(rb_cXEvent, "FOCUS_OUT", INT2FIX(FocusOut));
|
106
|
+
rb_define_const(rb_cXEvent, "KEYMAP_NOTIFY", INT2FIX(KeymapNotify));
|
107
|
+
rb_define_const(rb_cXEvent, "EXPOSE", INT2FIX(Expose));
|
108
|
+
rb_define_const(rb_cXEvent, "GRAPHICS_EXPOSE", INT2FIX(GraphicsExpose));
|
109
|
+
rb_define_const(rb_cXEvent, "NO_EXPOSE", INT2FIX(NoExpose));
|
110
|
+
rb_define_const(rb_cXEvent, "VISIBILITY_NOTIFY", INT2FIX(VisibilityNotify));
|
111
|
+
rb_define_const(rb_cXEvent, "CREATE_NOTIFY", INT2FIX(CreateNotify));
|
112
|
+
rb_define_const(rb_cXEvent, "DESTROY_NOTIFY", INT2FIX(DestroyNotify));
|
113
|
+
rb_define_const(rb_cXEvent, "UNMAP_NOTIFY", INT2FIX(UnmapNotify));
|
114
|
+
rb_define_const(rb_cXEvent, "MAP_NOTIFY", INT2FIX(MapNotify));
|
115
|
+
rb_define_const(rb_cXEvent, "MAP_REQUEST", INT2FIX(MapRequest));
|
116
|
+
rb_define_const(rb_cXEvent, "REPARENT_NOTIFY", INT2FIX(ReparentNotify));
|
117
|
+
rb_define_const(rb_cXEvent, "CONFIGURE_NOTIFY", INT2FIX(ConfigureNotify));
|
118
|
+
rb_define_const(rb_cXEvent, "CONFIGURE_REQUEST", INT2FIX(ConfigureRequest));
|
119
|
+
rb_define_const(rb_cXEvent, "GRAVITY_NOTIFY", INT2FIX(GravityNotify));
|
120
|
+
rb_define_const(rb_cXEvent, "RESIZE_REQUEST", INT2FIX(ResizeRequest));
|
121
|
+
rb_define_const(rb_cXEvent, "CIRCULATE_NOTIFY", INT2FIX(CirculateNotify));
|
122
|
+
rb_define_const(rb_cXEvent, "CIRCULATE_REQUEST", INT2FIX(CirculateRequest));
|
123
|
+
rb_define_const(rb_cXEvent, "PROPERTY_NOTIFY", INT2FIX(PropertyNotify));
|
124
|
+
rb_define_const(rb_cXEvent, "SELECTION_CLEAR", INT2FIX(SelectionClear));
|
125
|
+
rb_define_const(rb_cXEvent, "SELECTION_REQUEST", INT2FIX(SelectionRequest));
|
126
|
+
rb_define_const(rb_cXEvent, "SELKECTION_NOTIFY", INT2FIX(SelectionNotify));
|
127
|
+
rb_define_const(rb_cXEvent, "COLORMAP_NOTIFY", INT2FIX(ColormapNotify));
|
128
|
+
rb_define_const(rb_cXEvent, "CLIENT_MESSAGE", INT2FIX(ClientMessage));
|
129
|
+
rb_define_const(rb_cXEvent, "MAPPING_NOTIFY", INT2FIX(MappingNotify));
|
130
|
+
rb_define_const(rb_cXEvent, "GENERIC_EVENT", INT2FIX(GenericEvent));
|
131
|
+
rb_define_const(rb_cXEvent, "LAST_EVENT", INT2FIX(LASTEvent));
|
132
|
+
}
|
data/lib/libx11/version.rb
CHANGED
data/libx11.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Takashi Kokubun']
|
10
10
|
spec.email = ['takashikkbn@gmail.com']
|
11
11
|
|
12
|
-
spec.summary = 'Ruby binding
|
13
|
-
spec.description = 'Ruby binding
|
12
|
+
spec.summary = 'Ruby binding of libx11 mostly for xlib'
|
13
|
+
spec.description = 'Ruby binding of libx11 mostly for xlib'
|
14
14
|
spec.homepage = 'https://github.com/k0kubun/libx11-ruby'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
25
25
|
spec.add_development_dependency 'rake-compiler'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'pry-byebug'
|
27
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libx11
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,7 +66,21 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Ruby binding of libx11 mostly for xlib
|
70
84
|
email:
|
71
85
|
- takashikkbn@gmail.com
|
72
86
|
executables: []
|
@@ -84,12 +98,14 @@ files:
|
|
84
98
|
- bin/console
|
85
99
|
- bin/setup
|
86
100
|
- example/create_window.rb
|
101
|
+
- example/window_manager.rb
|
87
102
|
- ext/libx11_ruby/display.c
|
88
|
-
- ext/libx11_ruby/event.c
|
89
103
|
- ext/libx11_ruby/extconf.rb
|
90
104
|
- ext/libx11_ruby/libx11_ruby.c
|
91
105
|
- ext/libx11_ruby/libx11_ruby.h
|
92
106
|
- ext/libx11_ruby/window.c
|
107
|
+
- ext/libx11_ruby/xerror_event.c
|
108
|
+
- ext/libx11_ruby/xevent.c
|
93
109
|
- lib/libx11.rb
|
94
110
|
- lib/libx11/version.rb
|
95
111
|
- libx11.gemspec
|
@@ -116,6 +132,6 @@ rubyforge_project:
|
|
116
132
|
rubygems_version: 2.5.1
|
117
133
|
signing_key:
|
118
134
|
specification_version: 4
|
119
|
-
summary: Ruby binding
|
135
|
+
summary: Ruby binding of libx11 mostly for xlib
|
120
136
|
test_files: []
|
121
137
|
has_rdoc:
|
data/ext/libx11_ruby/event.c
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
#include "libx11_ruby.h"
|
2
|
-
#include <X11/Xlib.h>
|
3
|
-
|
4
|
-
VALUE rb_cXEvent;
|
5
|
-
|
6
|
-
extern rb_data_type_t display_type;
|
7
|
-
|
8
|
-
static void
|
9
|
-
xevent_dfree(void *arg)
|
10
|
-
{
|
11
|
-
XEvent *event = arg;
|
12
|
-
free(event);
|
13
|
-
}
|
14
|
-
|
15
|
-
static size_t
|
16
|
-
xevent_dsize(const void *arg)
|
17
|
-
{
|
18
|
-
const XEvent *event = arg;
|
19
|
-
return sizeof(event);
|
20
|
-
}
|
21
|
-
|
22
|
-
const rb_data_type_t xevent_type = {
|
23
|
-
.wrap_struct_name = "libx11_xevent",
|
24
|
-
.function = {
|
25
|
-
.dmark = NULL,
|
26
|
-
.dfree = xevent_dfree,
|
27
|
-
.dsize = xevent_dsize,
|
28
|
-
.reserved = { NULL, NULL },
|
29
|
-
},
|
30
|
-
.parent = NULL,
|
31
|
-
.data = NULL,
|
32
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
33
|
-
};
|
34
|
-
|
35
|
-
/*
|
36
|
-
* Xlib XNextEvent
|
37
|
-
*/
|
38
|
-
static VALUE
|
39
|
-
rb_libx11_xnext_event(VALUE self, VALUE obj)
|
40
|
-
{
|
41
|
-
Display *display;
|
42
|
-
XEvent *event;
|
43
|
-
|
44
|
-
TypedData_Get_Struct(obj, Display, &display_type, display);
|
45
|
-
|
46
|
-
event = (XEvent *)malloc(sizeof(XEvent));
|
47
|
-
XNextEvent(display, event);
|
48
|
-
return TypedData_Wrap_Struct(rb_cXEvent, &xevent_type, event);
|
49
|
-
}
|
50
|
-
|
51
|
-
static VALUE
|
52
|
-
rb_xevent_type(VALUE self)
|
53
|
-
{
|
54
|
-
XEvent *event;
|
55
|
-
|
56
|
-
TypedData_Get_Struct(self, XEvent, &xevent_type, event);
|
57
|
-
return INT2NUM(event->type);
|
58
|
-
}
|
59
|
-
|
60
|
-
void
|
61
|
-
Init_libx11_event(void)
|
62
|
-
{
|
63
|
-
rb_define_singleton_method(rb_mLibX11, "xnext_event", rb_libx11_xnext_event, 1);
|
64
|
-
|
65
|
-
rb_cXEvent = rb_define_class_under(rb_mLibX11, "XEvent", rb_cData);
|
66
|
-
rb_define_method(rb_cXEvent, "type", rb_xevent_type, 0);
|
67
|
-
|
68
|
-
rb_define_const(rb_cXEvent, "KEY_PRESS_MASK", LONG2FIX(KeyPressMask));
|
69
|
-
rb_define_const(rb_cXEvent, "KEY_PRESS", INT2FIX(KeyPress));
|
70
|
-
}
|