From: Jaehoon Jeong Date: Wed, 8 Jul 2015 05:01:43 +0000 (+0900) Subject: desktop-shell: Implement set_toplevel X-Git-Tag: accepted/tizen/mobile/20151221.050925~34^2~284 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b693c5ea21a51d9a8b2af079113ae8ff7279dbfe;p=platform%2Fcore%2Fuifw%2Fpepper.git desktop-shell: Implement set_toplevel - 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 --- diff --git a/desktop-shell/src/desktop-shell-internal.h b/desktop-shell/src/desktop-shell-internal.h index 7ca4478..8ca4fef 100644 --- a/desktop-shell/src/desktop-shell-internal.h +++ b/desktop-shell/src/desktop-shell-internal.h @@ -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); diff --git a/desktop-shell/src/shell-surface.c b/desktop-shell/src/shell-surface.c index d76d528..238a789 100644 --- a/desktop-shell/src/shell-surface.c +++ b/desktop-shell/src/shell-surface.c @@ -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 * diff --git a/desktop-shell/src/wl-shell.c b/desktop-shell/src/wl-shell.c index 0b61be9..e09f76f 100644 --- a/desktop-shell/src/wl-shell.c +++ b/desktop-shell/src/wl-shell.c @@ -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 diff --git a/desktop-shell/src/xdg-shell.c b/desktop-shell/src/xdg-shell.c index 9c5cc6a..06fc2a7 100644 --- a/desktop-shell/src/xdg-shell.c +++ b/desktop-shell/src/xdg-shell.c @@ -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