|  | 
|  | 1 | +#include "kde-appmenu-protocol.h" | 
|  | 2 | +#include "wayfire/core.hpp" | 
|  | 3 | +#include "wayfire/object.hpp" | 
|  | 4 | +#include <wayfire/plugin.hpp> | 
|  | 5 | +#include <wayfire/view.hpp> | 
|  | 6 | +#include <wayfire/toplevel-view.hpp> | 
|  | 7 | +#include "kde-appmenu.hpp" | 
|  | 8 | + | 
|  | 9 | +#define KDE_APPMENU_VERSION 2 | 
|  | 10 | + | 
|  | 11 | +struct wf_kde_appmenu_surface | 
|  | 12 | +{ | 
|  | 13 | +    wl_resource *resource; | 
|  | 14 | +    wl_resource *wl_surface; | 
|  | 15 | +}; | 
|  | 16 | + | 
|  | 17 | +static void handle_kde_appmenu_set_address(wl_client *client, | 
|  | 18 | +    wl_resource *resource, const char *service_name, | 
|  | 19 | +    const char *object_path) | 
|  | 20 | +{ | 
|  | 21 | +    auto surface = static_cast<wf_kde_appmenu_surface*>(wl_resource_get_user_data(resource)); | 
|  | 22 | +    wayfire_view view = wf::wl_surface_to_wayfire_view(surface->wl_surface); | 
|  | 23 | +    if (!view) | 
|  | 24 | +    { | 
|  | 25 | +        LOGE("Could not get view"); | 
|  | 26 | +        return; | 
|  | 27 | +    } else | 
|  | 28 | +    { | 
|  | 29 | +        kde_appmenu_dbus_address_signal ev; | 
|  | 30 | +        ev.view = view; | 
|  | 31 | +        ev.service_name = service_name; | 
|  | 32 | +        ev.object_path  = object_path; | 
|  | 33 | + | 
|  | 34 | +        wf::get_core().emit(&ev); | 
|  | 35 | +    } | 
|  | 36 | +} | 
|  | 37 | + | 
|  | 38 | +static void handle_kde_appmenu_release(wl_client*, wl_resource*) | 
|  | 39 | +{ | 
|  | 40 | +    /* no-op */ | 
|  | 41 | +} | 
|  | 42 | + | 
|  | 43 | +static void handle_kde_appmenu_destroy(wl_resource *resource) | 
|  | 44 | +{ | 
|  | 45 | +    auto surface = static_cast<wf_kde_appmenu_surface*>(wl_resource_get_user_data(resource)); | 
|  | 46 | +    delete surface; | 
|  | 47 | +} | 
|  | 48 | + | 
|  | 49 | +const struct org_kde_kwin_appmenu_interface kde_appmenu_impl = { | 
|  | 50 | +    .set_address = handle_kde_appmenu_set_address, | 
|  | 51 | +    .release     = handle_kde_appmenu_release | 
|  | 52 | +}; | 
|  | 53 | + | 
|  | 54 | + | 
|  | 55 | +static void handle_kde_appmenu_manager_create(wl_client *client, | 
|  | 56 | +    wl_resource *resource, uint32_t id, wl_resource *surface) | 
|  | 57 | +{ | 
|  | 58 | +    wf_kde_appmenu_surface *kde_appmenu_surface = new wf_kde_appmenu_surface; | 
|  | 59 | +    kde_appmenu_surface->resource = wl_resource_create(client, | 
|  | 60 | +        &org_kde_kwin_appmenu_interface, wl_resource_get_version(resource), id); | 
|  | 61 | +    kde_appmenu_surface->wl_surface = surface; | 
|  | 62 | +    wl_resource_set_implementation(kde_appmenu_surface->resource, &kde_appmenu_impl, | 
|  | 63 | +        kde_appmenu_surface, handle_kde_appmenu_destroy); | 
|  | 64 | +} | 
|  | 65 | + | 
|  | 66 | +static void handle_kde_appmenu_manager_release(wl_client*, wl_resource*) | 
|  | 67 | +{ | 
|  | 68 | +    /* no-op */ | 
|  | 69 | +} | 
|  | 70 | + | 
|  | 71 | +static void handle_kde_appmenu_manager_destroy(wl_resource*) | 
|  | 72 | +{ | 
|  | 73 | +    /* no-op */ | 
|  | 74 | +} | 
|  | 75 | + | 
|  | 76 | +static const struct org_kde_kwin_appmenu_manager_interface kde_appmenu_manager_impl = { | 
|  | 77 | +    .create  = handle_kde_appmenu_manager_create, | 
|  | 78 | +    .release = handle_kde_appmenu_manager_release | 
|  | 79 | +}; | 
|  | 80 | + | 
|  | 81 | + | 
|  | 82 | +static void bind_kde_appmenu(wl_client *client, void *data, uint32_t version, uint32_t id) | 
|  | 83 | +{ | 
|  | 84 | +    auto resource = wl_resource_create(client, &org_kde_kwin_appmenu_manager_interface, | 
|  | 85 | +        KDE_APPMENU_VERSION, id); | 
|  | 86 | +    wl_resource_set_implementation(resource, &kde_appmenu_manager_impl, | 
|  | 87 | +        data, handle_kde_appmenu_manager_destroy); | 
|  | 88 | +} | 
|  | 89 | + | 
|  | 90 | +class wayfire_kde_appmenu_impl : public wf::plugin_interface_t | 
|  | 91 | +{ | 
|  | 92 | +  public: | 
|  | 93 | +    void init() override | 
|  | 94 | +    { | 
|  | 95 | +        auto display = wf::get_core().display; | 
|  | 96 | +        wl_global_create(display, &org_kde_kwin_appmenu_manager_interface, | 
|  | 97 | +            KDE_APPMENU_VERSION, NULL, bind_kde_appmenu); | 
|  | 98 | +    } | 
|  | 99 | + | 
|  | 100 | +    bool is_unloadable() override | 
|  | 101 | +    { | 
|  | 102 | +        return false; | 
|  | 103 | +    } | 
|  | 104 | +}; | 
|  | 105 | + | 
|  | 106 | +DECLARE_WAYFIRE_PLUGIN(wayfire_kde_appmenu_impl); | 
0 commit comments