补丁在 suckless ST 终端中向后滚动以支持鼠标滚轮

Patch scrolling back in suckless ST terminal to support mouse wheel

ST terminal has a patch for scrolling back。除了 "PageUp" 和 "PageDown" 之外,我想更新上述补丁以启用鼠标滚轮上下信号。我怀疑 config.h 中的一个小改动是需要的,但我没有终端代码方面的经验,因此我请求帮助。

在源代码中,在 config.h 中出现了这些行:

static Mousekey mshortcuts[] = {
    /* button               mask            string */
    { Button4,              XK_ANY_MOD,     "1" },
    { Button5,              XK_ANY_MOD,     "[=10=]5" },
};

所以,很明显,我们知道 Button4/5 是什么。此外,我们还有这些:

static Shortcut shortcuts[] = {
    /* mask                 keysym          function        argument */
    [...]
    { ShiftMask,            XK_Page_Up,     kscrollup,      {.i = -1} },
    { ShiftMask,            XK_Page_Down,   kscrolldown,    {.i = -1} },
};

所以,天真地,我假设添加另外两个原始(一个用于轮子向上,一个用于轮子向下)就可以了。然而,什么?


注意:知道suckless recommends using a terminal multiplexer such as tmux. I use that already. However, sometimes (rarely) I just want to use a terminal without tmux and this feature would be useful. Please do not comment/answer to use tmux,这不是这个问题的问题。

没那么简单。当有人想要 left/right 滚动鼠标轨迹球时,偶尔会出现这个问题。

表格的左栏是一个 X 事件。这些仅限于预定义符号的组合。

Button4 和 Button5 被提及是因为它们通常用于传递鼠标 滚轮 事件。这种情况已经有一段时间了。在 1999 年 (patch #120) 修改 xterm 之前使用了一个资源文件,使其成为 built-in 功能。

可能的 X 事件在 C header 文件中列出 — X.h — and tables in the X source code; no wheel mouse events are provided for as such. For instance, there is a table 在 X 工具包库中,其中列出了所有可能性(对于使用 X 工具包的客户,例如 xterm)。 xev 使用 header-definitions.

如果 X 以不同的方式支持滚轮鼠标事件,它可能会为此目的使用新的函数调用,因为现有信息可能会以一种难以扩展的方式打包到 bit-fields 中。

来自 suckless site, there are some scroll back patches 允许使用 Shift+MouseWheel 滚动以及完全鼠标滚动。最后一个补丁可能会破坏其他 mkeys,不包括滚动功能。

现在有一个独立的程序 scroll 可以为任何终端仿真器提供回滚缓冲区。在撰写此答案时,它仍处于 实验状态 ,预计会有很多错误。尽管如此,它已经比 st 的回滚补丁更好地处理回滚。例如。调整终端的大小将包裹以前的输出而不是切断并丢失它们。

要启用它,当然首先 download/clone 来自 suckless website 的源代码并在本地构建它。

然后在 stconfig.def.h 中修改这一行(您必须获取最近的 git 提交以获得对 scroll 的支持)

char *scroll = NULL;

char *scroll = "/path/to/scroll";

现在重建 st 和 运行 st。它会自动使用滚动来提供回滚缓冲区。

如手册中所述,另一种不修改 st 源代码的方法是 运行 st 在安装完 st 之后使用以下命令和 scroll:

/path/to/st -e /path/to/scroll /bin/sh