diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/desktop/xdg_shell.c | 1 | ||||
-rw-r--r-- | sway/server.c | 4 | ||||
-rw-r--r-- | sway/tree/view.c | 42 |
3 files changed, 47 insertions, 0 deletions
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 | ||
64 | bool allow_unsupported_gpu = false; | 65 | bool 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 | ||
585 | static 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 | |||
585 | static bool should_focus(struct sway_view *view) { | 593 | static 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 | ||
1043 | void 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 | |||
1017 | void view_update_title(struct sway_view *view, bool force) { | 1055 | void 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 | ||
1065 | bool view_is_visible(struct sway_view *view) { | 1107 | bool view_is_visible(struct sway_view *view) { |