WM_NAME은 있지만 WM_CLASS는 없는 창을 부동시키는 방법

WM_NAME은 있지만 WM_CLASS는 없는 창을 부동시키는 방법

구성

데비안 리눅스 8.2, 64비트, Xmonad 0.11

시작할 때

xmonad.hs최근에 시스템을 debian8로 업그레이드했기 때문에 구성을 일부 조정 해야 했습니다 . 즉, GStreamer gst-launch창의 관리 후크를 변경했습니다.

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

도착하다:

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

Windows에는 다음 속성만 있으므로 대신 title사용 하고 있습니다 .classNamegst-launch-1.0

$ 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

그것이 무엇을 할 수 있는지

이전 Windows에서는 볼 수 없었던 매우 이상한 동작이 발생합니다 gst-launch-0.10. gst-launch-1.0창(보통 작음 - 400x300)이 시작 되면 확률이 감소하는 다음 상황 중 하나가 발생합니다.

  • 창을 다른 타일(전혀 부동되지 않음)로 추가하고 내용을 늘려 이 타일을 채웁니다(가로세로 비율 유지). 타일의 나머지 부분은 검은색입니다.
  • 창을 다른 타일로 추가하고(전혀 부동되지 않음) 이 타일의 왼쪽 상단 모서리만 그립니다(늘리지 않음). 타일의 나머지 부분은 X-Window 배경을 표시합니다.
  • 올바른 부동 창 확률은 10% 미만입니다.

내가 시도한 것

doFullFloat그리고 doCenterFloat정확히 같은 일을 합니다(마지막 경우를 제외하면 중앙에 있거나 가득 차 있습니다)

나는 무엇을 의심합니까?

창의 수명 동안 제목이 변경될 수 있기 때문에 문제 WM_NAME/title는 only를 사용하고 있다고 확신합니다 . WM_CLASS/className/appName내 생각에 gst-launch-1.0창은 다른 (또는 없음) 타이틀로 시작하고 잠시 후 다음으로 전환됩니다 . 그러면 메인 이벤트에서 우승할 수 있는지 아니면 결승전에서 우승 gst-launch-1.0할 수 있는지는 운에 달려 있습니다 .xmonadgst-launch-1.0

질문

마지막 창을 확실히 잡을 수 있도록 ManageHook에서 "잠시 대기"하는 방법이 있나요 WM_NAME/title?

아니면 다른 아이디어가 있나요?

추가 정보:

분명히 이것은 gstreamer에서 수정되었습니다.https://bugzilla.gnome.org/show_bug.cgi?id=750455- 하지만 안타깝게도 데비안과 함께 제공되는 gstreamer를 사용해야 합니다.

답변1

X ()도움이 될 수 있습니다. 아래에는 키 바인딩에 바인딩할 수 있는 유형이 있습니다 .

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

중요한 줄은 다음과 같습니다.

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

그래서 우리는 먼저 일치시킨 WM_CLASS다음 으로 일치시킵니다 WM_NAME.

관련 정보