forked from enlightenment/enlightenment
finish off x11<->wl clipboard support
a lot of this functionality is reused from dnd. basic selection owner management in x11 and slapping bytes down a pipe to the wl client; a bit laggy when pasting to wl clients sometimes, need to spend more time debugging that... #Kansas
This commit is contained in:
parent
cb363eb9b8
commit
335f9c4324
|
@ -764,12 +764,29 @@ e_comp_wl_data_device_keyboard_focus_set(void)
|
||||||
ERR("No focused resource");
|
ERR("No focused resource");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
source = (E_Comp_Wl_Data_Source*)e_comp->wl_comp_data->selection.data_source;
|
||||||
|
|
||||||
|
#ifndef HAVE_WAYLAND_ONLY
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!e_comp_util_has_xwayland()) break;
|
||||||
|
if (e_comp->wl_comp_data->clipboard.xwl_owner)
|
||||||
|
{
|
||||||
|
if (e_client_has_xwindow(e_client_focused_get())) return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (source && e_client_has_xwindow(e_client_focused_get()))
|
||||||
|
{
|
||||||
|
/* wl -> x11 */
|
||||||
|
ecore_x_selection_owner_set(e_comp->cm_selection, ECORE_X_ATOM_SELECTION_CLIPBOARD, ecore_x_current_time_get());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
#endif
|
||||||
data_device_res =
|
data_device_res =
|
||||||
e_comp_wl_data_find_for_client(wl_resource_get_client(focus));
|
e_comp_wl_data_find_for_client(wl_resource_get_client(focus));
|
||||||
if (!data_device_res) return;
|
if (!data_device_res) return;
|
||||||
|
|
||||||
source = (E_Comp_Wl_Data_Source*)e_comp->wl_comp_data->selection.data_source;
|
|
||||||
if (source)
|
if (source)
|
||||||
offer_res = _e_comp_wl_data_device_data_offer_create(source, data_device_res);
|
offer_res = _e_comp_wl_data_device_data_offer_create(source, data_device_res);
|
||||||
wl_data_device_send_selection(data_device_res, offer_res);
|
wl_data_device_send_selection(data_device_res, offer_res);
|
||||||
|
|
|
@ -107,11 +107,15 @@ _xwayland_target_send(E_Comp_Wl_Data_Source *source, uint32_t serial EINA_UNUSED
|
||||||
static void
|
static void
|
||||||
_xwayland_send_send(E_Comp_Wl_Data_Source *source, const char* mime_type, int32_t fd)
|
_xwayland_send_send(E_Comp_Wl_Data_Source *source, const char* mime_type, int32_t fd)
|
||||||
{
|
{
|
||||||
Ecore_X_Atom type;
|
Ecore_X_Atom type, sel = ECORE_X_ATOM_SELECTION_CLIPBOARD;
|
||||||
|
|
||||||
DBG("XWL Data Source Source Send");
|
DBG("XWL Data Source Source Send");
|
||||||
|
|
||||||
_xdnd_finish(0);
|
if (e_comp->wl_comp_data->drag_client)
|
||||||
|
{
|
||||||
|
_xdnd_finish(0);
|
||||||
|
sel = ECORE_X_ATOM_SELECTION_XDND;
|
||||||
|
}
|
||||||
|
|
||||||
if (eina_streq(mime_type, WL_TEXT_STR))
|
if (eina_streq(mime_type, WL_TEXT_STR))
|
||||||
type = string_atom;
|
type = string_atom;
|
||||||
|
@ -119,7 +123,7 @@ _xwayland_send_send(E_Comp_Wl_Data_Source *source, const char* mime_type, int32_
|
||||||
type = ecore_x_atom_get(mime_type);
|
type = ecore_x_atom_get(mime_type);
|
||||||
|
|
||||||
cur_fd = fd;
|
cur_fd = fd;
|
||||||
xconvertselection(ecore_x_display_get(), ECORE_X_ATOM_SELECTION_XDND, type, xwl_dnd_atom, e_comp->cm_selection, 0);
|
xconvertselection(ecore_x_display_get(), sel, type, xwl_dnd_atom, e_comp->cm_selection, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -208,7 +212,17 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even
|
||||||
}
|
}
|
||||||
if (ev->atom == ECORE_X_ATOM_SELECTION_CLIPBOARD)
|
if (ev->atom == ECORE_X_ATOM_SELECTION_CLIPBOARD)
|
||||||
{
|
{
|
||||||
e_comp->wl_comp_data->clipboard.xwl_owner = ev->owner ? e_pixmap_find_client(E_PIXMAP_TYPE_X, ev->owner) : NULL;
|
if (ev->owner)
|
||||||
|
{
|
||||||
|
if (e_comp->wl_comp_data->clipboard.source)
|
||||||
|
e_comp_wl_clipboard_source_unref(e_comp->wl_comp_data->clipboard.source);
|
||||||
|
e_comp->wl_comp_data->clipboard.source = NULL;
|
||||||
|
e_comp->wl_comp_data->clipboard.xwl_owner = ev->owner ? e_pixmap_find_client(E_PIXMAP_TYPE_X, ev->owner) : NULL;
|
||||||
|
xconvertselection(ecore_x_display_get(), ECORE_X_ATOM_SELECTION_CLIPBOARD,
|
||||||
|
ECORE_X_ATOM_SELECTION_TARGETS, xwl_dnd_atom, e_comp->cm_selection, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
e_comp->wl_comp_data->clipboard.xwl_owner = NULL;
|
||||||
}
|
}
|
||||||
return ECORE_CALLBACK_RENEW;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
@ -220,11 +234,38 @@ _xwl_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sele
|
||||||
int wrote = 0;
|
int wrote = 0;
|
||||||
|
|
||||||
DBG("XWL SELECTION NOTIFY");
|
DBG("XWL SELECTION NOTIFY");
|
||||||
if ((ev->selection != ECORE_X_SELECTION_XDND) && (ev->selection == ECORE_X_SELECTION_CLIPBOARD))
|
if ((ev->selection != ECORE_X_SELECTION_XDND) && (ev->selection != ECORE_X_SELECTION_CLIPBOARD))
|
||||||
{
|
{
|
||||||
e_object_del(E_OBJECT(e_comp->wl_comp_data->drag));
|
e_object_del(E_OBJECT(e_comp->wl_comp_data->drag));
|
||||||
return ECORE_CALLBACK_RENEW;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
if (ev->selection == ECORE_X_SELECTION_CLIPBOARD)
|
||||||
|
{
|
||||||
|
if (eina_streq(ev->target, "TARGETS"))
|
||||||
|
{
|
||||||
|
Ecore_X_Selection_Data_Targets *tgs = ev->data;
|
||||||
|
E_Comp_Wl_Clipboard_Source *source;
|
||||||
|
E_Comp_Wl_Data_Source *dsource;
|
||||||
|
int i, p[2];
|
||||||
|
|
||||||
|
if (pipe2(p, O_CLOEXEC) == -1)
|
||||||
|
return ECORE_CALLBACK_RENEW;
|
||||||
|
source = e_comp_wl_clipboard_source_create(NULL, 0, p[0]);
|
||||||
|
dsource = e_comp_wl_data_manager_source_create(e_comp->wl_comp_data->xwl_client,
|
||||||
|
e_comp->wl_comp_data->mgr.resource, 1);
|
||||||
|
for (i = 0; i < tgs->num_targets; i++)
|
||||||
|
if (tgs->targets[i])
|
||||||
|
source->data_source.mime_types = eina_list_append(source->data_source.mime_types, eina_stringshare_add(tgs->targets[i]));
|
||||||
|
e_comp->wl_comp_data->clipboard.source = source;
|
||||||
|
e_comp->wl_comp_data->selection.data_source = &source->data_source;
|
||||||
|
source->data_source.resource = dsource->resource;
|
||||||
|
source->data_source.send = _xwayland_send_send;
|
||||||
|
free(dsource);
|
||||||
|
if (e_client_has_xwindow(e_client_focused_get()))
|
||||||
|
e_comp_wl_data_device_keyboard_focus_set();
|
||||||
|
return ECORE_CALLBACK_RENEW;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* FIXME: ecore-x events are fucked */
|
/* FIXME: ecore-x events are fucked */
|
||||||
//if (ecore_x_atom_get(ev->target) != xwl_dnd_atom) return ECORE_CALLBACK_RENEW;
|
//if (ecore_x_atom_get(ev->target) != xwl_dnd_atom) return ECORE_CALLBACK_RENEW;
|
||||||
sd = ev->data;
|
sd = ev->data;
|
||||||
|
@ -233,8 +274,10 @@ _xwl_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sele
|
||||||
{
|
{
|
||||||
wrote += write(cur_fd, sd->data, sd->length);
|
wrote += write(cur_fd, sd->data, sd->length);
|
||||||
} while (wrote < sd->length);
|
} while (wrote < sd->length);
|
||||||
_xdnd_finish(1);
|
if (ev->selection == ECORE_X_SELECTION_XDND)
|
||||||
|
_xdnd_finish(1);
|
||||||
close(cur_fd);
|
close(cur_fd);
|
||||||
|
cur_fd = -1;
|
||||||
_xwayland_dnd_finish();
|
_xwayland_dnd_finish();
|
||||||
return ECORE_CALLBACK_RENEW;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
@ -289,9 +332,13 @@ _xwl_selection_request(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sel
|
||||||
const char *type;
|
const char *type;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
if (!e_comp->wl_comp_data->drag_source) return ECORE_CALLBACK_RENEW;
|
if (e_comp->wl_comp_data->drag_source)
|
||||||
|
source = e_comp->wl_comp_data->drag_source;
|
||||||
|
else if (e_comp->wl_comp_data->selection.data_source)
|
||||||
|
source = e_comp->wl_comp_data->selection.data_source;
|
||||||
|
else
|
||||||
|
return ECORE_CALLBACK_RENEW;
|
||||||
|
|
||||||
source = e_comp->wl_comp_data->drag_source;
|
|
||||||
if (ev->target == ECORE_X_ATOM_SELECTION_TARGETS)
|
if (ev->target == ECORE_X_ATOM_SELECTION_TARGETS)
|
||||||
{
|
{
|
||||||
Ecore_X_Atom *atoms;
|
Ecore_X_Atom *atoms;
|
||||||
|
|
Loading…
Reference in New Issue