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 7ca4478e9a882c3c3e2acce0d0ce594c5c6b1312..8ca4fefb6fdd661e7ae0ab6cd19408c55a5c6806 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 d76d52843d1f0f5835e094df7421115a8c9b8d11..238a789ecf7840a05a4aa7a834357b99424c1688 100644 (file)
@@ -11,6 +11,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)
 {
@@ -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);
 
@@ -197,10 +227,57 @@ shell_surface_handle_pong(shell_surface_t *shsurf, uint32_t serial)
     shell_client_handle_pong(shsurf->shell_client, 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 0b61be93daad90da24dde73f88229698bfbb28d6..e09f76fb07defa268071bb9b52d3a4bcd117a3d3 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 9c5cc6a22371a384e40a861dd518a0e9d69e2dfe..06fc2a762ed43366fa54871d12ff31f662129661 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