aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Merlin Lex <merlin@gandalf.ardholen.net>2024-02-11 12:20:15 +0100
committerLibravatar Simon Ser <contact@emersion.fr>2024-02-12 15:36:44 +0100
commit1b5515400d0e10c8e1205b88cfc0e46ecb5faa96 (patch)
treeb6ca6c061c6bb273f5d211dea6e86e3384118a13
parentconfig: use format_str() instead of hand-rolled snprintf() (diff)
downloadsway-1b5515400d0e10c8e1205b88cfc0e46ecb5faa96.tar.gz
sway-1b5515400d0e10c8e1205b88cfc0e46ecb5faa96.tar.zst
sway-1b5515400d0e10c8e1205b88cfc0e46ecb5faa96.zip
ext-foreign-toplevel-list: Implement protocol
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4543
-rw-r--r--include/sway/server.h2
-rw-r--r--include/sway/tree/view.h5
-rw-r--r--sway/desktop/xdg_shell.c1
-rw-r--r--sway/server.c4
-rw-r--r--sway/tree/view.c42
5 files changed, 54 insertions, 0 deletions
diff --git a/include/sway/server.h b/include/sway/server.h
index adb62cda..7dbce0b7 100644
--- a/include/sway/server.h
+++ b/include/sway/server.h
@@ -7,6 +7,7 @@
7#include <wlr/render/wlr_renderer.h> 7#include <wlr/render/wlr_renderer.h>
8#include <wlr/types/wlr_compositor.h> 8#include <wlr/types/wlr_compositor.h>
9#include <wlr/types/wlr_data_device.h> 9#include <wlr/types/wlr_data_device.h>
10#include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h>
10#include <wlr/types/wlr_input_method_v2.h> 11#include <wlr/types/wlr_input_method_v2.h>
11#include <wlr/types/wlr_foreign_toplevel_management_v1.h> 12#include <wlr/types/wlr_foreign_toplevel_management_v1.h>
12#include <wlr/types/wlr_drm_lease_v1.h> 13#include <wlr/types/wlr_drm_lease_v1.h>
@@ -116,6 +117,7 @@ struct sway_server {
116 struct wl_listener output_power_manager_set_mode; 117 struct wl_listener output_power_manager_set_mode;
117 struct wlr_input_method_manager_v2 *input_method; 118 struct wlr_input_method_manager_v2 *input_method;
118 struct wlr_text_input_manager_v3 *text_input; 119 struct wlr_text_input_manager_v3 *text_input;
120 struct wlr_ext_foreign_toplevel_list_v1 *foreign_toplevel_list;
119 struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; 121 struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
120 struct wlr_content_type_manager_v1 *content_type_manager_v1; 122 struct wlr_content_type_manager_v1 *content_type_manager_v1;
121 struct wlr_data_control_manager_v1 *data_control_manager_v1; 123 struct wlr_data_control_manager_v1 *data_control_manager_v1;
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index 3e5a9bfe..5f6c2ead 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -84,6 +84,9 @@ struct sway_view {
84 // transaction state. Updated on every commit. 84 // transaction state. Updated on every commit.
85 struct wlr_box geometry; 85 struct wlr_box geometry;
86 86
87 struct wlr_ext_foreign_toplevel_handle_v1 *ext_foreign_toplevel;
88 struct wl_listener ext_foreign_destroy;
89
87 struct wlr_foreign_toplevel_handle_v1 *foreign_toplevel; 90 struct wlr_foreign_toplevel_handle_v1 *foreign_toplevel;
88 struct wl_listener foreign_activate_request; 91 struct wl_listener foreign_activate_request;
89 struct wl_listener foreign_fullscreen_request; 92 struct wl_listener foreign_fullscreen_request;
@@ -284,6 +287,8 @@ struct sway_view *view_from_wlr_xwayland_surface(
284#endif 287#endif
285struct sway_view *view_from_wlr_surface(struct wlr_surface *surface); 288struct sway_view *view_from_wlr_surface(struct wlr_surface *surface);
286 289
290void view_update_app_id(struct sway_view *view);
291
287/** 292/**
288 * Re-read the view's title property and update any relevant title bars. 293 * Re-read the view's title property and update any relevant title bars.
289 * The force argument makes it recreate the title bars even if the title hasn't 294 * The force argument makes it recreate the title bars even if the title hasn't
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index 7cdd97c8..d3f69a15 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -337,6 +337,7 @@ static void handle_set_app_id(struct wl_listener *listener, void *data) {
337 struct sway_xdg_shell_view *xdg_shell_view = 337 struct sway_xdg_shell_view *xdg_shell_view =
338 wl_container_of(listener, xdg_shell_view, set_app_id); 338 wl_container_of(listener, xdg_shell_view, set_app_id);
339 struct sway_view *view = &xdg_shell_view->view; 339 struct sway_view *view = &xdg_shell_view->view;
340 view_update_app_id(view);
340 view_execute_criteria(view); 341 view_execute_criteria(view);
341} 342}
342 343
diff --git a/sway/server.c b/sway/server.c
index cc20e89d..8b8ccce9 100644
--- a/sway/server.c
+++ b/sway/server.c
@@ -60,6 +60,7 @@
60 60
61#define SWAY_XDG_SHELL_VERSION 2 61#define SWAY_XDG_SHELL_VERSION 2
62#define SWAY_LAYER_SHELL_VERSION 4 62#define SWAY_LAYER_SHELL_VERSION 4
63#define SWAY_FOREIGN_TOPLEVEL_LIST_VERSION 1
63 64
64bool allow_unsupported_gpu = false; 65bool allow_unsupported_gpu = false;
65 66
@@ -93,6 +94,7 @@ static bool is_privileged(const struct wl_global *global) {
93 global == server.output_manager_v1->global || 94 global == server.output_manager_v1->global ||
94 global == server.output_power_manager_v1->global || 95 global == server.output_power_manager_v1->global ||
95 global == server.input_method->global || 96 global == server.input_method->global ||
97 global == server.foreign_toplevel_list->global ||
96 global == server.foreign_toplevel_manager->global || 98 global == server.foreign_toplevel_manager->global ||
97 global == server.data_control_manager_v1->global || 99 global == server.data_control_manager_v1->global ||
98 global == server.screencopy_manager_v1->global || 100 global == server.screencopy_manager_v1->global ||
@@ -289,6 +291,8 @@ bool server_init(struct sway_server *server) {
289 &server->output_power_manager_set_mode); 291 &server->output_power_manager_set_mode);
290 server->input_method = wlr_input_method_manager_v2_create(server->wl_display); 292 server->input_method = wlr_input_method_manager_v2_create(server->wl_display);
291 server->text_input = wlr_text_input_manager_v3_create(server->wl_display); 293 server->text_input = wlr_text_input_manager_v3_create(server->wl_display);
294 server->foreign_toplevel_list =
295 wlr_ext_foreign_toplevel_list_v1_create(server->wl_display, SWAY_FOREIGN_TOPLEVEL_LIST_VERSION);
292 server->foreign_toplevel_manager = 296 server->foreign_toplevel_manager =
293 wlr_foreign_toplevel_manager_v1_create(server->wl_display); 297 wlr_foreign_toplevel_manager_v1_create(server->wl_display);
294 298
diff --git a/sway/tree/view.c b/sway/tree/view.c
index d6984178..aa87a0bb 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -582,6 +582,14 @@ static struct sway_workspace *select_workspace(struct sway_view *view) {
582 return NULL; 582 return NULL;
583} 583}
584 584
585static void update_ext_foreign_toplevel(struct sway_view *view) {
586 struct wlr_ext_foreign_toplevel_handle_v1_state toplevel_state = {
587 .app_id = view_get_app_id(view),
588 .title = view_get_title(view),
589 };
590 wlr_ext_foreign_toplevel_handle_v1_update_state(view->ext_foreign_toplevel, &toplevel_state);
591}
592
585static bool should_focus(struct sway_view *view) { 593static bool should_focus(struct sway_view *view) {
586 struct sway_seat *seat = input_manager_current_seat(); 594 struct sway_seat *seat = input_manager_current_seat();
587 struct sway_container *prev_con = seat_get_focused_container(seat); 595 struct sway_container *prev_con = seat_get_focused_container(seat);
@@ -751,6 +759,15 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
751 } 759 }
752 } 760 }
753 761
762 struct wlr_ext_foreign_toplevel_handle_v1_state foreign_toplevel_state = {
763 .app_id = view_get_app_id(view),
764 .title = view_get_title(view),
765 };
766 view->ext_foreign_toplevel =
767 wlr_ext_foreign_toplevel_handle_v1_create(server.foreign_toplevel_list, &foreign_toplevel_state);
768 wl_signal_add(&view->ext_foreign_toplevel->events.destroy,
769 &view->ext_foreign_destroy);
770
754 view->foreign_toplevel = 771 view->foreign_toplevel =
755 wlr_foreign_toplevel_handle_v1_create(server.foreign_toplevel_manager); 772 wlr_foreign_toplevel_handle_v1_create(server.foreign_toplevel_manager);
756 view->foreign_activate_request.notify = handle_foreign_activate_request; 773 view->foreign_activate_request.notify = handle_foreign_activate_request;
@@ -828,6 +845,10 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
828 input_manager_set_focus(&view->container->node); 845 input_manager_set_focus(&view->container->node);
829 } 846 }
830 847
848 if (view->ext_foreign_toplevel) {
849 update_ext_foreign_toplevel(view);
850 }
851
831 const char *app_id; 852 const char *app_id;
832 const char *class; 853 const char *class;
833 if ((app_id = view_get_app_id(view)) != NULL) { 854 if ((app_id = view_get_app_id(view)) != NULL) {
@@ -847,6 +868,11 @@ void view_unmap(struct sway_view *view) {
847 view->urgent_timer = NULL; 868 view->urgent_timer = NULL;
848 } 869 }
849 870
871 if (view->ext_foreign_toplevel) {
872 wlr_ext_foreign_toplevel_handle_v1_destroy(view->ext_foreign_toplevel);
873 view->ext_foreign_toplevel = NULL;
874 }
875
850 if (view->foreign_toplevel) { 876 if (view->foreign_toplevel) {
851 wlr_foreign_toplevel_handle_v1_destroy(view->foreign_toplevel); 877 wlr_foreign_toplevel_handle_v1_destroy(view->foreign_toplevel);
852 view->foreign_toplevel = NULL; 878 view->foreign_toplevel = NULL;
@@ -1014,6 +1040,18 @@ static size_t parse_title_format(struct sway_view *view, char *buffer) {
1014 return len; 1040 return len;
1015} 1041}
1016 1042
1043void view_update_app_id(struct sway_view *view) {
1044 const char *app_id = view_get_app_id(view);
1045
1046 if (view->foreign_toplevel && app_id) {
1047 wlr_foreign_toplevel_handle_v1_set_app_id(view->foreign_toplevel, app_id);
1048 }
1049
1050 if (view->ext_foreign_toplevel) {
1051 update_ext_foreign_toplevel(view);
1052 }
1053}
1054
1017void view_update_title(struct sway_view *view, bool force) { 1055void view_update_title(struct sway_view *view, bool force) {
1018 const char *title = view_get_title(view); 1056 const char *title = view_get_title(view);
1019 1057
@@ -1060,6 +1098,10 @@ void view_update_title(struct sway_view *view, bool force) {
1060 if (view->foreign_toplevel && title) { 1098 if (view->foreign_toplevel && title) {
1061 wlr_foreign_toplevel_handle_v1_set_title(view->foreign_toplevel, title); 1099 wlr_foreign_toplevel_handle_v1_set_title(view->foreign_toplevel, title);
1062 } 1100 }
1101
1102 if (view->ext_foreign_toplevel) {
1103 update_ext_foreign_toplevel(view);
1104 }
1063} 1105}
1064 1106
1065bool view_is_visible(struct sway_view *view) { 1107bool view_is_visible(struct sway_view *view) {