xkeyrap 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/README.md +0 -24
- data/bin/xkeyrap +3 -5
- data/lib/xkeyrap/command.rb +23 -18
- data/lib/xkeyrap/key.rb +3 -0
- data/lib/xkeyrap/version.rb +1 -1
- data/lib/xkeyrap.rb +15 -7
- data/xkeyrap.gemspec +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42dd7731a5793052a73353b312fc26967590df30eddc805859eac4ec6e1e4553
|
4
|
+
data.tar.gz: 884417d5725d2fb0b8b6335dbdcefebf24b3b7e2235f28a8050042daa7636652
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e87fbfa4dd4934c72d501e05948b1a6bf4825a73edc37908757d693a507e04d3ea5bccc272ac3072034d01cda3dfe00eab1147395463f1ba5040ea312b7c882
|
7
|
+
data.tar.gz: 73f4d87697fac3316c30871b45f6b0550010d0a9f1984c217a12a47bb1b0d9b15127ccb8d9e020a1b68a3db7ddc5824a920fefe2a09b3fd18485c958c0cc74d4
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,27 +1,3 @@
|
|
1
1
|
# Xkeyrap
|
2
2
|
|
3
3
|
Xkeyrap 是一个受 [https://github.com/mooz/xkeysnail](xkeysnail) 启发的项目。
|
4
|
-
|
5
|
-
如果你和我有一样的 [https://www.songofcode.com/posts/linux-shortcuts-for-macos/](改键需求), 可以使用下面的配置文件:
|
6
|
-
|
7
|
-
``` json
|
8
|
-
{
|
9
|
-
"Firefox": {
|
10
|
-
"KEY_LEFTALT": "KEY_LEFTCTRL",
|
11
|
-
"KEY_CAPSLOCK": "KEY_LEFTALT"
|
12
|
-
},
|
13
|
-
"Google-chrome": {
|
14
|
-
"KEY_LEFTALT": "KEY_LEFTCTRL",
|
15
|
-
"KEY_CAPSLOCK": "KEY_LEFTALT"
|
16
|
-
}
|
17
|
-
}
|
18
|
-
```
|
19
|
-
|
20
|
-
## Usage
|
21
|
-
|
22
|
-
``` shell
|
23
|
-
sudo gem install xkeyrap # need sudo
|
24
|
-
|
25
|
-
xhost +SI:localuser:root
|
26
|
-
sudo xkeyrap config.json
|
27
|
-
```
|
data/bin/xkeyrap
CHANGED
data/lib/xkeyrap/command.rb
CHANGED
@@ -1,38 +1,43 @@
|
|
1
1
|
require "evdev"
|
2
2
|
require 'libevdev'
|
3
3
|
require 'uinput/device'
|
4
|
-
require 'json'
|
5
4
|
|
6
5
|
module Xkeyrap
|
7
6
|
class Command
|
7
|
+
attr_accessor :keys
|
8
|
+
attr_accessor :modifier_keys
|
8
9
|
attr_accessor :output_device
|
9
10
|
attr_accessor :config
|
10
11
|
|
11
|
-
def initialize(device,
|
12
|
-
self.
|
12
|
+
def initialize(device, config)
|
13
|
+
self.keys = Set.new
|
14
|
+
self.modifier_keys = Set.new
|
13
15
|
self.output_device = device
|
16
|
+
unless config
|
17
|
+
self.config = {
|
18
|
+
global: {
|
19
|
+
KEY_CAPSLOCK: :KEY_LEFTCTRL,
|
20
|
+
KEY_LEFTCTRL: :KEY_CAPSLOCK,
|
21
|
+
KEY_LEFTALT: :KEY_LEFTMETA,
|
22
|
+
KEY_LEFTMETA: :KEY_LEFTALT
|
23
|
+
},
|
24
|
+
"Firefox": {
|
25
|
+
KEY_LEFTALT: :KEY_LEFTCTRL,
|
26
|
+
KEY_CAPSLOCK: :KEY_LEFTMETA,
|
27
|
+
KEY_LEFTMETA: :KEY_LEFTALT
|
28
|
+
}
|
29
|
+
}
|
30
|
+
end
|
14
31
|
end
|
15
32
|
|
16
33
|
def receive(state, key, wm_class_name = "global")
|
17
|
-
|
18
|
-
puts "input: #{state} ... #{key}"
|
34
|
+
puts "origin: #{wm_class_name} | #{state} | #{key}"
|
19
35
|
sub_json = self.config[wm_class_name.to_sym] || self.config[:global]
|
20
36
|
mapped_key = sub_json[key] || self.config[:global][key] || key
|
21
|
-
puts "
|
22
|
-
self.output_device.send_event(:EV_KEY, mapped_key
|
37
|
+
puts "mapped: #{wm_class_name} | #{state} | #{mapped_key}"
|
38
|
+
self.output_device.send_event(:EV_KEY, mapped_key, state)
|
23
39
|
self.output_device.send_event(:EV_SYN, :SYN_REPORT)
|
24
40
|
end
|
25
41
|
|
26
|
-
def default_config
|
27
|
-
{
|
28
|
-
global: {
|
29
|
-
KEY_CAPSLOCK: :KEY_LEFTCTRL,
|
30
|
-
KEY_LEFTCTRL: :KEY_CAPSLOCK,
|
31
|
-
KEY_LEFTALT: :KEY_LEFTMETA,
|
32
|
-
KEY_LEFTMETA: :KEY_LEFTALT
|
33
|
-
}
|
34
|
-
}
|
35
|
-
end
|
36
|
-
|
37
42
|
end
|
38
43
|
end
|
data/lib/xkeyrap/key.rb
CHANGED
data/lib/xkeyrap/version.rb
CHANGED
data/lib/xkeyrap.rb
CHANGED
@@ -10,7 +10,7 @@ require 'uinput/device'
|
|
10
10
|
module Xkeyrap
|
11
11
|
class Cli
|
12
12
|
|
13
|
-
def self.run(
|
13
|
+
def self.run(device)
|
14
14
|
display = XlibObj::Display.new(':0')
|
15
15
|
device = Uinput::Device.new do
|
16
16
|
self.name = "Xkeyrap virtual device"
|
@@ -24,10 +24,14 @@ module Xkeyrap
|
|
24
24
|
self.add_event(:EV_SYN)
|
25
25
|
end
|
26
26
|
|
27
|
-
keyboard = Evdev.new(
|
27
|
+
keyboard = Evdev.new(device)
|
28
|
+
|
29
|
+
|
30
|
+
#puts keyboard.supports_event? :KEY_ENTER
|
31
|
+
#puts keyboard.supports_event? :KEY_KPENTER
|
28
32
|
keyboard.grab
|
29
33
|
|
30
|
-
command = Command.new(device,
|
34
|
+
command = Command.new(device, nil)
|
31
35
|
|
32
36
|
key_handler = keyboard.on(*Xkeyrap::Key::ALL_KEYS) do |state, key|
|
33
37
|
root_window = display.screens.first.root_window
|
@@ -57,10 +61,14 @@ module Xkeyrap
|
|
57
61
|
parent = FFI::MemoryPointer.new :Window
|
58
62
|
number = FFI::MemoryPointer.new :uint
|
59
63
|
children = FFI::MemoryPointer.new :pointer
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
+
begin
|
65
|
+
q = Xlib.XQueryTree(display.to_native, focused_window.to_native, root, parent, children, number)
|
66
|
+
parent_window_id = parent.read(:int)
|
67
|
+
parent_window = top_level_windows.select {|tlw| tlw.id == parent_window_id }.first
|
68
|
+
parent_window.property("WM_CLASS")[1]
|
69
|
+
rescue
|
70
|
+
"global"
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
data/xkeyrap.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xkeyrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- teddy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|