Estou desenvolvendo um módulo com Python e gostaria de descobrir uma maneira de obter a resolução do monitor menos a barra de tarefas sem nenhuma interação do usuário e de preferência de forma que não interfira na interface visual. Se eu conseguir apenas obter o tamanho e a posição da barra de tarefas, posso simplesmente subtraí-la da resolução do monitor facilmente. No entanto, não consigo encontrar uma maneira.
No Windows, posso usar o win32api
módulo e usar GetMonitorInfo
para obter a resolução do monitor. No entanto, ainda não descobri uma maneira de fazer isso no Ubuntu ou no Linux em geral. Se você também tiver uma maneira de fazer isso no macOS, seria bom saber também, mas não é necessário para esta pergunta.
Gostaria de oferecer suporte ao maior número possível de ambientes de desktop, mas percebo como seria difícil fazer isso, pois cada um pode ter sua própria solução. Considerando isso, eu preferiria começar com estes ambientes de desktop:
- KDEGenericName
- XFCE
- Gnomo
- Canela
Se isso requer alguns programas externos para obtê-lo, prefiro usar algo que vem com o ambiente de desktop ou sistema operacional.
Isso é o que foi perguntado e vou me concentrar nisso ao longo desta resposta com base no que descobri. Obter o tamanho e a posição da barra de tarefas foi uma ideia original, mas como foi discutido nos comentários, isso será difícil de implementar sem conhecer muitas informações - qual painel ou encaixe está em execução, eles têm
_NET_WM_STRUT
propriedades definidas, eles expõem essas informações por meio de banco de dados GSettings ou outros métodos. Tenho certeza que não é impossível, mas é bastante difícil.Propriedade NET_WORKAREA
De acordo com as especificações da janela raiz, _NET_WORKAREA é definido da seguinte forma:
Há alguns pontos a serem observados:
_NET_WM_STRUT
ou_NET_WM_STRUT_PARTIAL
são propriedades definidas por encaixes e painéis. Isso significa que, se o painel ou dock não definir, eles basicamente se comportarão como uma janela normal que fica acima de todas as outras (e deixando os usuários potencialmente irritados 1 ). Dito isto, isso é bom o suficiente para nós. Eu testei essa propriedade no Cinnamon, LXQt e XFCE no Ubuntu 18.04. Em todos os casos, as docas e painéis informaram adequadamente o gerenciador de janelas sobre sua área de suporte. Isso significa_NET_WORKAREA
que funcionará para você em 99% dos casos.Essa propriedade pode ser consultada no shell por meio
xprop
do utilitário na janela raiz.Essa é a saída com minha configuração de monitor duplo, com dois monitores alinhados na parte superior, um dock e um painel superior. Se você observar apenas os primeiros quatro valores são significativos e os outros quatro são repetidos. De particular interesse é
3120
e974
. Esse é o valor que nos interessa. Os dois primeiros nos dizem onde começa o canto esquerdo da área de trabalho. Meu painel superior ocupa 32 pontos, portanto, o canto mais esquerdo da área de trabalho começa totalmente à esquerda, com deslocamento de 32 pontos para baixo. O deslocamento da parte inferior geralmente não importa para as janelas - elas preencherão a área de trabalho disponível.Se eu colocar o encaixe no lado direito do monitor principal, você notará que a largura diminuiu, mas a altura:
A mudança de altura é de 44 pontos. Adicione outro 32 (o tamanho da janela do painel superior) a isso e você obterá 1050 exatamente a geometria da minha área de trabalho (observe o 3120 de antes, quando não havia encaixe para o tamanho, então a largura total da área de trabalho estava sendo usada):
Python e
xprop
O
xprop
comando acima vem com a maioria dos desktops e pertence ao pacote x11-utils , portanto, se você estiver visando os principais sistemas baseados em Debian, deverá tê-lo disponível na maioria das vezes. O que eu faria é usar o subprocesso do Python e utilizar o comandosubprocess.check_output()
orsubprocess.run()
e analisar a saída por meio dore
módulo.Python e Gdk
Alternativa (e geralmente minha maneira preferida) seria utilizar a biblioteca Gdk, que está intimamente relacionada a outras bibliotecas de projetos GNOME . Se você está desenvolvendo um aplicativo de desktop usando Gtk, você já tem as ferramentas necessárias disponíveis, então por que não usá-las? A parte complicada é que você precisa calcular a área de trabalho para cada monitor individual.
O resultado deste programa:
Problemas
Agora, lembra que mencionei que tenho monitores duplos? Essa configuração abre muitas possibilidades, mas também revela certos comportamentos estranhos.
Lembre-se que tenho um painel e um dock em uma tela e adicionei para testes
xfce4-panel
na outra tela. Os resultados com erros do Gdk são que a área de trabalho do segundo monitor não foi alterada.xprop
também relatou números errados - nos primeiros526
pontos de saída de deslocamento da esquerda simplesmente não eram verdadeiros. Na última saída, no entanto, o deslocamento vertical aumentou, o que foi bom - a largura extra adicionadaxfce4-panel
deve ser adicionada ao total, e provavelmente o que ajuda é que meus dois monitores estão alinhados na parte superior.Em outras palavras, se seu aplicativo planeja determinar a área sem docks e painéis, esses métodos funcionarão melhor com a configuração de um único monitor. Na configuração de monitor duplo - os resultados podem ser inconsistentes. Observe que estou usando o Metacity Window Manager e os bugs podem ser atribuídos a isso. No entanto, não tenho como testar outro WM com configuração de monitor duplo no momento, então deixarei esta seção como inconclusiva.
TODO (algum dia)
Exemplo de libx11 em C ou Python
teste de monitor duplo com gerenciador de janelas alternativo
encontrar locais de encaixe e painel
notas de rodapé
1 Recurso não documentado, depende da paciência do usuário.