This is to separate implementation of visibliity from headless_server.c.
No functional changes.
Change-Id: I5635e42a92af7855bdca55a38228adfc0046dba2
#include <dlog.h>
#include <tbm_bufmgr.h>
-#include <tizen-extension-server-protocol.h>
#include "headless_server.h"
}
/* 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;
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);
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);
}
// 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);
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);
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);
#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);
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:
{
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;
+}
} 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;
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
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");
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");