summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohns <johns98@gmx.net>2012-03-08 15:25:10 +0100
committerJohns <johns98@gmx.net>2012-03-08 15:25:10 +0100
commit7d3f4f4434da68c430a55453ce387febdb69fb1e (patch)
tree961ca1341de572b0d1b80875d4eb63f32ba647cd
parentacc35fe30c6b48d771cc75c6168c51490d24953f (diff)
downloadvdr-plugin-softhddevice-7d3f4f4434da68c430a55453ce387febdb69fb1e.tar.gz
vdr-plugin-softhddevice-7d3f4f4434da68c430a55453ce387febdb69fb1e.tar.bz2
Disable and reenable screen saver and DPMS.
-rw-r--r--ChangeLog1
-rw-r--r--Todo2
-rw-r--r--video.c165
3 files changed, 155 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 026b736..c6b1e2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
User johns
Date:
+ Disable and reenable screen saver and DPMS.
Video source code cleanup.
Fix fast backward with some h264 streams.
Make soft start sync setup menu configurable.
diff --git a/Todo b/Todo
index c6aa762..1caf468 100644
--- a/Todo
+++ b/Todo
@@ -26,7 +26,6 @@ missing:
Option deinterlace off / deinterlace force!
ColorSpace aren't configurable with the gui.
Replay of old vdr 1.6 recordings.
- svdrp support for hot-keys.
Remote learning support.
restart vdr not working, when started x11 was killed.
@@ -75,7 +74,6 @@ libva-vdpau-driver:
libva-xvba-driver:
x11:
- disable screensaver
skip multiple configure-notify, handle only the last one.
support embedded mode
diff --git a/video.c b/video.c
index ad6ef4b..a7ffe87 100644
--- a/video.c
+++ b/video.c
@@ -37,6 +37,7 @@
///
#define USE_XLIB_XCB ///< use xlib/xcb backend
+#define USE_SCREENSAVER ///< support disable screensaver
#define USE_AUTOCROP ///< compile auto-crop support
#define USE_GRAB ///< experimental grab code
#define noUSE_GLX ///< outdated GLX code
@@ -87,16 +88,18 @@
#include <X11/keysym.h>
#include <xcb/xcb.h>
-#include <xcb/bigreq.h>
-#include <xcb/dpms.h>
-#include <xcb/glx.h>
-#include <xcb/randr.h>
+//#include <xcb/bigreq.h>
+//#include <xcb/glx.h>
+//#include <xcb/randr.h>
+#ifdef USE_SCREENSAVER
#include <xcb/screensaver.h>
-#include <xcb/shm.h>
-#include <xcb/xv.h>
+#include <xcb/dpms.h>
+#endif
+//#include <xcb/shm.h>
+//#include <xcb/xv.h>
-#include <xcb/xcb_image.h>
-#include <xcb/xcb_event.h>
+//#include <xcb/xcb_image.h>
+//#include <xcb/xcb_event.h>
#include <xcb/xcb_atom.h>
#include <xcb/xcb_icccm.h>
#ifdef XCB_ICCCM_NUM_WM_SIZE_HINTS_ELEMENTS
@@ -116,7 +119,6 @@ typedef enum
XCB_EWMH_WM_STATE_TOGGLE = 2
} xcb_ewmh_wm_state_action_t;
#endif
-#include <xcb/xcb_keysyms.h>
#endif
#ifdef USE_GLX
@@ -8938,6 +8940,137 @@ uint8_t *VideoGrab(int *size, int *width, int *height, int write_header)
return NULL;
}
+#ifdef USE_SCREENSAVER
+
+//----------------------------------------------------------------------------
+// DPMS / Screensaver
+//----------------------------------------------------------------------------
+
+static char DPMSDisabled; ///< flag we have disabled dpms
+
+///
+/// Suspend X11 screen saver.
+///
+/// @param connection X11 connection to enable/disable screensaver
+/// @param suspend True suspend screensaver,
+/// false enable screensaver
+///
+static void X11SuspendScreenSaver(xcb_connection_t * connection, int suspend)
+{
+ const xcb_query_extension_reply_t *query_extension_reply;
+
+ query_extension_reply =
+ xcb_get_extension_data(connection, &xcb_screensaver_id);
+ if (query_extension_reply && query_extension_reply->present) {
+ xcb_screensaver_query_version_cookie_t cookie;
+ xcb_screensaver_query_version_reply_t *reply;
+
+ Debug(3, "video: screen saver extension present\n");
+
+ cookie =
+ xcb_screensaver_query_version_unchecked(connection,
+ XCB_SCREENSAVER_MAJOR_VERSION, XCB_SCREENSAVER_MINOR_VERSION);
+ reply = xcb_screensaver_query_version_reply(connection, cookie, NULL);
+ if (reply
+ && (reply->server_major_version >= XCB_SCREENSAVER_MAJOR_VERSION)
+ && (reply->server_minor_version >= XCB_SCREENSAVER_MINOR_VERSION)
+ ) {
+ xcb_screensaver_suspend(connection, suspend);
+ }
+ free(reply);
+ }
+}
+
+///
+/// DPMS (Display Power Management Signaling) extension available.
+///
+/// @param connection X11 connection to check for DPMS
+///
+static int X11HaveDPMS(xcb_connection_t * connection)
+{
+ static int have_dpms = -1;
+ const xcb_query_extension_reply_t *query_extension_reply;
+
+ if (have_dpms != -1) { // already checked
+ return have_dpms;
+ }
+
+ have_dpms = 0;
+ query_extension_reply = xcb_get_extension_data(connection, &xcb_dpms_id);
+ if (query_extension_reply && query_extension_reply->present) {
+ xcb_dpms_get_version_cookie_t cookie;
+ xcb_dpms_get_version_reply_t *reply;
+ int major;
+ int minor;
+
+ Debug(3, "video: dpms extension present\n");
+
+ cookie =
+ xcb_dpms_get_version_unchecked(connection, XCB_DPMS_MAJOR_VERSION,
+ XCB_DPMS_MINOR_VERSION);
+ reply = xcb_dpms_get_version_reply(connection, cookie, NULL);
+ // use locals to avoid gcc warning
+ major = XCB_DPMS_MAJOR_VERSION;
+ minor = XCB_DPMS_MINOR_VERSION;
+ if (reply && (reply->server_major_version >= major)
+ && (reply->server_minor_version >= minor)
+ ) {
+ have_dpms = 1;
+ }
+ free(reply);
+ }
+ return have_dpms;
+}
+
+///
+/// Disable DPMS (Display Power Management Signaling)
+///
+/// @param connection X11 connection to disable DPMS
+///
+static void X11DPMSDisable(xcb_connection_t * connection)
+{
+ if (X11HaveDPMS(connection)) {
+ xcb_dpms_info_cookie_t cookie;
+ xcb_dpms_info_reply_t *reply;
+
+ cookie = xcb_dpms_info_unchecked(connection);
+ reply = xcb_dpms_info_reply(connection, cookie, NULL);
+ if (reply) {
+ if (reply->state) {
+ Debug(3, "video: dpms was enabled\n");
+ DPMSDisabled = 1;
+ xcb_dpms_disable(connection); // monitor powersave off
+ }
+ free(reply);
+ }
+ }
+}
+
+///
+/// Reenable DPMS (Display Power Management Signaling)
+///
+/// @param connection X11 connection to enable DPMS
+///
+static void X11DPMSReenable(xcb_connection_t * connection)
+{
+ if (DPMSDisabled && X11HaveDPMS(connection)) {
+ xcb_dpms_enable(connection); // monitor powersave on
+ xcb_dpms_force_level(connection, XCB_DPMS_DPMS_MODE_ON);
+ DPMSDisabled = 0;
+ }
+}
+
+#else
+
+ /// dummy function: Suspend X11 screen saver.
+#define X11SuspendScreenSaver(connection, suspend)
+ /// dummy function: Disable X11 DPMS.
+#define X11DPMSDisable(connection)
+ /// dummy function: Reenable X11 DPMS.
+#define X11DPMSReenable(connection)
+
+#endif
+
//----------------------------------------------------------------------------
// Setup
//----------------------------------------------------------------------------
@@ -9402,10 +9535,12 @@ void VideoInit(const char *display_name)
}
// prefetch extensions
//xcb_prefetch_extension_data(Connection, &xcb_big_requests_id);
- //xcb_prefetch_extension_data(Connection, &xcb_dpms_id);
//xcb_prefetch_extension_data(Connection, &xcb_glx_id);
//xcb_prefetch_extension_data(Connection, &xcb_randr_id);
- //xcb_prefetch_extension_data(Connection, &xcb_screensaver_id);
+#ifdef USE_SCREENSAVER
+ xcb_prefetch_extension_data(Connection, &xcb_screensaver_id);
+ xcb_prefetch_extension_data(Connection, &xcb_dpms_id);
+#endif
//xcb_prefetch_extension_data(Connection, &xcb_shm_id);
//xcb_prefetch_extension_data(Connection, &xcb_xv_id);
@@ -9488,6 +9623,10 @@ void VideoInit(const char *display_name)
if (getenv("STUDIO_LEVELS")) {
VideoStudioLevels = 1;
}
+ // disable x11 screensaver
+ X11SuspendScreenSaver(Connection, 1);
+ X11DPMSDisable(Connection);
+
//xcb_prefetch_maximum_request_length(Connection);
xcb_flush(Connection);
@@ -9507,6 +9646,10 @@ void VideoExit(void)
if (!XlibDisplay) { // no init or failed
return;
}
+ // reenable x11 screensaver
+ X11DPMSReenable(Connection);
+ X11SuspendScreenSaver(Connection, 0);
+
#ifdef USE_VIDEO_THREAD
VideoThreadExit();
// VDPAU cleanup hangs in XLockDisplay every 100 exits