From 6180b27c67320380992df93b16205079866a51bd Mon Sep 17 00:00:00 2001 From: Scott Moreau Date: Fri, 9 Feb 2024 17:28:24 -0700 Subject: [PATCH] ipc-rules: Add get-view-pid to get the active view pid --- plugins/single_plugins/ipc-rules.cpp | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/plugins/single_plugins/ipc-rules.cpp b/plugins/single_plugins/ipc-rules.cpp index adf642c5b..1ff9c3e61 100644 --- a/plugins/single_plugins/ipc-rules.cpp +++ b/plugins/single_plugins/ipc-rules.cpp @@ -138,6 +138,7 @@ class ipc_rules_t : public wf::plugin_interface_t, public wf::per_output_tracker method_repository->register_method("window-rules/configure-view", configure_view); method_repository->register_method("window-rules/focus-view", focus_view); method_repository->register_method("window-rules/get-focused-view", get_focused_view); + method_repository->register_method("window-rules/get-view-pid", get_view_pid); method_repository->connect(&on_client_disconnected); wf::get_core().connect(&on_view_mapped); wf::get_core().connect(&on_kbfocus_changed); @@ -156,6 +157,7 @@ class ipc_rules_t : public wf::plugin_interface_t, public wf::per_output_tracker method_repository->unregister_method("window-rules/configure-view"); method_repository->unregister_method("window-rules/focus-view"); method_repository->unregister_method("window-rules/get-focused-view"); + method_repository->unregister_method("window-rules/get-view-pid"); fini_output_tracking(); } @@ -494,6 +496,35 @@ class ipc_rules_t : public wf::plugin_interface_t, public wf::per_output_tracker return wf::ipc::json_error("Unknown input device!"); }; + + wf::ipc::method_callback get_view_pid = [=] (nlohmann::json) + { + auto response = wf::ipc::json_ok(); + auto view = wf::get_core().seat->get_active_view(); + pid_t pid = -1; + if (!view) + { + response["pid"] = pid; + return response; + } + + wlr_surface *wlr_surface = view->get_wlr_surface(); + int is_xwayland_surface = 0; +#if WF_HAS_XWAYLAND + is_xwayland_surface = wlr_surface && wlr_xwayland_surface_try_from_wlr_surface(wlr_surface); + if (is_xwayland_surface) + { + pid = wlr_xwayland_surface_try_from_wlr_surface(wlr_surface)->pid; + } else +#endif + if (view && view->get_client()) + { + wl_client_get_credentials(view->get_client(), &pid, 0, 0); + } + + response["pid"] = pid; + return response; + }; }; DECLARE_WAYFIRE_PLUGIN(ipc_rules_t);