[PATCH] shell: fix set_transient
Pekka Paalanen
ppaalanen at gmail.com
Fri Dec 9 04:28:31 PST 2011
> On Thu, 8 Dec 2011 13:05:42 -0500
> Kristian Høgsberg <krh at bitplanet.net> wrote:
>
> > On Thu, Dec 8, 2011 at 10:08 AM, Pekka Paalanen
> > <ppaalanen at gmail.com> wrote:
> > > On Thu, 08 Dec 2011 17:04:47 +0200
> > > Tiago Vignatti <tiago.vignatti at linux.intel.com> wrote:
> ...
> > >> but I thought you'd implement the explicit cast scheme.. meh.
> > >
> > > Sorry, not today :-D
> > >
> > > I'll keep it in mind, though, for when I have time for it.
> > >
> > > For reference to others: it is for improving type safety in the
> > > compositor side, by putting some real pointer types into struct
> > > wl_*_interface's function arguments.
> >
> > The question there is, what types? We could make a struct
> > wl_compositor_resource that wraps the generic wl_resource, and then
> > move the void *data out of wl_resource and into
> > wl_compsitor_resource as a typesafe pointer. To what though? We
> > could make it struct wl_compositor * and just require that the
> > compositor use those types. I dunno, it just seems messy and I'm
> > not sure it's worth it.
I just had another idea, but I'm not sure if it is better or worse.
It is about playing with typedefs, here is an ad hoc example with
wl_shell_surface.
On the core lib side, we use a type placeholder instead of any real
type.
--- wayland-server-protocol.h 2011-12-09 14:09:03.000000000 +0200
+++ wayland-server-protocol.h.mod 2011-12-09 14:00:55.000000000 +0200
@@ -249,7 +249,7 @@ struct wl_shell_surface_interface {
int32_t y,
uint32_t flags);
void (*set_fullscreen)(struct wl_client *client,
- struct wl_resource *resource);
+ struct_wl_shell_surface *resource);
};
#define WL_SHELL_SURFACE_CONFIGURE 0
Ok, so it's not 'resource' anymore, and we need to pass
wl_resource::data instead when we actually call it.
For that to compile, we need a binary compatible dummy definition in
the core library, private.
diff --git a/src/wayland-private.h b/src/wayland-private.h
index fada571..d65db2f 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -27,6 +27,9 @@
#include <stdarg.h>
#include "wayland-util.h"
+/* Dummy type definitions for just compiling the core lib */
+typedef void struct_wl_shell_surface;
+
#define WL_ZOMBIE_OBJECT ((void *) 2)
#define WL_MAP_SERVER_SIDE 0
Then, in the real compositor, we define it to be a proper type.
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 3c88807..15e1a3b 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -23,6 +23,9 @@
#ifndef _WAYLAND_SYSTEM_COMPOSITOR_H_
#define _WAYLAND_SYSTEM_COMPOSITOR_H_
+/* The real type definitions */
+typedef struct shell_surface struct_wl_shell_surface;
+
#include <libudev.h>
#include <pixman.h>
#include <wayland-server.h>
Then, in our callback definition, we can directly use the correct type.
diff --git a/compositor/shell.c b/compositor/shell.c
index b745693..7a72534 100644
--- a/compositor/shell.c
+++ b/compositor/shell.c
@@ -402,10 +401,9 @@ get_default_output(struct wlsc_compositor *compositor)
static void
shell_surface_set_fullscreen(struct wl_client *client,
- struct wl_resource *resource)
+ struct shell_surface *shsurf)
{
- struct shell_surface *shsurf = resource->data;
struct wlsc_surface *es = shsurf->surface;
struct wlsc_output *output;
And this actually compiles without warnings, I tried it.
Now, the ugly part is, wayland-server-protocol.h is not compileable
without either a dummy or a proper typedef. Also, can we trust on the
binary compatibility, that if library is compiled with (void *), and
same datum is compiled as (struct foo *) in another compilation unit,
that the implicit-hidden pointer cast works?
With this idea, we avoid the intermediate types in casts, the explicit
casts and inline cast wrapper functions, and yet do not have to teach
wayland-scanner about our implementation-spefic types.
Another downside will come with the shell plugins, they would have to
agree on types, have them all in a common header for the core protocol.
Yet further upside with typedefs is, that we could start generating
server side type safe inline wrappers for all wl_resource_post_event()
calls instead of the current varargs dance with absolutely no type
safety.
What do you think?
- pq
More information about the wayland-devel
mailing list