Skip to content

Commit 418b745

Browse files
committed
attempt to track popups
1 parent 50f8acc commit 418b745

File tree

1 file changed

+58
-29
lines changed

1 file changed

+58
-29
lines changed

plugins/protocols/xdg-activation.cpp

Lines changed: 58 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)