Bug#458041: updated patch
Lubos Lunak <l.lunak@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-cetin@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 <packages@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
Reply to: