@@ -43,7 +43,7 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
4343 if (last_view)
4444 {
4545 last_view->disconnect (&on_view_unmapped);
46- last_view->disconnect (&on_view_deactivated);
46+ // last_view->disconnect(&on_view_deactivated);
4747 last_view = nullptr ;
4848 }
4949
@@ -80,7 +80,7 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
8080 last_token = nullptr ; // avoid reusing the same token
8181 last_self_token = nullptr ;
8282
83- if (prevent_focus_stealing && !last_view)
83+ if (prevent_focus_stealing && ( !last_view || last_view != wf::get_core (). seat -> get_active_view ()) )
8484 {
8585 LOGI (" Denying focus request, requesting view has been deactivated" );
8686 return ;
@@ -120,7 +120,7 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
120120 if (last_view)
121121 {
122122 last_view->disconnect (&on_view_unmapped);
123- last_view->disconnect (&on_view_deactivated);
123+ // last_view->disconnect(&on_view_deactivated);
124124 last_view = nullptr ;
125125 }
126126 });
@@ -147,23 +147,18 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
147147 if (last_view)
148148 {
149149 last_view->disconnect (&on_view_unmapped);
150- last_view->disconnect (&on_view_deactivated);
150+ // last_view->disconnect(&on_view_deactivated);
151151 last_view = nullptr ;
152152 }
153153
154154 wayfire_view view = token->surface ? wf::wl_surface_to_wayfire_view (
155155 token->surface ->resource ) : nullptr ;
156156 if (view)
157157 {
158- last_view = wf::toplevel_cast (view); // might return nullptr
159- // !! does not work for:
160- // (1) layer-shell views
161- // (2) (some) menus
162- if (last_view)
163- {
164- last_view->connect (&on_view_unmapped);
165- last_view->connect (&on_view_deactivated);
166- }
158+ last_view = view;
159+ last_view->connect (&on_view_unmapped);
160+ LOGI (" New token for view: " , view.get ());
161+ // last_view->connect(&on_view_deactivated);
167162 }
168163
169164 // update our token and connect its destroy signal
@@ -201,16 +196,40 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
201196 wf::signal::connection_t <wf::view_unmapped_signal> on_view_unmapped = [this ] (auto )
202197 {
203198 last_view->disconnect (&on_view_unmapped);
204- last_view->disconnect (&on_view_deactivated);
199+ // last_view->disconnect(&on_view_deactivated);
200+ LOGI (" View closed: " , last_view.get ());
201+
205202 // handle the case when last_view was a dialog that is closed by user interaction
206- last_view = last_view->parent ;
203+ auto toplevel = wf::toplevel_cast (last_view);
204+ if (toplevel)
205+ {
206+ last_view = toplevel->parent ;
207+ LOGI (" Setting parent: " , last_view.get ());
208+ } else
209+ {
210+ // !! does not work, it is already NULL when this is called
211+ auto surface = last_view->get_wlr_surface ();
212+ auto popup = surface ? wlr_xdg_popup_try_from_wlr_surface (surface) : nullptr ;
213+ if (popup && popup->parent )
214+ {
215+ last_view = wf::wl_surface_to_wayfire_view (popup->parent ->resource );
216+ LOGI (" Setting parent (from xdg-popup): " , last_view.get ());
217+ } else
218+ {
219+ // !! TODO: XWayland popups?
220+ last_view = nullptr ;
221+ LOGI (" No parent" );
222+ }
223+ }
224+
207225 if (last_view)
208226 {
209227 last_view->connect (&on_view_unmapped);
210- last_view->connect (&on_view_deactivated);
228+ // last_view->connect(&on_view_deactivated);
211229 }
212230 };
213231
232+ /*
214233 wf::signal::connection_t<wf::view_activated_state_signal> on_view_deactivated = [this] (auto)
215234 {
216235 if (last_view->activated)
@@ -224,25 +243,35 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
224243 last_view->disconnect(&on_view_deactivated);
225244 last_view = nullptr;
226245 };
246+ */
227247
228248 wf::signal::connection_t <wf::view_mapped_signal> on_view_mapped = [this ] (auto signal)
229249 {
230250 signal->view ->disconnect (&on_view_mapped);
231251
252+ bool should_focus = true ;
253+
232254 // re-check focus stealing prevention
255+ if (prevent_focus_stealing)
256+ {
257+ if (!last_view || last_view != wf::get_core ().seat ->get_active_view ())
258+ {
259+ LOGI (" Denying focus request, requesting view has been deactivated" );
260+ should_focus = false ;
261+ }
262+ }
233263 if (last_view)
234264 {
235265 last_view->disconnect (&on_view_unmapped);
236- last_view->disconnect (&on_view_deactivated);
266+ // last_view->disconnect(&on_view_deactivated);
237267 last_view = nullptr ;
238- } else if (prevent_focus_stealing)
239- {
240- LOGI (" Denying focus request, requesting view has been deactivated" );
241- return ;
242268 }
243269
244- LOGD (" Activating view" );
245- wf::get_core ().default_wm ->focus_request (signal->view );
270+ if (should_focus)
271+ {
272+ LOGD (" Activating view" );
273+ wf::get_core ().default_wm ->focus_request (signal->view );
274+ }
246275 };
247276
248277 wf::signal::connection_t <wf::command_run_signal> on_run_command = [this ] (auto signal)
@@ -265,9 +294,9 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
265294 active_view = nullptr ;
266295 }
267296
268- auto active_toplevel = active_view ? wf::toplevel_cast (active_view) : nullptr ;
297+ // auto active_toplevel = active_view ? wf::toplevel_cast(active_view) : nullptr;
269298
270- if (!active_toplevel )
299+ if (!active_view )
271300 {
272301 // if there is no active view, we don't need a token
273302 return ;
@@ -277,12 +306,12 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
277306 {
278307 // TODO: we need a separate last_view actually !
279308 last_view->disconnect (&on_view_unmapped);
280- last_view->disconnect (&on_view_deactivated);
309+ // last_view->disconnect(&on_view_deactivated);
281310 }
282311
283- last_view = active_toplevel ;
312+ last_view = active_view ;
284313 last_view->connect (&on_view_unmapped);
285- last_view->connect (&on_view_deactivated);
314+ // last_view->connect(&on_view_deactivated);
286315 last_self_token = wlr_xdg_activation_token_v1_create (xdg_activation);
287316 xdg_activation_token_self_destroy.disconnect ();
288317 xdg_activation_token_self_destroy.connect (&last_self_token->events .destroy );
@@ -298,7 +327,7 @@ class wayfire_xdg_activation_protocol_impl : public wf::plugin_interface_t
298327 wf::wl_listener_wrapper xdg_activation_token_self_destroy;
299328 struct wlr_xdg_activation_token_v1 *last_token = nullptr ;
300329 struct wlr_xdg_activation_token_v1 *last_self_token = nullptr ;
301- wayfire_toplevel_view last_view = nullptr ; // view that created the token
330+ wayfire_view last_view = nullptr ; // view that created the token
302331
303332 wf::option_wrapper_t <bool > check_surface{" xdg-activation/check_surface" };
304333 wf::option_wrapper_t <bool > only_last_token{" xdg-activation/only_last_request" };
0 commit comments