You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-09 12:50:35 +00:00
[Wayland] Add support for native file dialogs.
This commit is contained in:
@@ -370,6 +370,12 @@ void WaylandThread::_wl_registry_on_global(void *data, struct wl_registry *wl_re
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(interface, zxdg_exporter_v1_interface.name) == 0) {
|
||||
registry->wl_exporter = (struct zxdg_exporter_v1 *)wl_registry_bind(wl_registry, name, &zxdg_exporter_v1_interface, 1);
|
||||
registry->wl_exporter_name = name;
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(interface, wl_compositor_interface.name) == 0) {
|
||||
registry->wl_compositor = (struct wl_compositor *)wl_registry_bind(wl_registry, name, &wl_compositor_interface, 4);
|
||||
registry->wl_compositor_name = name;
|
||||
@@ -570,6 +576,17 @@ void WaylandThread::_wl_registry_on_global_remove(void *data, struct wl_registry
|
||||
return;
|
||||
}
|
||||
|
||||
if (name == registry->wl_exporter_name) {
|
||||
if (registry->wl_exporter) {
|
||||
zxdg_exporter_v1_destroy(registry->wl_exporter);
|
||||
registry->wl_exporter = nullptr;
|
||||
}
|
||||
|
||||
registry->wl_exporter_name = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (name == registry->wl_compositor_name) {
|
||||
if (registry->wl_compositor) {
|
||||
wl_compositor_destroy(registry->wl_compositor);
|
||||
@@ -1107,6 +1124,13 @@ void WaylandThread::_xdg_toplevel_on_wm_capabilities(void *data, struct xdg_topl
|
||||
}
|
||||
}
|
||||
|
||||
void WaylandThread::_xdg_exported_on_exported(void *data, zxdg_exported_v1 *exported, const char *handle) {
|
||||
WindowState *ws = (WindowState *)data;
|
||||
ERR_FAIL_NULL(ws);
|
||||
|
||||
ws->exported_handle = vformat("wayland:%s", String::utf8(handle));
|
||||
}
|
||||
|
||||
void WaylandThread::_xdg_toplevel_decoration_on_configure(void *data, struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration, uint32_t mode) {
|
||||
if (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE) {
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
@@ -2975,6 +2999,11 @@ void WaylandThread::window_create(DisplayServer::WindowID p_window_id, int p_wid
|
||||
// "loop".
|
||||
wl_surface_commit(ws.wl_surface);
|
||||
|
||||
if (registry.wl_exporter) {
|
||||
ws.xdg_exported = zxdg_exporter_v1_export(registry.wl_exporter, ws.wl_surface);
|
||||
zxdg_exported_v1_add_listener(ws.xdg_exported, &xdg_exported_listener, &ws);
|
||||
}
|
||||
|
||||
// Wait for the surface to be configured before continuing.
|
||||
wl_display_roundtrip(wl_display);
|
||||
}
|
||||
@@ -3980,6 +4009,10 @@ void WaylandThread::destroy() {
|
||||
xdg_wm_base_destroy(registry.xdg_wm_base);
|
||||
}
|
||||
|
||||
if (registry.wl_exporter) {
|
||||
zxdg_exporter_v1_destroy(registry.wl_exporter);
|
||||
}
|
||||
|
||||
if (registry.wl_shm) {
|
||||
wl_shm_destroy(registry.wl_shm);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user