xkeyrap 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|