diff --git a/ChangeLog b/ChangeLog index 517479667..ef621dab2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2006-04-04 David Reveman + * hw/xgl/glx/xglxorg.c (xglxInitXorg): No need to try and disable + dpms and screensaver with command line arguments as we now + do that as part of detecting DPMS support in xglx.c. + + * hw/xgl/glx/xglx.c (xglxOsVendorInit): Check for DPMS, + get default timeouts, disable current timeouts and screensaver. + Add xglxDPMSSupported and xglxDPMSet for DPMS support. + + * hw/xgl/Makefile.am (Xgl_SOURCES): Remove dpmsstubs.c. + + * hw/xgl/egl/module/xeglmodule.c: + * hw/xgl/egl/xegl.c: + * hw/xgl/glx/module/xglxmodule.c: + * hw/xgl/glx/xglx.c: + * hw/xgl/xglinit.c: DPMS support by adding DPMSSupported + and DPMSSet as ddx module functions. + * hw/xgl/glx/xglx.c (xglxScreenInit): Re-install colormap after initializing software cursor (#6489). (Tiago Vignatti) diff --git a/hw/xgl/Makefile.am b/hw/xgl/Makefile.am index 2782887f6..b65be1d58 100644 --- a/hw/xgl/Makefile.am +++ b/hw/xgl/Makefile.am @@ -71,7 +71,6 @@ Xgl_LDFLAGS = -export-dynamic Xgl_SOURCES = \ xglinit.c \ $(top_srcdir)/mi/miinitext.c \ - $(top_srcdir)/Xext/dpmsstubs.c \ $(top_srcdir)/Xi/stubs.c \ $(top_srcdir)/fb/fbcmap.c Xgl_LDADD = \ diff --git a/hw/xgl/egl/module/xeglmodule.c b/hw/xgl/egl/module/xeglmodule.c index ff695f614..f7bc80257 100644 --- a/hw/xgl/egl/module/xeglmodule.c +++ b/hw/xgl/egl/module/xeglmodule.c @@ -102,3 +102,15 @@ OsVendorInit (void) { xeglOsVendorInit (); } + + +Bool +DPMSSupported (void) +{ + return FALSE; +} + +void +DPMSSet (int level) +{ +} diff --git a/hw/xgl/egl/xeglinit.c b/hw/xgl/egl/xeglinit.c index 51100a4d1..7547a6a46 100644 --- a/hw/xgl/egl/xeglinit.c +++ b/hw/xgl/egl/xeglinit.c @@ -129,3 +129,14 @@ OsVendorInit (void) { xeglOsVendorInit (); } + +Bool +DPMSSupported (void) +{ + return FALSE; +} + +void +DPMSSet (int level) +{ +} diff --git a/hw/xgl/glx/module/xglxmodule.c b/hw/xgl/glx/module/xglxmodule.c index 066cb8082..60de5baab 100644 --- a/hw/xgl/glx/module/xglxmodule.c +++ b/hw/xgl/glx/module/xglxmodule.c @@ -102,3 +102,15 @@ OsVendorInit (void) { xglxOsVendorInit (); } + +Bool +DPMSSupported (void) +{ + return xglxDPMSSupported (); +} + +void +DPMSSet (int level) +{ + xglxDPMSSet (level); +} diff --git a/hw/xgl/glx/xglx.c b/hw/xgl/glx/xglx.c index df9713178..bf2f9b439 100644 --- a/hw/xgl/glx/xglx.c +++ b/hw/xgl/glx/xglx.c @@ -26,6 +26,7 @@ #include "xglx.h" #include +#include #include #include @@ -132,6 +133,7 @@ static CARD32 lastEventTime = 0; static ScreenPtr currentScreen = 0; static Bool softCursor = FALSE; static Bool fullscreen = TRUE; +static Bool xDpms = FALSE; static Bool randrExtension = FALSE; static int randrEvent, randrError; @@ -1413,9 +1415,35 @@ xglxOsVendorInit (void) xscreen = DefaultScreen (xdisplay); if (!xDisplayName) + { + int timeout, interval, preferBlanking, allowExposures; + XDefineCursor (xdisplay, RootWindow (xdisplay, xscreen), XCreateFontCursor (xdisplay, XC_watch)); + if (DPMSCapable (xdisplay)) + { + CARD16 standby, suspend, off; + + DPMSGetTimeouts (xdisplay, &standby, &suspend, &off); + DPMSSetTimeouts (xdisplay, 0, 0, 0); + DPMSEnable (xdisplay); + DPMSForceLevel (xdisplay, DPMSModeOn); + + DPMSStandbyTime = standby * MILLI_PER_SECOND; + DPMSSuspendTime = suspend * MILLI_PER_SECOND; + DPMSOffTime = off * MILLI_PER_SECOND; + + xDpms = TRUE; + } + + XGetScreenSaver (xdisplay, &timeout, &interval, + &preferBlanking, &allowExposures); + XSetScreenSaver (xdisplay, 0, interval, + preferBlanking, allowExposures); + XResetScreenSaver (xdisplay); + } + if (!glitz_glx_find_window_format (xdisplay, xscreen, 0, NULL, 0)) FatalError ("no GLX visuals available\n"); } @@ -1485,3 +1513,16 @@ xglxCreateARGBCursor (ScreenPtr pScreen, } #endif + +Bool +xglxDPMSSupported (void) +{ + return xDpms; +} + +void +xglxDPMSSet (int level) +{ + if (xDpms) + DPMSForceLevel (xdisplay, level); +} diff --git a/hw/xgl/glx/xglx.h b/hw/xgl/glx/xglx.h index b0c5d3d70..79fa09d62 100644 --- a/hw/xgl/glx/xglx.h +++ b/hw/xgl/glx/xglx.h @@ -117,6 +117,15 @@ xglxGiveUp (void); void xglxOsVendorInit (void); +Bool +xglxDPMSSupported (void); + +int +xglxDPMSGet (int *plevel); + +void +xglxDPMSSet (int level); + #ifndef NXGLXORG void diff --git a/hw/xgl/glx/xglxinit.c b/hw/xgl/glx/xglxinit.c index 50bbca52b..4de4ae668 100644 --- a/hw/xgl/glx/xglxinit.c +++ b/hw/xgl/glx/xglxinit.c @@ -167,6 +167,19 @@ OsVendorInit (void) xglxOsVendorInit (); } -void ddxInitGlobals() +void +ddxInitGlobals (void) { } + +Bool +DPMSSupported (void) +{ + return xglxDPMSSupported (); +} + +void +DPMSSet (int level) +{ + xglxDPMSSet (level); +} diff --git a/hw/xgl/glx/xglxorg.c b/hw/xgl/glx/xglxorg.c index 984c50ee2..fff9d16a1 100644 --- a/hw/xgl/glx/xglxorg.c +++ b/hw/xgl/glx/xglxorg.c @@ -544,7 +544,6 @@ xglxInitXorg (void) pid_t pid; char *name; char *auth[] = { "-auth", xorgAuthBuf, "-nolisten", "tcp" }; - char *saver[] = { "-dpms", "-v", "-s", "0" }; char *endArg = NULL; int authFd; int mask; @@ -592,9 +591,6 @@ xglxInitXorg (void) if (!xglxAddXorgArguments (auth, sizeof (auth) / sizeof (char *))) return 0; - if (!xglxAddXorgArguments (saver, sizeof (saver) / sizeof (char *))) - return 0; - if (!xglxAddXorgArguments (&xorgDisplay, 1)) return 0; diff --git a/hw/xgl/xglinit.c b/hw/xgl/xglinit.c index dd0e6b0f6..a016a16dc 100644 --- a/hw/xgl/xglinit.c +++ b/hw/xgl/xglinit.c @@ -77,6 +77,8 @@ typedef struct _xglDDXFunc { void (*abort) (void); void (*giveUp) (void); void (*osVendorInit) (void); + Bool (*dpmsSupported) (void); + void (*dpmsSet) (int level); } xglDDXFuncRec; static xglDDXFuncRec __ddxFunc; @@ -154,7 +156,9 @@ xglEnsureDDXModule (void) SYM (__ddxFunc.processArgument, "ddxProcessArgument"), SYM (__ddxFunc.abort, "AbortDDX"), SYM (__ddxFunc.giveUp, "ddxGiveUp"), - SYM (__ddxFunc.osVendorInit, "OsVendorInit") + SYM (__ddxFunc.osVendorInit, "OsVendorInit"), + SYM (__ddxFunc.dpmsSupported, "DPMSSupported"), + SYM (__ddxFunc.dpmsSet, "DPMSSet") }; ddxHandle = xglLoadModule (ddxModuleName, RTLD_NOW | RTLD_GLOBAL); @@ -336,6 +340,28 @@ ddxInitGlobals (void) { } +Bool +DPMSSupported (void) +{ + if (xglEnsureDDXModule ()) + return (*__ddxFunc.dpmsSupported) (); + + return FALSE; +} + +int +DPMSGet (int *plevel) +{ + return -1; +} + +void +DPMSSet (int level) +{ + if (xglEnsureDDXModule ()) + return (*__ddxFunc.dpmsSet) (level); +} + #if 1 /* nvdia's driver seem to be abusing sched_yield and it is causing