forked from enlightenment/enlightenment
139 lines
3.7 KiB
C
139 lines
3.7 KiB
C
#define E_COMP_WL
|
|
#include "e_mod_main.h"
|
|
#ifdef HAVE_WAYLAND
|
|
#include "wl_teamwork.h"
|
|
|
|
static struct wl_resource *tw_resource;
|
|
static struct wl_global *tw_global;
|
|
|
|
static void
|
|
tw_preload_uri(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED,
|
|
struct wl_resource *surface, const char *uri)
|
|
{
|
|
E_Client *ec;
|
|
|
|
ec = wl_resource_get_user_data(surface);
|
|
if (ec)
|
|
tw_link_detect(ec, uri);
|
|
}
|
|
|
|
static void
|
|
tw_activate_uri(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED,
|
|
struct wl_resource *surface, const char *uri, wl_fixed_t x, wl_fixed_t y)
|
|
{
|
|
E_Client *ec;
|
|
|
|
ec = wl_resource_get_user_data(surface);
|
|
if (ec)
|
|
tw_link_show(ec, uri, wl_fixed_to_int(x), wl_fixed_to_int(y));
|
|
}
|
|
|
|
static void
|
|
tw_deactivate_uri(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED,
|
|
struct wl_resource *surface, const char *uri)
|
|
{
|
|
E_Client *ec;
|
|
|
|
ec = wl_resource_get_user_data(surface);
|
|
if (ec)
|
|
tw_link_hide(ec, uri);
|
|
}
|
|
|
|
static void
|
|
tw_open_uri(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED,
|
|
struct wl_resource *surface, const char *uri)
|
|
{
|
|
E_Client *ec;
|
|
|
|
ec = wl_resource_get_user_data(surface);
|
|
if (ec)
|
|
tw_link_open(ec, uri);
|
|
}
|
|
|
|
static const struct zwp_teamwork_interface tw_interface =
|
|
{
|
|
tw_preload_uri,
|
|
tw_activate_uri,
|
|
tw_deactivate_uri,
|
|
tw_open_uri,
|
|
};
|
|
|
|
static void
|
|
wl_tw_cb_unbind(struct wl_resource *resource EINA_UNUSED)
|
|
{
|
|
tw_resource = NULL;
|
|
}
|
|
|
|
static void
|
|
wl_tw_cb_bind(struct wl_client *client, void *data EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
|
|
{
|
|
struct wl_resource *res;
|
|
|
|
if (!(res = wl_resource_create(client, &zwp_teamwork_interface, E_TW_VERSION, id)))
|
|
{
|
|
ERR("Could not create zwp_teamwork_interface interface");
|
|
wl_client_post_no_memory(client);
|
|
return;
|
|
}
|
|
|
|
tw_resource = res;
|
|
wl_resource_set_implementation(res, &tw_interface, NULL, wl_tw_cb_unbind);
|
|
}
|
|
|
|
static void
|
|
wl_tw_link_complete(E_Client *ec, const char *uri)
|
|
{
|
|
if (e_object_is_del(E_OBJECT(ec))) return;
|
|
zwp_teamwork_send_completed_uri(tw_resource, ec->comp_data->surface, uri, 1);
|
|
}
|
|
|
|
static void
|
|
wl_tw_link_invalid(E_Client *ec, const char *uri)
|
|
{
|
|
if (e_object_is_del(E_OBJECT(ec))) return;
|
|
zwp_teamwork_send_completed_uri(tw_resource, ec->comp_data->surface, uri, 0);
|
|
}
|
|
|
|
static void
|
|
wl_tw_link_progress(E_Client *ec, const char *uri, uint32_t pct)
|
|
{
|
|
if (e_object_is_del(E_OBJECT(ec))) return;
|
|
zwp_teamwork_send_fetch_info(tw_resource, ec->comp_data->surface, uri, pct);
|
|
}
|
|
|
|
static void
|
|
wl_tw_link_downloading(E_Client *ec, const char *uri)
|
|
{
|
|
if (e_object_is_del(E_OBJECT(ec))) return;
|
|
zwp_teamwork_send_fetching_uri(tw_resource, ec->comp_data->surface, uri);
|
|
}
|
|
|
|
EINTERN Eina_Bool
|
|
wl_tw_init(void)
|
|
{
|
|
tw_global = wl_global_create(e_comp_wl->wl.disp, &zwp_teamwork_interface, E_TW_VERSION,
|
|
NULL, wl_tw_cb_bind);
|
|
if (!tw_global)
|
|
{
|
|
ERR("Could not add zwp_teamwork to wayland globals");
|
|
return EINA_FALSE;
|
|
}
|
|
tw_signal_link_complete[E_PIXMAP_TYPE_WL] = wl_tw_link_complete;
|
|
tw_signal_link_invalid[E_PIXMAP_TYPE_WL] = wl_tw_link_invalid;
|
|
tw_signal_link_progress[E_PIXMAP_TYPE_WL] = wl_tw_link_progress;
|
|
tw_signal_link_downloading[E_PIXMAP_TYPE_WL] = wl_tw_link_downloading;
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
EINTERN void
|
|
wl_tw_shutdown(void)
|
|
{
|
|
E_FREE_FUNC(tw_resource, wl_resource_destroy);
|
|
E_FREE_FUNC(tw_global, wl_global_destroy);
|
|
tw_signal_link_complete[E_PIXMAP_TYPE_WL] = NULL;
|
|
tw_signal_link_invalid[E_PIXMAP_TYPE_WL] = NULL;
|
|
tw_signal_link_progress[E_PIXMAP_TYPE_WL] = NULL;
|
|
tw_signal_link_downloading[E_PIXMAP_TYPE_WL] = NULL;
|
|
}
|
|
#endif
|