screen: add wtz_screen_set_opaque_region request callback 52/311952/1 accepted/tizen/unified/20240603.032429 accepted/tizen/unified/20240604.160810 accepted/tizen/unified/x/20240604.013025
authorJunseok Kim <juns.kim@samsung.com>
Thu, 23 May 2024 00:39:56 +0000 (09:39 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 31 May 2024 05:16:04 +0000 (14:16 +0900)
Change-Id: I299750529260c82a90a4d17e470397629a58baa4

include/libds-tizen/screen.h
src/meson.build
src/screen/screen.c

index 11a39ab4de16ef7fcf88de6a33e7ace953d2fccb..092e6acf4bf87808744df6d2c520336d1b506155 100644 (file)
@@ -2,6 +2,7 @@
 #define LIBDS_TIZEN_SCREEN_H
 
 #include <stdint.h>
+#include <pixman.h>
 #include <wayland-server.h>
 
 #ifdef __cplusplus
@@ -9,6 +10,7 @@ extern "C" {
 #endif
 
 struct ds_tizen_screen;
+struct ds_tizen_screen_opaque_region;
 struct ds_tizen_splitscreen;
 struct ds_tizen_splitscreen_region;
 
@@ -18,6 +20,12 @@ enum ds_tizen_screen_capability
     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);
 
@@ -34,6 +42,10 @@ ds_tizen_screen_add_get_splitscreen_listener(
         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(
index 2e0d09de2e25659f30714acc14fabaf951a8d262..de0b18ede6dd43fd4d5b4d46fc42bfd687ef5705 100644 (file)
@@ -135,6 +135,7 @@ lib_libds_tizen = shared_library('ds-tizen', libds_tizen_files,
                          include_directories('./video'),
                          include_directories('./blender'),
                          include_directories('./blur'),
+                         include_directories('./screen'),
                        ],
   version: meson.project_version(),
   c_args: [ '-DKEYLAYOUT_DIR="@0@"'.format(keylayout_dir) ],
index 6ba84420e17d29118123554d5eac3c28c7c8823c..4021ed4a0125ce27032690e3af9e31eb106c3974 100644 (file)
@@ -1,15 +1,28 @@
 #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;
@@ -21,12 +34,14 @@ struct ds_tizen_screen
     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;
 };
 
@@ -186,6 +201,43 @@ screen_handle_get_splitscreen(struct wl_client *client,
     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)
@@ -197,6 +249,7 @@ static const struct wtz_screen_interface screen_impl =
 {
     .destroy = screen_handle_destroy,
     .get_splitscreen = screen_handle_get_splitscreen,
+    .set_opaque_region = screen_handle_set_opaque_region,
 };
 
 static void
@@ -266,6 +319,18 @@ screen_handle_display_destroy(struct wl_listener *listener, void *data)
     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)
 {
@@ -286,6 +351,7 @@ 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);
@@ -294,6 +360,7 @@ ds_tizen_screen_create(struct wl_display *display)
 
     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);
 
@@ -346,6 +413,14 @@ ds_tizen_screen_add_get_splitscreen_listener(
     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,