Change-Id: If881ec130833c7e7e62caa3d31e350a531f5bc8e Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: http://review.coreboot.org/12398 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
		
			
				
	
	
		
			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 */
 | |
| }
 |