This commit is contained in:
navi 2025-06-16 13:20:11 +03:00 committed by GitHub
commit b86c6a684e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 45 additions and 3 deletions

View file

@ -103,6 +103,11 @@ struct sway_server {
struct wlr_input_method_manager_v2 *input_method;
struct wlr_text_input_manager_v3 *text_input;
struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list;
struct wlr_ext_foreign_toplevel_request_manager_v1 *foreign_toplevel_request_manager;
struct wl_listener foreign_toplevel_request;
struct wlr_ext_foreign_toplevel_request_source_v1 *foreign_toplevel_request_source;
struct wl_listener foreign_toplevel_response_toplevel;
struct wl_listener foreign_toplevel_response_cancel;
struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
struct wlr_content_type_manager_v1 *content_type_manager_v1;
struct wlr_data_control_manager_v1 *wlr_data_control_manager_v1;

View file

@ -351,4 +351,10 @@ void view_send_frame_done(struct sway_view *view);
bool view_can_tear(struct sway_view *view);
void handle_foreign_toplevel_response_toplevel(struct wl_listener *listener, void *data);
void handle_foreign_toplevel_response_cancel(struct wl_listener *listener, void *data);
void handle_foreign_toplevel_request(struct wl_listener *listener, void *data);
#endif

View file

@ -18,6 +18,7 @@
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_export_dmabuf_v1.h>
#include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h>
#include <wlr/types/wlr_ext_foreign_toplevel_request_v1.h>
#include <wlr/types/wlr_foreign_toplevel_management_v1.h>
#include <wlr/types/wlr_ext_image_capture_source_v1.h>
#include <wlr/types/wlr_ext_image_copy_capture_v1.h>
@ -72,6 +73,7 @@
#define SWAY_XDG_SHELL_VERSION 5
#define SWAY_LAYER_SHELL_VERSION 4
#define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1
#define SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION 1
#define SWAY_PRESENTATION_VERSION 2
bool allow_unsupported_gpu = false;
@ -107,6 +109,7 @@ static bool is_privileged(const struct wl_global *global) {
global == server.output_power_manager_v1->global ||
global == server.input_method->global ||
global == server.foreign_toplevel_list->global ||
global == server.foreign_toplevel_request_source->global ||
global == server.foreign_toplevel_manager->global ||
global == server.wlr_data_control_manager_v1->global ||
global == server.ext_data_control_manager_v1->global ||
@ -364,8 +367,17 @@ bool server_init(struct sway_server *server) {
server->text_input = wlr_text_input_manager_v3_create(server->wl_display);
server->foreign_toplevel_list =
wlr_ext_foreign_toplevel_list_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_LIST_VERSION);
server->foreign_toplevel_manager =
wlr_foreign_toplevel_manager_v1_create(server->wl_display);
server->foreign_toplevel_manager = wlr_foreign_toplevel_manager_v1_create(server->wl_display);
server->foreign_toplevel_request_manager =
wlr_ext_foreign_toplevel_request_manager_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION);
server->foreign_toplevel_request.notify = handle_foreign_toplevel_request;
wl_signal_add(&server->foreign_toplevel_request_manager->events.request, &server->foreign_toplevel_request);
server->foreign_toplevel_request_source =
wlr_ext_foreign_toplevel_request_source_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_REQUEST_VERSION);
server->foreign_toplevel_response_toplevel.notify = handle_foreign_toplevel_response_toplevel;
wl_signal_add(&server->foreign_toplevel_request_source->events.toplevel, &server->foreign_toplevel_response_toplevel);
server->foreign_toplevel_response_cancel.notify = handle_foreign_toplevel_response_cancel;
wl_signal_add(&server->foreign_toplevel_request_source->events.cancel, &server->foreign_toplevel_response_cancel);
sway_session_lock_init();

View file

@ -5,6 +5,7 @@
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_buffer.h>
#include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h>
#include <wlr/types/wlr_ext_foreign_toplevel_request_v1.h>
#include <wlr/types/wlr_foreign_toplevel_management_v1.h>
#include <wlr/types/wlr_fractional_scale_v1.h>
#include <wlr/types/wlr_output_layout.h>
@ -38,6 +39,8 @@
#include "sway/xdg_decoration.h"
#include "stringop.h"
#define SWAY_FOREIGN_TOPLEVEL_HANDLE_VERSION 1
bool view_init(struct sway_view *view, enum sway_view_type type,
const struct sway_view_impl *impl) {
bool failed = false;
@ -669,6 +672,21 @@ static bool should_focus(struct sway_view *view) {
return len == 0;
}
void handle_foreign_toplevel_response_toplevel(struct wl_listener *listener, void *data) {
struct wlr_ext_foreign_toplevel_request_pending_v1 *response = data;
wlr_ext_foreign_toplevel_request_v1_send_toplevel(response->request, response->handle);
}
void handle_foreign_toplevel_response_cancel(struct wl_listener *listener, void *data) {
struct wlr_ext_foreign_toplevel_request_pending_v1 *response = data;
wlr_ext_foreign_toplevel_request_v1_cancel(response->request);
}
void handle_foreign_toplevel_request(struct wl_listener *listener, void *data) {
struct sway_server *server = wl_container_of(listener, server, foreign_toplevel_request);
wlr_ext_foreign_toplevel_request_source_v1_request(server->foreign_toplevel_request_source, data);
}
static void handle_foreign_activate_request(
struct wl_listener *listener, void *data) {
struct sway_view *view = wl_container_of(
@ -814,7 +832,8 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
.title = view_get_title(view),
};
view->ext_foreign_toplevel =
wlr_ext_foreign_toplevel_handle_v1_create(server.foreign_toplevel_list, &foreign_toplevel_state);
wlr_ext_foreign_toplevel_handle_v1_create(server.foreign_toplevel_list,
&foreign_toplevel_state, SWAY_FOREIGN_TOPLEVEL_HANDLE_VERSION);
view->foreign_toplevel =
wlr_foreign_toplevel_handle_v1_create(server.foreign_toplevel_manager);