Lubos Lunak <l.lu...@kde.org> informed me that it is better to still use XResetScreenSaver for screensaver which ignores the X internal timers like the ones from KDE since rev916966. I tested it with enabled dpms and kde different screensaver types and it works fine.
From f6abc0242df2dba902ea4d59be2af125e2492fde Mon Sep 17 00:00:00 2001 From: Resul Cetin <resul-ce...@gmx.net> Date: Thu, 11 Dec 2008 17:50:28 +0100 Subject: [PATCH] Use XScreenSaverExtension instead of typing text via Xtest
--- config.h.in | 2 +- configure | 26 +++++++++++++------------- configure.ac | 8 ++++---- debian/control | 2 +- src/xcommon.c | 52 ++++++++++++++++++++++++---------------------------- 5 files changed, 43 insertions(+), 47 deletions(-) diff --git a/config.h.in b/config.h.in index 6180c73..455e380 100644 --- a/config.h.in +++ b/config.h.in @@ -296,7 +296,7 @@ #undef HAVE_XINERAMA /* XTest support */ -#undef HAVE_XTESTEXTENSION +#undef HAVE_XSSEXTENSION /* Xv support */ #undef HAVE_XV diff --git a/configure b/configure index a6c5138..6c2dd5e 100755 --- a/configure +++ b/configure @@ -25906,13 +25906,13 @@ _ACEOF fi - echo "$as_me:$LINENO: checking for XTestFakeKeyEvent in -lXtst" >&5 -echo $ECHO_N "checking for XTestFakeKeyEvent in -lXtst... $ECHO_C" >&6 -if test "${ac_cv_lib_Xtst_XTestFakeKeyEvent+set}" = set; then + echo "$as_me:$LINENO: checking for XScreenSaverSuspend in -lXss" >&5 +echo $ECHO_N "checking for XScreenSaverSuspend in -lXss... $ECHO_C" >&6 +if test "${ac_cv_lib_Xss_XScreenSaverSuspend+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS -LIBS="-lXtst $X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS -lXext $LIBS" +LIBS="-lXss $X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS -lXext $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -25926,11 +25926,11 @@ extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ -char XTestFakeKeyEvent (); +char XScreenSaverSuspend (); int main () { -XTestFakeKeyEvent (); +XScreenSaverSuspend (); ; return 0; } @@ -25956,26 +25956,26 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_lib_Xtst_XTestFakeKeyEvent=yes + ac_cv_lib_Xss_XScreenSaverSuspend=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_lib_Xtst_XTestFakeKeyEvent=no +ac_cv_lib_Xss_XScreenSaverSuspend=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_Xtst_XTestFakeKeyEvent" >&5 -echo "${ECHO_T}$ac_cv_lib_Xtst_XTestFakeKeyEvent" >&6 -if test $ac_cv_lib_Xtst_XTestFakeKeyEvent = yes; then +echo "$as_me:$LINENO: result: $ac_cv_lib_Xss_XScreenSaverSuspend" >&5 +echo "${ECHO_T}$ac_cv_lib_Xss_XScreenSaverSuspend" >&6 +if test $ac_cv_lib_Xss_XScreenSaverSuspend = yes; then cat >>confdefs.h <<\_ACEOF -#define HAVE_XTESTEXTENSION +#define HAVE_XSSEXTENSION _ACEOF - X11_LIBS="$X11_LIBS -lXtst" + X11_LIBS="$X11_LIBS -lXss" fi diff --git a/configure.ac b/configure.ac index 9692b31..ee240df 100644 --- a/configure.ac +++ b/configure.ac @@ -118,10 +118,10 @@ if test x"$no_x" != x"yes"; then X11_LIBS="$X11_LIBS -lXinerama"],, [$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS -lXext]) - dnl check for XTest - AC_CHECK_LIB([Xtst],[XTestFakeKeyEvent], - [AC_DEFINE([HAVE_XTESTEXTENSION],,[XTest support]) - X11_LIBS="$X11_LIBS -lXtst"],, + dnl check for XSs + AC_CHECK_LIB([Xss],[XScreenSaverSuspend], + [AC_DEFINE([HAVE_XSSEXTENSION],,[XSs support]) + X11_LIBS="$X11_LIBS -lXss"],, [$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS -lXext]) dnl check for Xvidmode diff --git a/debian/control b/debian/control index 2479259..2b38e42 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: x11 Priority: optional Maintainer: Debian QA Group <packa...@qa.debian.org> Build-Depends: debhelper (>= 7), zlib1g-dev, libpng-dev, libfreetype6-dev, libx11-dev, libxext-dev, libxinerama-dev, - libxt-dev, libxtst-dev, libxv-dev, libxxf86vm-dev, libxml2-dev, fontforge + libxt-dev, libxss-dev, libxv-dev, libxxf86vm-dev, libxml2-dev, fontforge Standards-Version: 3.6.2 Homepage: http://tvtime.net/ diff --git a/src/xcommon.c b/src/xcommon.c index 8e3be4c..408f231 100644 --- a/src/xcommon.c +++ b/src/xcommon.c @@ -45,8 +45,8 @@ #include <X11/keysym.h> #include <X11/cursorfont.h> #include <X11/extensions/XShm.h> -#ifdef HAVE_XTESTEXTENSION -#include <X11/extensions/XTest.h> +#ifdef HAVE_XSSEXTENSION +#include <X11/extensions/scrnsaver.h> #endif #include "xfullscreen.h" @@ -67,7 +67,7 @@ static Window wm_window; static Window fs_window; static Window output_window; static GC gc; -static int have_xtest; +static int have_xss; static int output_width, output_height; static int output_aspect; static int output_on_root; @@ -107,10 +107,6 @@ static Atom wm_delete_window; static Atom xawtv_station; static Atom xawtv_remote; -#ifdef HAVE_XTESTEXTENSION -static KeyCode kc_shift_l; /* Fake key to send. */ -#endif - static area_t video_area; static area_t window_area; static area_t scale_area; @@ -248,12 +244,12 @@ static void x11_wait_mapped( Display *dpy, Window win ) } while ( (event.type != MapNotify) || (event.xmap.event != win) ); } -static int have_xtestextention( void ) +static int have_xssextention( void ) { -#ifdef HAVE_XTESTEXTENSION - int dummy1, dummy2, dummy3, dummy4; +#ifdef HAVE_XSSEXTENSION + int dummy1, dummy2; - return (XTestQueryExtension( display, &dummy1, &dummy2, &dummy3, &dummy4 ) == True); + return (XScreenSaverQueryExtension( display, &dummy1, &dummy2 ) == True); #endif return 0; } @@ -843,7 +839,7 @@ int xcommon_open_display( const char *user_geometry, int aspect, int verbose ) output_aspect = aspect; output_height = 576; - have_xtest = 0; + have_xss = 0; output_on_root = 0; has_ewmh_state_fullscreen = 0; has_ewmh_state_above = 0; @@ -927,13 +923,16 @@ int xcommon_open_display( const char *user_geometry, int aspect, int verbose ) xfullscreen_print_summary( xf ); } -#ifdef HAVE_XTESTEXTENSION - kc_shift_l = XKeysymToKeycode( display, XK_Shift_L ); -#endif - have_xtest = have_xtestextention(); - if( have_xtest && xcommon_verbose ) { - fprintf( stderr, "xcommon: Have XTest, will use it to ping the screensaver.\n" ); + have_xss = have_xssextention(); + if( have_xss && xcommon_verbose ) { + fprintf( stderr, "xcommon: Have XSS, will use it to disable the screensaver.\n" ); + } + +#ifdef HAVE_XSSEXTENSION + if ( have_xss ) { + XScreenSaverSuspend( display, True ); } +#endif /* Initially, get the best width for our height. */ output_width = xv_get_width_for_height( output_height ); @@ -1110,17 +1109,9 @@ void xcommon_ping_screensaver( void ) } gettimeofday( &curtime, 0 ); - if( timediff( &curtime, &last_ping_time ) > SCREENSAVER_PING_TIME ) { + if( timediff( &curtime, &last_ping_time ) > SCREENSAVER_PING_TIME ) { last_ping_time = curtime; -#ifdef HAVE_XTESTEXTENSION - if( have_xtest ) { - XTestFakeKeyEvent( display, kc_shift_l, True, CurrentTime ); - XTestFakeKeyEvent( display, kc_shift_l, False, CurrentTime ); - } else -#endif - { - XResetScreenSaver( display ); - } + XResetScreenSaver( display ); } } @@ -1715,6 +1706,11 @@ void xcommon_poll_events( input_t *in ) void xcommon_close_display( void ) { +#ifdef HAVE_XSSEXTENSION + if ( have_xss ) { + XScreenSaverSuspend( display, False ); + } +#endif XDestroyWindow( display, output_window ); XDestroyWindow( display, wm_window ); XDestroyWindow( display, fs_window ); -- 1.6.0.6