mirror of https://github.com/k0kubun/xremap
Grab key by mruby
parent
faf4a9ab40
commit
36d41a3c99
@ -0,0 +1,45 @@
|
||||
#include <X11/Xlib.h>
|
||||
#include "mruby.h"
|
||||
#include "mruby/data.h"
|
||||
|
||||
struct mrb_display {
|
||||
Display *display;
|
||||
};
|
||||
|
||||
static void
|
||||
mrb_display_free(mrb_state *mrb, void *ptr)
|
||||
{
|
||||
struct mrb_display *display = (struct mrb_display *)ptr;
|
||||
if (display != NULL) {
|
||||
mrb_free(mrb, display);
|
||||
}
|
||||
}
|
||||
|
||||
struct mrb_data_type mrb_display_type = { "Display", mrb_display_free };
|
||||
|
||||
mrb_value
|
||||
mrb_wrap_x_display(mrb_state *mrb, Display *display)
|
||||
{
|
||||
struct RClass *mXkremap = mrb_module_get(mrb, "Xkremap");
|
||||
struct RClass *cDisplay = mrb_class_get_under(mrb, mXkremap, "Display");
|
||||
|
||||
struct mrb_display *display_ptr = (struct mrb_display *)mrb_malloc(mrb, sizeof(struct mrb_display));
|
||||
display_ptr->display = display;
|
||||
mrb_value display_obj = mrb_obj_value(mrb_data_object_alloc(mrb, cDisplay, NULL, &mrb_display_type));
|
||||
DATA_TYPE(display_obj) = &mrb_display_type;
|
||||
DATA_PTR(display_obj) = display_ptr;
|
||||
return display_obj;
|
||||
}
|
||||
|
||||
Display*
|
||||
extract_x_display(mrb_state *mrb, mrb_value display_obj)
|
||||
{
|
||||
struct mrb_display *display_ptr = (struct mrb_display *)mrb_get_datatype(mrb, display_obj, &mrb_display_type);
|
||||
return display_ptr->display;
|
||||
}
|
||||
|
||||
void
|
||||
mrb_xkremap_display_init(mrb_state *mrb, struct RClass *mXkremap)
|
||||
{
|
||||
mrb_define_class_under(mrb, mXkremap, "Display", mrb->object_class);
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
#include "mruby.h"
|
||||
|
||||
extern void mrb_mruby_xkremap_gem_init(mrb_state *mrb);
|
||||
extern void mrb_xkremap_xlib_wrapper_init(mrb_state *mrb, struct RClass *mXkremap);
|
||||
extern void mrb_xkremap_display_init(mrb_state *mrb, struct RClass *mXkremap);
|
||||
|
||||
void
|
||||
mrb_xkremap_gem_init(mrb_state *mrb)
|
||||
{
|
||||
struct RClass *mXkremap = mrb_define_module(mrb, "Xkremap");
|
||||
|
||||
mrb_xkremap_xlib_wrapper_init(mrb, mXkremap);
|
||||
mrb_xkremap_display_init(mrb, mXkremap);
|
||||
mrb_gc_arena_restore(mrb, 0);
|
||||
}
|
||||
|
||||
void
|
||||
mrb_xkremap_gem_final(mrb_state *mrb)
|
||||
{
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
#include "mruby.h"
|
||||
|
||||
extern Display* extract_x_display(mrb_state *mrb, mrb_value display_obj);
|
||||
|
||||
mrb_value
|
||||
mrb_xw_grab_keys(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
mrb_value display_obj;
|
||||
mrb_get_args(mrb, "o", &display_obj);
|
||||
Display *display = extract_x_display(mrb, display_obj);
|
||||
|
||||
Window root = XDefaultRootWindow(display);
|
||||
XGrabKey(display, XKeysymToKeycode(display, XK_b), ControlMask, root, True, GrabModeAsync, GrabModeAsync);
|
||||
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
void
|
||||
mrb_xkremap_xlib_wrapper_init(mrb_state *mrb, struct RClass *mXkremap)
|
||||
{
|
||||
struct RClass *cXlibWrapper = mrb_define_class_under(mrb, mXkremap, "XlibWrapper", mrb->object_class);
|
||||
mrb_define_class_method(mrb, cXlibWrapper, "grab_keys", mrb_xw_grab_keys, MRB_ARGS_REQ(1));
|
||||
}
|
Loading…
Reference in New Issue