Ubuntu 17.10 及更高版本中使用 GNOME 3 进行键盘布局切换的静态排序

Ubuntu 17.10 及更高版本中使用 GNOME 3 进行键盘布局切换的静态排序

刚刚安装了 Ubuntu 17.10,似乎键盘布局切换已经改变了其行为。

在以前的 Ubuntu 版本(例如 16.04 Unity)中,如果我有 3 种不同的键盘布局(例如EN--JA), 击中Super+Space总是按相同顺序循环到下一个布局(例如ENJA然后回到EN)。

然而从 Ubuntu 17.10 开始,这种情况不再存在。它会循环显示毛里求斯大学 (最近使用)排序。假设布局以EN然后我骑车去。下次我按Super+时Space,它会给我EN代替JA

我尝试深入挖掘,发现罪魁祸首是里面新实施的 DCONF 设置org.gnome.desktop.input-sources,而且似乎没有办法改变这种行为。

所以我的问题是:有没有办法将这种行为改变为“静态排序”键盘布局切换?


(顺便说一句,当我们有三个或更多布局时,新的行为非常糟糕。大多数时候,作为用户,我们无法记住毛里求斯大学布局切换非常不方便,慢得多而不是已经知道如果使用静态排序的话下一个布局会是什么。)

如果没有设置可以改变这种行为,我应该在哪里将其报告为错误或功能请求?

答案1

作为一种解决方法,您可以设置备用键盘快捷键(如alt+)shift来在键盘布局之间切换(请参阅此问题以供参考:Ubuntu 17.10 无法将输入切换快捷键更改为 alt+shift)。

此快捷方式应遵循您所寻找的“静态排序”。


OP 已提交功能请求这里

答案2

GNOME 3 的 D-Bus API 提供了org.gnome.Shell.Eval执行任意 JavaScript 的方法,因此我们可以对代码进行 monkey-patch 以不改变顺序。

这是一个适用于 GNOME 40(Ubuntu 21.10)的脚本:

#!/usr/bin/bash

read -r -d '' patch_script << '{ENDOFMSG}'
Object.getPrototypeOf(imports.ui.status.keyboard.getInputSourceManager())._currentInputSourceChanged = function () {
  let oldSource;
  [oldSource, this._currentSource] = [this._currentSource, newSource];

  this.emit('current-source-changed', oldSource);

  // for (let i = 1; i < this._mruSources.length; ++i) {
  //   if (this._mruSources[i] == newSource) {
  //     let currentSource = this._mruSources.splice(i, 1);
  //     this._mruSources = currentSource.concat(this._mruSources);
  //     break;
  //   }
  // }
  this._changePerWindowSource();
}
{ENDOFMSG}

gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "$patch_script"

相关内容