diff --git a/proto/wayfire-kill-view.xml b/proto/wayfire-kill-view.xml index 4fe0c56..8274569 100644 --- a/proto/wayfire-kill-view.xml +++ b/proto/wayfire-kill-view.xml @@ -36,6 +36,12 @@ + + + Send close to the top view. + + + Provide client with a view pid. diff --git a/src/client/wf-kill.cpp b/src/client/wf-kill.cpp index 762b7cf..01fe1e8 100644 --- a/src/client/wf-kill.cpp +++ b/src/client/wf-kill.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "wf-kill.hpp" @@ -113,11 +114,43 @@ WfKill::WfKill(int argc, char *argv[]) std::cout << "Wayfire kill view protocol not advertised by compositor. Is wf-kill plugin enabled?" << std::endl; return; } - wf_kill_view_base_view_kill(wf_kill_view_manager); wf_kill_view_base_add_listener(wf_kill_view_manager, &kill_view_listener, this); - send_kill = (argc > 1 && !strcmp(argv[1], "-k")); + send_kill = false; + top_view = false; + struct option opts[] = { + { "kill-view", no_argument, NULL, 'k' }, + { "top-view", no_argument, NULL, 't' }, + { 0, 0, NULL, 0 } + }; + + int c, i; + while((c = getopt_long(argc, argv, "kt", opts, &i)) != -1) + { + switch(c) + { + case 'k': + send_kill = true; + break; + + case 't': + top_view = true; + break; + + default: + std::cerr << "Usage: wf-kill [-k|--kill-view] [-t|--top-view]" << std::endl; + return; + } + } + if (top_view) + { + wf_kill_view_base_top_view_kill(wf_kill_view_manager); + } else + { + wf_kill_view_base_view_kill(wf_kill_view_manager); + } + running = 1; while(running) wl_display_dispatch(display); diff --git a/src/client/wf-kill.hpp b/src/client/wf-kill.hpp index 6065675..9b85064 100644 --- a/src/client/wf-kill.hpp +++ b/src/client/wf-kill.hpp @@ -35,6 +35,7 @@ class WfKill int running; int send_kill; + int top_view; wl_display *display; wf_kill_view_base *wf_kill_view_manager; }; diff --git a/src/plugin/wayfire-kill-view.cpp b/src/plugin/wayfire-kill-view.cpp index e338778..8753a26 100644 --- a/src/plugin/wayfire-kill-view.cpp +++ b/src/plugin/wayfire-kill-view.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -43,13 +44,8 @@ wf::plugin_activation_data_t grab_interface{ static void bind_manager(wl_client *client, void *data, uint32_t version, uint32_t id); -void wf_kill_view::send_view_info() +static pid_t get_pid_for_view(wayfire_view view) { - wayfire_view view = wf::get_core().get_cursor_focus_view(); - if (!view) - { - return; - } pid_t pid = 0; wlr_surface *wlr_surface = view->get_wlr_surface(); #if WF_HAS_XWAYLAND @@ -62,6 +58,18 @@ void wf_kill_view::send_view_info() wl_client_get_credentials(view->get_client(), &pid, 0, 0); } + return pid; +} + +void wf_kill_view::send_view_info() +{ + wayfire_view view = wf::get_core().get_cursor_focus_view(); + if (!view) + { + return; + } + pid_t pid = get_pid_for_view(view); + view->close(); for (auto r : client_resources) @@ -72,7 +80,6 @@ void wf_kill_view::send_view_info() void wf_kill_view::send_cancel() { - for (auto r : client_resources) { wf_kill_view_base_send_cancel(r); @@ -161,9 +168,28 @@ static void view_kill(struct wl_client *client, struct wl_resource *resource) } } +static void top_view_kill(struct wl_client *client, struct wl_resource *resource) +{ + wf_kill_view *wd = (wf_kill_view*)wl_resource_get_user_data(resource); + auto view = wf::get_core().seat->get_active_view(); + if (!view) + { + return; + } + pid_t pid = get_pid_for_view(view); + + view->close(); + + for (auto r : wd->client_resources) + { + wf_kill_view_base_send_view_pid(r, pid); + } +} + static const struct wf_kill_view_base_interface wf_kill_view_impl = { .view_kill = view_kill, + .top_view_kill = top_view_kill, }; static void destroy_client(wl_resource *resource)