shell: Send visibility events in shell 96/279096/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 25 Jul 2022 06:41:46 +0000 (15:41 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Tue, 2 Aug 2022 01:18:11 +0000 (10:18 +0900)
This is to separate implementation of visibliity from headless_server.c.

No functional changes.

Change-Id: I5635e42a92af7855bdca55a38228adfc0046dba2

src/headless_server.c
src/headless_server.h
src/shell/shell.c
src/shell/shell.h
src/shell/tizen_policy.c
src/shell/xdg_shell_v6.c

index 0920b07a66bcc7f4e3a8501203ec155fefd68919..de35f86412dc709b709d7c29d1e2959c16ab1654 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <dlog.h>
 #include <tbm_bufmgr.h>
-#include <tizen-extension-server-protocol.h>
 
 #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);
index 9a933bc3712b0d5d084101c88f1e16f08020040e..761a932dff58ca098cbe0f0ebf67c1fedd156e29 100644 (file)
@@ -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);
 
index 69debcac5249b1b5bbf0f767d1316637bacf4311..b53544003522edc611934a98ad403e7e2e86b23b 100644 (file)
 
 #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;
+}
index 14886c1023be3e70544abd3eaa58dbda0cd30665..70868b134a567f5cf7be6f33e03b6bedb80f0f4e 100644 (file)
@@ -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
index 59f2b060f163952cb893d3d9f8e724d2636a2d84..b16d4fc29184b53e3cb59e8d813420ab392158ad 100644 (file)
@@ -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");
index a813ad4400ac6464c0a8a477af61c30b8b2dc1e9..cdca2f450b941f50bb0138350baffde7d76e525f 100644 (file)
@@ -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");