Skip to content

Commit

Permalink
Merge pull request #4 from iberianpig/feat/remap-pointer
Browse files Browse the repository at this point in the history
Palm Rejection for Touchpad
  • Loading branch information
iberianpig authored Apr 15, 2024
2 parents cfbdc5a + 16f0191 commit 9d5659e
Show file tree
Hide file tree
Showing 12 changed files with 658 additions and 113 deletions.
12 changes: 5 additions & 7 deletions exe/fusuma-remap
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,17 @@
require "fusuma/plugin/inputs/input"
require_relative "../lib/fusuma/plugin/inputs/remap_keyboard_input"
require_relative "../lib/fusuma/plugin/remap/version"
require_relative "../lib/fusuma/plugin/remap/remapper"
require_relative "../lib/fusuma/plugin/remap/keyboard_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"

include Revdev

# FIXME: use OptionParser and implement help
if ARGV.length < 1
puts "you can specify keyboard name pattern and touchpad name pattern"
puts "$ #{$PROGRAM_NAME} 'AT Translated Set 2 keyboard' 'SynPS/2 Synaptics TouchPad'"
Expand All @@ -40,7 +38,7 @@ end

@layer_manager = Fusuma::Plugin::Remap::LayerManager.instance

keyboard_reader, keyboard_writer = IO.pipe
keyboard_reader, fusuma_writer = IO.pipe

layers = Fusuma::Config.instance.keymap.select { |m| m[:context] && m[:remap] }.map { |m| m[:context] }.uniq
Thread.new do
Expand Down Expand Up @@ -87,9 +85,9 @@ Thread.new do
end
end

Fusuma::Plugin::Remap::Remapper.new(
Fusuma::Plugin::Remap::KeyboardRemapper.new(
layer_manager: @layer_manager,
keyboard_writer: keyboard_writer,
fusuma_writer: fusuma_writer,
source_keyboards: source_keyboards,
internal_touchpad: internal_touchpad
).run
42 changes: 42 additions & 0 deletions exe/fusuma-touchpad-remap
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
4 changes: 2 additions & 2 deletions fusuma-plugin-remap.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ Gem::Specification.new do |spec|
# https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all&section=main
# support focal (20.04LTS) 2.7

spec.add_dependency "fusuma", ">= 3.1"
spec.add_dependency "fusuma-plugin-keypress", "~> 0.5"
spec.add_dependency "fusuma", ">= 3.4"
spec.add_dependency "fusuma-plugin-keypress", ">= 0.11.0"
spec.add_dependency "msgpack"
spec.add_dependency "revdev"
spec.add_dependency "ruinput"
Expand Down
37 changes: 15 additions & 22 deletions lib/fusuma/plugin/inputs/remap_keyboard_input.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# frozen_string_literal: true

require "fusuma/device"
require "fusuma/plugin/remap/remapper"
require "fusuma/plugin/remap/layer_manager"
require_relative "../remap/keyboard_remapper"
require_relative "../remap/layer_manager"

module Fusuma
module Plugin
Expand All @@ -26,26 +26,19 @@ def initialize
end

def io
@keyboard_reader
@fusuma_reader
end

# @param record [String]
# @return [Event]
def create_event(record:)
data = MessagePack.unpack(record) # => {"key"=>"J", "status"=>1}
# override Input#read_from_io
# @return [Record]
def read_from_io
@unpacker ||= MessagePack::Unpacker.new(io)
data = @unpacker.unpack

unless data.is_a? Hash
MultiLogger.error("Invalid record: #{record}", data: data)
return
end
raise "data is not Hash : #{data}" unless data.is_a? Hash

code = data["key"]
status = (data["status"] == 1) ? "pressed" : "released"
record = Events::Records::KeypressRecord.new(status: status, code: code)

e = Events::Event.new(tag: tag, record: record)
MultiLogger.debug(input_event: e)
e
Events::Records::KeypressRecord.new(status: status, code: data["key"], layer: data["layer"])
end

private
Expand All @@ -70,21 +63,21 @@ def setup_remapper
layer_manager = Remap::LayerManager.instance

# physical keyboard input event
@keyboard_reader, keyboard_writer = IO.pipe
@fusuma_reader, fusuma_writer = IO.pipe

@pid = fork do
layer_manager.writer.close
@keyboard_reader.close
remapper = Remap::Remapper.new(
@fusuma_reader.close
remapper = Remap::KeyboardRemapper.new(
layer_manager: layer_manager,
source_keyboards: source_keyboards,
keyboard_writer: keyboard_writer,
fusuma_writer: fusuma_writer,
internal_touchpad: internal_touchpad
)
remapper.run
end
layer_manager.reader.close
keyboard_writer.close
fusuma_writer.close
end

# Devices to detect key presses and releases
Expand Down
112 changes: 112 additions & 0 deletions lib/fusuma/plugin/inputs/remap_touchpad_input.rb
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
4 changes: 4 additions & 0 deletions lib/fusuma/plugin/inputs/remap_touchpad_input.yml
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"]
Loading

0 comments on commit 9d5659e

Please sign in to comment.