From 0915c5727b5434f00c05c95a398b811c318adf59 Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Sun, 19 Mar 2006 15:33:38 +0000 Subject: [PATCH] Simplify server extension handling. Initial screensaver extension stuff. SVN revision: 21412 --- configure.in | 20 +++- src/E.h | 27 +++++- src/ecompmgr.c | 14 +-- src/events.c | 242 ++++++++++++++++++++++++++++--------------------- src/icccm.c | 2 + 5 files changed, 184 insertions(+), 121 deletions(-) diff --git a/configure.in b/configure.in index 63e98ee4..f062d490 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/src/E.h b/src/E.h index 3be80b51..71b1cae1 100644 --- a/src/E.h +++ b/src/E.h @@ -43,6 +43,14 @@ #include #include +#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 #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; diff --git a/src/ecompmgr.c b/src/ecompmgr.c index 548a5253..2b8fceca 100644 --- a/src/ecompmgr.c +++ b/src/ecompmgr.c @@ -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; diff --git a/src/events.c b/src/events.c index 4d83b5dd..8201de6a 100644 --- a/src/events.c +++ b/src/events.c @@ -30,6 +30,9 @@ #if USE_XSYNC #include #endif +#if USE_XSCREENSAVER +#include +#endif #if USE_XRANDR #include #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 } diff --git a/src/icccm.c b/src/icccm.c index fd84fec8..0dfffd3e 100644 --- a/src/icccm.c +++ b/src/icccm.c @@ -31,6 +31,8 @@ #include #endif +#undef USE_XSYNC /* No - Not sure this is safe */ + static void ICCCM_SetIconSizes(void); void