forked from e16/e16
1
0
Fork 0

Simplify server extension handling. Initial screensaver extension stuff.

SVN revision: 21412
This commit is contained in:
Kim Woelders 2006-03-19 15:33:38 +00:00
parent d22580d185
commit 0915c5727b
5 changed files with 184 additions and 121 deletions

View File

@ -81,7 +81,7 @@ AC_ARG_ENABLE(hints-gnome,
enable_hints_gnome=no)
AC_ARG_ENABLE(ecore,
[ --enable-ecore use ecore functions (for testing only - DO NOT USE!) @<:@default=no@:>@],,
[ --enable-ecore use ecore functions (for testing only - DO NOT USE!) @<:@default=no@:>@],,
enable_ecore=no)
if test "x$enable_hints_gnome" = "xyes"; then
@ -172,6 +172,24 @@ else
echo "zoom has been turned off by request at compiletime"
fi
AC_ARG_ENABLE(xsync,
[ --enable-xsync compile with SYNC support (experimental!) @<:@default=no@:>@],,
enable_xsync=no)
if test "x$enable_xsync" = "xyes"; then
AC_CHECK_LIB(Xext, XSyncQueryExtension,
AC_DEFINE(HAS_XSYNC, 1, [SYNC support])
, , $X_LIBS -lX11)
fi
AC_ARG_ENABLE(xscrnsaver,
[ --enable-xscrnsaver compile with ScreenSaver support (experimental!) @<:@default=no@:>@],,
enable_xscrnsaver=no)
if test "x$enable_xscrnsaver" = "xyes"; then
AC_CHECK_LIB(Xss, XScreenSaverQueryExtension,
AC_DEFINE(HAS_XSCREENSAVER, 1, [ScreenSaver support])
E_X_LIBS="-lXss $E_X_LIBS", , $X_LIBS -lXss -lXext -lX11)
fi
AC_ARG_ENABLE(xrandr,
[ --enable-xrandr compile with RandR support @<:@default=yes@:>@],,
enable_xrandr=yes)

27
src/E.h
View File

@ -43,6 +43,14 @@
#include <X11/Xlib.h>
#include <X11/extensions/shape.h>
#ifdef HAS_XSYNC
#define USE_XSYNC 1 /* Experimental */
#endif
#ifdef HAS_XSCREENSAVER
#define USE_XSCREENSAVER 1 /* Experimental */
#endif
#ifdef HAS_XRANDR
#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
#define USE_XRANDR 1
@ -53,8 +61,6 @@
#define USE_COMPOSITE 1
#endif
#define USE_XSYNC 0 /* Experimental */
#include <Imlib2.h>
#define ENABLE_COLOR_MODIFIERS 0 /* Not functional */
@ -216,6 +222,19 @@ int Esnprintf(va_alist);
#define EVENT_FOCUS_IN 7
#define EVENT_FOCUS_OUT 8
/* Server extensions */
#define XEXT_SHAPE 0
#define XEXT_SYNC 1
#define XEXT_SCRSAVER 2
#define XEXT_RANDR 3
#define XEXT_COMPOSITE 4
#define XEXT_DAMAGE 5
#define XEXT_FIXES 6
#define XEXT_RENDER 7
#define XEXT_CM_ALL 16
#define XEXT_AVAILABLE(ext) (Mode.server.extensions & (1 << ext))
/*
* Types
*/
@ -490,6 +509,10 @@ typedef struct
char doing_slide;
} place;
struct
{
unsigned int extensions;
} server;
struct
{
Pixmap ext_pmap;
char ext_pmap_valid;

View File

@ -2593,19 +2593,7 @@ ECompMgrHandleRootEvent(XEvent * ev, void *prm)
static void
ECompMgrInit(void)
{
int events, errors, major, minor;
if (!XCompositeQueryExtension(disp, &events, &errors) ||
!XDamageQueryExtension(disp, &events, &errors) ||
!XFixesQueryExtension(disp, &events, &errors) ||
!XRenderQueryExtension(disp, &events, &errors))
{
Conf_compmgr.mode = ECM_MODE_OFF;
goto done;
}
if (!XCompositeQueryVersion(disp, &major, &minor) ||
(major == 0 && minor < 2))
if (!XEXT_AVAILABLE(XEXT_CM_ALL))
{
Conf_compmgr.mode = ECM_MODE_OFF;
goto done;

View File

@ -30,6 +30,9 @@
#if USE_XSYNC
#include <X11/extensions/sync.h>
#endif
#if USE_XSCREENSAVER
#include <X11/extensions/scrnsaver.h>
#endif
#if USE_XRANDR
#include <X11/extensions/Xrandr.h>
#endif
@ -44,132 +47,161 @@
static const char *EventName(unsigned int type);
#endif
static int event_base_shape = 0;
static int error_base_shape = 0;
typedef struct
{
int event_base, error_base;
int major, minor;
} EServerExtData;
typedef struct
{
const char *name;
unsigned int ix;
int (*query_ext) (Display * dpy, int *event, int *error);
int (*query_ver) (Display * dpy, int *major, int *minor);
void (*init) (int avaliable);
} EServerExt;
static EServerExtData ExtData[8];
#define event_base_shape ExtData[XEXT_SHAPE].event_base
#define event_base_randr ExtData[XEXT_RANDR].event_base
#define event_base_damage ExtData[XEXT_DAMAGE].event_base
static void
ExtInitShape(int available)
{
if (available)
return;
AlertX(_("X server setup error"), _("OK"), NULL, NULL,
_("FATAL ERROR:\n" "\n"
"This Xserver does not support the Shape extension.\n"
"This is required for Enlightenment to run.\n" "\n"
"Your Xserver probably is too old or mis-configured.\n" "\n"
"Exiting.\n"));
EExit(1);
}
#if USE_XSYNC
static int event_base_sync = 0;
static int error_base_sync = 0;
static void
ExtInitSync(int available)
{
if (!available)
return;
if (EventDebug(EDBUG_TYPE_VERBOSE))
{
int i, num;
XSyncSystemCounter *xssc;
xssc = XSyncListSystemCounters(disp, &num);
for (i = 0; i < num; i++)
{
Eprintf(" Sync counter %2d: %10s %#lx %#x:%#x\n", i,
xssc[i].name, xssc[i].counter,
XSyncValueHigh32(xssc[i].resolution),
XSyncValueLow32(xssc[i].resolution));
}
}
}
#endif
#if USE_XSCREENSAVER
static void
ExtInitSS(int available)
{
if (!available)
return;
if (EventDebug(EDBUG_TYPE_VERBOSE))
{
XScreenSaverInfo *xssi = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(disp, VRoot.win, xssi);
Eprintf(" Screen saver window=%#lx\n", xssi->window);
XFree(xssi);
}
}
#endif
#if USE_XRANDR
static int event_base_randr = 0;
static int error_base_randr = 0;
static void
ExtInitRR(int available)
{
if (!available)
return;
/* Listen for RandR events */
XRRSelectInput(disp, VRoot.win, RRScreenChangeNotifyMask);
}
#endif
static const EServerExt Extensions[] = {
{"Shape", XEXT_SHAPE, XShapeQueryExtension, XShapeQueryVersion,
ExtInitShape},
#if USE_XSYNC
{"Sync", XEXT_SYNC, XSyncQueryExtension, XSyncInitialize, ExtInitSync},
#endif
#if USE_XSCREENSAVER
{"ScrSaver", XEXT_SCRSAVER, XScreenSaverQueryExtension,
XScreenSaverQueryVersion, ExtInitSS},
#endif
#if USE_XRANDR
{"RandR", XEXT_RANDR, XRRQueryExtension, XRRQueryVersion, ExtInitRR},
#endif
#if USE_COMPOSITE
static int event_base_comp = 0;
static int error_base_comp = 0;
static int event_base_damage = 0;
static int error_base_damage = 0;
static int event_base_fixes = 0;
static int error_base_fixes = 0;
static int event_base_render = 0;
static int error_base_render = 0;
{"Composite", XEXT_COMPOSITE, XCompositeQueryExtension,
XCompositeQueryVersion, NULL},
{"Damage", XEXT_DAMAGE, XDamageQueryExtension, XDamageQueryVersion, NULL},
{"Fixes", XEXT_FIXES, XFixesQueryExtension, XFixesQueryVersion, NULL},
{"Render", XEXT_RENDER, XRenderQueryExtension, XRenderQueryVersion, NULL},
#endif
#define DOUBLE_CLICK_TIME 250 /* Milliseconds */
};
static void
EventsExtensionShowInfo(const char *name, int major, int minor,
int event_base, int error_base)
ExtQuery(const EServerExt * ext)
{
if (EventDebug(EDBUG_TYPE_VERBOSE))
Eprintf("Found extension %-10s version %d.%d -"
" Event/error base = %d/%d\n", name,
major, minor, event_base, error_base);
int available;
EServerExtData *exd = ExtData + ext->ix;
available = ext->query_ext(disp, &(exd->event_base), &(exd->error_base));
if (available)
{
Mode.server.extensions |= 1 << ext->ix;
ext->query_ver(disp, &(exd->major), &(exd->minor));
if (EventDebug(EDBUG_TYPE_VERBOSE))
Eprintf("Found extension %-10s version %d.%d -"
" Event/error base = %d/%d\n", ext->name,
exd->major, exd->minor, exd->event_base, exd->error_base);
}
if (ext->init)
ext->init(available);
}
#define DOUBLE_CLICK_TIME 250 /* Milliseconds */
void
EventsInit(void)
{
int major, minor;
unsigned int i;
/* Check for the Shape Extension */
if (XShapeQueryExtension(disp, &event_base_shape, &error_base_shape))
{
XShapeQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("Shape", major, minor,
event_base_shape, error_base_shape);
}
else
{
AlertX(_("X server setup error"), "", "",
_("Quit Enlightenment"),
_("FATAL ERROR:\n" "\n"
"This Xserver does not support the Shape extension.\n"
"This is required for Enlightenment to run.\n" "\n"
"Your Xserver probably is too old or mis-configured.\n" "\n"
"Exiting.\n"));
EExit(1);
}
memset(ExtData, 0, sizeof(ExtData));
#if USE_XSYNC
if (XSyncQueryExtension(disp, &event_base_sync, &error_base_sync))
{
XSyncInitialize(disp, &major, &minor);
EventsExtensionShowInfo("SYNC", major, minor,
event_base_sync, error_base_sync);
#if 1 /* Debug */
{
int i, num;
XSyncSystemCounter *xssc;
xssc = XSyncListSystemCounters(disp, &num);
for (i = 0; i < num; i++)
{
Eprintf("%2d: %10s %#lx %#x:%#x\n", i,
xssc[i].name,
xssc[i].counter,
XSyncValueHigh32(xssc[i].resolution),
XSyncValueLow32(xssc[i].resolution));
}
}
#endif
}
#endif
#if USE_XRANDR
if (XRRQueryExtension(disp, &event_base_randr, &error_base_randr))
{
XRRQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("RandR", major, minor,
event_base_randr, error_base_randr);
/* Listen for RandR events */
XRRSelectInput(disp, VRoot.win, RRScreenChangeNotifyMask);
}
#endif
for (i = 0; i < sizeof(Extensions) / sizeof(EServerExt); i++)
ExtQuery(Extensions + i);
#if USE_COMPOSITE
if (XCompositeQueryExtension(disp, &event_base_comp, &error_base_comp))
{
XCompositeQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("Composite", major, minor,
event_base_comp, error_base_comp);
}
if (XDamageQueryExtension(disp, &event_base_damage, &error_base_damage))
{
XDamageQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("Damage", major, minor,
event_base_damage, error_base_damage);
}
if (XFixesQueryExtension(disp, &event_base_fixes, &error_base_fixes))
{
XFixesQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("Fixes", major, minor,
event_base_fixes, error_base_fixes);
}
if (XRenderQueryExtension(disp, &event_base_render, &error_base_render))
{
XRenderQueryVersion(disp, &major, &minor);
EventsExtensionShowInfo("Render", major, minor,
event_base_render, error_base_render);
}
#define XEXT_MASK_CM_ALL ((1 << XEXT_COMPOSITE) | (1 << XEXT_DAMAGE) | \
(1 << XEXT_FIXES) | (1 << XEXT_RENDER))
if (((Mode.server.extensions & XEXT_MASK_CM_ALL) == XEXT_MASK_CM_ALL) &&
(ExtData[XEXT_COMPOSITE].major > 0 ||
ExtData[XEXT_COMPOSITE].minor >= 2))
Mode.server.extensions |= 1 << XEXT_CM_ALL;
#endif
}

View File

@ -31,6 +31,8 @@
#include <X11/extensions/sync.h>
#endif
#undef USE_XSYNC /* No - Not sure this is safe */
static void ICCCM_SetIconSizes(void);
void