#include "pdcx11.h"
#include <stdlib.h>
int PDC_getclipboard(char **contents, long *length)
{
#ifdef PDC_WIDE
wchar_t *wcontents;
#endif
int result = 0;
int len;
PDC_LOG(("PDC_getclipboard() - called\n"));
XCursesInstructAndWait(CURSES_GET_SELECTION);
if (XC_read_socket(xc_display_sock, &result, sizeof(int)) < 0)
XCursesExitCursesProcess(5, "exiting from PDC_getclipboard");
if (result == PDC_CLIP_SUCCESS)
{
if (XC_read_socket(xc_display_sock, &len, sizeof(int)) < 0)
XCursesExitCursesProcess(5, "exiting from PDC_getclipboard");
#ifdef PDC_WIDE
wcontents = malloc((len + 1) * sizeof(wchar_t));
*contents = malloc(len * 3 + 1);
if (!wcontents || !*contents)
#else
*contents = malloc(len + 1);
if (!*contents)
#endif
XCursesExitCursesProcess(6, "exiting from PDC_getclipboard - "
"synchronization error");
if (len)
{
if (XC_read_socket(xc_display_sock,
#ifdef PDC_WIDE
wcontents, len * sizeof(wchar_t)) < 0)
#else
*contents, len) < 0)
#endif
XCursesExitCursesProcess(5, "exiting from PDC_getclipboard");
}
#ifdef PDC_WIDE
wcontents[len] = 0;
len = PDC_wcstombs(*contents, wcontents, len * 3);
free(wcontents);
#endif
(*contents)[len] = '\0';
*length = len;
}
return result;
}
int PDC_setclipboard(const char *contents, long length)
{
#ifdef PDC_WIDE
wchar_t *wcontents;
#endif
int rc;
PDC_LOG(("PDC_setclipboard() - called\n"));
#ifdef PDC_WIDE
wcontents = malloc((length + 1) * sizeof(wchar_t));
if (!wcontents)
return PDC_CLIP_MEMORY_ERROR;
length = PDC_mbstowcs(wcontents, contents, length);
#endif
XCursesInstruct(CURSES_SET_SELECTION);
if (XC_write_socket(xc_display_sock, &length, sizeof(long)) >= 0)
{
if (XC_write_socket(xc_display_sock,
#ifdef PDC_WIDE
wcontents, length * sizeof(wchar_t)) >= 0)
{
free(wcontents);
#else
contents, length) >= 0)
{
#endif
if (XC_read_socket(xc_display_sock, &rc, sizeof(int)) >= 0)
return rc;
}
}
XCursesExitCursesProcess(5, "exiting from PDC_setclipboard");
return PDC_CLIP_ACCESS_ERROR;
}
int PDC_freeclipboard(char *contents)
{
PDC_LOG(("PDC_freeclipboard() - called\n"));
free(contents);
return PDC_CLIP_SUCCESS;
}
int PDC_clearclipboard(void)
{
int rc;
long len = 0;
PDC_LOG(("PDC_clearclipboard() - called\n"));
XCursesInstruct(CURSES_CLEAR_SELECTION);
if (XC_write_socket(xc_display_sock, &len, sizeof(long)) >= 0)
if (XC_read_socket(xc_display_sock, &rc, sizeof(int)) >= 0)
return rc;
XCursesExitCursesProcess(5, "exiting from PDC_clearclipboard");
return PDC_CLIP_ACCESS_ERROR;
}