Ok here's the DPMS stuff converted to use
IDirectFBDisplayLayer::SetScreenPowerMode.
I decided to name the enum DFBScreenPowerMode even though IDirectFBScreen
doesn't exist. Adding "DisplayLayer" to that name just makes it so long...
After doing this patch I stumbled on some Apple developer docs describing
a SetSync() interface with disable {h,v,c}sync flags. Perhaps I should
convert this thing to a SetSync() interface instead?
BTW is there some logic in how the various enums and structs are located
in directfb.h? Display layer specific stuff is located in two places.
PS.
Could we bump the version nuber in CVS? I'd like to offload the triple
buffering/alut44 patches to mplayer-dev-eng...
--
Ville Syrj�l�
[EMAIL PROTECTED]
http://www.sci.fi/~syrjala/
Index: include/directfb.h
===================================================================
RCS file: /cvs/directfb/DirectFB/include/directfb.h,v
retrieving revision 1.172
diff -u -r1.172 directfb.h
--- include/directfb.h 3 Apr 2003 18:35:00 -0000 1.172
+++ include/directfb.h 13 Apr 2003 01:36:28 -0000
@@ -414,6 +414,16 @@
} DFBDisplayLayerBufferMode;
/*
+ * Screen Power Mode.
+ */
+typedef enum {
+ DSPM_ON = 0,
+ DSPM_STANDBY,
+ DSPM_SUSPEND,
+ DSPM_OFF
+} DFBScreenPowerMode;
+
+/*
* Flags defining which fields of a DFBSurfaceDescription are valid.
*/
typedef enum {
@@ -1585,6 +1595,13 @@
IDirectFBDisplayLayer *thiz
);
+ /*
+ * Set screen power mode.
+ */
+ DFBResult (*SetScreenPowerMode) (
+ IDirectFBDisplayLayer *thiz,
+ DFBScreenPowerMode mode
+ );
/** Configuration handling **/
Index: src/core/layers.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/layers.c,v
retrieving revision 1.103
diff -u -r1.103 layers.c
--- src/core/layers.c 3 Apr 2003 18:35:00 -0000 1.103
+++ src/core/layers.c 13 Apr 2003 01:36:29 -0000
@@ -1336,6 +1336,23 @@
layer->layer_data );
}
+DFBResult
+dfb_layer_set_screen_power_mode( DisplayLayer *layer,
+ DFBScreenPowerMode mode )
+{
+ DFB_ASSERT( layersfield != NULL );
+ DFB_ASSERT( layer != NULL );
+ DFB_ASSERT( layer->funcs != NULL );
+ DFB_ASSERT( layer->shared != NULL );
+ DFB_ASSERT( layer->shared->enabled );
+
+ if (!layer->funcs->SetScreenPowerMode)
+ return DFB_UNSUPPORTED;
+
+ return layer->funcs->SetScreenPowerMode( layer, layer->driver_data,
+ layer->layer_data, mode );
+}
+
DFBResult
dfb_layer_set_coloradjustment (DisplayLayer *layer,
Index: src/core/layers.h
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/layers.h,v
retrieving revision 1.48
diff -u -r1.48 layers.h
--- src/core/layers.h 14 Feb 2003 12:43:38 -0000 1.48
+++ src/core/layers.h 13 Apr 2003 01:36:30 -0000
@@ -150,7 +150,12 @@
void *driver_data,
void *layer_data,
int field );
-
+
+ DFBResult (*SetScreenPowerMode)( DisplayLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ DFBScreenPowerMode mode );
+
/*
* optional to override default surface (re)allocation
*/
@@ -300,6 +305,9 @@
DFBResult dfb_layer_set_field_parity( DisplayLayer *layer, int field );
DFBResult dfb_layer_wait_vsync( DisplayLayer *layer );
+
+DFBResult dfb_layer_set_screen_power_mode( DisplayLayer *layer,
+ DFBScreenPowerMode mode );
DFBResult dfb_layer_set_coloradjustment (DisplayLayer *layer,
DFBColorAdjustment *adj);
Index: src/core/fbdev/fbdev.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/core/fbdev/fbdev.c,v
retrieving revision 1.51
diff -u -r1.51 fbdev.c
--- src/core/fbdev/fbdev.c 7 Apr 2003 16:58:34 -0000 1.51
+++ src/core/fbdev/fbdev.c 13 Apr 2003 01:36:31 -0000
@@ -172,13 +172,18 @@
void *layer_data,
CorePalette *palette );
-
static DFBResult
primaryWaitVSync ( DisplayLayer *layer,
void *driver_data,
void *layer_data );
static DFBResult
+primarySetScreenPowerMode( DisplayLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ DFBScreenPowerMode mode );
+
+static DFBResult
primaryAllocateSurface ( DisplayLayer *layer,
void *driver_data,
void *layer_data,
@@ -207,7 +212,8 @@
SetColorAdjustment: primarySetColorAdjustment,
SetPalette: primarySetPalette,
WaitVSync: primaryWaitVSync,
-
+ SetScreenPowerMode: primarySetScreenPowerMode,
+
AllocateSurface: primaryAllocateSurface,
ReallocateSurface: primaryReallocateSurface,
/* default DeallocateSurface copes with our chunkless video buffers */
@@ -221,6 +227,7 @@
static DFBResult dfb_fbdev_set_rgb332_palette();
#endif
static DFBResult dfb_fbdev_pan( int offset );
+static DFBResult dfb_fbdev_blank( int level );
static DFBResult dfb_fbdev_set_mode( DisplayLayer *layer,
VideoMode *mode,
DFBDisplayLayerConfig *config );
@@ -1145,6 +1152,34 @@
}
static DFBResult
+primarySetScreenPowerMode( DisplayLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ DFBScreenPowerMode mode )
+{
+ int level;
+
+ switch (mode) {
+ case DSPM_OFF:
+ level = 4;
+ break;
+ case DSPM_SUSPEND:
+ level = 3;
+ break;
+ case DSPM_STANDBY:
+ level = 2;
+ break;
+ case DSPM_ON:
+ level = 0;
+ break;
+ default:
+ return DFB_INVARG;
+ }
+
+ return dfb_fbdev_blank( level );
+}
+
+static DFBResult
primaryAllocateSurface ( DisplayLayer *layer,
void *driver_data,
void *layer_data,
@@ -1335,6 +1370,20 @@
PERRORMSG( "DirectFB/core/fbdev: Panning display failed!\n" );
return errno2dfb( erno );
+ }
+
+ return DFB_OK;
+}
+
+/*
+ * blanks display using fbdev ioctl
+ */
+static DFBResult dfb_fbdev_blank( int level )
+{
+ if (ioctl( dfb_fbdev->fd, FBIOBLANK, level ) < 0) {
+ PERRORMSG( "DirectFB/core/fbdev: Display blanking failed!\n" );
+
+ return errno2dfb( errno );
}
return DFB_OK;
Index: src/display/idirectfbdisplaylayer.c
===================================================================
RCS file: /cvs/directfb/DirectFB/src/display/idirectfbdisplaylayer.c,v
retrieving revision 1.50
diff -u -r1.50 idirectfbdisplaylayer.c
--- src/display/idirectfbdisplaylayer.c 1 Apr 2003 19:09:08 -0000 1.50
+++ src/display/idirectfbdisplaylayer.c 13 Apr 2003 01:36:31 -0000
@@ -230,6 +230,18 @@
return dfb_layer_wait_vsync( data->layer );
}
+static DFBResult
+
+IDirectFBDisplayLayer_SetScreenPowerMode( IDirectFBDisplayLayer *thiz,
+ DFBScreenPowerMode mode )
+{
+ INTERFACE_GET_DATA(IDirectFBDisplayLayer)
+
+ if (data->level == DLSCL_SHARED)
+ return DFB_ACCESSDENIED;
+
+ return dfb_layer_set_screen_power_mode( data->layer, mode );
+}
static DFBResult
IDirectFBDisplayLayer_SetScreenLocation( IDirectFBDisplayLayer *thiz,
@@ -668,6 +680,7 @@
thiz->SetCursorOpacity = IDirectFBDisplayLayer_SetCursorOpacity;
thiz->WaitForSync = IDirectFBDisplayLayer_WaitForSync;
thiz->SetFieldParity = IDirectFBDisplayLayer_SetFieldParity;
+ thiz->SetScreenPowerMode = IDirectFBDisplayLayer_SetScreenPowerMode;
return DFB_OK;
}
Index: config/cf/directfb.cf
===================================================================
RCS file: /cvs/directfb/XDirectFB/config/cf/directfb.cf,v
retrieving revision 1.9
diff -u -r1.9 directfb.cf
--- config/cf/directfb.cf 18 Feb 2003 01:16:47 -0000 1.9
+++ config/cf/directfb.cf 13 Apr 2003 01:38:25 -0000
@@ -242,7 +242,7 @@
* Build the DPMS extension support
*/
#ifndef BuildDPMSExt
-# define BuildDPMSExt NO
+# define BuildDPMSExt YES
#endif
/*
Index: programs/Xserver/hw/directfb/directfbX.c
===================================================================
RCS file: /cvs/directfb/XDirectFB/programs/Xserver/hw/directfb/directfbX.c,v
retrieving revision 1.22
diff -u -r1.22 directfbX.c
--- programs/Xserver/hw/directfb/directfbX.c 1 Apr 2003 19:14:31 -0000 1.22
+++ programs/Xserver/hw/directfb/directfbX.c 13 Apr 2003 01:38:26 -0000
@@ -26,6 +26,12 @@
#include "globals.h"
#include "dix.h"
+#ifdef DPMSExtension
+#define DPMS_SERVER
+#include "extensions/dpms.h"
+#include "dpmsproc.h"
+#endif
+
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
@@ -58,7 +64,8 @@
FALSE, /* enable unfocused */
FALSE, /* enable fade in */
FALSE, /* enable fade out */
- FALSE /* enable root window */
+ FALSE, /* enable root window */
+ DLID_PRIMARY
};
int directfbEventsPipe[2] = { -1, -1};
@@ -119,10 +126,11 @@
if (!dfb)
return;
- if (dfb->GetDisplayLayer (dfb, DLID_PRIMARY, &layer))
+ if (dfb->GetDisplayLayer (dfb, directfbPrefs.layerID, &layer))
return;
- layer->SetCursorAcceleration (layer, ctrl->num, ctrl->den, ctrl->threshold);
+ if (layer->SetCooperativeLevel (layer, DLSCL_ADMINISTRATIVE) == DFB_OK)
+ layer->SetCursorAcceleration (layer, ctrl->num, ctrl->den, ctrl->threshold);
layer->Release (layer);
}
@@ -641,20 +649,51 @@
#ifdef DPMSExtension
/*
- * DPMS extension stubs
+ * DPMS extension
*/
Bool DPMSSupported(void)
{
- return FALSE;
+ return TRUE;
}
void DPMSSet(int level)
{
+ IDirectFBDisplayLayer *layer;
+ DFBScreenPowerMode mode;
+
+ if (!dfb)
+ return;
+
+ switch (level) {
+ case DPMSModeOff:
+ mode = DSPM_OFF;
+ break;
+ case DPMSModeSuspend:
+ mode = DSPM_SUSPEND;
+ break;
+ case DPMSModeStandby:
+ mode = DSPM_STANDBY;
+ break;
+ case DPMSModeOn:
+ mode = DSPM_ON;
+ break;
+ default:
+ return;
+ }
+
+ if (dfb->GetDisplayLayer (dfb, directfbPrefs.layerID, &layer))
+ return;
+
+ if (layer->SetCooperativeLevel (layer, DLSCL_ADMINISTRATIVE) == DFB_OK)
+ if (layer->SetScreenPowerMode (layer, mode) == DFB_OK)
+ DPMSPowerLevel = level;
+
+ layer->Release (layer);
}
int DPMSGet(int *level)
{
- return -1;
+ return DPMSPowerLevel;
}
#endif