SwayWM - UnixPorn você mesmo

Olá pessoal. Neste artigo, descreverei minha experiência em configurar e usar o sway, um gerenciador de janelas lado a lado para Linux.


O que é e por que é necessário?


Oficialmente, o sway é um gerenciador de janelas lado a lado, um substituto transparente para o i3wm, trabalhando em cima do Wayland.


Weiland, também conhecido como Wölund, etc. - Um personagem da mitologia alemã antiga e nórdica antiga, um livro sobre o qual uma vez foi escrito pela folclorista inglesa Jessie Weston. Agora você sabe.

No entanto, na minha opinião, a principal característica do balanço é que ele é um construtor, com todas as vantagens e desvantagens dessa abordagem. Se você gosta do Vim (a semelhança com ele é agravada pela orientação sobre o uso do teclado), do Archlinux e de projetos similares, aconselho que você dê uma olhada mais de perto na influência. Minha opinião pessoal é que, quando você gastar um pouco mais de tempo para configurá-lo, terá um ambiente muito estável e conveniente para você, pessoalmente, no qual nada inesperado acontecerá.


Se as falhas de oscilação e Wayland (como a falta de suporte para os drivers particulares da NVidia e a necessidade de procurar análogos para muitos programas familiares) parecerem fatais para você, aconselho que você preste atenção no x3 i3wm. As partes construtoras serão completamente diferentes, você terá que instalar o xinit, configurar várias .Xauthority, é possível lidar com o rasgo, mas a lógica geral do sistema é exatamente a mesma.


Instalação


O Sway provavelmente está nos repositórios da sua distribuição. No entanto, se você deseja instalar uma versão mais recente, é muito simples. A página do projeto github tem uma lista escassa de suas dependências. Instale-os, clone o repositório, clone wlroots na pasta de subprojects :


 hub clone swaywm/sway hub clone swaywm/wlroots sway/subprojects/wlroots 

(aqui eu uso um hub . Uma ferramenta não-padrão, mas muito conveniente). Depois disso, você pode configurar e criar:


 meson setup ./sway-build ./sway --buildtype=minsize ninja -C ./sway-build doas ninja -C ./sway-build install 

doas é um substituto leve do sudo para desenvolvedores do OpenBSD. O Linux geralmente usa seu fork do OpenDoas.

Lançamento


Se você deseja controlar a partir da linha de comando sem usar gerentes como o SDDM, a única maneira correta de fazer isso é


 $ exec sway 

Se você executar o balanço sem o exec , bloquear a tela com o bloqueio e a queda do balanço, você será jogado de volta à linha de comando. A fechadura será inútil.


Nota para os fãs do systemd: o sway não requer nem systemd-logind nem elogind. É verdade que, nesse caso, você terá que definir o suid bit ou configurar os recursos. Veja o wiki .

Variáveis ​​de ambiente


Existem vários lugares onde eu os prescrevo.


Script de shell em ~/.local/bin/sway - para variáveis ​​específicas ao sway. Por exemplo, quero que os aplicativos Qt não mostrem o cenário e usem o tema de qt5ct :


 #!/bin/bash QT_QPA_PLATFORMTHEME=qt5ct \ QT_WAYLAND_DISABLE_WINDOWDECORATION=1 \ /usr/bin/sway 

~/.pam_environment - para variáveis ​​que eu quero disponibilizar imediatamente na sessão do usuário systemd. Um exemplo:


 SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh" 

No entanto, altere este arquivo com cuidado, especialmente se você usar outros ambientes. Por exemplo, o KDE Plasma não gostará muito se detectar $WAYLAND_DISPLAY (ironicamente, o módulo pam_env que pam_env este arquivo foi criado há N anos atrás, principalmente para definir a variável $DISPLAY ).


~/.bashrc - para todos os outros casos.


Configuração do balanço


Entrar


Tudo é bem simples no meu sistema: instalamos layouts em russo e inglês e alternamos entre eles com Alt+Shift . Na configuração do balanço, fica assim:


 input * { xkb_layout us,ru xkb_options grp:alt_shift_toggle } 

O Sway usa a biblioteca libinput para entrada, o mesmo que o KDE e o Gnome. Portanto, temos muitas opções disponíveis. Configurações do touchpad, rolagem natural, aceleração do ponteiro do mouse etc. etc. A lista de opções pode ser examinada em man sway-input e a lista de dispositivos de entrada na saída do comando


 swaymsg -t get_inputs 

No entanto, gostaria de chamar a atenção para uma oportunidade interessante. Se você estiver saindo de um ambiente X, basta transferir as configurações do teclado a partir daí. Execute o comando neste ambiente


 $ xkbcomp $DISPLAY /path/to/keymap.xkb 

e no registro de configuração do balanço


 input * { xkb_file /path/to/keymap.xkb } 

Teclas de atalho


As teclas de atalho, como todo o resto, são definidas na configuração. Existem 3 comandos para defini-los:


  1. bindswitch . É realizada ao abrir / fechar a tampa do laptop, ao modo tablet, etc.
  2. bindcode . É executado quando uma tecla com o código especificado é pressionada. Não depende do layout atual, especialmente útil para teclas multimídia.
  3. bindsym . O caractere atual inserido depende do layout. No entanto, se você adicionar o parâmetro --to-code , esse caractere será implicitamente convertido no código correspondente para o primeiro layout do xkb_layout (consulte as configurações de entrada).

Por exemplo, uma tecla de atalho superará a janela atual, independentemente do layout:


 bindsym --to-code $mod+Shift+q kill 

Você pode ler mais sobre esses parâmetros em mana: man 5 sway .


Para determinar facilmente o que foi pressionado, o autor do sway escreveu um keylogger especial (ele precisa de direitos de root para funcionar, portanto, não há necessidade de se preocupar com segurança).


Conclusão


Uma lista de dispositivos de saída disponíveis pode ser obtida com o comando


 swaymsg -t get_outputs 

Na configuração de cada um deles, você pode definir o modo de vídeo, dimensionamento (incluindo fracionário), imagem, rotação etc. A configuração mais simples é assim:


 output HDMI-A-1 mode 1920x1080@60Hz output * bg /path/to/wallpaper.jpg fill 

Uma lista completa de opções pode ser encontrada no mana man sway-output .
Existe também um programa wlr-randr no qual tudo isso pode ser definido na linha de comando (ou seja, é um análogo do XRandr para Wayland).


Swaybar


Barra estabilizadora - um painel no qual as informações de status são exibidas. Data, hora, bandeja do sistema etc. etc. Normalmente, os ventiladores i3 e os osciladores passam mais tempo configurando esse painel específico (ou painéis, pode haver vários). Pessoalmente, eu tenho o suficiente disso, perto da configuração mínima:


 bar { position top colors { statusline #ffffff background #282828E6 inactive_workspace #282936BF #282936BF #5c5c5c } font Hack 11 status_command i3blocks } 

Existem muitas opções para ajustar posição, cores, fontes, bandeja, etc. Você pode man 5 sway-bar sobre eles em mana - man 5 sway-bar .


O Swaybar está comprometido em ler e analisar o json no formato i3bar, produzido pelo status_command . Existem muitos programas que podem ser usados ​​aqui. i3status , waybar , i3status-rs e muitos outros projetos. Pessoalmente, prefiro i3blocks devido à simplicidade da configuração e à facilidade de adicionar blocos personalizados.


Configuração do aplicativo


Notificações


Isso pode ser feito pelo daemon mako (provavelmente existe na sua distribuição). Lá você também pode ajustar cores, etc., mas tudo isso é opcional. Basta executá-lo e ele funcionará.


O Mako implementa a especificação de Notificações de área de trabalho XDG baseada em dbus. É suportado por muitos programas, incluindo Chromium, Firefox e Telegram.


Emulador de terminal


Em ambientes como o KDE, o Plasma normalmente usa emuladores embutidos que exibem menus, guias e muitos outros elementos de design. Mas por que tudo isso influencia? Eu prefiro o Alacritty - muito rápido, graças ao uso do emulador de GPU, a propósito, escrito em Rust. Adicionei essas teclas de atalho à seção key_bindings em sua configuração ( ~/.config/alacritty/alacritty.yml ):


 - { key: T, mods: Control|Shift, action: SpawnNewInstance } 

abra uma nova janela com o diretório atual. Um ótimo substituto para as guias e o balanço cuidará do layout.


 - { key: Up, mods: Control|Shift, action: ScrollLineUp, mode: ~Alt } - { key: Down, mods: Control|Shift, action: ScrollLineDown, mode: ~Alt } 

role para cima / baixo uma linha.


Escrevemos na configuração do balanço


 set $term alacritty bindsym $mod+Return exec $term 

O Alacritty não suporta ligaduras, pois elas afetam a velocidade de renderização. Se você ainda precisar deles, preste atenção ao gatinho - este emulador também é muito rápido e há apenas uma quantidade assustadora de recursos e configurações sob o capô.


Iniciar aplicativos


Os aplicativos influenciados geralmente são iniciados usando o menu de teclas de atalho. Na configuração, eles escrevem algo como


 set $menu ... bindsym --to-code $mod+d exec $menu 

Existem muitos programas para exibir o menu. Alguns, como dmenu ou rofi , precisam do XWayland. Entre os que trabalham no Wayland, podemos distinguir bemenu e até krunner (o que aparece no KDE pelo Alt+F2 . Sim, este é um programa independente).


No entanto, prefiro uma solução mais universal, ou seja, o sway-launcher-desktop . Apesar do nome, ele não depende de influência e, em geral, não é um programa da GUI, mas um pequeno script de shell que funciona no console. Este script forma um menu a partir de programas em $PATH , arquivos da área de trabalho instalados (de acordo com a especificação XDG Desktop Entry) e, possivelmente, fontes adicionais (configuradas na configuração). O maravilhoso utilitário fzf é usado para exibir e pesquisar no menu - preste atenção nele.


Assim, para exibir o menu, precisamos abrir uma janela de terminal com este programa. Com alacritty, isso é feito assim:


 set $menu exec alacritty -e sway-launcher-desktop bindsym --to-code $mod+d exec $menu 

Você pode fazer essa janela flutuar por padrão. No i3 e no sway, essas regras são configuradas na configuração usando a diretiva for_window . Para mapear a regra para a janela sway-launcher-desktop , ela precisa receber uma classe exclusiva, para mim é apenas o Launcher . Lembre-se de que, devido ao uso de Wayland, os critérios listados no manual i3 não são adequados para oscilação. Os corretos podem ser encontrados no man 5 sway , seção CRITERIA . Nesse caso, app_id é bastante adequado, e a configuração final é assim:


 set $menu exec alacritty --class Launcher -e sway-launcher-desktop for_window [app_id="Launcher"] floating enable, border pixel 10, sticky enable bindsym --to-code $mod+d exec $menu 

Iniciar aplicativos automaticamente


Em princípio, para iniciar automaticamente um programa, você pode simplesmente escrever


 exec /path/to/program 

na configuração de oscilação ou até mesmo criar uma unidade systemd personalizada. No entanto, neste artigo, usarei a especificação de inicialização automática do XDG adotada pelo KDE e Gnome.


A especificação é para executar arquivos da área de trabalho localizados nos diretórios /etc/xdg/autostart e ~/.config/autostart . Como regra, esses arquivos vêm em pacotes com programas, mas são fáceis de criar você mesmo.


É aqui que a essência modular do balanço se manifesta. O Sway em si não sabe nada sobre o XDG Autostart, nem sobre o XDG Desktop Entry. Além disso, seus desenvolvedores não gostam ativamente dessas e de todas as especificações semelhantes. No entanto, o utilitário dex console pode gerenciá-los (provavelmente, ele está no repositório da sua distribuição).


Para verificar o que haverá na execução automática, digite o comando


 $ dex -ade Sway 

a significa início automático, d - "funcionamento a seco", -e Sway define o nome do ambiente (pode ser qualquer) e é usado para filtrar.


Provavelmente, a lista resultante não será adequada para você. Por exemplo, eu tenho o kgpg . Procedemos da seguinte maneira: copie o arquivo da área de trabalho correspondente de /etc/xdg/autostart para ~/.config/autostart , adicione a linha lá


 NotShowIn=Sway 

e verifique a execução automática novamente. Muitos programas (especialmente aqueles escritos em Electron) podem não gostar de rodar em Wayland. Nós fazemos o mesmo com eles. Copiamos o arquivo da área de trabalho e alteramos a linha de lançamento lá. Foi:


 Exec=/usr/bin/skypeforlinux 

tornou-se:


 Exec=env GDK_BACKEND=x11 /usr/bin/skypeforlinux 

a mesma técnica pode ser aplicada ao sway-launcher-desktop do parágrafo anterior. Quando todos os problemas forem resolvidos, adicione a linha à configuração de oscilação


 exec dex -ae Sway 

Ou você pode fazer o oposto: copie os arquivos da área de trabalho desejados para algum diretório não padrão e defina o dex nele com o comando


 exec dex -as /path/to/your/dir 

Screenshots


Dois caixões nos ajudarão nisso. O slurp permite selecionar uma área retangular arbitrária na tela e o sombrio faz uma captura de tela dela. Na minha configuração, fica assim:


 bindsym Print exec grim ~/Pictures/screen-"$(date +%s)".png bindsym $mod+Print exec grim -g "$(slurp)" ~/Pictures/screen-"$(date +%s)".png 

$mod+PrintScreen - captura de tela de uma área arbitrária, PrintScreen - captura de tela de toda a tela.


Screencasts


Se você precisar gravar um screencast em um arquivo ou transmiti-lo para um fluxo RTMP (por exemplo, no Twitch), o wf-recorder ajudará nisso (também suporta slurp).


Se você deseja usar o OBS Studio, existe o plugin wlrobs para isso.


No entanto, a solução mais universal suportada, por um lado, no KDE e no Gnome e, por outro, em particular nos navegadores Chrome e Firefox, é usar o Pipewire e a especificação do XDG Desktop Portal. Por outro lado, existe a camada necessária xdg-desktop-portal-wlr , embora eu não tenha verificado seu desempenho.


Modo noturno


O modo noturno consiste em substituir as cores do monitor por cores mais quentes no escuro. Os cientistas duvidam de quão útil isso realmente seja, e os desenvolvedores de Wayland decidiram que padronizar o protocolo de correção gama era inútil por razões técnicas.


No entanto, eu gosto desse recurso, e também está lá. Para o modo noturno, precisamos desta bifurcação do redshift com suporte para o protocolo específico de oscilação.


Nós o instalamos de qualquer maneira, na configuração ~/.config/redshift/redshift.conf , selecione o protocolo desejado e especifique a longitude e latitude.


 [redshift] location-provider=manual adjustment-method=wayland [manual] lat=xx.xx lon=yy.yy 

Bloqueio e tela desativada


Dois de outro caixão vêm em socorro aqui. swayidle executa os comandos fornecidos em timeout se não houver atividade (ou vice-versa, sua aparência) e o swaylock bloqueia a tela e requer uma senha. Você pode desligar a tela (ou todas as telas, se houver várias)


 swaymsg "output * dpms off" 

Aqui está a aparência do daemon, bloqueando a tela após 300 segundos de inatividade e desativando-a após 600:


 swayidle -w \ timeout 300 'swaylock -f -c 000000' \ timeout 600 'swaymsg "output * dpms off"' \ resume 'swaymsg "output * dpms on"' \ before-sleep 'swaylock -f -c 000000' 

Execute-o de qualquer maneira.


i3blocks


Blocos prontos com calendário, rede, status do disco etc. etc. pode ser emprestado do repositório i3blocks-contrib . Nos i3blocks, eles são adicionados na configuração em ~/.config/i3blocks/config . Por exemplo, um bloco com atualizações a cada 5 segundos pelo dia da semana, data e hora:


 [time] command=date +"%a %d/%m %H:%M" interval=5 

Mas este era um exemplo muito simples. De fato, os entusiastas do i3 e do sway têm um santo graal: exibir a barra de título da janela atual na barra superior. Vamos descobrir como conseguir isso.


Primeiro de tudo, começamos a ler man sway-ipc e descobrimos que você pode se inscrever em eventos lá. O necessário possui o código 0x80000003. WINDOW 0x80000003. WINDOW e retorna objetos json dessa estrutura:


 { "change" : "focus | title | ...", "container": { focused: true | false, name: "...", ... } } 

De fato, ou a própria janela pode mudar seu título ( change == title ), ou podemos mover o foco para outra janela ( change == focus ). No entanto, a janela pode alterar o título e ficar fora de foco. Para filtrar esses eventos, devemos verificar a propriedade container.focused .


Você pode descrever toda essa lógica no Python ou no Go, mas existe uma maneira melhor. swaymsg facilita a inscrição nos eventos desejados e a saída deles para o stdout:


 $ swaymsg -m -t SUBSCRIBE "['window']" 

e processaremos o json resultante em jq . Sem entrar nas sutilezas da sintaxe de consulta deste maravilhoso utilitário, eis o resultado:


 $ query='select(.change == "focus" or (.change == "title" and .container.focused)) | .container.name' $ swaymsg -m -t SUBSCRIBE "['window']" | jq --unbuffered -r "$query" 

Um script de duas linhas no bash, e não mais código! O sinalizador --unbuffered necessário; caso contrário, o i3blocks não receberá novas linhas imediatamente, mas somente quando o buffer for limpo.


Por fim, adicione o seguinte bloco à configuração do i3blocks:


 [active_window] command=/path/to/our/script.sh interval=persist 

Lição de casa: ensine sombrio a tirar uma captura de tela da janela atual. Eles dizem que essas coisas são impossíveis em Wayland, mas os homens duvidam disso.


Trabalho de casa 2: Ensine os i3blocks a exibir o layout atual do teclado como uma bandeira. Existem alguns blocos no i3blocks-contrib, mas eles mostram texto em vez de uma bandeira e não funcionam em Wayland.


Outros programas


O wl-clipboard permite que você trabalhe com a área de transferência do terminal, ou seja, ela substitui o xclip e o xsel. É especialmente útil para usuários do vim, nos quais copiar / colar começa a usar "+y / "+p (basta instalar este pacote, nenhuma configuração adicional é necessária).


ydotool - substituição do xdotool.


waypipe - proxy para a transparência da rede. Para ser sincero, não me lembro da última vez que alguém fez uma pergunta relacionada a esse recurso em fóruns especializados. Talvez eles não usem nada? Eu - definitivamente não.


KDE Connect Adicione o arquivo org.kde.kdeconnect.nonplasma.desktop à org.kde.kdeconnect.nonplasma.desktop (consulte as seções anteriores), instale o KDE Connect no seu smartphone e configure sua conexão - e você pode controlar a reprodução de música e vídeo do seu smartphone em um navegador com o plug - in de integração de plasma , no vlc , no cantata, no mpv com o plug-in mpv-mpris e também receba notificações no mako. Meu respeito pelo projeto KDE pelo desenvolvimento de programas que não foram acertados em seus ecossistemas.


Conclusão


Você pode escrever sobre como configurar tudo isso (especialmente o painel i3blocks) sem parar, mas é melhor parar por aqui. Aqui está o que eu tenho:



Acesse também o subreddit / r / unixporn e maravilhe-se com o que as pessoas estão fazendo. (no entanto, 95% de tudo o que é apresentado lá parece bonito, mas categoricamente não é adequado para o trabalho diário :)).

Source: https://habr.com/ru/post/pt484378/


All Articles