mirror of
https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
synced 2023-10-10 19:16:51 +02:00
Disable and reenable screen saver and DPMS.
This commit is contained in:
parent
acc35fe30c
commit
7d3f4f4434
@ -1,6 +1,7 @@
|
|||||||
User johns
|
User johns
|
||||||
Date:
|
Date:
|
||||||
|
|
||||||
|
Disable and reenable screen saver and DPMS.
|
||||||
Video source code cleanup.
|
Video source code cleanup.
|
||||||
Fix fast backward with some h264 streams.
|
Fix fast backward with some h264 streams.
|
||||||
Make soft start sync setup menu configurable.
|
Make soft start sync setup menu configurable.
|
||||||
|
2
Todo
2
Todo
@ -26,7 +26,6 @@ missing:
|
|||||||
Option deinterlace off / deinterlace force!
|
Option deinterlace off / deinterlace force!
|
||||||
ColorSpace aren't configurable with the gui.
|
ColorSpace aren't configurable with the gui.
|
||||||
Replay of old vdr 1.6 recordings.
|
Replay of old vdr 1.6 recordings.
|
||||||
svdrp support for hot-keys.
|
|
||||||
Remote learning support.
|
Remote learning support.
|
||||||
restart vdr not working, when started x11 was killed.
|
restart vdr not working, when started x11 was killed.
|
||||||
|
|
||||||
@ -75,7 +74,6 @@ libva-vdpau-driver:
|
|||||||
libva-xvba-driver:
|
libva-xvba-driver:
|
||||||
|
|
||||||
x11:
|
x11:
|
||||||
disable screensaver
|
|
||||||
skip multiple configure-notify, handle only the last one.
|
skip multiple configure-notify, handle only the last one.
|
||||||
support embedded mode
|
support embedded mode
|
||||||
|
|
||||||
|
165
video.c
165
video.c
@ -37,6 +37,7 @@
|
|||||||
///
|
///
|
||||||
|
|
||||||
#define USE_XLIB_XCB ///< use xlib/xcb backend
|
#define USE_XLIB_XCB ///< use xlib/xcb backend
|
||||||
|
#define USE_SCREENSAVER ///< support disable screensaver
|
||||||
#define USE_AUTOCROP ///< compile auto-crop support
|
#define USE_AUTOCROP ///< compile auto-crop support
|
||||||
#define USE_GRAB ///< experimental grab code
|
#define USE_GRAB ///< experimental grab code
|
||||||
#define noUSE_GLX ///< outdated GLX code
|
#define noUSE_GLX ///< outdated GLX code
|
||||||
@ -87,16 +88,18 @@
|
|||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
|
|
||||||
#include <xcb/xcb.h>
|
#include <xcb/xcb.h>
|
||||||
#include <xcb/bigreq.h>
|
//#include <xcb/bigreq.h>
|
||||||
#include <xcb/dpms.h>
|
//#include <xcb/glx.h>
|
||||||
#include <xcb/glx.h>
|
//#include <xcb/randr.h>
|
||||||
#include <xcb/randr.h>
|
#ifdef USE_SCREENSAVER
|
||||||
#include <xcb/screensaver.h>
|
#include <xcb/screensaver.h>
|
||||||
#include <xcb/shm.h>
|
#include <xcb/dpms.h>
|
||||||
#include <xcb/xv.h>
|
#endif
|
||||||
|
//#include <xcb/shm.h>
|
||||||
|
//#include <xcb/xv.h>
|
||||||
|
|
||||||
#include <xcb/xcb_image.h>
|
//#include <xcb/xcb_image.h>
|
||||||
#include <xcb/xcb_event.h>
|
//#include <xcb/xcb_event.h>
|
||||||
#include <xcb/xcb_atom.h>
|
#include <xcb/xcb_atom.h>
|
||||||
#include <xcb/xcb_icccm.h>
|
#include <xcb/xcb_icccm.h>
|
||||||
#ifdef XCB_ICCCM_NUM_WM_SIZE_HINTS_ELEMENTS
|
#ifdef XCB_ICCCM_NUM_WM_SIZE_HINTS_ELEMENTS
|
||||||
@ -116,7 +119,6 @@ typedef enum
|
|||||||
XCB_EWMH_WM_STATE_TOGGLE = 2
|
XCB_EWMH_WM_STATE_TOGGLE = 2
|
||||||
} xcb_ewmh_wm_state_action_t;
|
} xcb_ewmh_wm_state_action_t;
|
||||||
#endif
|
#endif
|
||||||
#include <xcb/xcb_keysyms.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_GLX
|
#ifdef USE_GLX
|
||||||
@ -8938,6 +8940,137 @@ uint8_t *VideoGrab(int *size, int *width, int *height, int write_header)
|
|||||||
return NULL;
|
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
|
// Setup
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -9402,10 +9535,12 @@ void VideoInit(const char *display_name)
|
|||||||
}
|
}
|
||||||
// prefetch extensions
|
// prefetch extensions
|
||||||
//xcb_prefetch_extension_data(Connection, &xcb_big_requests_id);
|
//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_glx_id);
|
||||||
//xcb_prefetch_extension_data(Connection, &xcb_randr_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_shm_id);
|
||||||
//xcb_prefetch_extension_data(Connection, &xcb_xv_id);
|
//xcb_prefetch_extension_data(Connection, &xcb_xv_id);
|
||||||
|
|
||||||
@ -9488,6 +9623,10 @@ void VideoInit(const char *display_name)
|
|||||||
if (getenv("STUDIO_LEVELS")) {
|
if (getenv("STUDIO_LEVELS")) {
|
||||||
VideoStudioLevels = 1;
|
VideoStudioLevels = 1;
|
||||||
}
|
}
|
||||||
|
// disable x11 screensaver
|
||||||
|
X11SuspendScreenSaver(Connection, 1);
|
||||||
|
X11DPMSDisable(Connection);
|
||||||
|
|
||||||
//xcb_prefetch_maximum_request_length(Connection);
|
//xcb_prefetch_maximum_request_length(Connection);
|
||||||
xcb_flush(Connection);
|
xcb_flush(Connection);
|
||||||
|
|
||||||
@ -9507,6 +9646,10 @@ void VideoExit(void)
|
|||||||
if (!XlibDisplay) { // no init or failed
|
if (!XlibDisplay) { // no init or failed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// reenable x11 screensaver
|
||||||
|
X11DPMSReenable(Connection);
|
||||||
|
X11SuspendScreenSaver(Connection, 0);
|
||||||
|
|
||||||
#ifdef USE_VIDEO_THREAD
|
#ifdef USE_VIDEO_THREAD
|
||||||
VideoThreadExit();
|
VideoThreadExit();
|
||||||
// VDPAU cleanup hangs in XLockDisplay every 100 exits
|
// VDPAU cleanup hangs in XLockDisplay every 100 exits
|
||||||
|
Loading…
Reference in New Issue
Block a user