[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: alt-space switch



On 2016-01-19, sergio wrote:

> Хочу переключать раскладку по alt-space:
> ralt-space: русский, latl-space: английский.

Я реализовал так (вроде важен порядок меджу setxkbmap и kbdd):

  $ cat ~/.xinitrc

  #!/bin/bash

  # Under Cygwin I prefer '-multiwindow' option, so it needn't to setup WM.
  if [[ -z $COMSPEC ]]; then
    {
      setxkbmap us,ru,ua
      kbdd
      if [[ -f ~/.xmodmaprc ]]; then
          xmodmap ~/.xmodmaprc &
      fi
    } &
  fi

  ! To load this config run:
  !   $ xmodmap .xmodmaprc

  $ cat ~/.xmodmaprc

  ! Win key.
  clear mod3
  clear mod4

  keycode 133 = Super_L
  ! keycode 134 = Multi_key
  ! keycode 134 = Super_R
  keycode 134 = Hyper_R
  add mod3 = Super_L
  add mod4 = Hyper_R

Использую 3 языка, LWin делаю модфикатором Super.

kbdd сохраняет раскладку индивидуально по приложениям и доступен по DBus:

  $ dbus-send --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:0
  $ dbus-send --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:1
  $ dbus-send --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:2

В своем оконном менеджере добавил:

  $ cat ~/.fvwm/config

  # Run at sturtup and after each restart.
  # All fvwm modules exit after restart Fvwm, so you must put they there.
  DestroyFunc StartFunction
  AddToFunc StartFunction
  + I Module FvwmKbdd.pl

  # Switch input method.
  Key 1 A 3 SendToModule FvwmKbdd.pl kbdd 0
  Key 2 A 3 SendToModule FvwmKbdd.pl kbdd 1
  Key 3 A 3 SendToModule FvwmKbdd.pl kbdd 2

  $ cat ~/.fvwm/FvwmKbdd.pl

  #!/usr/bin/perl -w

  use lib `fvwm-perllib dir`;
  use FVWM::Module;
  use General::Parse;
  use Net::DBus;

  # Net::DBus
  my $bus = Net::DBus->session();
  # Net::DBus::RemoteService
  my $service = $bus->get_service("ru.gentoo.KbddService");
  # Net::DBus::RemoteObject
  my $object = $service->get_object("/ru/gentoo/KbddService");

  my $module = new FVWM::Module(
    Name => "FvwmKbdd",
    Mask => M_STRING,
    Debug => 1,
  );

  sub kbdd {
    my ($module, $event) = @_;
    my ($action, @args) = get_tokens($event->_text);
    if ($action eq "hello") {
      $module->send("Echo Hello from Kbdd...");
    } elsif ($action eq "hel") {
      $module->send("Echo xxx...");
    } elsif ($action eq "kbdd") {
      my $no = $args[0];
      if ((0 <= $no) && ($no < 4)) {
        $object->set_layout(Net::DBus::dbus_uint32($no));
      } else {
        $module->send("Echo Error: Kbdd no " . $no . "is not in 1..4 range");
      }
    } elsif ($action eq "stop") {
      $module->send("Echo Kbdd exit...");
      $module->terminate;
    } else {
      $module->send("Echo Kbdd unknown action: " . $action);
    }
  }

  $module->addHandler(M_STRING, \&kbdd);

  $module->send("Echo Kbdd loaded...");

  $module->event_loop;

================================================================

Так живу несколько лет. По итогу переключение по:

  LWin+1, LWin+2, LWin+3

Получить настройки в файлах:

  http://hg.defun.work/skel/file/tip

У решения есть проблемы с всплывающими окнами.

Вообще у X11 какой то особый статус всплывающих окон, Они эксклюзивно забирают
фокус, так что события с клавиатуры не попадают в Fvwm. Я даже не знаю какими
словами это гуглить.

================================================================

Для Emacs есть интересное решение:

  ;; cyrillic-jis-russian  for 567 is :,.
  ;; cyrillic-jcuken  for SHIFT 567 is :,.
  ;; russian-computer for SHIFT 567 is %^&
  (setq my-russian-input-method 'russian-computer)
  (setq my-ukranian-input-method 'ukrainian-computer)
  (setq my-ipa-input-method 'ipa-x-sampa)
  (when (<= emacs-major-version 21)
    (setq my-russian-input-method 'cyrillic-jcuken)
    (setq my-ukranian-input-method 'cyrillic-jcuken))
  (setq default-input-method my-russian-input-method)

  (defun my-toggle-input-method (&optional arg)
    (interactive "P")
    (if (numberp arg)
        (cond
         ((eq arg 1)
          (activate-input-method nil))
         ((eq arg 2)
          (activate-input-method my-russian-input-method))
         ((eq arg 3)
          (activate-input-method my-ukranian-input-method))
         ((eq arg 4)
          (activate-input-method my-ipa-input-method))
         ((eq arg 5)
          (activate-input-method 'TeX)) )
      (toggle-input-method arg)) )

  (global-set-key (kbd "C-\\") 'my-toggle-input-method)

По C-4 C-\ ввожу IPA символы (ранее пользовался методом ipa, но ipa-x-sampa
полнее, понятней и распространен в другом софте), по C-5 C-\ ввожу всякие
типографические кавычки и стрелочки.

================================================================

Безусловное переключение - хорошо.

Если у Вас получится с .xkbrc - отпишите в рассылку. Разобраться хочется, но
времени нету, а там много концепций и доки.

-- 
http://defun.work/


Reply to: