WM_NAMEはあるがWM_CLASSはないウィンドウを浮動させる方法

WM_NAMEはあるがWM_CLASSはないウィンドウを浮動させる方法

構成

Debian Linux 8.2、64ビット、Xmonad 0.11

起動時に

xmonad.hs最近システムをdebian8にアップグレードしたため、設定をいくつか調整する必要がありました。つまり、GStreamergst-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.10gst-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- しかし、残念ながら、Debianに付属の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

おすすめ記事