aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/curses/PDCurses/x11/pdcclip.c
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/curses/PDCurses/x11/pdcclip.c')
-rw-r--r--payloads/libpayload/curses/PDCurses/x11/pdcclip.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/payloads/libpayload/curses/PDCurses/x11/pdcclip.c b/payloads/libpayload/curses/PDCurses/x11/pdcclip.c
new file mode 100644
index 0000000000..bba080f3a2
--- /dev/null
+++ b/payloads/libpayload/curses/PDCurses/x11/pdcclip.c
@@ -0,0 +1,170 @@
+/* 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 */
+}