171 lines
4.8 KiB
C
171 lines
4.8 KiB
C
|
/* Public Domain Curses */
|
||
|
|
||
|
#include "pdcx11.h"
|
||
|
|
||
|
RCSID("$Id: pdcclip.c,v 1.35 2008/07/14 04:24:52 wmcbrine Exp $")
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
/*man-start**************************************************************
|
||
|
|
||
|
Name: clipboard
|
||
|
|
||
|
Synopsis:
|
||
|
int PDC_getclipboard(char **contents, long *length);
|
||
|
int PDC_setclipboard(const char *contents, long length);
|
||
|
int PDC_freeclipboard(char *contents);
|
||
|
int PDC_clearclipboard(void);
|
||
|
|
||
|
Description:
|
||
|
PDC_getclipboard() gets the textual contents of the system's
|
||
|
clipboard. This function returns the contents of the clipboard
|
||
|
in the contents argument. It is the responsibilitiy of the
|
||
|
caller to free the memory returned, via PDC_freeclipboard().
|
||
|
The length of the clipboard contents is returned in the length
|
||
|
argument.
|
||
|
|
||
|
PDC_setclipboard copies the supplied text into the system's
|
||
|
clipboard, emptying the clipboard prior to the copy.
|
||
|
|
||
|
PDC_clearclipboard() clears the internal clipboard.
|
||
|
|
||
|
Return Values:
|
||
|
indicator of success/failure of call.
|
||
|
PDC_CLIP_SUCCESS the call was successful
|
||
|
PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for
|
||
|
the clipboard contents
|
||
|
PDC_CLIP_EMPTY the clipboard contains no text
|
||
|
PDC_CLIP_ACCESS_ERROR no clipboard support
|
||
|
|
||
|
Portability X/Open BSD SYS V
|
||
|
PDC_getclipboard - - -
|
||
|
PDC_setclipboard - - -
|
||
|
PDC_freeclipboard - - -
|
||
|
PDC_clearclipboard - - -
|
||
|
|
||
|
**man-end****************************************************************/
|
||
|
|
||
|
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);
|
||
|
|
||
|
/* Write, then wait for X to do its stuff; expect return code. */
|
||
|
|
||
|
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; /* not reached */
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
|
||
|
/* Write, then wait for X to do its stuff; expect return code. */
|
||
|
|
||
|
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; /* not reached */
|
||
|
}
|