Handle X events in mruby class

pull/1/head
Takashi Kokubun 8 years ago
parent 0c531e1583
commit faf4a9ab40

@ -3,4 +3,6 @@ MRuby::Gem::Specification.new('xkremap') do |spec|
spec.author = 'Takashi Kokubun'
spec.summary = 'Dynamic key remapper for X Window System'
spec.bins = ['xkremap']
spec.add_dependency 'mruby-eval', core: 'mruby-eval'
end

@ -5,16 +5,19 @@ module Xkremap
def initialize(config, display)
@config = config
@display = display
# grab keys
end
def handle_key_press(serial, keycode, state)
p serial
def handle_key_press(keycode, state)
puts 'Event: key_press'
end
def handle_property_notify(serial)
def handle_property_notify
puts 'Event: property_notify'
end
def handle_mapping_notify(serial)
def handle_mapping_notify
puts 'Event: mapping_notify'
end
end
end

@ -40,6 +40,9 @@ load_config(mrb_state *mrb, char *filename)
struct RClass *mXkremap = mrb_module_get(mrb, "Xkremap");
struct RClass *cConfig = mrb_class_get_under(mrb, mXkremap, "Config");
mrb_value config = mrb_funcall(mrb, mrb_obj_value(cConfig), "load", 1, mrb_str_new_cstr(mrb, dsl));
if (mrb->exc) {
mrb_print_error(mrb);
}
free(dsl);
return config;

@ -4,20 +4,35 @@
mrb_value
new_event_handler(mrb_state *mrb, mrb_value config, Display *display)
{
return mrb_nil_value();
struct RClass *mXkremap = mrb_module_get(mrb, "Xkremap");
struct RClass *cEventHandler = mrb_class_get_under(mrb, mXkremap, "EventHandler");
return mrb_funcall(mrb, mrb_obj_value(cEventHandler), "new", 2, config, mrb_nil_value());
}
void
handle_key_press(mrb_state *mrb, mrb_value event_handler, unsigned long serial, unsigned int keycode, unsigned int state)
handle_key_press(mrb_state *mrb, mrb_value event_handler, unsigned int keycode, unsigned int state)
{
mrb_funcall(mrb, event_handler, "handle_key_press", 2,
mrb_fixnum_value(keycode), mrb_fixnum_value(state));
if (mrb->exc) {
mrb_print_error(mrb);
}
}
void
handle_property_notify(mrb_state *mrb, mrb_value event_handler, unsigned long serial)
handle_property_notify(mrb_state *mrb, mrb_value event_handler)
{
mrb_funcall(mrb, event_handler, "handle_property_notify", 0);
if (mrb->exc) {
mrb_print_error(mrb);
}
}
void
handle_mapping_notify(mrb_state *mrb, mrb_value event_handler, unsigned long serial)
handle_mapping_notify(mrb_state *mrb, mrb_value event_handler)
{
mrb_funcall(mrb, event_handler, "handle_mapping_notify", 0);
if (mrb->exc) {
mrb_print_error(mrb);
}
}

@ -21,16 +21,16 @@ event_loop(Display *display, mrb_state *mrb, mrb_value event_handler)
XNextEvent(display, &event);
switch (event.type) {
case KeyPress:
handle_key_press(mrb, event_handler, event.xkey.serial, event.xkey.keycode, event.xkey.state);
handle_key_press(mrb, event_handler, event.xkey.keycode, event.xkey.state);
break;
case KeyRelease:
// ignore. Is it necessary to handle this?
break;
case PropertyNotify:
handle_property_notify(mrb, event_handler, event.xproperty.serial);
handle_property_notify(mrb, event_handler);
break;
case MappingNotify:
handle_mapping_notify(mrb, event_handler, event.xmapping.serial);
handle_mapping_notify(mrb, event_handler);
break;
default:
fprintf(stderr, "unexpected event detected! (%d)\n", event.type);

@ -6,6 +6,6 @@ mrb_value load_config(mrb_state *mrb, char *filename);
// event_handler.c
mrb_value new_event_handler(mrb_state *mrb, mrb_value config, Display *display);
void handle_key_press(mrb_state *mrb, mrb_value event_handler, unsigned long serial, unsigned int state, unsigned int keycode);
void handle_property_notify(mrb_state *mrb, mrb_value event_handler, unsigned long serial);
void handle_mapping_notify(mrb_state *mrb, mrb_value event_handler, unsigned long serial);
void handle_key_press(mrb_state *mrb, mrb_value event_handler, unsigned int state, unsigned int keycode);
void handle_property_notify(mrb_state *mrb, mrb_value event_handler);
void handle_mapping_notify(mrb_state *mrb, mrb_value event_handler);

Loading…
Cancel
Save