Compare commits

...

4 commits
1.4 ... master

Author SHA1 Message Date
John Gebbie
945a7daede uinput udev rule MODE 0660 -> 0620 2024-08-13 14:36:06 +01:00
John Gebbie
7c0a53ef94 version 1.5 2024-05-04 12:36:44 +01:00
John Gebbie
5bc814cb39 bump dependency 2024-05-04 12:35:34 +01:00
John Gebbie
b5812c001d prefer keys on lower levels for realsies 2023-11-05 16:51:46 +00:00
7 changed files with 23 additions and 11 deletions

View file

@ -1,2 +1,2 @@
# This allows users in group input to use dotool without root permissions.
KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"
KERNEL=="uinput", GROUP="input", MODE="0620", OPTIONS+="static_node=uinput"

View file

@ -2,6 +2,12 @@
Notable changes to dotool will be documented in this file.
## [1.5](https://git.sr.ht/~geb/dotool/refs/1.5)
### Fixed
- The selecting of the fewest modifiers for simulating keys.
## [1.4](https://git.sr.ht/~geb/dotool/refs/1.4)
### Added
@ -18,7 +24,7 @@ Notable changes to dotool will be documented in this file.
### Fixed
- Now prefers the fewest modifiers for simulating keys.
- Now prefers the fewest modifiers for simulating keys. (UPDATE: see 1.5)
## [1.3](https://git.sr.ht/~geb/dotool/refs/1.3)

View file

@ -1,6 +1,6 @@
#!/bin/sh
# ./build.sh ['install']
: "${DOTOOL_VERSION=$(git describe --long --abbrev=12 --tags --dirty 2>/dev/null || echo 1.4)}"
: "${DOTOOL_VERSION=$(git describe --long --abbrev=12 --tags --dirty 2>/dev/null || echo 1.5)}"
: "${DOTOOL_DESTDIR=}"
: "${DOTOOL_BINDIR=usr/local/bin}"
: "${DOTOOL_UDEV_RULES_DIR=etc/udev/rules.d}"

View file

@ -62,6 +62,8 @@ func log(err error) {
type Chord struct {
Super, AltGr, Ctrl, Alt, Shift bool
Key int
level uint32 // just for initKeys
}
func parseChord(keymap *xkb.Keymap, chord string) (Chord, error) {

2
go.mod
View file

@ -4,5 +4,5 @@ go 1.19
require (
git.sr.ht/~geb/opt v0.0.0-20230911153257-e72225a1933c
github.com/bendahl/uinput v1.6.2
github.com/bendahl/uinput v1.7.0
)

4
go.sum
View file

@ -1,4 +1,4 @@
git.sr.ht/~geb/opt v0.0.0-20230911153257-e72225a1933c h1:gIC1gnCgoasPHks1x6MB+bgDmIWMxKc5HIJPJrsV5Ck=
git.sr.ht/~geb/opt v0.0.0-20230911153257-e72225a1933c/go.mod h1:S6h1g8P7DyG7i7YIHZ5IpYbC6lzZB9DYIEl8PyXOmsg=
github.com/bendahl/uinput v1.6.2 h1:tIz52QyKDx1i1nObUkts3AZa/bULfLhPA5a+xKGlRPI=
github.com/bendahl/uinput v1.6.2/go.mod h1:Np7w3DINc9wB83p12fTAM3DPPhFnAKP0WTXRqCQJ6Z8=
github.com/bendahl/uinput v1.7.0 h1:nA4fm8Wu8UYNOPykIZm66nkWEyvxzfmJ8YC02PM40jg=
github.com/bendahl/uinput v1.7.0/go.mod h1:Np7w3DINc9wB83p12fTAM3DPPhFnAKP0WTXRqCQJ6Z8=

14
keys.go
View file

@ -607,11 +607,14 @@ var DeadKeyResults = []DeadKeyResult{
{"dead_tilde", "Y", 'Ỹ'},
}
func newChord(keymap *xkb.Keymap, mask, code uint32) Chord{
func newChord(keymap *xkb.Keymap, code, level uint32) Chord {
altGrMask := uint32(1) << keymap.ModGetIndex("Mod5")
ctrlMask := uint32(1) << keymap.ModGetIndex(xkb.ModNameCtrl)
altMask := uint32(1) << keymap.ModGetIndex(xkb.ModNameAlt)
shiftMask := uint32(1) << keymap.ModGetIndex(xkb.ModNameShift)
// TODO support layouts other than 0
mask := keymap.KeyGetMod(code, 0, level)
return Chord{
false,
(mask & altGrMask) != 0,
@ -619,6 +622,7 @@ func newChord(keymap *xkb.Keymap, mask, code uint32) Chord{
(mask & altMask) != 0,
(mask & shiftMask) != 0,
int(code) - 8,
level,
}
}
@ -628,16 +632,16 @@ func initKeys(keymap *xkb.Keymap) {
numLevels := keymap.NumLevelsForKey(code, 0)
for level := uint32(0); level < numLevels; level++ {
for _, sym := range keymap.KeyGetSymsByLevel(code, 0, level) {
chord := newChord(keymap, keymap.KeyGetMod(code, 0, level), code)
chord := newChord(keymap, code, level)
for name, s := range linuxXSyms {
if s == sym {
if _, ok := LinuxKeys[name]; !ok {
if l, ok := LinuxKeys[name]; !ok || level < l.level {
LinuxKeys[name] = chord
}
}
}
name := xkb.KeysymGetName(sym)
if _, ok := XKeys[name]; !ok {
if x, ok := XKeys[name]; !ok || level < x.level {
XKeys[name] = chord
}
}
@ -657,7 +661,7 @@ func getChord(keymap *xkb.Keymap, keysym uint32) Chord {
for level := uint32(0); level < numLevels; level++ {
for _, sym := range keymap.KeyGetSymsByLevel(code, 0, level) {
if sym == keysym {
return newChord(keymap, keymap.KeyGetMod(code, 0, level), code)
return newChord(keymap, code, level)
}
}
}