Como flutuar uma janela que tenha WM_NAME, mas não WM_CLASS

4

Configuração

Debian Linux 8.2, 64 bits, Xmonad 0.11

Quando começou

Eu recentemente atualizei meu sistema (para debian8), então eu tive que fazer alguns ajustes na minha configuração de xmonad.hs - ou seja, mudar os gerenciadores para as janelas gst-launch do GStreamer de:

, title     =? "gst-launch-0.10" --> doFloat

para:

, title     =? "gst-launch-1.0" --> doFloat

Estou usando title em vez de className porque gst-launch-1.0 windows somente estas propriedades:

$ xprop
_NET_WM_DESKTOP(CARDINAL) = 6
WM_NAME(STRING) = "gst-launch-1.0"
WM_STATE(WM_STATE):
                window state: Normal
                icon window: 0x0
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x2, 0x0, 0x1, 0x0, 0x0
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW

O que faz

Estou encontrando um comportamento muito estranho, que eu não vi com o old gst-launch-0.10 windows. Quando gst-launch-1.0 janela (geralmente bastante pequeno - 400x300) começa é um dos seguintes casos com diminuição probabilidade:

  • adiciona a janela como outro bloco (sem flutuar) e estica a sua conteúdo para preencher esse bloco (mantendo a proporção), o restante do bloco é preto
  • adiciona a janela como outro bloco (sem flutuar), mas desenha somente no canto superior esquerdo desta telha (sem alongamento), o resto da telha mostra Fundo de X-Window
  • com menos de 10% de probabilidade que flutua a janela corretamente

O que eu tentei

doFullFloat e doCenterFloat fazem exatamente a mesma coisa (exceto que é centrado ou cheio no último caso)

O que eu suspeito

Tenho certeza de que o problema está em usar apenas WM_NAME/title em vez de WM_CLASS/className/appName , porque o título pode ser alterado durante o vida da janela. Eu acho que a janela gst-launch-1.0 começa com alguns outro (ou nenhum) título e depois de algum tempo muda para gst-launch-1.0 . Então é só uma questão de sorte se xmonad pegar o título original ou o % finalgst-launch-1.0.

Pergunta

Existe alguma maneira de "esperar um pouco" no manageHook para que eu possa ter certeza de pegar a janela final WM_NAME/title ?

Ou alguma outra ideia?

Informações adicionais:

Aparentemente isso foi corrigido no gstreamer - link - mas infelizmente eu preciso usar o gstreamer que vem com debian.

    
por Jan Spurny 09.11.2015 / 20:37

1 resposta

0

Isso pode ser útil, o seguinte é do tipo X () , portanto, pode ser vinculado a uma associação de teclas.

              withWindowSet $ (\ws ->
              case W.stack . W.workspace . W.current  $ ws of
                Just w' ->
                  mapM_ (\w -> do
                    s <- withDisplay $ \d -> fmap resClass $ liftIO $ getClassHint d w
                    case (s) of
                      "Emacs" -> do
                        windows $ W.focusWindow w
                      "Lxterminal" -> do
                        wmName <- withDisplay $ \d -> getStringProperty d w "WM_NAME"
                        case wmName of
                          Just "ranger" -> windows $ W.focusWindow w
                    ) $ W.integrate w'
                _ -> return ()
                )
              )

As linhas importantes são:

              "Lxterminal" -> do
                wmName <- withDisplay $ \d -> getStringProperty d w "WM_NAME"
                case wmName of
                  Just "ranger" -> windows $ W.focusWindow w

Então, primeiro comparamos por WM_CLASS e, em seguida, WM_NAME .

    
por 01.01.2018 / 14:26

Tags