Linux 版 Punto Switcher 的新类似物:xswitcher

在过去的六个月里,xneur 支持的终止给我带来了一些痛苦。 (随着 OpenSUSE 15.1 在我的桌面上的出现:启用 xneur 后,Windows 失去焦点并随着键盘输入及时闪烁).

“哦,该死,我又开始输入错误的布局”——在我的工作中,这种不雅的情况经常发生。 而且它没有增加任何积极的东西。

Linux 版 Punto Switcher 的新类似物:xswitcher
同时,我(作为一名设计工程师)可以非常清楚地表达我想要的东西。 但我想要(首先从 Punto Switcher,然后,感谢 Windows Vista,最后从 xneur 切换到 Linux)一件事。 意识到屏幕上的垃圾布局错误(这通常发生在输入新单词结束时),请踩“暂停/中断”。 并获取您打印的内容。

目前,该产品具有最佳的(从我的角度来看)功能/复杂性比。 是时候分享了。

TL.DR

稍后会有各种技术细节,所以首先 - 链接“触摸” 对于不耐烦的人。

目前以下行为是硬编码的:

  • “暂停/中断”:退格最后一个单词,切换活动窗口中的布局(0 和 1 之间)并再次拨号。
  • “左Ctrl键不做任何事情”:切换活动窗口中的布局(0和1之间)。
  • “左移无任何内容”:打开活动窗口中的 0 号布局。
  • “Right Shift without everything”:打开活动窗口中的 1 号布局。

从现在开始,我计划自定义该行为。 没有反馈,就没意思了(反正我对此很满意)。 我相信在《哈布雷》上会有足够比例的观众遇到类似的问题。

注: 因为在当前版本中,键盘记录器附加到“/dev/input/”,xswitcher 必须以 root 权限启动:

chown root:root xswitcher
chmod +xs xswitcher

请注意: 具有suid的文件的所有者必须是root,因为无论谁是所有者,启动时都会变成suid。

偏执狂(我也不例外)可以克隆 GIT 并现场组装。 像那样:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

添加自动启动功能(取决于 DE)。

它有效,“不求粥”(约每天 30 秒 CPU,约 12 MB RSS)。

商品详细信息

现在-细节。

整个存储库最初专用于我的宠物项目,我懒得启动另一个项目。 因此,所有内容都堆积起来(仅在文件夹中)并由 AGPL(“反向专利”)覆盖。

xswitcher 代码是用 golang 编写的,包含最少的 C。我们假设这种方法将导致最少的工作量(到目前为止)。 同时保持使用 cgo 连接缺失内容的能力。

文本包含对其借用地点和原因的评论。 因为xneur 代码“没有激励我”,我把它作为起点 洛洛切换者.

使用“/dev/input/”既有优点(一切都可见,包括按下的自动重复键)也有缺点。 缺点是:

  • 自动重复(代码为“2”的事件)与 x 的重复无关。
  • 通过 X11 接口的输入是不可见的(例如,这就是 VNC 的工作原理)。
  • 需要root。

另一方面,可以通过“XSelectExtensionEvent()”订阅X事件。 你可以看一下 x输入代码。 我在 go 中没有找到这样的东西,粗略的实现立即花了一百行 C 代码。 暂时把它放在一边。

到目前为止,“反向”输出是通过拧入虚拟键盘来实现的。 感谢keybd_event的作者,但是那里的抽象太高级了,需要进一步重做。 例如,我使用右 Win 键选择第三行。 并且只有左边的Win被传回来。

已知错误

  • 我们对“复合”输入一无所知(例如:XNUMX/XNUMX)。 现在不需要。
  • 我们错误地玩了正确的Win。 就我而言,它破坏了重点。
  • 没有明确的输入解析。 相反,有几个函数:Compare()、CtrlSequence()、RepeatSequence()、SpaceSequence()。 谢谢 NSMCAN 为了您的关心:在代码和此处更正它。 有一定的概率,你可以在替换的时候发现bug。
    目前我不知道“如何”,欢迎任何建议。
  • (天啊) 竞争性地使用通道(keyboardEvents、miceEvents)。

结论

代码是最简单的程序。 还有像我这样的傻子。 因此,我自以为是,希望几乎所有技术人员都能够完成他想要的事情。 正因为如此,该产品不会像大多数只是为了好玩的产品一样,在没有支持的情况下消失。

祝你好运!

来源: habr.com

添加评论