Re: [waffle] [PATCH 02/12] core: store context API in wcore_context

2016-01-08 Thread Chad Versace
On 01/06/2016 11:56 AM, Frank Henigman wrote:
> Facilitates api-specific code in core functions, like the forthcoming
> wflinfo-like function.
> 
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/core/wcore_context.h | 2 ++
>  1 file changed, 2 insertions(+)



>  struct wcore_context {
>  struct api_object api;
> +int32_t context_api; // WAFFLE_CONTEXT_API enum, e.g. 
> WAFFLE_CONTEXT_OPENGL
>  struct wcore_display *display;
>  };

Like patch 1, use an enum here for gdb's sake.

___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH v2 3/4] wflinfo.c: split version, renderer, and vendor checks

2016-01-08 Thread Chad Versace
On 01/05/2016 11:46 AM, baker.dyla...@gmail.com wrote:
> From: Dylan Baker 
> 
> Pull these out into helper functions, this change will be used in a
> following patch to add a JSON printer.
> 
> Signed-off-by: Dylan Baker 
> 
> v2: - change "const char * name" to "const char *name" (Frank)
> ---
>  src/utils/wflinfo.c | 50 --
>  1 file changed, 36 insertions(+), 14 deletions(-)

Patches 1-3 are
Reviewed-by: Chad Versace 

For patch 4, I'm waiting for you to address the `i != flag_count`
issue, and any resultant newline fixups.

I just began reading Frank's series, btw. I haven't decided yet
how your two series should interact.
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 01/12] core: store platform type in wcore_platform

2016-01-08 Thread Chad Versace
On 01/08/2016 04:00 AM, Emil Velikov wrote:
> Hi Frank,
> 
> On 6 January 2016 at 21:56, Frank Henigman  wrote:
>> Facilitates platform-specific code in core functions, like the forthcoming
>> wflinfo-like function.
>>
>> Signed-off-by: Frank Henigman 
>> ---
>>  src/waffle/api/waffle_init.c | 32 +---
>>  src/waffle/core/wcore_platform.h |  1 +
>>  2 files changed, 22 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/waffle/api/waffle_init.c b/src/waffle/api/waffle_init.c
>> index 60091d1..3d8d350 100644
>> --- a/src/waffle/api/waffle_init.c
>> +++ b/src/waffle/api/waffle_init.c
>> @@ -142,43 +142,53 @@ waffle_init_parse_attrib_list(
>>  static struct wcore_platform*
>>  waffle_init_create_platform(int32_t waffle_platform)
>>  {
>> +struct wcore_platform *wc_platform = NULL;
>> +
>>  switch (waffle_platform) {
>>  #ifdef WAFFLE_HAS_ANDROID
>>  case WAFFLE_PLATFORM_ANDROID:
>> -return droid_platform_create();
>> +wc_platform = droid_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_CGL
>>  case WAFFLE_PLATFORM_CGL:
>> -return cgl_platform_create();
>> +wc_platform = cgl_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_GLX
>>  case WAFFLE_PLATFORM_GLX:
>> -return glx_platform_create();
>> +wc_platform = glx_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_WAYLAND
>>  case  WAFFLE_PLATFORM_WAYLAND:
>> -return wayland_platform_create();
>> +wc_platform = wayland_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_X11_EGL
>>  case WAFFLE_PLATFORM_X11_EGL:
>> -return xegl_platform_create();
>> +wc_platform = xegl_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_GBM
>>  case WAFFLE_PLATFORM_GBM:
>> -return wgbm_platform_create();
>> +wc_platform = wgbm_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_WGL
>>  case WAFFLE_PLATFORM_WGL:
>> -return wgl_platform_create();
>> +wc_platform = wgl_platform_create();
>> +break;
>>  #endif
>>  #ifdef WAFFLE_HAS_NACL
>>  case WAFFLE_PLATFORM_NACL:
>> -return nacl_platform_create();
>> +wc_platform = nacl_platform_create();
>> +break;
>>  #endif
>> -default:
>> -assert(false);
>> -return NULL;

> If we remove the default statement the compiler will shout loudly at
> us. Just initialize wc_platform here ?

Like Emil said, the default is required to eliminate compiler warnings,
as this switch is non-exhaustive. It's best to keep the default statement
as-is (assert for debug builds, return NULL for release builds).

> 
>>  }

An empty line after the brace, please.

>> +assert(wc_platform);
>> +wc_platform->waffle_platform = waffle_platform;
>> +return wc_platform;
>>  }
>>
>>  WAFFLE_API bool
>> diff --git a/src/waffle/core/wcore_platform.h 
>> b/src/waffle/core/wcore_platform.h
>> index 780d07a..30d1c6c 100644
>> --- a/src/waffle/core/wcore_platform.h
>> +++ b/src/waffle/core/wcore_platform.h
>> @@ -139,6 +139,7 @@ struct wcore_platform_vtbl {
>>
>>  struct wcore_platform {
>>  const struct wcore_platform_vtbl *vtbl;
>> +int32_t waffle_platform; // WAFFLE_PLATFORM_* enum

> Worth using the enum here ? (same goes for patch 2)

Yes, this should be an enum. Originally, values like this were
int32_t throughout the waffle code. But then Brian Paul requested that
waffle use enums instead because it made debugging easier. (gdb understands
how to print enum names, but doesn't know the name if the value's type is
a plain int).

___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH v2 3/4] wflinfo.c: split version, renderer, and vendor checks

2016-01-08 Thread Chad Versace
On 01/06/2016 02:55 PM, Dylan Baker wrote:
> 
> 
> On Wed, Jan 6, 2016 at 1:30 PM, Emil Velikov  > wrote:
> 
> On 5 January 2016 at 19:46,   > wrote:
> > From: Dylan Baker  >

> > +static const char *
> > +get_vendor(void)
> > +{
> > +const char *vendor = (const char *) glGetString(GL_VENDOR);
> > +if (glGetError() != GL_NO_ERROR || vendor == NULL) {
> > +vendor = "WFLINFO_GL_ERROR";
> > +}
> > +

> Wish I caught you before re-spinning things. This and the other two
> can loose the brackets - those were added due to bugs in MSVC's C99
> parser. This comment is another "if things ever get to v3".
> 
> -Emil
> 
> 
> After learning GO I'm always going to use brackets, because being in
> a good habit of using brackets prevents an entire class of bugs (like
> apple's ssl return bug). Unless Chad really objects to having the
> brackets I prefer them.

Even though it's unpopular with C programmers, I prefer, like Dylan,
to use brackets everywhere. Programming in C is hard enough; deciding
when to use or not use brackets is another unneeded mental burden.
Also, I've encountered real bugs in driver code due to a missing
bracket.

I'm not entirely consistent, though. Sometimes I don't bracket when
I'm *gasp* feeling lazy.
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 10/12] egl: implement platform-specific information

2016-01-08 Thread Emil Velikov
On 6 January 2016 at 21:56, Frank Henigman  wrote:
> Implement the platform hook of waffle_display_info_json() so it can
> pick up egl-specific information.
>
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/egl/wegl_display.c  | 32 ++--
>  src/waffle/egl/wegl_display.h  |  4 
>  src/waffle/egl/wegl_platform.h |  3 +++
>  3 files changed, 37 insertions(+), 2 deletions(-)
>
> diff --git a/src/waffle/egl/wegl_display.c b/src/waffle/egl/wegl_display.c
> index 88fce7a..dcfe934 100644
> --- a/src/waffle/egl/wegl_display.c
> +++ b/src/waffle/egl/wegl_display.c
> @@ -25,6 +25,8 @@
>
>  #include 
>
> +#include "json.h"
> +
>  #include "wcore_error.h"
>  #include "wcore_platform.h"
>
> @@ -63,7 +65,6 @@ wegl_display_init(struct wegl_display *dpy,
>  {
>  struct wegl_platform *plat = wegl_platform(wc_plat);
>  bool ok;
> -EGLint major, minor;
>
>  ok = wcore_display_init(&dpy->wcore, wc_plat);
>  if (!ok)
> @@ -75,7 +76,7 @@ wegl_display_init(struct wegl_display *dpy,
>  goto fail;
>  }
>
> -ok = plat->eglInitialize(dpy->egl, &major, &minor);
> +ok = plat->eglInitialize(dpy->egl, &plat->major, &plat->minor);
>  if (!ok) {
>  wegl_emit_error(plat, "eglInitialize");
>  goto fail;
> @@ -139,3 +140,30 @@ wegl_display_supports_context_api(struct wcore_display 
> *wc_dpy,
>
>  return wc_plat->vtbl->dl_can_open(wc_plat, waffle_dl);
>  }
> +
> +void
> +wegl_display_info_json(struct wcore_display *wc_dpy, struct json *jj)
> +{
> +struct wegl_display *dpy = wegl_display(wc_dpy);
> +struct wegl_platform *plat = wegl_platform(dpy->wcore.platform);
> +
> +const char *version = plat->eglQueryString(dpy->egl, EGL_VERSION);
> +const char *vendor = plat->eglQueryString(dpy->egl, EGL_VENDOR);
> +#ifdef EGL_VERSION_1_2
> +const char *apis = plat->eglQueryString(dpy->egl, EGL_CLIENT_APIS);
> +#endif
I would suggesting adding the define on top ifndef EGL_VERSION_1_2,
and dropping the checks here and below.

-Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 07/12] waffle: support platform-specific information

2016-01-08 Thread Emil Velikov
On 6 January 2016 at 21:56, Frank Henigman  wrote:
> Add a platform hook so platform-specific information can be included
> by waffle_display_info_json().
>
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/api/waffle_display.c  | 10 +-
>  src/waffle/core/wcore_platform.h |  4 
>  2 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/src/waffle/api/waffle_display.c b/src/waffle/api/waffle_display.c
> index 7abe2ef..d6988ac 100644
> --- a/src/waffle/api/waffle_display.c
> +++ b/src/waffle/api/waffle_display.c
> @@ -367,8 +367,16 @@ waffle_display_info_json(struct waffle_display *self, 
> bool platform_too)
>
>  json_appendv(jj, "{", "generic", "{", "");
>  add_generic_info(jj, wc_self->current_context);
> -json_appendv(jj, "}", "}", "");
> +json_append(jj, "}");
>
> +if (platform_too) {
> +json_appendv(jj, "platform", "{", "");
> +if (api_platform->vtbl->display.info_json)
> +api_platform->vtbl->display.info_json(wc_self, jj);
The rest of waffle tends to set UNSUPPORTED_ON_PLATFORM if the backend
is missing the vfunc.

-Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 05/12] waffle: add waffle_display_info_json()

2016-01-08 Thread Emil Velikov
On 6 January 2016 at 21:56, Frank Henigman  wrote:
> Duplicate wflinfo functionality in the API, with the difference that the
> information is returned in JSON form.
> The function has a parameter for including platform-specific information,
> but it is ignored for now.
>
> Signed-off-by: Frank Henigman 
> ---
>  include/waffle/waffle.h |   5 +
>  man/waffle_display.3.xml|  19 +++
>  src/waffle/api/waffle_display.c | 284 
> +++-
>  src/waffle/waffle.def.in|   1 +
>  4 files changed, 308 insertions(+), 1 deletion(-)
>
> diff --git a/include/waffle/waffle.h b/include/waffle/waffle.h
> index df0218e..1800399 100644
> --- a/include/waffle/waffle.h
> +++ b/include/waffle/waffle.h
> @@ -214,6 +214,11 @@ bool
>  waffle_display_supports_context_api(struct waffle_display *self,
>  int32_t context_api);
>
> +#if WAFFLE_API_VERSION >= 0x0106
> +char*
> +waffle_display_info_json(struct waffle_display *self, bool platform_too);
The function does not work solely with the display, but it requires a
(bound) context. Thus it does not really fit waffle naming scheme. I'm
afraid that I'm short of suggestions though (barring my "returning
json formatted data sounds iffy, lets use tokens" rant from earlier)


> +#endif
> +
>  union waffle_native_display*
>  waffle_display_get_native(struct waffle_display *self);
>
> diff --git a/man/waffle_display.3.xml b/man/waffle_display.3.xml
> index 9896247..5358472 100644
> --- a/man/waffle_display.3.xml
> +++ b/man/waffle_display.3.xml
> @@ -24,6 +24,7 @@
>  waffle_display
>  waffle_display_connect
>  waffle_display_disconnect
> +waffle_display_info_json
>  waffle_display_supports_context_api
>  waffle_display_get_native
>  class waffle_display
> @@ -58,6 +59,12 @@ struct waffle_display;
>
>
>
> +char* 
> waffle_display_info_json
> +struct waffle_display 
> *self
> +bool platform_info
> +  
> +
> +  
>  bool 
> waffle_display_supports_context_api
>  struct waffle_display 
> *self
>  int32_t context_api
> @@ -129,6 +136,18 @@ struct waffle_display;
>
>
>
> +waffle_display_info_json()
> +
> +  
> +Return a JSON string containing information about the current 
> context on the given display, including Waffle platform and API, GL 
> version/vendor/renderer and extensions.
> +If platform_info is true, 
> platform-specific information (such as GLX or EGL versions and extensions) 
> will be included as available.
> +Returns NULL on error.
> +The string should be deallocated with 
> free3.
> +  
> +
> +  
> +
> +  
>  
> waffle_display_supports_context_api()
>  
>
> diff --git a/src/waffle/api/waffle_display.c b/src/waffle/api/waffle_display.c
> index fa19462..7abe2ef 100644
> --- a/src/waffle/api/waffle_display.c
> +++ b/src/waffle/api/waffle_display.c
> @@ -23,13 +23,61 @@
>  // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
> USE
>  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>
> +#include 
> +#include 
> +
>  #include "api_priv.h"
>
> -#include "wcore_error.h"
> +#include "json.h"
> +
> +#include "wcore_context.h"
>  #include "wcore_display.h"
> +#include "wcore_error.h"
>  #include "wcore_platform.h"
>  #include "wcore_util.h"
>
> +typedef unsigned int GLint;
> +typedef unsigned int GLenum;
> +typedef unsigned char GLubyte;
> +
> +enum {
> +// Copied from .
> +GL_NO_ERROR = 0,
> +
> +GL_CONTEXT_FLAGS = 0x821e,
> +GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x0001,
> +GL_CONTEXT_FLAG_DEBUG_BIT  = 0x0002,
> +GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB  = 0x0004,
> +
> +GL_VENDOR  = 0x1F00,
> +GL_RENDERER= 0x1F01,
> +GL_VERSION = 0x1F02,
> +GL_EXTENSIONS  = 0x1F03,
> +GL_NUM_EXTENSIONS  = 0x821D,
> +GL_SHADING_LANGUAGE_VERSION= 0x8B8C,
> +};
> +
> +#ifndef _WIN32
> +#define APIENTRY
> +#else
> +#ifndef APIENTRY
> +#define APIENTRY __stdcall
> +#endif
> +#endif
> +
> +static GLenum (APIENTRY *glGetError)(void);
> +static void (APIENTRY *glGetIntegerv)(GLenum pname, GLint *params);
> +static const GLubyte * (APIENTRY *glGetString)(GLenum name);
> +static const GLubyte * (APIENTRY *glGetStringi)(GLenum name, GLint i);
> +
> +#if defined(__GNUC__)
> +#define NORETURN __attribute__((noreturn))
> +#elif defined(_MSC_VER)
> +#define NORETURN __declspec(noreturn)
> +#else
> +#define NORETURN
> +#endif
> +
>  WAFFLE_API struct waffle_display*
>  waffle_display_connect(const char *name)
>  {
> @@ -90,6 +138,240 @@ waffle_display_supports_context_api(
>  contex

Re: [waffle] [PATCH 04/12] core: add JSON library

2016-01-08 Thread Emil Velikov
On 6 January 2016 at 21:56, Frank Henigman  wrote:
> A small library for building JSON strings.
>
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/CMakeLists.txt |   1 +
>  src/waffle/core/json.c| 235 
> ++
>  src/waffle/core/json.h|  93 ++
Is the library is copied/derived from another project or written from
scratch ? If the former should we move it to third_party/  ?

-Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 03/12] core: store current context in wcore_display

2016-01-08 Thread Emil Velikov
On 6 January 2016 at 21:56, Frank Henigman  wrote:
> For core functions that need to know the current context, like the
> forthcoming wflinfo-like function.
>
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/api/waffle_gl_misc.c | 11 +++
>  src/waffle/core/wcore_display.c |  1 +
>  src/waffle/core/wcore_display.h |  2 ++
>  3 files changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/src/waffle/api/waffle_gl_misc.c b/src/waffle/api/waffle_gl_misc.c
> index 138974d..4161ce8 100644
> --- a/src/waffle/api/waffle_gl_misc.c
> +++ b/src/waffle/api/waffle_gl_misc.c
> @@ -94,10 +94,13 @@ waffle_make_current(
>  if (!api_check_entry(obj_list, len))
>  return false;
>
> -return api_platform->vtbl->make_current(api_platform,
> -wc_dpy,
> -wc_window,
> -wc_ctx);
> +bool ok = api_platform->vtbl->make_current(api_platform,
> +   wc_dpy,
> +   wc_window,
> +   wc_ctx);
> +if (ok)
> +wc_dpy->current_context = wc_ctx;
> +return ok;
>  }
>
>  WAFFLE_API void*
> diff --git a/src/waffle/core/wcore_display.c b/src/waffle/core/wcore_display.c
> index 18262c3..bcaeacb 100644
> --- a/src/waffle/core/wcore_display.c
> +++ b/src/waffle/core/wcore_display.c
> @@ -52,6 +52,7 @@ wcore_display_init(struct wcore_display *self,
>  mtx_unlock(&mutex);
>
>  self->platform = platform;
> +self->current_context = NULL;
We calloc the struct so we should need this ?

>
>  if (self->api.display_id == 0) {
>  fprintf(stderr, "waffle: error: internal counter wrapped to 0\n");
> diff --git a/src/waffle/core/wcore_display.h b/src/waffle/core/wcore_display.h
> index 6e374e3..1ccff6f 100644
> --- a/src/waffle/core/wcore_display.h
> +++ b/src/waffle/core/wcore_display.h
> @@ -37,12 +37,14 @@
>  extern "C" {
>  #endif
>
> +struct wcore_context;
>  struct wcore_display;
>  struct wcore_platform;
>  union waffle_native_display;
>
>  struct wcore_display {
>  struct api_object api;
> +struct wcore_context *current_context;
Not 100% if wcore_display is the "right" struct, but keeping a
reference in waffle sounds great imho. The alternative (using every
permutation of GetCurrentContext) does feel like an overkill.

-Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 01/12] core: store platform type in wcore_platform

2016-01-08 Thread Emil Velikov
Hi Frank,

On 6 January 2016 at 21:56, Frank Henigman  wrote:
> Facilitates platform-specific code in core functions, like the forthcoming
> wflinfo-like function.
>
> Signed-off-by: Frank Henigman 
> ---
>  src/waffle/api/waffle_init.c | 32 +---
>  src/waffle/core/wcore_platform.h |  1 +
>  2 files changed, 22 insertions(+), 11 deletions(-)
>
> diff --git a/src/waffle/api/waffle_init.c b/src/waffle/api/waffle_init.c
> index 60091d1..3d8d350 100644
> --- a/src/waffle/api/waffle_init.c
> +++ b/src/waffle/api/waffle_init.c
> @@ -142,43 +142,53 @@ waffle_init_parse_attrib_list(
>  static struct wcore_platform*
>  waffle_init_create_platform(int32_t waffle_platform)
>  {
> +struct wcore_platform *wc_platform = NULL;
> +
>  switch (waffle_platform) {
>  #ifdef WAFFLE_HAS_ANDROID
>  case WAFFLE_PLATFORM_ANDROID:
> -return droid_platform_create();
> +wc_platform = droid_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_CGL
>  case WAFFLE_PLATFORM_CGL:
> -return cgl_platform_create();
> +wc_platform = cgl_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_GLX
>  case WAFFLE_PLATFORM_GLX:
> -return glx_platform_create();
> +wc_platform = glx_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_WAYLAND
>  case  WAFFLE_PLATFORM_WAYLAND:
> -return wayland_platform_create();
> +wc_platform = wayland_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_X11_EGL
>  case WAFFLE_PLATFORM_X11_EGL:
> -return xegl_platform_create();
> +wc_platform = xegl_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_GBM
>  case WAFFLE_PLATFORM_GBM:
> -return wgbm_platform_create();
> +wc_platform = wgbm_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_WGL
>  case WAFFLE_PLATFORM_WGL:
> -return wgl_platform_create();
> +wc_platform = wgl_platform_create();
> +break;
>  #endif
>  #ifdef WAFFLE_HAS_NACL
>  case WAFFLE_PLATFORM_NACL:
> -return nacl_platform_create();
> +wc_platform = nacl_platform_create();
> +break;
>  #endif
> -default:
> -assert(false);
> -return NULL;
If we remove the default statement the compiler will shout loudly at
us. Just initialize wc_platform here ?

>  }
> +assert(wc_platform);
> +wc_platform->waffle_platform = waffle_platform;
> +return wc_platform;
>  }
>
>  WAFFLE_API bool
> diff --git a/src/waffle/core/wcore_platform.h 
> b/src/waffle/core/wcore_platform.h
> index 780d07a..30d1c6c 100644
> --- a/src/waffle/core/wcore_platform.h
> +++ b/src/waffle/core/wcore_platform.h
> @@ -139,6 +139,7 @@ struct wcore_platform_vtbl {
>
>  struct wcore_platform {
>  const struct wcore_platform_vtbl *vtbl;
> +int32_t waffle_platform; // WAFFLE_PLATFORM_* enum
Worth using the enum here ? (same goes for patch 2)

-Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle