e_tizen_embedded_compositor: make tizen_embedded_compositor 44/320844/2
authorSooChan Lim <sc1.lim@samsung.com>
Sun, 9 Mar 2025 02:43:49 +0000 (11:43 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 10 Mar 2025 06:20:40 +0000 (06:20 +0000)
add the server implementation for tizen_embedded_compositor resource

Change-Id: I04e51c80dad6aaba68e85b776073a46e52199024

src/bin/Makefile.mk
src/bin/server/e_tizen_embedded_compositor.c [new file with mode: 0644]
src/bin/server/e_tizen_embedded_compositor_intern.h [new file with mode: 0644]

index 4a860316b484dca4608f0943cd89ccd4dfb74e57..146f681f4025d762ac79a0481216e7c9e4665cc7 100644 (file)
@@ -203,6 +203,7 @@ src/bin/server/e_tizen_indicator.c \
 src/bin/server/e_tizen_clipboard.c \
 src/bin/server/e_surface_view.c \
 src/bin/server/e_seat.c \
+src/bin/server/e_tizen_embedded_compositor.c \
 src/bin/server/e_surface_fps_tracker.c \
 src/bin/windowmgr/services/e_service_gesture.c \
 src/bin/windowmgr/services/e_service_lockscreen.c \
diff --git a/src/bin/server/e_tizen_embedded_compositor.c b/src/bin/server/e_tizen_embedded_compositor.c
new file mode 100644 (file)
index 0000000..8e02d9a
--- /dev/null
@@ -0,0 +1,124 @@
+#include "e_tizen_embedded_compositor_intern.h"
+
+#include <tizen-extension-server-protocol.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+
+struct _E_Tizen_Embedded_Compositor
+{
+   struct wl_global *global;
+};
+
+static E_Tizen_Embedded_Compositor *g_tizen_embedded_compositor = NULL;
+
+static void
+_e_tizen_embedded_compositor_cb_get_socket(struct wl_client *client,
+                          struct wl_resource *resource)
+{
+   int sock_fd = -1;
+   pid_t pid = 0;
+
+   wl_client_get_credentials(client, &pid, NULL, NULL);
+
+   sock_fd = socket(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
+   if (sock_fd < 0)
+     {
+        ERR("Could not create socket: %m, (client:%p, pid:%d)", client, pid);
+        return;
+     }
+
+   tizen_embedded_compositor_send_socket(resource, sock_fd);
+
+   ELOGF("WTZ_EMBEDDED_COMP", "sock_fd(%d) sent! (client:%p, pid:%d)",
+         NULL, sock_fd, client, pid);
+
+   close(sock_fd);
+}
+
+static void
+_e_tizen_embedded_compositor_cb_destroy(struct wl_client *client,
+                          struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+// --------------------------------------------------------
+// tizen_embedded_compositor_interface
+// --------------------------------------------------------
+static const struct tizen_embedded_compositor_interface _e_tizen_embedded_compositor_interface =
+{
+   _e_tizen_embedded_compositor_cb_get_socket,
+   _e_tizen_embedded_compositor_cb_destroy
+};
+
+static void
+_embedded_compositor_client_cb_unbind(struct wl_resource *embedded_compositor_res)
+{
+   // Nothing to do here.
+}
+
+static void
+_e_tizen_embedded_compositor_cb_bind(struct wl_client *client, void *data,
+      uint32_t ver, uint32_t id)
+{
+   struct wl_resource *embedded_compositor_res;
+
+   embedded_compositor_res = wl_resource_create(client,
+                                         &tizen_embedded_compositor_interface,
+                                         ver,
+                                         id);
+   EINA_SAFETY_ON_NULL_GOTO(embedded_compositor_res, err);
+
+   wl_resource_set_implementation(embedded_compositor_res,
+                                  &_e_tizen_embedded_compositor_interface,
+                                  NULL,
+                                  _embedded_compositor_client_cb_unbind);
+   return;
+
+err:
+   ERR("Could not create tizen_embedded_compositor_interface res: %m");
+   wl_client_post_no_memory(client);
+}
+
+EINTERN E_Tizen_Embedded_Compositor *
+e_tizen_embedded_compositor_init(struct wl_display *display)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
+
+   if (g_tizen_embedded_compositor) return g_tizen_embedded_compositor;
+
+   g_tizen_embedded_compositor = E_NEW(E_Tizen_Embedded_Compositor, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_embedded_compositor, NULL);
+
+   g_tizen_embedded_compositor->global = wl_global_create(display,
+                             &tizen_embedded_compositor_interface,
+                             1,
+                             NULL,
+                             _e_tizen_embedded_compositor_cb_bind);
+
+   if (!g_tizen_embedded_compositor->global)
+     {
+        ERR("Failed to create tizen_embedded_compositor global");
+        E_FREE(g_tizen_embedded_compositor);
+        g_tizen_embedded_compositor = NULL;
+
+        return NULL;
+     }
+
+   return g_tizen_embedded_compositor;
+}
+
+EINTERN void
+e_tizen_embedded_compositor_shutdown(void)
+{
+   if (!g_tizen_embedded_compositor) return;
+
+   wl_global_destroy(g_tizen_embedded_compositor->global);
+
+   E_FREE(g_tizen_embedded_compositor);
+   g_tizen_embedded_compositor = NULL;
+}
diff --git a/src/bin/server/e_tizen_embedded_compositor_intern.h b/src/bin/server/e_tizen_embedded_compositor_intern.h
new file mode 100644 (file)
index 0000000..5fd5af6
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef E_TIZEN_EMBEDDED_COMPOSITOR_INTERN_H
+#define E_TIZEN_EMBEDDED_COMPOSITOR_INTERN_H
+
+#include "e_intern.h"
+
+typedef struct _E_Tizen_Embedded_Compositor E_Tizen_Embedded_Compositor;
+
+EINTERN E_Tizen_Embedded_Compositor *e_tizen_embedded_compositor_init(struct wl_display *display);
+EINTERN void                         e_tizen_embedded_compositor_shutdown(void);
+
+#endif
\ No newline at end of file