#define LIBDS_TIZEN_SCREEN_H
#include <stdint.h>
+#include <pixman.h>
#include <wayland-server.h>
#ifdef __cplusplus
#endif
struct ds_tizen_screen;
+struct ds_tizen_screen_opaque_region;
struct ds_tizen_splitscreen;
struct ds_tizen_splitscreen_region;
DS_TIZEN_SCREEN_CAPABILITY_SPLITSCREEN,
};
+WL_EXPORT pixman_region32_t
+ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region);
+
+WL_EXPORT uint32_t
+ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region);
+
WL_EXPORT struct ds_tizen_screen *
ds_tizen_screen_create(struct wl_display *display);
struct ds_tizen_screen *screen,
struct wl_listener *listener);
+WL_EXPORT void
+ds_tizen_screen_add_set_opaque_region_listener(
+ struct ds_tizen_screen *screen,
+ struct wl_listener *listener);
WL_EXPORT void
ds_tizen_splitscreen_add_destroy_listener(
#include <assert.h>
#include <stdint.h>
#include <stdlib.h>
+#include <pixman.h>
#include <wayland-server.h>
#include <wtz-screen-server-protocol.h>
+
#include <libds/log.h>
+#include <libds/region.h>
#include "util.h"
#include "libds-tizen/screen.h"
#define TIZEN_SCREEN_VERSION 1
+struct ds_tizen_screen_opaque_region
+{
+ struct ds_tizen_screen *screen;
+
+ struct wl_list link; // ds_tizen_screen::opaque_region_list
+
+ pixman_region32_t region;
+ uint32_t serial;
+};
+
struct ds_tizen_screen
{
struct wl_global *global;
struct wl_array capabilities;
uint32_t splitscreen_capability;
+ struct wl_list opaque_region_list; // list of ds_tizen_screen_opaque_region
bool splitscreen_enabled;
struct {
struct wl_signal destroy;
struct wl_signal get_splitscreen;
+ struct wl_signal set_opaque_region;
} events;
};
wl_signal_emit(&screen_client->screen->events.get_splitscreen, splitscreen);
}
+static void
+screen_handle_set_opaque_region(struct wl_client *client,
+ struct wl_resource *screen_client_resource,
+ struct wl_resource *region_resource,
+ uint32_t serial)
+{
+ struct ds_tizen_screen_opaque_region *opaque_region;
+ struct ds_tizen_screen_client *screen_client;
+ struct ds_tizen_screen *screen;
+ pixman_region32_t *region;
+
+ screen_client = wl_resource_get_user_data(screen_client_resource);
+
+ screen = screen_client->screen;
+
+ opaque_region = calloc(1, sizeof *opaque_region);
+ if (!opaque_region) {
+ ds_err("calloc() failed.");
+ wl_resource_post_no_memory(screen_client_resource);
+ return;
+ }
+ opaque_region->screen = screen;
+ opaque_region->serial = serial;
+ pixman_region32_init(&opaque_region->region);
+
+ if (region_resource) {
+ region = ds_region_from_resource(region_resource);
+ pixman_region32_copy(&opaque_region->region, region);
+ }
+
+ wl_list_insert(&screen->opaque_region_list, &opaque_region->link);
+
+ ds_inf("wtz_screen set opaque region, region:%p, serial:%u", opaque_region, serial);
+
+ wl_signal_emit(&screen->events.set_opaque_region, opaque_region);
+}
+
static void
screen_handle_destroy(struct wl_client *wl_client,
struct wl_resource *resource)
{
.destroy = screen_handle_destroy,
.get_splitscreen = screen_handle_get_splitscreen,
+ .set_opaque_region = screen_handle_set_opaque_region,
};
static void
free(screen);
}
+WL_EXPORT pixman_region32_t
+ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region)
+{
+ return opaque_region->region;
+}
+
+WL_EXPORT uint32_t
+ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region)
+{
+ return opaque_region->serial;
+}
+
WL_EXPORT struct ds_tizen_screen *
ds_tizen_screen_create(struct wl_display *display)
{
}
wl_list_init(&screen->clients);
+ wl_list_init(&screen->opaque_region_list);
screen->destroy.notify = screen_handle_display_destroy;
wl_display_add_destroy_listener(display, &screen->destroy);
wl_signal_init(&screen->events.destroy);
wl_signal_init(&screen->events.get_splitscreen);
+ wl_signal_init(&screen->events.set_opaque_region);
ds_inf("Global created: tizen_screen(%p)", screen);
wl_signal_add(&screen->events.get_splitscreen, listener);
}
+WL_EXPORT void
+ds_tizen_screen_add_set_opaque_region_listener(
+ struct ds_tizen_screen *screen,
+ struct wl_listener *listener)
+{
+ wl_signal_add(&screen->events.set_opaque_region, listener);
+}
+
WL_EXPORT void
ds_tizen_splitscreen_add_destroy_listener(
struct ds_tizen_splitscreen *splitscreen,