Basic requests are implemented, enough to get a surface displayed.
---
 src/.gitignore  |   2 +
 src/Makefile.am |   6 +-
 src/shell.c     | 228 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 223 insertions(+), 13 deletions(-)

diff --git a/src/.gitignore b/src/.gitignore
index 723967d..8e59be6 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -19,3 +19,5 @@ workspaces-protocol.c
 workspaces-server-protocol.h
 input-method-protocol.c
 input-method-server-protocol.h
+xdg-shell-protocol.c
+xdg-shell-server-protocol.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 551dff9..f6f277d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -294,7 +294,9 @@ desktop_shell_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS)
 desktop_shell_la_SOURCES =                     \
        shell.c                                 \
        desktop-shell-protocol.c                \
-       desktop-shell-server-protocol.h
+       desktop-shell-server-protocol.h         \
+       xdg-shell-protocol.c                    \
+       xdg-shell-server-protocol.h
 endif
 
 if ENABLE_TABLET_SHELL
@@ -355,6 +357,8 @@ BUILT_SOURCES =                                     \
        input-method-server-protocol.h          \
        workspaces-server-protocol.h            \
        workspaces-protocol.c                   \
+       xdg-shell-protocol.c                    \
+       xdg-shell-server-protocol.h             \
        git-version.h
 
 CLEANFILES = $(BUILT_SOURCES)
diff --git a/src/shell.c b/src/shell.c
index 507d46f..f775899 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -40,6 +40,7 @@
 #include "input-method-server-protocol.h"
 #include "workspaces-server-protocol.h"
 #include "../shared/config-parser.h"
+#include "xdg-shell-server-protocol.h"
 
 #define DEFAULT_NUM_WORKSPACES 1
 #define DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH 200
@@ -1564,8 +1565,8 @@ surface_move(struct shell_surface *shsurf, struct 
weston_seat *seat)
 }
 
 static void
-shell_surface_move(struct wl_client *client, struct wl_resource *resource,
-                  struct wl_resource *seat_resource, uint32_t serial)
+common_surface_move(struct wl_resource *resource,
+                   struct wl_resource *seat_resource, uint32_t serial)
 {
        struct weston_seat *seat = wl_resource_get_user_data(seat_resource);
        struct shell_surface *shsurf = wl_resource_get_user_data(resource);
@@ -1587,6 +1588,13 @@ shell_surface_move(struct wl_client *client, struct 
wl_resource *resource,
        }
 }
 
+static void
+shell_surface_move(struct wl_client *client, struct wl_resource *resource,
+                  struct wl_resource *seat_resource, uint32_t serial)
+{
+       common_surface_move(resource, seat_resource, serial);
+}
+
 struct weston_resize_grab {
        struct shell_grab base;
        uint32_t edges;
@@ -1741,9 +1749,9 @@ surface_resize(struct shell_surface *shsurf,
 }
 
 static void
-shell_surface_resize(struct wl_client *client, struct wl_resource *resource,
-                    struct wl_resource *seat_resource, uint32_t serial,
-                    uint32_t edges)
+common_surface_resize(struct wl_resource *resource,
+                     struct wl_resource *seat_resource, uint32_t serial,
+                     uint32_t edges)
 {
        struct weston_seat *seat = wl_resource_get_user_data(seat_resource);
        struct shell_surface *shsurf = wl_resource_get_user_data(resource);
@@ -1763,6 +1771,14 @@ shell_surface_resize(struct wl_client *client, struct 
wl_resource *resource,
 }
 
 static void
+shell_surface_resize(struct wl_client *client, struct wl_resource *resource,
+                    struct wl_resource *seat_resource, uint32_t serial,
+                    uint32_t edges)
+{
+       common_surface_resize(resource, seat_resource, serial, edges);
+}
+
+static void
 end_busy_cursor(struct shell_surface *shsurf, struct weston_pointer *pointer);
 
 static void
@@ -1943,12 +1959,10 @@ create_pointer_focus_listener(struct weston_seat *seat)
 }
 
 static void
-shell_surface_pong(struct wl_client *client, struct wl_resource *resource,
-                                                       uint32_t serial)
+surface_pong(struct shell_surface *shsurf, uint32_t serial)
 {
-       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
-       struct weston_seat *seat;
        struct weston_compositor *ec = shsurf->surface->compositor;
+       struct weston_seat *seat;
 
        if (shsurf->ping_timer == NULL)
                /* Just ignore unsolicited pong. */
@@ -1965,6 +1979,16 @@ shell_surface_pong(struct wl_client *client, struct 
wl_resource *resource,
 }
 
 static void
+shell_surface_pong(struct wl_client *client, struct wl_resource *resource,
+                                                       uint32_t serial)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       surface_pong(shsurf, serial);
+
+}
+
+static void
 set_title(struct shell_surface *shsurf, const char *title)
 {
        free(shsurf->title);
@@ -2802,9 +2826,9 @@ get_shell_surface(struct weston_surface *surface)
                return NULL;
 }
 
-static         struct shell_surface *
-create_shell_surface(void *shell, struct weston_surface *surface,
-                    const struct weston_shell_client *client)
+static struct shell_surface *
+create_common_surface(void *shell, struct weston_surface *surface,
+                     const struct weston_shell_client *client)
 {
        struct shell_surface *shsurf;
 
@@ -2863,6 +2887,19 @@ create_shell_surface(void *shell, struct weston_surface 
*surface,
        return shsurf;
 }
 
+static struct shell_surface *
+create_shell_surface(void *shell, struct weston_surface *surface,
+                    const struct weston_shell_client *client)
+{
+       struct shell_surface *shsurf;
+       shsurf = create_common_surface(shell, surface, client);
+
+       shsurf->type = SHELL_SURFACE_NONE;
+       shsurf->next_type = SHELL_SURFACE_NONE;
+
+       return shsurf;
+}
+
 static struct weston_view *
 get_primary_view(void *shell, struct shell_surface *shsurf)
 {
@@ -2907,6 +2944,157 @@ static const struct wl_shell_interface 
shell_implementation = {
        shell_get_shell_surface
 };
 
+/****************************
+ * xdg-shell implementation */
+
+static void
+xdg_surface_destroy(struct wl_client *client,
+                   struct wl_resource *resource)
+{
+       wl_resource_destroy(resource);
+}
+
+static void
+xdg_surface_pong(struct wl_client *client,
+                struct wl_resource *resource,
+                uint32_t serial)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       surface_pong(shsurf, serial);
+}
+
+static void
+xdg_surface_set_app_id(struct wl_client *client,
+                      struct wl_resource *resource,
+                      const char *app_id)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       free(shsurf->class);
+       shsurf->class = strdup(app_id);
+}
+
+static void
+xdg_surface_set_title(struct wl_client *client,
+                       struct wl_resource *resource, const char *title)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       set_title(shsurf, title);
+}
+
+static void
+xdg_surface_move(struct wl_client *client, struct wl_resource *resource,
+                struct wl_resource *seat_resource, uint32_t serial)
+{
+       common_surface_move(resource, seat_resource, serial);
+}
+
+static void
+xdg_surface_resize(struct wl_client *client, struct wl_resource *resource,
+                  struct wl_resource *seat_resource, uint32_t serial,
+                  uint32_t edges)
+{
+       common_surface_resize(resource, seat_resource, serial, edges);
+}
+
+static const struct xdg_surface_interface xdg_surface_implementation = {
+       xdg_surface_destroy,
+       NULL, // set_transient_for
+       xdg_surface_set_title,
+       xdg_surface_set_app_id,
+       xdg_surface_pong,
+       xdg_surface_move,
+       xdg_surface_resize,
+       NULL, // set_output
+       NULL, // set_fullscreen
+       NULL, // unset_fullscreen
+       NULL, // set_maximized
+       NULL, // unset_maximized
+       NULL // set_minimized
+};
+
+static void
+xdg_send_configure(struct weston_surface *surface,
+              uint32_t edges, int32_t width, int32_t height)
+{
+       struct shell_surface *shsurf = get_shell_surface(surface);
+
+       xdg_surface_send_configure(shsurf->resource, edges, width, height);
+}
+
+static const struct weston_shell_client xdg_client = {
+       xdg_send_configure
+};
+
+static void
+xdg_use_unstable_version(struct wl_client *client,
+                        struct wl_resource *resource,
+                        int32_t version)
+{
+       if (version > 1) {
+               wl_resource_post_error(resource,
+                                      1,
+                                      "xdg-shell:: version not implemented 
yet.");
+               return;
+       }
+}
+
+static struct shell_surface *
+create_xdg_surface(void *shell, struct weston_surface *surface,
+                  const struct weston_shell_client *client)
+{
+       struct shell_surface *shsurf;
+       shsurf = create_common_surface(shell, surface, client);
+
+       shsurf->type = SHELL_SURFACE_NONE;
+       shsurf->next_type = SHELL_SURFACE_TOPLEVEL;
+
+       return shsurf;
+}
+
+static void
+xdg_get_xdg_surface(struct wl_client *client,
+                   struct wl_resource *resource,
+                   uint32_t id,
+                   struct wl_resource *surface_resource)
+{
+       struct weston_surface *surface =
+               wl_resource_get_user_data(surface_resource);
+       struct desktop_shell *shell = wl_resource_get_user_data(resource);
+       struct shell_surface *shsurf;
+
+       if (get_shell_surface(surface)) {
+               wl_resource_post_error(surface_resource,
+                                      WL_DISPLAY_ERROR_INVALID_OBJECT,
+                                      "desktop_shell::get_shell_surface 
already requested");
+               return;
+       }
+
+       shsurf = create_xdg_surface(shell, surface, &xdg_client);
+       if (!shsurf) {
+               wl_resource_post_error(surface_resource,
+                                      WL_DISPLAY_ERROR_INVALID_OBJECT,
+                                      "surface->configure already set");
+               return;
+       }
+
+       shsurf->resource =
+               wl_resource_create(client,
+                                  &xdg_surface_interface, 1, id);
+       wl_resource_set_implementation(shsurf->resource,
+                                      &xdg_surface_implementation,
+                                      shsurf, shell_destroy_shell_surface);
+}
+
+static const struct xdg_shell_interface xdg_implementation = {
+       xdg_use_unstable_version,
+       xdg_get_xdg_surface,
+       NULL // get_xdg_popup
+};
+
+
 static void
 shell_fade(struct desktop_shell *shell, enum fade_type type);
 
@@ -4507,6 +4695,18 @@ bind_shell(struct wl_client *client, void *data, 
uint32_t version, uint32_t id)
 }
 
 static void
+bind_xdg_shell(struct wl_client *client, void *data, uint32_t version, 
uint32_t id)
+{
+       struct desktop_shell *shell = data;
+       struct wl_resource *resource;
+
+       resource = wl_resource_create(client, &xdg_shell_interface, 1, id);
+       if (resource)
+               wl_resource_set_implementation(resource, &xdg_implementation,
+                                              shell, NULL);
+}
+
+static void
 unbind_desktop_shell(struct wl_resource *resource)
 {
        struct desktop_shell *shell = wl_resource_get_user_data(resource);
@@ -6045,6 +6245,10 @@ module_init(struct weston_compositor *ec,
                                  shell, bind_shell) == NULL)
                return -1;
 
+       if (wl_global_create(ec->wl_display, &xdg_shell_interface, 1,
+                                 shell, bind_xdg_shell) == NULL)
+               return -1;
+
        if (wl_global_create(ec->wl_display,
                             &desktop_shell_interface, 2,
                             shell, bind_desktop_shell) == NULL)
-- 
1.8.3.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to