如何在Xmonad中全屏模式下正确缩放Chrome?

4
当我使用F11键进入全屏模式,或在YouTube或Netflix中点击全屏按钮时,Chrome似乎会缩放页面以适应屏幕大小,并将页面裁剪到其包含的窗口。然而,在使用mod + space切换布局后,它会正确地缩放以适合包含的窗口。
如何使Chrome在首次进入全屏模式时缩放以适合其窗口而不是整个屏幕?
我尝试了XMonad.Hooks.EwmhDesktops和XMonad.Layout.Fullscreen中的函数,但仍无法找到方法。
我正在Arch上使用Google Chrome 57.0.2987.98和xmonad 0.13。谢谢!

包含您的配置信息会很有帮助。 - Chris Stryczynski
3个回答

2
我的解决方案是使用这个修改过的EWMH中的fullscreenEventHook版本。最初的回答中提到了这个方法。
fullscreenEventHook :: Event -> Bool -> X All
fullscreenEventHook (ClientMessageEvent _ _ _ dpy win typ (action:dats)) isChrome = do
  wmstate <- getAtom "_NET_WM_STATE"
  fullsc <- getAtom "_NET_WM_STATE_FULLSCREEN"
  wstate <- fromMaybe [] `fmap` getProp32 wmstate win

  let isFull = fromIntegral fullsc `elem` wstate

      -- Constants for the _NET_WM_STATE protocol:
      remove = 0
      add = 1
      toggle = 2
      ptype = 4 -- The atom property type for changeProperty
      chWstate f = io $ changeProperty32 dpy win wmstate ptype propModeReplace (f wstate)

      uglyChromeHack x = do
        when (not isChrome) x
        when isChrome $ windows W.swapUp >> windows W.swapDown

  when (typ == wmstate && fi fullsc `elem` dats) $ do
    when (action == add || (action == toggle && not isFull)) $ do
      chWstate (fi fullsc:)
      uglyChromeHack $ windows $ W.float win $ W.RationalRect 0 0 1 1
    when (action == remove || (action == toggle && isFull)) $ do
      chWstate $ delete (fi fullsc)
      uglyChromeHack $ windows $ W.sink win

  return $ All True

fullscreenEventHook _ _ = return $ All True


butNotChrome :: Event -> X All
butNotChrome e@(ClientMessageEvent _ _ _ _ win _ _) = do
  isChrome <- runQuery (appName =? "google-chrome") win
  fullscreenEventHook e isChrome
butNotChrome _ = return $ All True

这段代码 windows W.swapUp >> windows W.swapDown 可以让 Chrome 顺畅运行。将其称为 "最初的回答"。

1
这个问题也困扰了我一段时间。我尝试在我的xmonad配置文件中使用各种组合,但没有成功。但我最近发现了一个基于Chromium引擎并由Opera浏览器的前CEO领导的浏览器'Vivaldi'。它通过使用“切换UI”选项(默认情况下为Ctrl-F11)实现了你想要的功能。

谢谢您的建议。Vivaldi中的“切换UI”功能是一个相当不错的解决方法。我只希望它也能处理像Youtube或Vimeo这样的网站上的全屏按钮。 - Kuan-Ying Chou

0

你需要将以下内容添加到你的配置文件(xmonad.hs)中:

import XMonad.Hooks.EwmhDesktops
main = xmonad $ ewmh (yourExistingConfigValueGoesHereExample { handleEventHook =
       handleEventHook def <+> fullscreenEventHook })

更多信息可以在这里找到:http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-EwmhDesktops.html


这个功能也被捆绑到 desktopConfig 中(一种 xmonad 的理智默认设置)。https://hackage.haskell.org/package/xmonad-contrib-0.13/docs/XMonad-Config-Desktop.html


1
这个设置会让XMonad的行为像其他桌面环境或操作系统,并使Chrome适应整个屏幕,这可能是大多数人想要的。然而,我正在尝试让Chrome在全屏模式下保持在其窗口中,这样我们就可以将两个完整的“屏幕”Youtube视频并排放在同一个屏幕上。 - Kuan-Ying Chou
这有点像是一个hack,但你可以使用类似xbindkeys和xdotool的工具将F12绑定到(F11)+(Mod+space),从而自动化你手动操作的过程。 - Chris Stryczynski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接