summaryrefslogtreecommitdiffstats
path: root/.xmonad/xmonad.hs
blob: cec291c291be223d27337d1df0eff215f6d9d3a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
-- TODO: remove `killall xmobar` once xmobar will use stdin reader.

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.EwmhDesktops
import XMonad.Actions.Submap
import XMonad.Config
import qualified Data.Map as M
import XMonad.Util.SpawnOnce
import XMonad.Util.EZConfig


-- | Prefixes everything with mod+t instead of a mod key, so that
-- mod+1 becomes mod+t 1 (e.g., C-1 -> C-t 1), for instance.
myKeys :: (XConfig Layout -> M.Map (KeyMask, KeySym) (X ()))
       -> XConfig Layout
       -> M.Map (KeyMask, KeySym) (X ())
myKeys oldKeys conf@(XConfig {XMonad.modMask = modMask}) =
  M.fromList [((modMask, xK_t), submap (oldKeys conf { modMask = noModMask }))]


{- | On CentOS 7, with GeForce GTX 660 and a proprietary NVIDIA driver,
with vsync enabled in nvidia-settings:

- default: white flash when switching to FF, and screen tearing on
  smooth scrolling there
- compton --backend glx: screen tearing in emacs on scroll/text
  movement, apparently happens just after some time (may be a bug)
- compton --backend glx --vsync opengl-swc: same
- compton --backend glx --paint-on-overlay: same
- compton --backend glx --vsync opengl --paint-on-overlay: same
- compton --backend glx --vsync opengl-swc --sw-opti: same, probably
  FF scrolling gets less smooth
- compton with
  <https://bbs.archlinux.org/viewtopic.php?pid=1541023#p1541023>
  configuration: same, probably FF scrolling got worse
- compton with that and `glx-swap-method = "buffer-age"`, as suggested
  further in that thread: some text bits in emacs begin changing back
  and forth even without scrolling (apparently that's what is
  described even further there).
- compton --backend xrender: same as with no compton
- compton --dbe: same
- compton --backend xrender --vsync opengl-oml: same
- compton --backend xrender --vsync opengl: same, but reduces the
  flashing
- compton --backend xrender --vsync opengl --paint-on-overlay: same
- compton --backend xrender --vsync opengl --dbe: same
- compton --backend xrender -cf: eliminates the white flash, though a
  bit slower; same as without -cf otherwise
- with --vsync drm: "VBlank ioctl did not work, unimplemented in this
  drmver?"

Apparently these and similar issues are not uncommon (and not specific
to xmonad), and there's a bunch of different solutions -- some of them
probably working for some users, but they tend to have side effects as
well. Pretty much as described on
<https://github.com/chjj/compton/wiki/vsync-guide>.

Using 'spawnOnce' here, so that it wouldn't run multiple compton
processes on xmonad restart: that would load CPU and make the display
unusable. A drawback is that restarting xmonad doesn't suffice to
restart a killed compton. This actually shouldn't be an issue, since
compton is supposed to handle it:

- https://specifications.freedesktop.org/wm-spec/latest/ar01s08.html#idm139870829889072
- https://github.com/chjj/compton/issues/301

But I've got an old version from repositories (apparently they don't
do much of versioning or releases, or of other conventional things,
but the package update date is 2014-10-16). I still don't see why this
happens (would probably have to debug, or at least to try a newer
version), but it does.
-}
runCompton = spawnOnce "compton --backend xrender -cf"


main = do
  -- This is awkward, but apparently there's no better standard way to
  -- avoid multiple xmobar instances.
  c <- statusBar "killall --quiet --exact xmobar; xmobar" xmobarPP
       (\(XConfig {XMonad.modMask = modMask}) -> (modMask, xK_b))
       def
  -- EWMH (extended window manager hints) are used to control xmonad
  -- with xdotool from xmobar.
  xmonad $ ewmh c
    { layoutHook = avoidStruts $ layoutHook c
    , manageHook = manageHook c <+> manageDocks
    , keys = myKeys $ keys $ c `additionalKeys`
             -- C-t C-t would send C-t to a focused window.
             [((controlMask, xK_t), spawn "xdotool key ctrl+t")]
    , modMask = controlMask
    , focusedBorderColor = "#444"
    , normalBorderColor = "#000"
    , startupHook = runCompton
    }