1313#include <stdlib.h>
1414#include <string.h>
1515#include <wayland-server-core.h>
16+ #include <wlr/types/wlr_foreign_toplevel_management_v1.h>
1617#include <wlr/types/wlr_output.h>
1718#include <wlr/types/wlr_scene.h>
1819
5051view_activate (struct cg_view * view , bool activate )
5152{
5253 view -> impl -> activate (view , activate );
54+ wlr_foreign_toplevel_handle_v1_set_activated (view -> foreign_toplevel_handle , activate );
5355}
5456
5557static bool
@@ -115,20 +117,39 @@ view_unmap(struct cg_view *view)
115117{
116118 wl_list_remove (& view -> link );
117119
120+ wl_list_remove (& view -> request_activate .link );
121+ wl_list_remove (& view -> request_close .link );
122+ wlr_foreign_toplevel_handle_v1_destroy (view -> foreign_toplevel_handle );
123+ view -> foreign_toplevel_handle = NULL ;
124+
118125 wlr_scene_node_destroy (& view -> scene_tree -> node );
119126
120127 view -> wlr_surface -> data = NULL ;
121128 view -> wlr_surface = NULL ;
122129}
123130
131+ void
132+ handle_surface_request_activate (struct wl_listener * listener , void * data )
133+ {
134+ struct cg_view * view = wl_container_of (listener , view , request_activate );
135+
136+ wlr_scene_node_raise_to_top (& view -> scene_tree -> node );
137+ seat_set_focus (view -> server -> seat , view );
138+ }
139+
140+ void
141+ handle_surface_request_close (struct wl_listener * listener , void * data )
142+ {
143+ struct cg_view * view = wl_container_of (listener , view , request_close );
144+ view -> impl -> close (view );
145+ }
146+
124147void
125148view_map (struct cg_view * view , struct wlr_surface * surface )
126149{
127150 view -> scene_tree = wlr_scene_subsurface_tree_create (& view -> server -> scene -> tree , surface );
128- if (!view -> scene_tree ) {
129- wl_resource_post_no_memory (surface -> resource );
130- return ;
131- }
151+ if (!view -> scene_tree )
152+ goto fail ;
132153 view -> scene_tree -> node .data = view ;
133154
134155 view -> wlr_surface = surface ;
@@ -144,7 +165,21 @@ view_map(struct cg_view *view, struct wlr_surface *surface)
144165 }
145166
146167 wl_list_insert (& view -> server -> views , & view -> link );
168+
169+ view -> foreign_toplevel_handle = wlr_foreign_toplevel_handle_v1_create (view -> server -> foreign_toplevel_manager );
170+ if (!view -> foreign_toplevel_handle )
171+ goto fail ;
172+
173+ view -> request_activate .notify = handle_surface_request_activate ;
174+ wl_signal_add (& view -> foreign_toplevel_handle -> events .request_activate , & view -> request_activate );
175+ view -> request_close .notify = handle_surface_request_close ;
176+ wl_signal_add (& view -> foreign_toplevel_handle -> events .request_close , & view -> request_close );
177+
147178 seat_set_focus (view -> server -> seat , view );
179+ return ;
180+
181+ fail :
182+ wl_resource_post_no_memory (surface -> resource );
148183}
149184
150185void
0 commit comments