1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * QNX port by Julian Kinraid
6  *
7  * Do ":help uganda"  in Vim to read copying and usage conditions.
8  * Do ":help credits" in Vim to see a list of people who contributed.
9  */
10 
11 /*
12  * os_qnx.c
13  */
14 
15 #include "vim.h"
16 
17 
18 #if defined(FEAT_GUI_PHOTON)
19 int is_photon_available;
20 #endif
21 
qnx_init(void)22 void qnx_init(void)
23 {
24 #if defined(FEAT_GUI_PHOTON)
25     PhChannelParms_t parms;
26 
27     memset(&parms, 0, sizeof(parms));
28     parms.flags = Ph_DYNAMIC_BUFFER;
29 
30     is_photon_available = (PhAttach(NULL, &parms) != NULL) ? TRUE : FALSE;
31 #endif
32 }
33 
34 #if (defined(FEAT_GUI_PHOTON) && defined(FEAT_CLIPBOARD)) || defined(PROTO)
35 
36 #define CLIP_TYPE_VIM "VIMTYPE"
37 #define CLIP_TYPE_TEXT "TEXT"
38 
39 // Turn on the clipboard for a console vim when photon is running
qnx_clip_init(void)40 void qnx_clip_init(void)
41 {
42     if (is_photon_available == TRUE && !gui.in_use)
43 	clip_init(TRUE);
44 }
45 
46 /////////////////////////////////////////////////////////////////////////////
47 // Clipboard
48 
49 // No support for owning the clipboard
50 int
clip_mch_own_selection(Clipboard_T * cbd)51 clip_mch_own_selection(Clipboard_T *cbd)
52 {
53     return FALSE;
54 }
55 
56 void
clip_mch_lose_selection(Clipboard_T * cbd)57 clip_mch_lose_selection(Clipboard_T *cbd)
58 {
59 }
60 
61 void
clip_mch_request_selection(Clipboard_T * cbd)62 clip_mch_request_selection(Clipboard_T *cbd)
63 {
64     int		    type = MLINE, clip_length = 0, is_type_set = FALSE;
65     void	    *cbdata;
66     PhClipHeader    *clip_header;
67     char_u	    *clip_text = NULL;
68 
69     cbdata = PhClipboardPasteStart(PhInputGroup(NULL));
70     if (cbdata != NULL)
71     {
72 	// Look for the vim specific clip first
73 	clip_header = PhClipboardPasteType(cbdata, CLIP_TYPE_VIM);
74 	if (clip_header != NULL && clip_header->data != NULL)
75 	{
76 	    switch(*(char *) clip_header->data)
77 	    {
78 		default: // fallthrough to line type
79 		case 'L': type = MLINE; break;
80 		case 'C': type = MCHAR; break;
81 		case 'B': type = MBLOCK; break;
82 	    }
83 	    is_type_set = TRUE;
84 	}
85 
86 	// Try for just normal text
87 	clip_header = PhClipboardPasteType(cbdata, CLIP_TYPE_TEXT);
88 	if (clip_header != NULL)
89 	{
90 	    clip_text = clip_header->data;
91 	    clip_length  = clip_header->length - 1;
92 
93 	    if (clip_text != NULL && is_type_set == FALSE)
94 		type = MAUTO;
95 	}
96 
97 	if ((clip_text != NULL) && (clip_length > 0))
98 	    clip_yank_selection(type, clip_text, clip_length, cbd);
99 
100 	PhClipboardPasteFinish(cbdata);
101     }
102 }
103 
104 void
clip_mch_set_selection(Clipboard_T * cbd)105 clip_mch_set_selection(Clipboard_T *cbd)
106 {
107     int type;
108     long_u  len;
109     char_u *text_clip, vim_clip[2], *str = NULL;
110     PhClipHeader clip_header[2];
111 
112     // Prevent recursion from clip_get_selection()
113     if (cbd->owned == TRUE)
114 	return;
115 
116     cbd->owned = TRUE;
117     clip_get_selection(cbd);
118     cbd->owned = FALSE;
119 
120     type = clip_convert_selection(&str, &len, cbd);
121     if (type >= 0)
122     {
123 	text_clip = alloc(len + 1); // Normal text
124 
125 	if (text_clip && vim_clip)
126 	{
127 	    memset(clip_header, 0, sizeof(clip_header));
128 
129 	    STRNCPY(clip_header[0].type, CLIP_TYPE_VIM, 8);
130 	    clip_header[0].length = sizeof(vim_clip);
131 	    clip_header[0].data   = vim_clip;
132 
133 	    STRNCPY(clip_header[1].type, CLIP_TYPE_TEXT, 8);
134 	    clip_header[1].length = len + 1;
135 	    clip_header[1].data   = text_clip;
136 
137 	    switch(type)
138 	    {
139 		default: // fallthrough to MLINE
140 		case MLINE:	*vim_clip = 'L'; break;
141 		case MCHAR:	*vim_clip = 'C'; break;
142 		case MBLOCK:	*vim_clip = 'B'; break;
143 	    }
144 
145 	    vim_strncpy(text_clip, str, len);
146 
147 	    vim_clip[ 1 ] = NUL;
148 
149 	    PhClipboardCopy(PhInputGroup(NULL), 2, clip_header);
150 	}
151 	vim_free(text_clip);
152     }
153     vim_free(str);
154 }
155 #endif
156