diff options
-rw-r--r-- | include/sway/layers.h | 3 | ||||
-rw-r--r-- | include/sway/tree/view.h | 10 | ||||
-rw-r--r-- | sway/desktop/layer_shell.c | 5 | ||||
-rw-r--r-- | sway/desktop/output.c | 4 | ||||
-rw-r--r-- | sway/desktop/xdg_shell.c | 7 | ||||
-rw-r--r-- | sway/desktop/xdg_shell_v6.c | 7 | ||||
-rw-r--r-- | sway/desktop/xwayland.c | 7 | ||||
-rw-r--r-- | sway/tree/view.c | 30 |
8 files changed, 73 insertions, 0 deletions
diff --git a/include/sway/layers.h b/include/sway/layers.h index ee47c5ad..96155eae 100644 --- a/include/sway/layers.h +++ b/include/sway/layers.h | |||
@@ -22,4 +22,7 @@ struct sway_layer_surface { | |||
22 | struct sway_output; | 22 | struct sway_output; |
23 | void arrange_layers(struct sway_output *output); | 23 | void arrange_layers(struct sway_output *output); |
24 | 24 | ||
25 | struct sway_layer_surface *layer_from_wlr_layer_surface( | ||
26 | struct wlr_layer_surface *layer_surface); | ||
27 | |||
25 | #endif | 28 | #endif |
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index b99044d3..7dc8ac46 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h | |||
@@ -260,6 +260,16 @@ void view_child_init(struct sway_view_child *child, | |||
260 | 260 | ||
261 | void view_child_destroy(struct sway_view_child *child); | 261 | void view_child_destroy(struct sway_view_child *child); |
262 | 262 | ||
263 | |||
264 | struct sway_view *view_from_wlr_xdg_surface( | ||
265 | struct wlr_xdg_surface *xdg_surface); | ||
266 | struct sway_view *view_from_wlr_xdg_surface_v6( | ||
267 | struct wlr_xdg_surface_v6 *xdg_surface_v6); | ||
268 | struct sway_view *view_from_wlr_xwayland_surface( | ||
269 | struct wlr_xwayland_surface *xsurface); | ||
270 | |||
271 | struct sway_view *view_from_wlr_surface(struct wlr_surface *surface); | ||
272 | |||
263 | /** | 273 | /** |
264 | * Re-read the view's title property and update any relevant title bars. | 274 | * Re-read the view's title property and update any relevant title bars. |
265 | * The force argument makes it recreate the title bars even if the title hasn't | 275 | * The force argument makes it recreate the title bars even if the title hasn't |
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index ff37bbf1..de1fe349 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c | |||
@@ -307,6 +307,11 @@ static void handle_unmap(struct wl_listener *listener, void *data) { | |||
307 | unmap(sway_layer); | 307 | unmap(sway_layer); |
308 | } | 308 | } |
309 | 309 | ||
310 | struct sway_layer_surface *layer_from_wlr_layer_surface( | ||
311 | struct wlr_layer_surface *layer_surface) { | ||
312 | return layer_surface->data; | ||
313 | } | ||
314 | |||
310 | void handle_layer_shell_surface(struct wl_listener *listener, void *data) { | 315 | void handle_layer_shell_surface(struct wl_listener *listener, void *data) { |
311 | struct wlr_layer_surface *layer_surface = data; | 316 | struct wlr_layer_surface *layer_surface = data; |
312 | struct sway_server *server = | 317 | struct sway_server *server = |
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 541d765d..1e7494b3 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c | |||
@@ -1302,6 +1302,10 @@ static void handle_scale(struct wl_listener *listener, void *data) { | |||
1302 | arrange_and_commit(output->swayc); | 1302 | arrange_and_commit(output->swayc); |
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | struct sway_output *output_from_wlr_output(struct wlr_output *wlr_output) { | ||
1306 | return wlr_output->data; | ||
1307 | } | ||
1308 | |||
1305 | void handle_new_output(struct wl_listener *listener, void *data) { | 1309 | void handle_new_output(struct wl_listener *listener, void *data) { |
1306 | struct sway_server *server = wl_container_of(listener, server, new_output); | 1310 | struct sway_server *server = wl_container_of(listener, server, new_output); |
1307 | struct wlr_output *wlr_output = data; | 1311 | struct wlr_output *wlr_output = data; |
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index da3a1cdd..5b40d903 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c | |||
@@ -289,6 +289,11 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data) | |||
289 | arrange_and_commit(ws); | 289 | arrange_and_commit(ws); |
290 | } | 290 | } |
291 | 291 | ||
292 | struct sway_view *view_from_wlr_xdg_surface( | ||
293 | struct wlr_xdg_surface *xdg_surface) { | ||
294 | return xdg_surface->data; | ||
295 | } | ||
296 | |||
292 | void handle_xdg_shell_surface(struct wl_listener *listener, void *data) { | 297 | void handle_xdg_shell_surface(struct wl_listener *listener, void *data) { |
293 | struct sway_server *server = wl_container_of(listener, server, | 298 | struct sway_server *server = wl_container_of(listener, server, |
294 | xdg_shell_surface); | 299 | xdg_shell_surface); |
@@ -327,4 +332,6 @@ void handle_xdg_shell_surface(struct wl_listener *listener, void *data) { | |||
327 | xdg_shell_view->request_fullscreen.notify = handle_request_fullscreen; | 332 | xdg_shell_view->request_fullscreen.notify = handle_request_fullscreen; |
328 | wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen, | 333 | wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen, |
329 | &xdg_shell_view->request_fullscreen); | 334 | &xdg_shell_view->request_fullscreen); |
335 | |||
336 | xdg_surface->data = xdg_shell_view; | ||
330 | } | 337 | } |
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 69819280..c794e23a 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c | |||
@@ -280,6 +280,11 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data) | |||
280 | arrange_and_commit(ws); | 280 | arrange_and_commit(ws); |
281 | } | 281 | } |
282 | 282 | ||
283 | struct sway_view *view_from_wlr_xdg_surface_v6( | ||
284 | struct wlr_xdg_surface_v6 *xdg_surface_v6) { | ||
285 | return xdg_surface_v6->data; | ||
286 | } | ||
287 | |||
283 | void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { | 288 | void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { |
284 | struct sway_server *server = wl_container_of(listener, server, | 289 | struct sway_server *server = wl_container_of(listener, server, |
285 | xdg_shell_v6_surface); | 290 | xdg_shell_v6_surface); |
@@ -318,4 +323,6 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { | |||
318 | xdg_shell_v6_view->request_fullscreen.notify = handle_request_fullscreen; | 323 | xdg_shell_v6_view->request_fullscreen.notify = handle_request_fullscreen; |
319 | wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen, | 324 | wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen, |
320 | &xdg_shell_v6_view->request_fullscreen); | 325 | &xdg_shell_v6_view->request_fullscreen); |
326 | |||
327 | xdg_surface->data = xdg_shell_v6_view; | ||
321 | } | 328 | } |
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 6e63c505..4bb35f60 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c | |||
@@ -417,6 +417,11 @@ static void handle_set_window_type(struct wl_listener *listener, void *data) { | |||
417 | view_execute_criteria(view); | 417 | view_execute_criteria(view); |
418 | } | 418 | } |
419 | 419 | ||
420 | struct sway_view *view_from_wlr_xwayland_surface( | ||
421 | struct wlr_xwayland_surface *xsurface) { | ||
422 | return xsurface->data; | ||
423 | } | ||
424 | |||
420 | void handle_xwayland_surface(struct wl_listener *listener, void *data) { | 425 | void handle_xwayland_surface(struct wl_listener *listener, void *data) { |
421 | struct sway_server *server = wl_container_of(listener, server, | 426 | struct sway_server *server = wl_container_of(listener, server, |
422 | xwayland_surface); | 427 | xwayland_surface); |
@@ -470,6 +475,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { | |||
470 | 475 | ||
471 | wl_signal_add(&xsurface->events.map, &xwayland_view->map); | 476 | wl_signal_add(&xsurface->events.map, &xwayland_view->map); |
472 | xwayland_view->map.notify = handle_map; | 477 | xwayland_view->map.notify = handle_map; |
478 | |||
479 | xsurface->data = xwayland_view; | ||
473 | } | 480 | } |
474 | 481 | ||
475 | void handle_xwayland_ready(struct wl_listener *listener, void *data) { | 482 | void handle_xwayland_ready(struct wl_listener *listener, void *data) { |
diff --git a/sway/tree/view.c b/sway/tree/view.c index 6263bfb0..06e9edc5 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -694,6 +694,36 @@ void view_child_destroy(struct sway_view_child *child) { | |||
694 | } | 694 | } |
695 | } | 695 | } |
696 | 696 | ||
697 | struct sway_view *view_from_wlr_surface(struct wlr_surface *wlr_surface) { | ||
698 | if (wlr_surface_is_xdg_surface(wlr_surface)) { | ||
699 | struct wlr_xdg_surface *xdg_surface = | ||
700 | wlr_xdg_surface_from_wlr_surface(wlr_surface); | ||
701 | return view_from_wlr_xdg_surface(xdg_surface); | ||
702 | } | ||
703 | if (wlr_surface_is_xdg_surface_v6(wlr_surface)) { | ||
704 | struct wlr_xdg_surface_v6 *xdg_surface_v6 = | ||
705 | wlr_xdg_surface_v6_from_wlr_surface(wlr_surface); | ||
706 | return view_from_wlr_xdg_surface_v6(xdg_surface_v6); | ||
707 | } | ||
708 | if (wlr_surface_is_xwayland_surface(wlr_surface)) { | ||
709 | struct wlr_xwayland_surface *xsurface = | ||
710 | wlr_xwayland_surface_from_wlr_surface(wlr_surface); | ||
711 | return view_from_wlr_xwayland_surface(xsurface); | ||
712 | } | ||
713 | if (wlr_surface_is_subsurface(wlr_surface)) { | ||
714 | struct wlr_subsurface *subsurface = | ||
715 | wlr_subsurface_from_wlr_surface(wlr_surface); | ||
716 | return view_from_wlr_surface(subsurface->parent); | ||
717 | } | ||
718 | if (wlr_surface_is_layer_surface(wlr_surface)) { | ||
719 | return NULL; | ||
720 | } | ||
721 | |||
722 | wlr_log(L_DEBUG, "Surface of unknown type (role %s): %p", | ||
723 | wlr_surface->role, wlr_surface); | ||
724 | return NULL; | ||
725 | } | ||
726 | |||
697 | static size_t append_prop(char *buffer, const char *value) { | 727 | static size_t append_prop(char *buffer, const char *value) { |
698 | if (!value) { | 728 | if (!value) { |
699 | return 0; | 729 | return 0; |