mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-22 15:11:31 +00:00
[client] clipboard: add support for Caja
This commit is contained in:
@@ -79,6 +79,7 @@ static const char * jpegMimetypes[] =
|
||||
static const char * fileMimetypes[] =
|
||||
{
|
||||
"x-special/gnome-copied-files",
|
||||
"x-special/mate-copied-files",
|
||||
"text/uri-list",
|
||||
"application/x-kde-cutselection",
|
||||
NULL,
|
||||
@@ -153,6 +154,7 @@ static bool isTextMimetype(const char * mimetype)
|
||||
static enum LG_ClipboardData mimetypeToCbType(const char * mimetype)
|
||||
{
|
||||
if (!strcmp(mimetype, "x-special/gnome-copied-files") ||
|
||||
!strcmp(mimetype, "x-special/mate-copied-files" ) ||
|
||||
!strcmp(mimetype, "text/uri-list"))
|
||||
return LG_CLIPBOARD_DATA_FILES;
|
||||
|
||||
@@ -435,8 +437,9 @@ static void dataOfferHandleOffer(void * opaque, struct wl_data_offer * offer,
|
||||
{
|
||||
if (type != LG_CLIPBOARD_DATA_FILES ||
|
||||
strcmp(mimetype, "x-special/gnome-copied-files") ||
|
||||
!strcmp(data->mimetypes[type],
|
||||
"x-special/gnome-copied-files"))
|
||||
strcmp(mimetype, "x-special/mate-copied-files") ||
|
||||
!strcmp(data->mimetypes[type], "x-special/gnome-copied-files") ||
|
||||
!strcmp(data->mimetypes[type], "x-special/mate-copied-files"))
|
||||
return;
|
||||
free(data->mimetypes[type]);
|
||||
}
|
||||
@@ -1295,7 +1298,9 @@ static bool fileTransferPayload(const struct WCBTransfer * transfer,
|
||||
*data = transfer->fileUri;
|
||||
*size = transfer->fileUriSize;
|
||||
}
|
||||
else if (!strcmp(mime, "x-special/gnome-copied-files"))
|
||||
else if (
|
||||
!strcmp(mime, "x-special/gnome-copied-files") ||
|
||||
!strcmp(mime, "x-special/mate-copied-files" ))
|
||||
{
|
||||
*data = transfer->fileGnome;
|
||||
*size = transfer->fileGnomeSize;
|
||||
@@ -1409,8 +1414,11 @@ static void dataSourceHandleSend(void * data, struct wl_data_source * source,
|
||||
{
|
||||
const char * payload;
|
||||
size_t size;
|
||||
const bool deliversUri = !strcmp(mimetype, "text/uri-list") ||
|
||||
!strcmp(mimetype, "x-special/gnome-copied-files");
|
||||
const bool deliversUri =
|
||||
!strcmp(mimetype, "text/uri-list" ) ||
|
||||
!strcmp(mimetype, "x-special/gnome-copied-files") ||
|
||||
!strcmp(mimetype, "x-special/mate-copied-files" );
|
||||
|
||||
if (fileTransferPayload(transfer, mimetype, &payload, &size) &&
|
||||
clipboardFileWriteStart(fd, payload, size,
|
||||
transfer, deliversUri))
|
||||
@@ -1538,6 +1546,9 @@ static bool waylandCBPublish(LG_ClipboardData type)
|
||||
!clipboardFiles_getRemotePresentation(transfer->filePresentation,
|
||||
"x-special/gnome-copied-files",
|
||||
&transfer->fileGnome, &transfer->fileGnomeSize) ||
|
||||
!clipboardFiles_getRemotePresentation(transfer->filePresentation,
|
||||
"x-special/mate-copied-files",
|
||||
&transfer->fileGnome, &transfer->fileGnomeSize) ||
|
||||
!clipboardFiles_getRemotePresentation(transfer->filePresentation,
|
||||
"application/x-kde-cutselection",
|
||||
&transfer->fileKde, &transfer->fileKdeSize)))
|
||||
|
||||
@@ -92,6 +92,7 @@ struct X11ClipboardState
|
||||
Atom aCurSelection;
|
||||
Atom aTypes[LG_CLIPBOARD_DATA_NONE];
|
||||
Atom aFileGnome;
|
||||
Atom aFileMate;
|
||||
Atom aFileKde;
|
||||
Window targetsWindow;
|
||||
LG_ClipboardData type;
|
||||
@@ -114,8 +115,9 @@ static const char * atomTypes[] =
|
||||
};
|
||||
|
||||
static const char fileGnomeMime[] = "x-special/gnome-copied-files";
|
||||
static const char fileKdeMime[] = "application/x-kde-cutselection";
|
||||
static const char fileUriMime[] = "text/uri-list";
|
||||
static const char fileMateMime [] = "x-special/mate-copied-files";
|
||||
static const char fileKdeMime [] = "application/x-kde-cutselection";
|
||||
static const char fileUriMime [] = "text/uri-list";
|
||||
|
||||
static struct X11ClipboardState x11cb;
|
||||
|
||||
@@ -143,6 +145,8 @@ static const char * fileMimeForAtom(Atom atom)
|
||||
return fileUriMime;
|
||||
if (atom == x11cb.aFileGnome)
|
||||
return fileGnomeMime;
|
||||
if (atom == x11cb.aFileMate)
|
||||
return fileMateMime;
|
||||
if (atom == x11cb.aFileKde)
|
||||
return fileKdeMime;
|
||||
return NULL;
|
||||
@@ -285,9 +289,12 @@ bool x11CBInit(void)
|
||||
}
|
||||
|
||||
x11cb.aFileGnome = XInternAtom(x11.display, fileGnomeMime, False);
|
||||
x11cb.aFileKde = XInternAtom(x11.display, fileKdeMime, False);
|
||||
if (x11cb.aFileGnome == BadAlloc || x11cb.aFileGnome == BadValue ||
|
||||
x11cb.aFileKde == BadAlloc || x11cb.aFileKde == BadValue)
|
||||
x11cb.aFileMate = XInternAtom(x11.display, fileMateMime , False);
|
||||
x11cb.aFileKde = XInternAtom(x11.display, fileKdeMime , False);
|
||||
if (
|
||||
x11cb.aFileGnome == BadAlloc || x11cb.aFileGnome == BadValue ||
|
||||
x11cb.aFileMate == BadAlloc || x11cb.aFileMate == BadValue ||
|
||||
x11cb.aFileKde == BadAlloc || x11cb.aFileKde == BadValue)
|
||||
{
|
||||
DEBUG_ERROR("failed to get clipboard file atoms");
|
||||
return false;
|
||||
@@ -480,13 +487,14 @@ static void x11CBSelectionRequest(const XSelectionRequestEvent e)
|
||||
// target list requested
|
||||
if (e.target == x11atoms.TARGETS)
|
||||
{
|
||||
Atom targets[4];
|
||||
Atom targets[5];
|
||||
targets[0] = x11atoms.TARGETS;
|
||||
targets[1] = x11cb.aTypes[requestType];
|
||||
int count = 2;
|
||||
if (requestType == LG_CLIPBOARD_DATA_FILES)
|
||||
{
|
||||
targets[count++] = x11cb.aFileGnome;
|
||||
targets[count++] = x11cb.aFileMate;
|
||||
targets[count++] = x11cb.aFileKde;
|
||||
}
|
||||
|
||||
@@ -1406,11 +1414,19 @@ static void x11CBSelectionNotify(const XSelectionEvent e)
|
||||
const Atom * targets = (const Atom *)data;
|
||||
Atom fileTarget = None;
|
||||
for (unsigned long i = 0; i < itemCount; ++i)
|
||||
{
|
||||
if (targets[i] == x11cb.aFileGnome)
|
||||
{
|
||||
fileTarget = x11cb.aFileGnome;
|
||||
break;
|
||||
}
|
||||
|
||||
if (targets[i] == x11cb.aFileMate)
|
||||
{
|
||||
fileTarget = x11cb.aFileMate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (fileTarget == None)
|
||||
for (unsigned long i = 0; i < itemCount; ++i)
|
||||
if (targets[i] == x11cb.aTypes[LG_CLIPBOARD_DATA_FILES])
|
||||
|
||||
Reference in New Issue
Block a user