Pop Shell é uma camada controlada por teclado para GNOME Shell que permite navegação e gerenciamento rápido e sensato de janelas. O principal recurso do Pop Shell é a adição de gerenciamento avançado de janelas lado a lado – um recurso que tem sido muito procurado em nossa comunidade. Para muitos – inclusive nós mesmos – o i3wm se tornou o principal concorrente do desktop GNOME.
O gerenciamento de janelas lado a lado no GNOME é praticamente inexistente, o que torna a área de trabalho difícil de interagir quando suas necessidades excedem as de duas janelas em um determinado momento. Felizmente, o GNOME Shell é uma área de trabalho extensível com bases que tornam possível implementar um gerenciador de janelas lado a lado na parte superior da área de trabalho.
Portanto, vemos aqui uma oportunidade de avançar na usabilidade da área de trabalho GNOME para melhor acomodar as necessidades da nossa comunidade com o Pop Shell. O gerenciamento avançado de janelas lado a lado é essencial para a área de trabalho, por isso fundimos o gerenciamento de janelas lado a lado do tipo i3 com a área de trabalho GNOME para obter o melhor dos dois mundos.
A Proposta: Possível upstreaming para o GNOME
O problema: por que precisamos disso no GNOME
Instalação: Para quem deseja instalar em sua distribuição
A solução:
Recursos compartilhados: comportamentos compartilhados entre os modos de empilhamento e agrupamento automático
Modo flutuante: comportamentos específicos do modo flutuante
Modo lado a lado: comportamentos específicos do modo lado a lado automático
Desenvolvedores: guia para começar a desenvolver
Uma proposta para integração dos recursos de gerenciamento de janelas lado a lado do Pop Shell no GNOME está atualmente em desenvolvimento. Ele será criado como uma edição do GitLab no GNOME Shell para discussão futura, uma vez que tenhamos investido nosso tempo na produção de um protótipo funcional e aprendido o que funciona e o que não funciona na prática.
Idealmente, os recursos explorados no Pop Shell estarão disponíveis para qualquer ambiente que use o Mutter – ampliando em muito a capacidade de agrupamento de meio monitor atualmente presente. Começando como uma extensão de shell, qualquer pessoa que use o GNOME Shell pode instalá-lo em seu sistema, sem ter que instalar um fork específico do GNOME para Pop em seu sistema.
Então, por que isso é um problema para nós e por que tantos de nossos usuários mudam para o i3wm?
Atualmente, o GNOME suporta apenas half-tiling, que coloca uma janela em um lado da tela e outra janela no outro lado da tela. Se você tiver mais de duas janelas, espera-se colocá-las em áreas de trabalho e monitores separados ou alternar entre janelas com Alt
+ Tab
.
Isso tende a funcionar bem se você tiver apenas alguns aplicativos. Se você precisar de mais de duas janelas ao mesmo tempo em uma tela, sua única opção é arrastar manualmente as janelas para a posição e redimensioná-las para que caibam uma ao lado da outra – um processo muito demorado que pode ser facilmente automatizado e simplificado.
Suponha que você seja um sortudo – ou talvez azarado – proprietário de uma tela ultralarga. Uma janela maximizada terá muitas de suas preferências e controles dispersos nos cantos esquerdo e direito. O aplicativo pode colocar um painel com botões na extrema esquerda, enquanto outros botões são deslocados para o centro distante ou para a direita.
Half-tiling neste cenário significa que cada janela será tão grande quanto uma tela inteira de 2560x1440 ou 4K. Em qualquer cenário, em tamanhos tão extremos, o mouse se torna completamente inútil – e o uso dos aplicativos torna-se insuportável – na prática.
À medida que você luta para combater o gerenciador de janelas, rapidamente fica claro que qualquer tentativa de gerenciar janelas da maneira tradicional de empilhamento – onde você precisa mover manualmente as janelas para o lugar e depois redimensioná-las manualmente – é inútil. Os humanos não são tão precisos ou rápidos quanto os algoritmos no alinhamento de janelas lado a lado em uma tela.
A área de trabalho GNOME vem com muitos recursos úteis de integração de área de trabalho, que são perdidos ao mudar para uma sessão i3wm. Embora seja possível conectar vários serviços de sessão do GNOME a uma sessão i3wm, grande parte da experiência da área de trabalho do GNOME ainda é perdida no processo. A visão geral do aplicativo, o painel do GNOME e as extensões do GNOME.
Pior ainda, muitos usuários não estão familiarizados com os gerenciadores de janelas lado a lado e podem nunca se sentir confortáveis em mudar o "peru frio" para um. Ao oferecer o gerenciamento de janelas lado a lado como um recurso que pode ser ativado, podemos capacitar o usuário a obter maior controle sobre sua área de trabalho, de modo que a ideia de gerenciamento de janelas lado a lado se torne subitamente acessível.
Além disso, há aqueles que desejam a experiência tradicional de gerenciamento de janelas empilhadas, mas também desejam poder optar pelo gerenciamento avançado de janelas lado a lado. Portanto, deve ser possível optar pelo gerenciamento de janelas lado a lado, conforme necessário. Outros sistemas operacionais combinaram com sucesso os recursos de gerenciamento de janelas lado a lado com a experiência tradicional de gerenciamento de janelas empilhadas, e achamos que podemos fazer isso também com o GNOME.
Use o branch correspondente à sua versão do GNOME Shell ( git checkout branch_name
):
GNOME 3.36 a 41: Use a ramificação master_focal
.
GNOME 42 a 44: Use o branch master_jammy
.
GNOME 45: Use o branch master_mantic
.
GNOME 46+: Use o branch master_noble
.
GNU Make e TypeScript também são necessários para construir o projeto.
A funcionalidade adequada do shell requer a modificação dos atalhos de teclado padrão do GNOME. Para uma instalação local, execute make local-install
.
Se quiser desinstalar a extensão, você pode invocar make uninstall
e, em seguida, abrir o painel "Atalhos de teclado" nas configurações do GNOME para selecionar o botão "Redefinir tudo.." na barra de cabeçalho.
Observe que se você estiver empacotando para sua distribuição Linux, muitos recursos do Pop Shell não funcionarão imediatamente porque exigem alterações nos atalhos de teclado padrão do GNOME. Uma instalação local é necessária se você não estiver empacotando sua sessão do GNOME com esses atalhos de teclado padrão não configurados ou alterados.
Fedora: sudo dnf install gnome-shell-extension-pop-shell xprop
Gentoo: emerge gnome-shell-extension-pop-shell
openSUSE Tumbleweed: sudo zypper install gnome-shell-extension-pop-shell
Arch Linux (usando Yay como auxiliar AUR):
yay -S gnome-shell-extension-pop-shell
Para versão binária pré-compilada: yay -S gnome-shell-extension-pop-shell-bin
Para a versão do repositório GitHub: yay -S gnome-shell-extension-pop-shell-git
Recursos que são compartilhados entre os modos de empilhamento e agrupamento automático.
Esses são essenciais para muitos dos atalhos utilizados pelos gerenciadores de janelas lado a lado. Doravante, este documento se referirá a essas chaves como <Direction>
, cujo padrão são as seguintes chaves:
Left
ou h
Down
ou j
Up
ou k
Right
ou l
Super
+ q
: Fecha a janela
Super
+ m
: Maximiza a janela em foco
Super
+ ,
: Minimiza a janela em foco
Super
+ Esc
: tela de bloqueio
Super
+ f
: Arquivos
Super
+ e
: E-mail
Super
+ b
: Navegador da Web
Super
+ t
: Terminal
Este modo é ativado com
Super
+Return
.
O modo de gerenciamento de janelas ativa o controle adicional do teclado sobre o tamanho e a localização da janela em foco no momento. O comportamento deste modo muda ligeiramente dependendo se você está no modo de agrupamento automático ou no modo de empilhamento padrão. No modo padrão, uma sobreposição é exibida ajustada a uma grade, que representa uma possível localização futura e tamanho da janela em foco. Este comportamento muda ligeiramente no modo de mosaico automático, onde os redimensionamentos são executados imediatamente e as sobreposições só são mostradas ao trocar janelas.
Ativar isso permite os seguintes comportamentos:
<Direction>
No modo padrão, isso moverá a sobreposição exibida com base em uma grade
No modo de mosaico automático, isso redimensionará a janela
Shift
+ <Direction>
No modo padrão, isso redimensionará a sobreposição
No modo de mosaico automático, isso não fará nada
Ctrl
+ <Direction>
Seleciona uma janela na direção especificada da sobreposição
Quando Return
é pressionado, as posições das janelas serão trocadas
Shift
+ Ctrl
+ <Direction>
No modo de mosaico automático, isso é redimensionado na direção oposta
O
: Alterna entre ladrilho horizontal e vertical no modo ladrilho automático
~
: Alterna entre flutuante e lado a lado no modo de mosaico automático
Return
: Aplica as alterações que foram solicitadas
Esc
: Cancela quaisquer alterações solicitadas
Quando não estiver no modo de gerenciamento de janela, pressionar Super
+ <Direction>
mudará o foco da janela para uma janela na direção especificada. Isto é calculado com base na distância entre o centro do lado da janela focada a partir da qual a janela está sendo deslocada e o lado oposto das janelas que a rodeiam.
Mudar o foco para a esquerda calculará do centro do lado leste da janela em foco até o centro do lado oeste de todas as outras janelas. A janela com menor distância é a janela que escolhemos.
Pop Shell fornece um iniciador integrado que faz interface direta com nosso serviço de iniciador pop. JSON IPC é usado para comunicação entre o shell e o inicializador de forma assíncrona. Esta funcionalidade foi separada do shell devido a problemas de desempenho e facilidade de manutenção. O novo launcher é escrito em Rust e totalmente assíncrono. O inicializador possui recursos abrangentes que seriam úteis para implementar inicializadores de desktop além de uma extensão de shell.
As lacunas melhoram a estética das janelas de azulejos e facilitam o agarramento da borda de uma janela específica. Decidimos adicionar suporte para lacunas internas e externas e tornar essas configurações configuráveis no menu pop-up da extensão.
Janelas com decorações no lado do servidor podem ter suas barras de título completamente ocultas, resultando em espaço adicional na tela para seus aplicativos e em um ambiente visualmente mais limpo. Este recurso pode ser alternado no menu pop-up da extensão. As janelas podem ser movidas com o mouse segurando Super
ao clicar e arrastar uma janela para outro local ou usando os atalhos de teclado nativos do pop-shell. As janelas podem ser fechadas pressionando Super
+ Q
e maximizadas com Super
+ M
.
Este é o modo padrão do Pop Shell, que combina o gerenciamento tradicional de janelas empilhadas com recursos opcionais de gerenciamento de janelas lado a lado.
Neste modo, as exibições são divididas em uma grade de colunas e linhas. Ao entrar no modo lado a lado, as janelas são ajustadas a esta grade à medida que são colocadas. O número de linhas e colunas pode ser configurado no menu pop-up da extensão no painel.
Um recurso opcional para melhorar sua experiência de ladrilho é a capacidade de encaixar as janelas na grade ao usar o mouse para movê-las e redimensioná-las. Isso fornece a mesma precisão que entrar no modo de gerenciamento de janelas para posicionar uma janela com o teclado, mas com a conveniência e familiaridade de um mouse. Este recurso pode ser habilitado através do menu pop-up da extensão.
Desativado por padrão, este modo gerencia janelas usando um gerenciador de janelas lado a lado baseado em árvore. Semelhante ao i3, cada nó da árvore representa dois ramos. Uma ramificação pode ser uma janela, uma bifurcação contendo mais ramificações ou uma pilha que contém muitas janelas. Cada ramo representa uma área retangular de espaço na tela e pode ser subdividido criando mais ramos dentro de um ramo. À medida que as janelas são criadas, elas são atribuídas à janela ou pilha que está ativamente em foco, o que cria uma nova bifurcação em uma janela ou anexa a janela à pilha em foco. À medida que as janelas são destruídas, o oposto é realizado para comprimir a árvore e reorganizar as janelas para suas novas dimensões.
Super
+ O
Alterna a orientação da orientação lado a lado de um fork
Super
+ G
Alterna uma janela entre flutuante e lado a lado.
Veja #personalizando a lista flutuante da janela
Existe o arquivo $XDG_CONFIG_HOME/pop-shell/config.json
onde você pode adicionar a seguinte estrutura:
{ class: "<WM_CLASS String from xprop>", title: "<Optional Window Title>" }
Por exemplo, fazendo xprop
nas configurações do GNOME (ou GNOME Control Center), os valores WM_CLASS são gnome-control-center
e Gnome-control-center
. Use o segundo valor (Gnome-control-center), que o pop-shell irá ler. O campo title
é opcional.
Depois de aplicar as alterações em config.json
, você poderá recarregar o bloco se não funcionar na primeira vez.
Devido à natureza arriscada do JavaScript simples, esta extensão do GNOME Shell é escrita em TypeScript. Além de fornecer verificação de tipo estática e classes e interfaces autodocumentadas, ele nos permite escrever sintaxe JavaScript moderna, ao mesmo tempo que oferece suporte à geração de código para alvos mais antigos.
Instale o seguinte como dependências durante o desenvolvimento:
Node.js
LTS+ (v12+)
npm
mais recente (vem com NodeJS)
npm install typescript@latest
Ao trabalhar no shell, você pode recompilar, reconfigurar, reinstalar e reiniciar o GNOME Shell registrando com make debug
. Observe que isso só funciona de forma confiável em sessões X11, já que o Wayland sairá para a tela de login ao reiniciar o shell.
Discussões bem-vindas no Pop Chat
Licenciado sob a Licença Pública Geral GNU, Versão 3.0, (LICENSE ou https://www.gnu.org/licenses/gpl-3.0.en.html)
Qualquer contribuição enviada intencionalmente para inclusão no trabalho por você deverá ser licenciada sob a GNU GPLv3.