summaryrefslogtreecommitdiff
path: root/src/common/native.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/native.c')
-rw-r--r--src/common/native.c106
1 files changed, 38 insertions, 68 deletions
diff --git a/src/common/native.c b/src/common/native.c
index 1b32094..36f7010 100644
--- a/src/common/native.c
+++ b/src/common/native.c
@@ -45,84 +45,54 @@ bool yasl_private_surface_get_native_frame(struct yasl_surface *s,
}
#include "public_internal.h"
-#include "yasl/metal.h"
-#if YASL_HAS_WAYLAND || YASL_HAS_X11 || YASL_HAS_COCOA
-static int native_validate(const yasl_surface *s, enum yasl_private_backend backend)
-{
- if (!yasl_public_surface((yasl_surface *)s, false))
- return -errno;
- if (s->display->ops->type != backend)
- return yasl_public_error(ENOTSUP);
- if (s->display->offline)
- return yasl_public_error(ENOTCONN);
- return 0;
-}
-#endif
-#if YASL_HAS_WAYLAND
-#include "yasl/native/wayland.h"
-int yasl_wayland_get_native(const yasl_surface *s, struct yasl_wayland_handles *out)
-{
- if (!out)
- return yasl_public_error(EINVAL);
- *out = (struct yasl_wayland_handles){0};
- int error = native_validate(s, YASL_PRIVATE_BACKEND_WAYLAND);
- if (error)
- return error;
- out->display = yasl_private_display_get_native_handle(s->display);
- out->surface = yasl_private_surface_get_native_handle((yasl_surface *)s);
- return 0;
-}
-#endif
-#if YASL_HAS_X11
-#include "yasl/native/x11.h"
-int yasl_x11_get_native(const yasl_surface *s, struct yasl_x11_handles *out)
-{
- if (!out)
- return yasl_public_error(EINVAL);
- *out = (struct yasl_x11_handles){0};
- int error = native_validate(s, YASL_PRIVATE_BACKEND_X11);
- if (error)
- return error;
- out->display = yasl_private_display_get_native_handle(s->display);
- out->window = (uintptr_t)yasl_private_surface_get_native_handle((yasl_surface *)s);
- return 0;
-}
-#endif
#if YASL_HAS_COCOA
-#include "yasl/native/cocoa.h"
#include "common/private_native_cocoa.h"
-int yasl_cocoa_get_native(const yasl_surface *s, struct yasl_cocoa_handles *out)
-{
- if (!out)
- return yasl_public_error(EINVAL);
- *out = (struct yasl_cocoa_handles){0};
- int error = native_validate(s, YASL_PRIVATE_BACKEND_COCOA);
- if (error)
- return error;
- out->application = yasl_private_cocoa_display_get_application(s->display);
- out->window = yasl_private_cocoa_surface_get_window((yasl_surface *)s);
- out->view = yasl_private_cocoa_surface_get_view((yasl_surface *)s);
- return 0;
-}
#endif
-int yasl_metal_get_layer(yasl_surface *s, CAMetalLayer **out)
+int yasl_surface_get_native(const yasl_surface *cs, struct yasl_native *out)
{
+ yasl_surface *s = (yasl_surface *)cs;
if (!out)
return yasl_public_error(EINVAL);
- *out = NULL;
- if (!yasl_public_surface(s, false))
+ *out = (struct yasl_native){0};
+ if (!yasl_public_connected(s))
return -errno;
- if (s->display->offline)
+ void *window = yasl_private_surface_get_native_handle(s);
+ switch (s->display->ops->type) {
+ case YASL_PRIVATE_BACKEND_WAYLAND:
+ out->wl_display = yasl_private_display_get_native_handle(s->display);
+ out->wl_surface = window;
+ break;
+ case YASL_PRIVATE_BACKEND_X11:
+ out->x11_display = yasl_private_display_get_native_handle(s->display);
+ out->x11_window = (unsigned long)(uintptr_t)window;
+ break;
+#if YASL_HAS_COCOA
+ case YASL_PRIVATE_BACKEND_COCOA:
+ out->ns_window = yasl_private_cocoa_surface_get_window(s);
+ out->ns_view = yasl_private_cocoa_surface_get_view(s);
+ break;
+#endif
+ default:
+ return yasl_public_error(ENOTSUP);
+ }
+ if (!window) {
+ *out = (struct yasl_native){0};
return yasl_public_error(ENOTCONN);
+ }
+ return 0;
+}
+void *yasl_metal_get_layer(yasl_surface *s)
+{
+ if (!yasl_public_connected(s))
+ return NULL;
if (s->vulkan || (s->presenter != YASL_PRIVATE_PRESENTER_NONE &&
s->presenter != YASL_PRIVATE_PRESENTER_METAL))
- return yasl_public_error(EBUSY);
- if (!s->display->ops->surface_get_metal_layer)
- return yasl_public_error(ENOTSUP);
- CAMetalLayer *layer = s->display->ops->surface_get_metal_layer(s);
+ return yasl_public_fail(EBUSY), NULL;
+ void *layer = s->display->ops->surface_get_metal_layer
+ ? s->display->ops->surface_get_metal_layer(s)
+ : NULL;
if (!layer)
- return yasl_public_error(ENOTSUP);
+ return yasl_public_fail(ENOTSUP), NULL;
s->presenter = YASL_PRIVATE_PRESENTER_METAL;
- *out = layer;
- return 0;
+ return layer;
}