From: Seunghun Lee Date: Mon, 25 Jul 2022 06:41:46 +0000 (+0900) Subject: shell: Send visibility events in shell X-Git-Tag: submit/tizen/20220818.083245~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=34f617d26a751225a6ce50b4e51c334a74c7ebf4;p=platform%2Fcore%2Fuifw%2Fheadless-server.git shell: Send visibility events in shell This is to separate implementation of visibliity from headless_server.c. No functional changes. Change-Id: I5635e42a92af7855bdca55a38228adfc0046dba2 --- diff --git a/src/headless_server.c b/src/headless_server.c index 0920b07..de35f86 100644 --- a/src/headless_server.c +++ b/src/headless_server.c @@ -31,7 +31,6 @@ #include #include -#include #include "headless_server.h" @@ -161,7 +160,7 @@ main(int argc, char *argv[]) } /* Init Shell */ - server.shell = headless_shell_create(server.display); + server.shell = headless_shell_create(&server); HS_CHECK(server.shell, goto end, "headless_shell_create() failed.\n"); server.new_shell_surface.notify = server_handle_new_shell_surface; @@ -209,8 +208,15 @@ end: static void destroy_view(headless_view_t *view) { + headless_server_t *server = view->server; + ds_inf("view(%p) destroyed", view); + if (server->top_visible_view == view) + server_set_top_visible_view(server, NULL); + + server_schedule_idle_task(server); + wl_signal_emit(&view->events.destroy, view); wl_list_remove(&view->commit.link); @@ -228,17 +234,8 @@ static void view_handle_shell_surface_destroy(struct wl_listener *listener, void *data) { headless_view_t *view; - headless_server_t *server; view = wl_container_of(listener, view, shell_surface_destroy); - server = view->server; - - if (server->top_visible_view == view) { - server->top_visible_view = NULL; - wl_signal_emit(&server->events.top_visible_view_change, NULL); - } - - server_schedule_idle_task(server); destroy_view(view); } @@ -402,16 +399,6 @@ server_set_top_visible_view(headless_server_t *server, headless_view_t *view) // TODO handle input and debug - if (server->top_visible_view) { - headless_shell_send_visibility(server->top_visible_view->shell_surface, - TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED); - } - - if (view) { - headless_shell_send_visibility(view->shell_surface, - TIZEN_VISIBILITY_VISIBILITY_UNOBSCURED); - } - server->top_visible_view = view; wl_signal_emit(&server->events.top_visible_view_change, view); diff --git a/src/headless_server.h b/src/headless_server.h index 9a933bc..761a932 100644 --- a/src/headless_server.h +++ b/src/headless_server.h @@ -137,7 +137,7 @@ void headless_output_stop_boot_ani(led_output_t *output); void headless_output_update_led(led_output_t *output, unsigned char *data); /* APIs for headless_shell */ -headless_shell_t *headless_shell_create(struct wl_display *display); +headless_shell_t *headless_shell_create(headless_server_t *server); void headless_shell_destroy(headless_shell_t *shell); void headless_shell_add_new_surface_listener(headless_shell_t *shell, struct wl_listener *listener); @@ -155,8 +155,6 @@ void headless_shell_surface_add_unset_skip_focus_listener( headless_shell_surface_t *hs_surface, struct wl_listener *listener); struct ds_surface * headless_shell_surface_get_surface(headless_shell_surface_t *shell_surface); -void headless_shell_send_visibility(headless_shell_surface_t *hs_surface, - uint8_t visibility); struct wl_resource * headless_shell_surface_get_resource(headless_shell_surface_t *hs_surface); diff --git a/src/shell/shell.c b/src/shell/shell.c index 69debca..b535440 100644 --- a/src/shell/shell.c +++ b/src/shell/shell.c @@ -25,26 +25,36 @@ #include "shell.h" +static void handle_top_visible_view_change(struct wl_listener *listener, + void *data); +static void handle_top_visible_view_destroy(struct wl_listener *listener, + void *data); +static void shell_set_top_visible_view(headless_shell_t *shell, + headless_view_t *top_visible_view); +static void shell_unset_top_visible_view(headless_shell_t *shell); + void headless_shell_destroy(headless_shell_t *shell) { if (!shell) return; + wl_list_remove(&shell->top_visible_view_change.link); + xdg_shell_v6_finish(shell); tizen_policy_finish(shell); free(shell); } headless_shell_t * -headless_shell_create(struct wl_display *display) +headless_shell_create(headless_server_t *server) { headless_shell_t *shell; shell = (headless_shell_t*)calloc(sizeof(headless_shell_t), 1); HS_CHECK(shell, goto error, "fail to alloc for shell\n"); - shell->display = display; + shell->server = server; wl_signal_init(&shell->events.new_surface); @@ -53,6 +63,11 @@ headless_shell_create(struct wl_display *display) HS_CHECK(tizen_policy_init(shell), goto error, "tizen_policy_init() failed\n"); + shell->top_visible_view_change.notify = + handle_top_visible_view_change; + wl_signal_add(&server->events.top_visible_view_change, + &shell->top_visible_view_change); + return shell; error: @@ -67,3 +82,58 @@ headless_shell_add_new_surface_listener(headless_shell_t *shell, { wl_signal_add(&shell->events.new_surface, listener); } + +static void +handle_top_visible_view_change(struct wl_listener *listener, void *data) +{ + headless_shell_t *shell; + headless_view_t *top_visible_view = data; + + shell = wl_container_of(listener, shell, top_visible_view_change); + + if (shell->top_visible_view == top_visible_view) + return; + + if (shell->top_visible_view) { + headless_shell_send_visibility(shell->top_visible_view->shell_surface, + TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED); + + shell_unset_top_visible_view(shell); + } + + if (top_visible_view) { + headless_shell_send_visibility(top_visible_view->shell_surface, + TIZEN_VISIBILITY_VISIBILITY_UNOBSCURED); + + shell_set_top_visible_view(shell, top_visible_view); + } +} + +static void +handle_top_visible_view_destroy(struct wl_listener *listener, + void *data) +{ + headless_shell_t *shell; + + shell = wl_container_of(listener, shell, top_visible_view_destroy); + + shell_unset_top_visible_view(shell); +} + +static void +shell_set_top_visible_view(headless_shell_t *shell, + headless_view_t *top_visible_view) +{ + shell->top_visible_view_destroy.notify = handle_top_visible_view_destroy; + wl_signal_add(&top_visible_view->events.destroy, + &shell->top_visible_view_destroy); + + shell->top_visible_view = top_visible_view; +} + +static void +shell_unset_top_visible_view(headless_shell_t *shell) +{ + wl_list_remove(&shell->top_visible_view_destroy.link); + shell->top_visible_view = NULL; +} diff --git a/src/shell/shell.h b/src/shell/shell.h index 14886c1..70868b1 100644 --- a/src/shell/shell.h +++ b/src/shell/shell.h @@ -18,11 +18,16 @@ typedef enum { } headless_surface_type_t; struct headless_shell { - struct wl_display *display; + headless_server_t *server; + headless_view_t *top_visible_view; + struct wl_global *zxdg_shell; struct wl_global *tizen_policy; struct wl_event_source *cb_idle; + struct wl_listener top_visible_view_destroy; + struct wl_listener top_visible_view_change; + struct { struct wl_signal new_surface; } events; @@ -61,5 +66,7 @@ headless_shell_surface_from_ds_surface(struct ds_surface *ds_surface); bool tizen_policy_init(headless_shell_t *shell); void tizen_policy_finish(headless_shell_t *shell); +void headless_shell_send_visibility(headless_shell_surface_t *hs_surface, + uint8_t visibility); #endif diff --git a/src/shell/tizen_policy.c b/src/shell/tizen_policy.c index 59f2b06..b16d4fc 100644 --- a/src/shell/tizen_policy.c +++ b/src/shell/tizen_policy.c @@ -6,7 +6,7 @@ static void tizen_policy_cb_bind(struct wl_client *client, void *data, bool tizen_policy_init(headless_shell_t *shell) { - shell->tizen_policy = wl_global_create(shell->display, + shell->tizen_policy = wl_global_create(shell->server->display, &tizen_policy_interface, 7, shell, tizen_policy_cb_bind); HS_CHECK(shell->tizen_policy, return false, "faile to create tizen_policy\n"); diff --git a/src/shell/xdg_shell_v6.c b/src/shell/xdg_shell_v6.c index a813ad4..cdca2f4 100644 --- a/src/shell/xdg_shell_v6.c +++ b/src/shell/xdg_shell_v6.c @@ -16,7 +16,7 @@ static void unmap_headless_shell_surface(headless_shell_surface_t *hs_surface); bool xdg_shell_v6_init(headless_shell_t *shell) { - shell->zxdg_shell = wl_global_create(shell->display, + shell->zxdg_shell = wl_global_create(shell->server->display, &zxdg_shell_v6_interface, 1, shell, zxdg_shell_cb_bind); HS_CHECK(shell->zxdg_shell, return false, "fail to create zxdg_shell\n");