Awesome: switch de layout do teclado

5

Eu uso o awesome como gerenciador de janelas no gnome (sistema debian) e fiz 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, no entanto, há um problema sério com o comportamento do teclado. Quando eu mudo para o layout ru não funciona o meu bindings de teclado. Ligações impressionantes não funcionam. Por exemplo, os atalhos do vim também não funcionam e etc. Como posso resolver este problema?

    
por itun 06.04.2012 / 19:10

4 respostas

3

Suas ligações de teclado não estão funcionando porque seu teclado não tem mais esses teclados.

Se você quiser que, por exemplo, o Alt + F faça alguma coisa, então você precisa do "F" em alguma chave. Mas se você carregar "ru" sozinho , então não há "F" (nem qualquer letra latina).

Eu acho que, especialmente quando você precisa lidar com múltiplos 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 awfull parece chamar o setxkbmap, para alterar "ru" com "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 keyysms do layout "us", embora não sejam diretamente tipificáveis, serão vistos pela camada X11 que manipula as ligações de teclas.

    
por 04.04.2013 / 18:46
2

Sobre o AwesomeWM, da FAQ :

Você deve usar códigos de teclas, em vez de nomes-chave, assim:

  1. Executar xev .
  2. Pressione a tecla "Imprimir".
  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.

    
por 20.04.2012 / 00:38
1

Acabei de enfrentar o mesmo problema, e a solução listada aqui não funcionou. Eu finalmente encontrei xkb-switch que funcionou corretamente com o incrível. Ele tem o bônus adicional de código simplificado no arquivo rc.lua .

-- 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
    
por 29.11.2015 / 22:42
1

Não tenho certeza se é para comentar ou não, no entanto: depois de ler e usar o comentário do yotam (obrigado! você tem meu voto positivo).

Eu decidi levá-lo para o próximo nível, corrigindo o xkb-switch para permitir tanto os flags -n quanto -p, tornando possível alternar para o próximo layout e imprimi-lo. até que a mesclagem possa ser clonada de aqui . finalmente mesclada! pode ser encontrado em aqui .

Agora é possível tornar o comutador um pouco mais limpo e mais 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()

Espero que ajude alguém:)

EDIT: para fazer com que o setxkbmap não perturbe o layout de switching por atalhos de teclas impressionantes, use este tipo de comando para configurar seu layout:

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

Isso garante que nenhuma opção extra seja deixada pela configuração anterior.

    
por 04.07.2016 / 02:36