Implement key press handler

pull/1/head
Takashi Kokubun 8 years ago
parent fc993cee6e
commit cc4730f517

@ -0,0 +1,25 @@
module Xkremap
class ActiveWindow
# @param [Fixnum] current_window
attr_reader :current_window
# @param [Xkremap::Display] display
def initialize(display)
@display = display
@current_window = fetch_active_window
end
def changed?
next_window = fetch_active_window
@current_window != next_window
ensure
@current_window = next_window
end
private
def fetch_active_window
XlibWrapper.fetch_active_window(@display)
end
end
end

@ -3,32 +3,37 @@ module Xkremap
# @param [Xkremap::Config] config
# @param [Xkremap::Display] display
def initialize(config, display)
@key_remap_builder = KeyRemapBuilder.new(config, display)
@key_grab_manager = KeyGrabManager.new(display)
@active_window = ActiveWindow.new(display)
@grab_manager = GrabManager.new(display)
@remap_compiler = KeyRemapCompiler.new(config, display)
remap_keys
end
def handle_key_press(keycode, state)
handler = @key_remap_builder.prebuilt[keycode][state]
handler && handler.call
puts 'Event: key_press'
handler = @remap_handlers[keycode][state]
if handler
handler.call
else
$stderr.puts "Handler not found!: #{[keycode, state, @remap_handlers].inspect}"
end
end
def handle_property_notify
if @key_remap_builder.active_window_changed?
if @active_window.changed?
remap_keys
end
end
def handle_mapping_notify
puts 'mapping changed!'
remap_keys
end
private
def remap_keys
@key_remap_builder.build
@key_grab_manager.grab_keys
@remap_handlers = @remap_compiler.compile
@grab_manager.grab_keys
puts 'remap keys!'
end
end

@ -1,5 +1,5 @@
module Xkremap
class KeyGrabManager
class GrabManager
# @param [Xkremap::Display] display
def initialize(display)
@display = display

@ -1,33 +0,0 @@
module Xkremap
class KeyRemapBuilder
# @attribute [Hash] prebuilt
# [Fixnum] keycode -> [Fixnum] state -> [Proc] handler
attr_reader :prebuilt
# @param [Xkremap::Config] config
# @param [Xkremap::Display] display
def initialize(config, display)
@config = config
@display = display
@prebuilt = Hash.new { |h, k| h[k] = {} }
@current_window = fetch_active_window
end
def build
puts 'rebuilt!'
end
def active_window_changed?
next_window = fetch_active_window
@current_window != next_window
ensure
@current_window = next_window
end
private
def fetch_active_window
XlibWrapper.fetch_active_window(@display)
end
end
end

@ -0,0 +1,23 @@
module Xkremap
class KeyRemapCompiler
def initialize(config, display)
@config = config
@display = display
end
# @return [Hash] : keycode(Fixnum) -> state(Fixnum) -> handler(Proc)
def compile
result = Hash.new { |h, k| h[k] = {} }
result[to_keycode(0x0062)][1<<2] = Proc.new do
puts 'C-b pressed!'
end
result
end
private
def to_keycode(keysym)
XlibWrapper.keysym_to_keycode(@display, keysym)
end
end
end

@ -4,6 +4,17 @@
extern Display* extract_x_display(mrb_state *mrb, mrb_value display_obj);
mrb_value
mrb_xw_keysym_to_keycode(mrb_state *mrb, mrb_value self)
{
mrb_value display_obj;
mrb_int keysym;
mrb_get_args(mrb, "oi", &display_obj, &keysym);
Display *display = extract_x_display(mrb, display_obj);
return mrb_fixnum_value(XKeysymToKeycode(display, keysym));
}
mrb_value
mrb_xw_fetch_active_window(mrb_state *mrb, mrb_value self)
{
@ -48,6 +59,7 @@ 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, "keysym_to_keycode", mrb_xw_keysym_to_keycode, MRB_ARGS_REQ(2));
mrb_define_class_method(mrb, cXlibWrapper, "fetch_active_window", mrb_xw_fetch_active_window, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, cXlibWrapper, "grab_key", mrb_xw_grab_key, MRB_ARGS_REQ(3));
mrb_define_class_method(mrb, cXlibWrapper, "ungrab_keys", mrb_xw_ungrab_keys, MRB_ARGS_REQ(1));

Loading…
Cancel
Save