summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2011-05-12 21:29:22 -0400
committerKristian Høgsberg <krh@bitplanet.net>2011-05-12 21:29:22 -0400
commit4bde293ff8109d55eeaee8732f5a6ee0c8cd4bd9 (patch)
tree9bc28fe4281feeb90758a2f6cfb28988da348287
parent4453ba084aae5a00318b9dfdeda95e8eaa17494c (diff)
Add event to associate visuals with a pixel format token
-rw-r--r--protocol/wayland.xml11
-rw-r--r--wayland/wayland-client.c39
-rw-r--r--wayland/wayland-server.c46
3 files changed, 46 insertions, 50 deletions
diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index afeaf9e..9d0a539 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -83,6 +83,17 @@
<request name="create_surface">
<arg name="id" type="new_id" interface="wl_surface"/>
</request>
+
+ <enum name="visual">
+ <entry name="argb32" value="0"/>
+ <entry name="premultiplied_argb32" value="1"/>
+ <entry name="xrgb32" value="2"/>
+ </enum>
+
+ <event name="token_visual">
+ <arg name="id" type="new_id" interface="wl_object"/>
+ <arg name="token" type="uint"/>
+ </event>
</interface>
<!-- Shared memory support -->
diff --git a/wayland/wayland-client.c b/wayland/wayland-client.c
index 3d28cc5..0852662 100644
--- a/wayland/wayland-client.c
+++ b/wayland/wayland-client.c
@@ -82,10 +82,6 @@ struct wl_display {
struct wl_list global_listener_list;
struct wl_list global_list;
- struct wl_visual *argb_visual;
- struct wl_visual *premultiplied_argb_visual;
- struct wl_visual *rgb_visual;
-
wl_display_update_func_t update;
void *update_data;
@@ -208,39 +204,6 @@ wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
wl_closure_destroy(closure);
}
-static void
-add_visual(struct wl_display *display, uint32_t id)
-{
- struct wl_visual *visual;
-
- visual = (struct wl_visual *)
- wl_proxy_create_for_id(display, &wl_visual_interface, id);
- if (display->argb_visual == NULL)
- display->argb_visual = visual;
- else if (display->premultiplied_argb_visual == NULL)
- display->premultiplied_argb_visual = visual;
- else
- display->rgb_visual = visual;
-}
-
-WL_EXPORT struct wl_visual *
-wl_display_get_argb_visual(struct wl_display *display)
-{
- return display->argb_visual;
-}
-
-WL_EXPORT struct wl_visual *
-wl_display_get_premultiplied_argb_visual(struct wl_display *display)
-{
- return display->premultiplied_argb_visual;
-}
-
-WL_EXPORT struct wl_visual *
-wl_display_get_rgb_visual(struct wl_display *display)
-{
- return display->rgb_visual;
-}
-
/* Can't do this, there may be more than one instance of an
* interface... */
WL_EXPORT uint32_t
@@ -278,8 +241,6 @@ display_handle_global(void *data,
if (strcmp(interface, "wl_display") == 0)
wl_hash_table_insert(display->objects,
id, &display->proxy.object);
- else if (strcmp(interface, "wl_visual") == 0)
- add_visual(display, id);
global = malloc(sizeof *global);
global->id = id;
diff --git a/wayland/wayland-server.c b/wayland/wayland-server.c
index 0d76bb0..d30df5b 100644
--- a/wayland/wayland-server.c
+++ b/wayland/wayland-server.c
@@ -822,6 +822,29 @@ wl_display_add_socket(struct wl_display *display, const char *name)
return 0;
}
+static void
+compositor_bind(struct wl_client *client,
+ struct wl_object *global, uint32_t version)
+{
+ struct wl_compositor *compositor =
+ container_of(global, struct wl_compositor, object);
+
+ wl_client_post_event(client, global,
+ WL_COMPOSITOR_TOKEN_VISUAL,
+ &compositor->argb_visual.object,
+ WL_COMPOSITOR_VISUAL_ARGB32);
+
+ wl_client_post_event(client, global,
+ WL_COMPOSITOR_TOKEN_VISUAL,
+ &compositor->premultiplied_argb_visual.object,
+ WL_COMPOSITOR_VISUAL_PREMULTIPLIED_ARGB32);
+
+ wl_client_post_event(client, global,
+ WL_COMPOSITOR_TOKEN_VISUAL,
+ &compositor->rgb_visual.object,
+ WL_COMPOSITOR_VISUAL_XRGB32);
+}
+
WL_EXPORT int
wl_compositor_init(struct wl_compositor *compositor,
const struct wl_compositor_interface *interface,
@@ -830,13 +853,15 @@ wl_compositor_init(struct wl_compositor *compositor,
compositor->object.interface = &wl_compositor_interface;
compositor->object.implementation = (void (**)(void)) interface;
wl_display_add_object(display, &compositor->object);
- if (wl_display_add_global(display, &compositor->object, NULL))
+ if (wl_display_add_global(display,
+ &compositor->object, compositor_bind))
return -1;
compositor->argb_visual.object.interface = &wl_visual_interface;
compositor->argb_visual.object.implementation = NULL;
wl_display_add_object(display, &compositor->argb_visual.object);
- if (wl_display_add_global(display, &compositor->argb_visual.object, NULL))
+ if (wl_display_add_global(display,
+ &compositor->argb_visual.object, NULL))
return -1;
compositor->premultiplied_argb_visual.object.interface =
@@ -844,18 +869,17 @@ wl_compositor_init(struct wl_compositor *compositor,
compositor->premultiplied_argb_visual.object.implementation = NULL;
wl_display_add_object(display,
&compositor->premultiplied_argb_visual.object);
- if (wl_display_add_global(display,
- &compositor->premultiplied_argb_visual.object,
- NULL))
- return -1;
+ if (wl_display_add_global(display,
+ &compositor->premultiplied_argb_visual.object,
+ NULL))
+ return -1;
compositor->rgb_visual.object.interface = &wl_visual_interface;
compositor->rgb_visual.object.implementation = NULL;
- wl_display_add_object(display,
- &compositor->rgb_visual.object);
- if (wl_display_add_global(display,
- &compositor->rgb_visual.object, NULL))
- return -1;
+ wl_display_add_object(display, &compositor->rgb_visual.object);
+ if (wl_display_add_global(display,
+ &compositor->rgb_visual.object, NULL))
+ return -1;
return 0;
}