-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4 from iberianpig/feat/remap-pointer
Palm Rejection for Touchpad
- Loading branch information
Showing
12 changed files
with
658 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#!/usr/bin/env ruby | ||
# frozen_string_literal: true | ||
|
||
require "fusuma/plugin/inputs/input" | ||
require_relative "../lib/fusuma/plugin/inputs/remap_touchpad_input" | ||
require_relative "../lib/fusuma/plugin/remap/version" | ||
require_relative "../lib/fusuma/plugin/remap/touchpad_remapper" | ||
require_relative "../lib/fusuma/plugin/remap/layer_manager" | ||
require "fusuma/config" | ||
require "fusuma/multi_logger" | ||
require "revdev" | ||
require "msgpack" | ||
require "irb" | ||
|
||
Fusuma::MultiLogger.instance.debug_mode = true | ||
Fusuma::Config.instance.custom_path = "~/.config/fusuma/config.yml" | ||
|
||
touchpad_name_pattern = ["touchpad", "Touchpad", "TOUCHPAD"] | ||
|
||
# $DEBUG=true # puts events | ||
|
||
internal_touchpad = Fusuma::Plugin::Inputs::RemapKeyboardInput::TouchpadSelector.new(touchpad_name_pattern).select.first | ||
|
||
if internal_touchpad.nil? | ||
warn "no touchpad found" | ||
exit 1 | ||
end | ||
|
||
touchpad_reader, touchpad_writer = IO.pipe | ||
|
||
Thread.new do | ||
unpacker = MessagePack::Unpacker.new(touchpad_reader) | ||
loop do | ||
data = unpacker.unpack | ||
puts data | ||
end | ||
end | ||
|
||
Fusuma::Plugin::Remap::TouchpadRemapper.new( | ||
touchpad_writer: touchpad_writer, | ||
source_touchpad: internal_touchpad | ||
).run |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
# frozen_string_literal: true | ||
|
||
require "fusuma/device" | ||
require_relative "../remap/touchpad_remapper" | ||
# require_relative "../remap/layer_manager" | ||
|
||
module Fusuma | ||
module Plugin | ||
module Inputs | ||
# Get touchpad events from remapper | ||
class RemapTouchpadInput < Input | ||
include CustomProcess | ||
|
||
def config_param_types | ||
{ | ||
touchpad_name_patterns: [Array, String] | ||
} | ||
end | ||
|
||
attr_reader :pid | ||
|
||
def initialize | ||
super | ||
setup_remapper | ||
end | ||
|
||
def io | ||
@fusuma_reader | ||
end | ||
|
||
# override Input#read_from_io | ||
# @return [Record] | ||
def read_from_io | ||
@unpacker ||= MessagePack::Unpacker.new(io) | ||
data = @unpacker.unpack | ||
|
||
raise "data is not Hash : #{data}" unless data.is_a? Hash | ||
|
||
gesture = "touch" | ||
finger = data["finger"] | ||
|
||
# @touch_state ||= {} | ||
# @mt_slot ||= 0 | ||
# @touch_state[@mt_slot] ||= { | ||
# MT_TRACKING_ID: nil, | ||
# X: nil, | ||
# Y: nil, | ||
# valid_touch_point: false | ||
# } | ||
# TODO: implement update touch_state | ||
status = | ||
if data["touch_state"].any? { |_, v| v["valid_touch_point"] } | ||
"begin" | ||
else | ||
"end" | ||
end | ||
|
||
Events::Records::GestureRecord.new(gesture: gesture, status: status, finger: finger, delta: nil) | ||
end | ||
|
||
private | ||
|
||
def setup_remapper | ||
internal_touchpad = TouchpadSelector.new(config_params(:touchpad_name_patterns)).select.first | ||
if internal_touchpad.nil? | ||
MultiLogger.error("No touchpad found: #{config_params(:touchpad_name_patterns)}") | ||
exit | ||
end | ||
|
||
MultiLogger.info("set up remapper") | ||
MultiLogger.info("internal_touchpad: #{internal_touchpad.device_name}") | ||
|
||
# layer_manager = Remap::LayerManager.instance | ||
|
||
# physical touchpad input event | ||
@fusuma_reader, fusuma_writer = IO.pipe | ||
|
||
@pid = fork do | ||
# layer_manager.writer.close | ||
@fusuma_reader.close | ||
remapper = Remap::TouchpadRemapper.new( | ||
# layer_manager: layer_manager, | ||
fusuma_writer: fusuma_writer, | ||
source_touchpad: internal_touchpad | ||
) | ||
remapper.run | ||
end | ||
# layer_manager.reader.close | ||
fusuma_writer.close | ||
end | ||
|
||
class TouchpadSelector | ||
def initialize(names = nil) | ||
@names = names | ||
end | ||
|
||
# @return [Array<Revdev::EventDevice>] | ||
def select | ||
devices = if @names | ||
Fusuma::Device.all.select { |d| Array(@names).any? { |name| d.name =~ /#{name}/ } } | ||
else | ||
# available returns only touchpad devices | ||
Fusuma::Device.available | ||
end | ||
|
||
devices.map { |d| Revdev::EventDevice.new("/dev/input/#{d.id}") } | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
plugin: | ||
inputs: | ||
remap_touchpad_input: | ||
touchpad_name_patterns: ["touchpad", "Touchpad", "TOUCHPAD"] |
Oops, something went wrong.