
I've got reply from libx11 bug tracker.
https://bugs.freedesktop.org/show_bug.cgi?id=89028#c1
Do `flush` from `Graphics.X11.Xlib.Event` after `resetScreenSaver` is
the solution. `getScreenSaver` calls XFlush() internally.
On Sun, Feb 8, 2015 at 10:10 PM, YCH
On Wed, Jan 21, 2015 at 3:22 PM, Dontdie YCH
wrote: Hello,
I'm looking for what is proper method to inhibit screensaver(DPMS) without xscreensaver, KDE, GNOME ... .
My video player 'bomi'(was cmplayer) try these, in order,
~~~ [App] Initialize screensaver functions. [App] Try to connect 'org.gnome.SessionManager'. [App] Failed to connect 'org.gnome.SessionManager'. Fallback to 'org.freedesktop.ScreenSaver'. [App] Failed to connect 'org.freedesktop.ScreenSaver'. Fallback to XResetScreenSaver(). [App] Disable screensaver with XResetScreenSaver(). ~~~
But it does not working. I didn't know how I directly deal with X11 lib. Fortunately, I found 'resetScreenSaver' from 'Graphics.X11.Xlib.Misc' that say interface to XResetScreenSaver().
resetScreenSaver.hs :
~~~ import Graphics.X11.Xlib import Graphics.X11.Xlib.Misc import Control.Concurrent import Control.Monad
main = do dpy <- openDisplay "" forever $ do putStrLn "reset" resetScreenSaver dpy threadDelay (5*1000000) ~~~
~~~ $ xset s 10 $ runhaskell resetScreenSaver.hs ~~~
Unfortunately, It does not working. `activateScreenSaver` and `forceScreenSaver` also does not working.
But `xset s reset` is working as intended and also there is `xdg-screensaver [ suspend | resume | reset ]` command from 'xdg-utils' package (Arch). It looks like abstraction layer for xset, xscreensaver, KDE, GNOME ... .
So I'm curious about whether this is bug of xorg or I misunderstand something. And what is right way to do this if I don't want any screensaver daemon? `xset s` or `xdg-screensaver`?
Thanks.
I've experiment couple of things and then find relation between `getScreenSaver` and `resetScreenSaver`. resetScreenSaver only works if I call getScreenSaver immediately before.
Any know about this?
Working as intended,
~~~ $ xset s 5; runhaskell withgetScreenSaver.hs $ cat withgetScreenSaver.hs import Graphics.X11.Xlib import Graphics.X11.Xlib.Misc import Control.Concurrent import Control.Monad
main = do dpy <- openDisplay "" forever $ do getScreenSaver dpy resetScreenSaver dpy threadDelay (3*1000000) ~~~
Does not working as intended,
~~~ $ xset s 5; runhaskell onlyresetScreenSaver.hs $ cat onlyresetScreenSaver.hs import Graphics.X11.Xlib import Graphics.X11.Xlib.Misc import Control.Concurrent import Control.Monad
main = do dpy <- openDisplay "" forever $ do resetScreenSaver dpy threadDelay (3*1000000) ~~~
If I call `getScreenSaver` outside loop, it also does not working.
~~~ import Graphics.X11.Xlib import Graphics.X11.Xlib.Misc import Control.Concurrent import Control.Monad
main = do dpy <- openDisplay "" getScreenSaver dpy forever $ do resetScreenSaver dpy threadDelay (3*1000000) ~~~
Thanks