desktop-shell: Implement set_toplevel
authorJaehoon Jeong <jh01.j@samsung.com>
Wed, 8 Jul 2015 05:01:43 +0000 (14:01 +0900)
committerGerrit Code Review <root@ap3>
Wed, 15 Jul 2015 08:46:52 +0000 (17:46 +0900)
    - In surface type setting api cases, server tracks client's request and
      actual mapping done in shell_surface_map_xxx() when surface.commmit()
      called

    - type setting scenario
        1. client send request for shell_surface.set_something()
        2. server track states
        3. server send configure event
        4. client post a new frame in reponse of the configure event with commit request
        5. server apply changed states

Change-Id: I0dc7d731ad05e407efb69a3ed571eada3acc7830

desktop-shell/src/desktop-shell-internal.h
desktop-shell/src/shell-surface.c
desktop-shell/src/wl-shell.c
desktop-shell/src/xdg-shell.c

index 7ca4478..8ca4fef 100644 (file)
@@ -16,15 +16,15 @@ typedef struct shell_surface    shell_surface_t;
 
 struct desktop_shell
 {
-    pepper_object_t     *compositor;
+    pepper_object_t         *compositor;
 
-    struct wl_list       shell_client_list;
-    struct wl_list       shell_surface_list;
+    struct wl_list           shell_client_list;
+    struct wl_list           shell_surface_list;
 
     /* TODO: */
-    struct wl_listener   seat_create_listener;
-    struct wl_listener   output_create_listener;
-    struct wl_listener   output_change_listener;
+    struct wl_listener       seat_create_listener;
+    struct wl_listener       output_create_listener;
+    struct wl_listener       output_change_listener;
 };
 
 struct shell_client
@@ -77,9 +77,14 @@ struct shell_surface
     /* Data structures per surface type */
     shell_surface_type_t     type;
 
+    /* (*map) */
+    void (*shell_surface_map)(shell_surface_t *shsurf);
+    pepper_bool_t            mapped;
+
     /* Listeners */
     struct wl_listener      client_destroy_listener;
     struct wl_listener      surface_destroy_listener;
+    struct wl_listener      surface_commit_listener;
 
     struct wl_list          link;       /* link */
 };
@@ -119,5 +124,8 @@ get_shsurf_from_surface(pepper_object_t *surface, desktop_shell_t *shell);
 void
 set_shsurf_to_surface(pepper_object_t *surface, shell_surface_t *shsurf);
 
+void
+shell_surface_set_toplevel(shell_surface_t *shsurf);
+
 pepper_bool_t
 init_wl_shell(desktop_shell_t *shell);
index d76d528..238a789 100644 (file)
@@ -12,6 +12,31 @@ remove_ping_timer(shell_client_t *shell_client)
 }
 
 static void
+shsurf_stop_listen_commit_event(shell_surface_t *shsurf)
+{
+    wl_list_remove(&shsurf->surface_commit_listener.link);
+    wl_list_init(&shsurf->surface_commit_listener.link);
+}
+
+static void
+handle_surface_commit(struct wl_listener *listener, void *data)
+{
+    shell_surface_t *shsurf =
+        pepper_container_of(listener, shell_surface_t, surface_commit_listener);
+
+    if (!shsurf->mapped && shsurf->shell_surface_map)
+        shsurf->shell_surface_map(shsurf);
+}
+
+static void
+shsurf_start_listen_commit_event(shell_surface_t *shsurf)
+{
+    shsurf->surface_commit_listener.notify = handle_surface_commit;
+    wl_list_init(&shsurf->surface_commit_listener.link);
+    /* TODO: Need new API: pepper_surface_add_commit_listener() */
+}
+
+static void
 handle_client_destroy(struct wl_listener *listener, void *data)
 {
     shell_surface_t *shsurf =
@@ -34,6 +59,8 @@ handle_surface_destroy(struct wl_listener *listener, void *data)
 
     wl_list_remove(&shsurf->surface_destroy_listener.link);
 
+    shsurf_stop_listen_commit_event(shsurf);
+
     if (shsurf->resource)
         wl_resource_destroy(shsurf->resource);
 
@@ -104,6 +131,9 @@ shell_surface_create(shell_client_t *shell_client, pepper_object_t *surface,
     shsurf->surface_destroy_listener.notify = handle_surface_destroy;
     pepper_object_add_destroy_listener(surface, &shsurf->surface_destroy_listener);
 
+    shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_NONE);
+    shsurf_start_listen_commit_event(shsurf);
+
     /* Set shell_surface_t to pepper_surface_t */
     set_shsurf_to_surface(surface, shsurf);
 
@@ -198,9 +228,56 @@ shell_surface_handle_pong(shell_surface_t *shsurf, uint32_t serial)
 }
 
 void
+shell_surface_set_toplevel(shell_surface_t *shsurf)
+{
+    shell_surface_set_parent(shsurf, NULL);
+
+    shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_TOPLEVEL);
+
+    /* Need to map in later */
+    shsurf->mapped = PEPPER_FALSE;
+}
+
+static void
+shell_surface_set_position(shell_surface_t *shsurf, int32_t x, int32_t y)
+{
+    pepper_view_set_position(shsurf->view, x, y);
+}
+
+static void
+shell_surface_map_toplevel(shell_surface_t *shsurf)
+{
+    int32_t x = 0, y = 0;
+
+    /**
+     * TODO: To placing view, need to get output's size, position and seat->pointer's position
+     *       or, read from config file
+     */
+
+    shell_surface_set_position(shsurf, x, y);
+
+    pepper_view_map(shsurf->view);
+
+    shsurf->mapped = PEPPER_TRUE;
+}
+
+void
 shell_surface_set_type(shell_surface_t *shsurf, shell_surface_type_t type)
 {
     shsurf->type = type;
+
+    switch (type)
+    {
+    case SHELL_SURFACE_TYPE_NONE:
+        shsurf->shell_surface_map = NULL;
+        break;
+    case SHELL_SURFACE_TYPE_TOPLEVEL:
+        shsurf->shell_surface_map = shell_surface_map_toplevel;
+        break;
+    default :
+        /* XXX: Maybe some logs be needed */
+        break;
+    }
 }
 
 shell_surface_t *
index 0b61be9..e09f76f 100644 (file)
@@ -27,11 +27,7 @@ wl_shell_surface_set_toplevel(struct wl_client *client, struct wl_resource *reso
 {
     shell_surface_t *shsurf = wl_resource_get_user_data(resource);
 
-    shell_surface_set_parent(shsurf, NULL);
-
-    shell_surface_set_type(shsurf, SHELL_SURFACE_TYPE_TOPLEVEL);
-
-    pepper_view_map(shsurf->view);
+    shell_surface_set_toplevel(shsurf);
 }
 
 static void
index 9c5cc6a..06fc2a7 100644 (file)
@@ -169,12 +169,12 @@ xdg_shell_get_xdg_surface(struct wl_client      *client,
         return ;
     }
 
-    /* TODO: */
-
     shsurf = shell_surface_create(shell_client, surface, client, &xdg_surface_interface,
                                   &xdg_surface_implementation, 1, id);
     if (!shsurf)
         wl_client_post_no_memory(client);
+
+    shell_surface_set_toplevel(shsurf);
 }
 
 static void