AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1124149
Accepted
Christian Sirolli
Christian Sirolli
Asked: 2019-03-09 14:12:30 +0800 CST2019-03-09 14:12:30 +0800 CST 2019-03-09 14:12:30 +0800 CST

Como obter tamanho e posição da barra de tarefas com Python

  • 772

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 win32apimódulo e usar GetMonitorInfopara 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.

python display-resolution taskbar python3
  • 1 1 respostas
  • 2275 Views

1 respostas

  • Voted
  1. Best Answer
    Sergiy Kolodyazhnyy
    2019-03-16T00:20:09+08:002019-03-16T00:20:09+08:00

    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.

    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_STRUTpropriedades 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:

    _NET_WORKAREA, x, y, largura, altura CARDEAL/32

    Esta propriedade DEVE ser definida pelo Gerenciador de Janelas ao calcular a área de trabalho para cada área de trabalho. Contém uma geometria para cada área de trabalho. Essas geometrias são especificadas em relação à viewport em cada área de trabalho e especificam uma área que está completamente contida na viewport. A área de trabalho DEVE ser usada por aplicativos de área de trabalho para colocar os ícones da área de trabalho adequadamente.

    O Window Manager DEVE calcular esse espaço tomando a página atual menos o espaço ocupado por dock e panel windows, conforme indicado pelas propriedades _NET_WM_STRUT ou _NET_WM_STRUT_PARTIAL definidas nas janelas do cliente.

    Há alguns pontos a serem observados:

    • Um gerenciador de janelas compatível com essas especificações deve definir essa propriedade, portanto, em ambientes de desktop como XFCE, Budgie, Unity, GNOME, KDE - ou seja, em qualquer versão oficial do Ubuntu que não use nenhum gerenciador de janelas experimental terá essa propriedade definida ; em outras palavras, isso funcionará em desktops compatíveis
    • Isso calcula a largura e a altura disponíveis, mas também onde os deslocamentos começam em relação ao canto mais à esquerda de toda a tela (no caso de tela dupla, o canto superior esquerdo da tela mais à esquerda será o ponto de partida)
    • O _NET_WM_STRUTou _NET_WM_STRUT_PARTIALsã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_WORKAREAque funcionará para você em 99% dos casos.

    Essa propriedade pode ser consultada no shell por meio xpropdo utilitário na janela raiz.

    $ xprop -root _NET_WORKAREA
    _NET_WORKAREA(CARDINAL) = 0, 32, 3120, 974, 0, 32, 3120, 974
    

    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 é 3120e 974. 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:

    $ xprop -root _NET_WORKAREA
    _NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
    

    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):

    $ xprop -root _NET_DESKTOP_GEOMETRY
    _NET_DESKTOP_GEOMETRY(CARDINAL) = 3120, 1050
    

    Python exprop

    O xpropcomando 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 comando subprocess.check_output()or subprocess.run()e analisar a saída por meio do remódulo.

    >>> import re,subprocess
    >>> out = subprocess.check_output(['xprop','-root','_NET_WORKAREA'])
    >>> workarea_tokens = re.split('=|,',out.decode())
    >>> workarea_tokens[1:5]
    [' 0', ' 32', ' 3059', ' 1018']
    

    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.

    #!/usr/bin/env python3
    import gi
    gi.require_version('Gtk','3.0')
    gi.require_version('Gdk','3.0')
    from gi.repository import Gdk,Gtk,GdkX11
    
    display = Gdk.Display().get_default()
    for i in range(display.get_n_monitors()):
        monitor = display.get_monitor(i)
        w_area  = monitor.get_workarea()
        print(w_area.x, w_area.y,
              w_area.width, w_area.height)
    

    O resultado deste programa:

    $ python3  display_area.py
    1440 32 1619 1018
    0 0 1440 900
    # width of two monitors with dock on right adds up to _NET_WORKAREA
    $ echo $((1619+1440))
    3059
    $ xprop -root _NET_WORKAREA
    _NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
    

    Problemas

    Agora, lembra que mencionei que tenho monitores duplos? Essa configuração abre muitas possibilidades, mas também revela certos comportamentos estranhos.

    # added xfce4-panel at the bottom of second screen, no change in height - 900
    $ python3 display_area.py ; xprop -root _NET_WORKAREA
    1440 32 1619 1018
    0 0 1440 900
    _NET_WORKAREA(CARDINAL) = 526, 32, 2533, 1018, 526, 32, 2533, 1018
    # stopped xfce4-panel process, same height - 900
    $ python3 display_area.py ; xprop -root _NET_WORKAREA
    1440 32 1619 1018
    0 0 1440 900
    _NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
    # added xfce4-panel to the top of second monitor
    $ python3 display_area.py ; xprop -root _NET_WORKAREA
    1440 49 1619 1001
    0 0 1440 900
    _NET_WORKAREA(CARDINAL) = 0, 49, 3059, 1001, 0, 49, 3059, 1001
    

    Lembre-se que tenho um painel e um dock em uma tela e adicionei para testes xfce4-panelna outra tela. Os resultados com erros do Gdk são que a área de trabalho do segundo monitor não foi alterada. xproptambém relatou números errados - nos primeiros 526pontos 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 adicionada xfce4-paneldeve 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.

    • 4

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve