Incrível: mudança de layout do teclado

Incrível: mudança de layout do teclado

Eu uso o incrível como gerenciador de janelas no gnome (sistema debian) e criei um widget para mudar o layout do teclado por este código:

-- Keyboard map indicator and changer
    kbdcfg = {}
    kbdcfg.cmd = "setxkbmap"
    kbdcfg.layout = { { "us", "" }, { "ru", "phonetic" } }
    kbdcfg.current = 1  -- us is our default layout
    kbdcfg.widget = widget({ type = "textbox", align = "right" })
    kbdcfg.widget.text = " " .. kbdcfg.layout[kbdcfg.current][1] .. " "
    kbdcfg.switch = function ()
       kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1
       local t = kbdcfg.layout[kbdcfg.current]
       kbdcfg.widget.text = " " .. t[1] .. " "
       os.execute( kbdcfg.cmd .. " " .. t[1] .. " " .. t[2] )
    end

    -- Mouse bindings
    kbdcfg.widget:buttons(awful.util.table.join(
        awful.button({ }, 1, function () kbdcfg.switch() end)
    ))
-- Alt + Right Shift switches the current keyboard layout
    awful.key({ "Mod1" }, "Shift_R", function () kbdcfg.switch() end),

Funciona, porém há um problema sério com o comportamento do teclado. Quando mudo para o layout ru, nenhuma das ligações do teclado funciona. Ligações incríveis não funcionam. Por exemplo, os atalhos do vim também não funcionam e etc. Como posso resolver este problema?

Responder1

As ligações do teclado não estão funcionando porque o teclado não possui mais essas teclas.

Se você quiser que, por exemplo, Alt+ Ffaça alguma coisa, então você precisa de "F" em alguma tonalidade. Mas se você carregar "ru"sozinho, então não existe "F" (nem qualquer letra latina).

Eu acho que, especialmente quando você precisa lidar com vários layouts, é muito melhor deixar o X11 (através do setxkbmap) fazer o trabalho para você; a maneira como os gerenciadores de janelas fazem isso é muito mais limitada, como você descobriu.

Você também pode tentar, como o widget horrível parece chamar setxkbmap, alterar "ru" por "ru,us", por exemplo:

kbdcfg.layout = { { "us", "" }, { "ru,us", "phonetic" } }

dessa forma, o layout "us" será empilhado em cima do "ru" quando carregado, e os sistemas de teclas do layout "us", embora ainda não possam ser digitados diretamente, serão vistos pela camada X11 que lida com as combinações de teclas .

Responder2

Sobre AwesomeWM, desde seuPerguntas frequentes:

Você deve usar códigos-chave, em vez de nomes-chave, como este:

  1. Correr xev.
  2. Pressione Printa tecla.
  3. Leia a saída

    KeyPress event, serial 34, synthetic NO, window 0x1200002,
    root 0x291, subw 0x0, time 1510129, (471,293), root:(472,316),
    state 0x0, keycode **107** (keysym 0xff61, Print), same_screen YES,
    ...
    
  4. Crie ~/screenshots, instale o scrot e adicione o seguinte ao rc.lua:

    awful.key({ }, "#107", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'") end),
    

Agora você pode testar se pode criar capturas de tela com qualquer layout de teclado.

Responder3

Acabei de resolver o mesmo problema e a solução listada aqui não funcionou. Eu finalmente encontreiinterruptor xkbque funcionou corretamente com incrível. Ele tem a vantagem adicional de código simplificado no rc.luaarquivo.

-- language switcher
kbdcfg = {}
kbdcfg.cmd = "xkb-switch -n"
kbdcfg.widget = wibox.widget.textbox()

kbdcfg.current = io.popen("xkb-switch"):read("*a")
kbdcfg.widget:set_text(kbdcfg.current)
kbdcfg.switch = function()
    os.execute(kbdcfg.cmd)
    kbdcfg.current = io.popen("xkb-switch"):read("*a")
    kbdcfg.widget:set_text(kbdcfg.current)
end

Responder4

Não tenho certeza se deveria ser um comentário ou não: depois de ler e usarComentário de @yotam(obrigado! você tem meu voto positivo).

Decidi levá-lo para o próximo nível, corrigindo o xkb-switch para permitir os sinalizadores -n e -p, tornando possível mudar para o próximo layout e imprimi-lo.até que a mesclagem possa ser clonada deaqui.finalmente mesclado! pode ser encontrado acimaaqui.

Agora é possível deixar o switcher um pouco mais limpo e rápido :)

-- Language switcher
kbdcfg = {}
kbdcfg.widget = wibox.widget.textbox()
kbdcfg.switch = function ()
  current_kb = io.popen("xkb-switch -p -n"):read("*a")
  kbdcfg.widget:set_text(current_kb)
end
kbdcfg.switch()

EDIT: para fazer com que setxkbmap não perturbe a troca de layout por meio de combinações de teclas incríveis, use este tipo de comando para configurar seu layout:

setxkbmap -layout "us,il" -option ""

Isso garantirá que nenhuma opção extra seja deixada na configuração anterior.

informação relacionada