Статический порядок переключения раскладки клавиатуры в Ubuntu 17.10 и более поздних версиях с GNOME 3

Только что установил Ubuntu 17.10 и похоже, что переключение раскладки клавиатуры изменило его поведение.

В предыдущей версии Ubuntu (например, 16.04 Unity), если у меня есть 3 разных раскладки клавиатуры (например, EN-TH-JA), нажатие Super+Space всегда будет циклически переходить к следующей раскладке в том же порядке (например, от EN к TH в JA, затем обратно в EN).

Однако, начиная с Ubuntu 17.10, это уже не так. Он перебирает макет в порядке MRU ("Последние использованные"). Итак, предположим, что макет начинается с EN, а затем я переключился на TH. В следующий раз, когда я нажму Super+Space, это даст мне EN вместо JA.

Я попытался выкопать и обнаружил, что виновником являются недавно реализованные настройки DCONF внутри org.gnome.desktop.input-sources и, кажется, нет способа изменить это поведение.

Итак, мой вопрос: есть ли способ изменить это поведение на "статическое упорядочение" переключения раскладки клавиатуры?


(Как примечание, новое поведение очень плохое, когда у нас есть три или более макетов. Большую часть времени мы, как пользователь, не могли вспомнить макеты MRU, поэтому переключение макетов очень неудобно и намного медленнее, чем уже зная, что следующий макет будет, если используется статический порядок.)

Если нет параметров для изменения этого поведения, где я должен сообщить об этом как об ошибке или запросе функции?

2 ответа

Решение

В качестве обходного пути вы можете установить альтернативное сочетание клавиш, такое как alt+shift, для переключения между раскладками клавиатуры (см. Этот вопрос для справки: Ubuntu 17.10 не может изменить сочетание клавиш ввода на alt+shift).

Этот ярлык должен соответствовать "статическому порядку", который вы ищете.


Запрос функции был подан OP здесь.

D-Bus API GNOME 3 предлагает org.gnome.Shell.Evalметод для выполнения произвольного JavaScript, и, таким образом, мы можем исправить код так, чтобы он не менял порядок.

Вот скрипт, который работает в 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"
Другие вопросы по тегам