kwo pushed a commit to branch master. http://git.enlightenment.org/e16/e16.git/commit/?id=1e625f8bb4b84f65567adc3ba865b6d2e2d3f4da
commit 1e625f8bb4b84f65567adc3ba865b6d2e2d3f4da Author: Kim Woelders <k...@woelders.dk> Date: Sat Nov 15 13:29:36 2014 +0100 Initial Present infrastructure. --- configure.ac | 11 +++++++++++ src/E.h | 1 + src/Makefile.am | 2 ++ src/edebug.h | 1 + src/events.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 4331c58..0496427 100644 --- a/configure.ac +++ b/configure.ac @@ -294,6 +294,16 @@ if test "x$enable_composite" = "xyes"; then fi AM_CONDITIONAL(ENABLE_COMPOSITE, test "x$enable_composite" = "xyes") +AC_ARG_ENABLE(xpresent, + AC_HELP_STRING([--enable-xpresent], [compile with Present support (experimental) @<:@default=no@:>@]),, + enable_xpresent=no) +if test "x$enable_xpresent" = "xyes"; then + PKG_CHECK_MODULES(XPRESENT, xpresent, + AC_DEFINE(USE_XPRESENT, 1, [Present support]), + enable_xpresent=no + AC_MSG_WARN([Present support was requested but not found]) ) +fi + AC_ARG_ENABLE(zoom, AC_HELP_STRING([--enable-zoom], [compile with zoom support @<:@default=yes@:>@]),, enable_zoom=yes) @@ -514,6 +524,7 @@ echo " GLX .......................... $enable_glx" echo " ScreenSaver .................. $enable_xscrnsaver" echo " D-Bus ........................ $enable_dbus" echo " XI2 .......................... $enable_xi2" +echo " Present....................... $enable_xpresent" echo " Use container window ......... $enable_container" echo echo "Installation path .............. $prefix" diff --git a/src/E.h b/src/E.h index 9409fea..13b9d42 100644 --- a/src/E.h +++ b/src/E.h @@ -126,6 +126,7 @@ #define XEXT_RENDER 8 #define XEXT_GLX 9 #define XEXT_XI 10 +#define XEXT_PRESENT 11 #define XEXT_CM_ALL 16 diff --git a/src/Makefile.am b/src/Makefile.am index 2b670ef..df02908 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -135,6 +135,7 @@ e16_CPPFLAGS = \ $(DBUS_CFLAGS) \ $(XI_CFLAGS) \ $(XRANDR_CFLAGS) \ + $(XPRESENT_CFLAGS) \ $(X_CFLAGS) LDADD = \ @@ -145,6 +146,7 @@ LDADD = \ $(GLX_LIBS) \ $(XI_LIBS) \ $(XRANDR_LIBS) \ + $(XPRESENT_LIBS) \ $(X_LIBS) \ $(SM_LIBS) \ $(XINERAMA_LIBS) \ diff --git a/src/edebug.h b/src/edebug.h index 2fd70f6..3d1d820 100644 --- a/src/edebug.h +++ b/src/edebug.h @@ -57,6 +57,7 @@ #define EDBUG_TYPE_XI2 153 #define EDBUG_TYPE_ZOOM 154 #define EDBUG_TYPE_ANIM 155 +#define EDBUG_TYPE_PRESENT 156 #define EDBUG_TYPE_COMPMGR 161 #define EDBUG_TYPE_COMPMGR2 162 diff --git a/src/events.c b/src/events.c index 8a0179f..52a8362 100644 --- a/src/events.c +++ b/src/events.c @@ -50,13 +50,16 @@ #include <X11/extensions/Xfixes.h> #include <X11/extensions/Xrender.h> #endif +#if USE_XPRESENT +#include <X11/extensions/Xpresent.h> +#endif #if USE_GLX #include <GL/glx.h> #endif #if USE_XI2 #include <X11/extensions/XInput2.h> #endif -#define USE_GENERIC defined(USE_XI2) +#define USE_GENERIC defined(USE_XI2) || defined(USE_XPRESENT) #if ENABLE_DEBUG_EVENTS static const char *EventName(unsigned int type); @@ -78,7 +81,7 @@ typedef struct { void (*init) (int avaliable); } EServerExt; -static EServerExtData ExtData[11]; +static EServerExtData ExtData[12]; #define event_base_shape ExtData[XEXT_SHAPE].event_base #define event_base_randr ExtData[XEXT_RANDR].event_base @@ -249,6 +252,21 @@ ExtInitInput(int available) } #endif +#if USE_XPRESENT +static void +ExtInitPresent(int available) +{ + if (!available) + return; + + if (EDebug(EDBUG_TYPE_VERBOSE)) + { + Eprintf(" Capabilities: %#x\n", + XPresentQueryCapabilities(disp, WinGetXwin(VROOT))); + } +} +#endif + static const EServerExt Extensions[] = { {"SHAPE", XEXT_SHAPE, XShapeQueryVersion, ExtInitShape}, #if USE_XSYNC @@ -275,6 +293,9 @@ static const EServerExt Extensions[] = { #if USE_XI2 {"XInputExtension", XEXT_XI, EInputQueryVersion, ExtInitInput}, #endif +#if USE_XPRESENT + {"Present", XEXT_PRESENT, XPresentQueryVersion, ExtInitPresent}, +#endif }; static void @@ -888,6 +909,25 @@ _EventFetchXI2(XEvent * ev) } #endif /* USE_XI2 */ +#if USE_XPRESENT +typedef union { + XPresentEvent xpe; + XPresentConfigureNotifyEvent conf; + XPresentCompleteNotifyEvent cmpl; + XPresentIdleNotifyEvent idle; +} xpe_t; + +static void +_EventFetchPresent(XEvent * ev) +{ + xpe_t *xpe = (xpe_t *) ev->xcookie.data; + + if (EDebug(EDBUG_TYPE_PRESENT)) + Eprintf("%s: %#lx: type=%d\n", + __func__, xpe->idle.window, xpe->xpe.evtype); +} +#endif /* USE_XPRESENT */ + static void _EventFetchGeneric(XEvent * ev) { @@ -905,6 +945,13 @@ _EventFetchGeneric(XEvent * ev) goto done; } #endif +#if USE_XPRESENT + if (ev->xcookie.extension == ExtData[XEXT_PRESENT].major_op) + { + _EventFetchPresent(ev); + goto done; + } +#endif /* We should never go here */ Eprintf("*** %s: ext=%d type=%d\n", __func__, ev->xcookie.extension, ev->xcookie.evtype); --