|
1 /* Public Domain Curses */ |
|
2 |
|
3 #include <curspriv.h> |
|
4 |
|
5 RCSID("$Id: insch.c,v 1.44 2008/07/13 16:08:18 wmcbrine Exp $") |
|
6 |
|
7 /*man-start************************************************************** |
|
8 |
|
9 Name: insch |
|
10 |
|
11 Synopsis: |
|
12 int insch(chtype ch); |
|
13 int winsch(WINDOW *win, chtype ch); |
|
14 int mvinsch(int y, int x, chtype ch); |
|
15 int mvwinsch(WINDOW *win, int y, int x, chtype ch); |
|
16 |
|
17 int insrawch(chtype ch); |
|
18 int winsrawch(WINDOW *win, chtype ch); |
|
19 int mvinsrawch(int y, int x, chtype ch); |
|
20 int mvwinsrawch(WINDOW *win, int y, int x, chtype ch); |
|
21 |
|
22 int ins_wch(const cchar_t *wch); |
|
23 int wins_wch(WINDOW *win, const cchar_t *wch); |
|
24 int mvins_wch(int y, int x, const cchar_t *wch); |
|
25 int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch); |
|
26 |
|
27 Description: |
|
28 The insch() functions insert a chtype into the window at the |
|
29 current or specified cursor position. The cursor is NOT |
|
30 advanced. A newline is equivalent to clrtoeol(); tabs are |
|
31 expanded; other control characters are converted as with |
|
32 unctrl(). |
|
33 |
|
34 The ins_wch() functions are the wide-character |
|
35 equivalents, taking cchar_t pointers rather than chtypes. |
|
36 |
|
37 Video attributes can be combined with a character by ORing |
|
38 them into the parameter. Text, including attributes, can be |
|
39 copied from one place to another using inch() and insch(). |
|
40 |
|
41 insrawch() etc. are PDCurses-specific wrappers for insch() etc. |
|
42 that disable the translation of control characters. |
|
43 |
|
44 Return Value: |
|
45 All functions return OK on success and ERR on error. |
|
46 |
|
47 Portability X/Open BSD SYS V |
|
48 insch Y Y Y |
|
49 winsch Y Y Y |
|
50 mvinsch Y Y Y |
|
51 mvwinsch Y Y Y |
|
52 insrawch - - - |
|
53 winsrawch - - - |
|
54 ins_wch Y |
|
55 wins_wch Y |
|
56 mvins_wch Y |
|
57 mvwins_wch Y |
|
58 |
|
59 **man-end****************************************************************/ |
|
60 |
|
61 #include <string.h> |
|
62 |
|
63 int winsch(WINDOW *win, chtype ch) |
|
64 { |
|
65 int x, y; |
|
66 chtype attr; |
|
67 bool xlat; |
|
68 |
|
69 PDC_LOG(("winsch() - called: win=%p ch=%x (text=%c attr=0x%x)\n", |
|
70 win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES)); |
|
71 |
|
72 if (!win) |
|
73 return ERR; |
|
74 |
|
75 x = win->_curx; |
|
76 y = win->_cury; |
|
77 |
|
78 if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) |
|
79 return ERR; |
|
80 |
|
81 xlat = !SP->raw_out && !(ch & A_ALTCHARSET); |
|
82 attr = ch & A_ATTRIBUTES; |
|
83 ch &= A_CHARTEXT; |
|
84 |
|
85 if (xlat && (ch < ' ' || ch == 0x7f)) |
|
86 { |
|
87 int x2; |
|
88 |
|
89 switch (ch) |
|
90 { |
|
91 case '\t': |
|
92 for (x2 = ((x / TABSIZE) + 1) * TABSIZE; x < x2; x++) |
|
93 { |
|
94 if (winsch(win, attr | ' ') == ERR) |
|
95 return ERR; |
|
96 } |
|
97 return OK; |
|
98 |
|
99 case '\n': |
|
100 wclrtoeol(win); |
|
101 break; |
|
102 |
|
103 case 0x7f: |
|
104 if (winsch(win, attr | '?') == ERR) |
|
105 return ERR; |
|
106 |
|
107 return winsch(win, attr | '^'); |
|
108 |
|
109 default: |
|
110 /* handle control chars */ |
|
111 |
|
112 if (winsch(win, attr | (ch + '@')) == ERR) |
|
113 return ERR; |
|
114 |
|
115 return winsch(win, attr | '^'); |
|
116 } |
|
117 } |
|
118 else |
|
119 { |
|
120 int maxx; |
|
121 chtype *temp; |
|
122 |
|
123 /* If the incoming character doesn't have its own attribute, |
|
124 then use the current attributes for the window. If it has |
|
125 attributes but not a color component, OR the attributes to |
|
126 the current attributes for the window. If it has a color |
|
127 component, use the attributes solely from the incoming |
|
128 character. */ |
|
129 |
|
130 if (!(attr & A_COLOR)) |
|
131 attr |= win->_attrs; |
|
132 |
|
133 /* wrs (4/10/93): Apply the same sort of logic for the window |
|
134 background, in that it only takes precedence if other color |
|
135 attributes are not there and that the background character |
|
136 will only print if the printing character is blank. */ |
|
137 |
|
138 if (!(attr & A_COLOR)) |
|
139 attr |= win->_bkgd & A_ATTRIBUTES; |
|
140 else |
|
141 attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); |
|
142 |
|
143 if (ch == ' ') |
|
144 ch = win->_bkgd & A_CHARTEXT; |
|
145 |
|
146 /* Add the attribute back into the character. */ |
|
147 |
|
148 ch |= attr; |
|
149 |
|
150 maxx = win->_maxx; |
|
151 temp = &win->_y[y][x]; |
|
152 |
|
153 memmove(temp + 1, temp, (maxx - x - 1) * sizeof(chtype)); |
|
154 |
|
155 win->_lastch[y] = maxx - 1; |
|
156 |
|
157 if ((win->_firstch[y] == _NO_CHANGE) || (win->_firstch[y] > x)) |
|
158 win->_firstch[y] = x; |
|
159 |
|
160 *temp = ch; |
|
161 } |
|
162 |
|
163 PDC_sync(win); |
|
164 |
|
165 return OK; |
|
166 } |
|
167 |
|
168 int insch(chtype ch) |
|
169 { |
|
170 PDC_LOG(("insch() - called\n")); |
|
171 |
|
172 return winsch(stdscr, ch); |
|
173 } |
|
174 |
|
175 int mvinsch(int y, int x, chtype ch) |
|
176 { |
|
177 PDC_LOG(("mvinsch() - called\n")); |
|
178 |
|
179 if (move(y, x) == ERR) |
|
180 return ERR; |
|
181 |
|
182 return winsch(stdscr, ch); |
|
183 } |
|
184 |
|
185 int mvwinsch(WINDOW *win, int y, int x, chtype ch) |
|
186 { |
|
187 PDC_LOG(("mvwinsch() - called\n")); |
|
188 |
|
189 if (wmove(win, y, x) == ERR) |
|
190 return ERR; |
|
191 |
|
192 return winsch(win, ch); |
|
193 } |
|
194 |
|
195 int winsrawch(WINDOW *win, chtype ch) |
|
196 { |
|
197 PDC_LOG(("winsrawch() - called: win=%p ch=%x " |
|
198 "(char=%c attr=0x%x)\n", win, ch, |
|
199 ch & A_CHARTEXT, ch & A_ATTRIBUTES)); |
|
200 |
|
201 if ((ch & A_CHARTEXT) < ' ' || (ch & A_CHARTEXT) == 0x7f) |
|
202 ch |= A_ALTCHARSET; |
|
203 |
|
204 return winsch(win, ch); |
|
205 } |
|
206 |
|
207 int insrawch(chtype ch) |
|
208 { |
|
209 PDC_LOG(("insrawch() - called\n")); |
|
210 |
|
211 return winsrawch(stdscr, ch); |
|
212 } |
|
213 |
|
214 int mvinsrawch(int y, int x, chtype ch) |
|
215 { |
|
216 PDC_LOG(("mvinsrawch() - called\n")); |
|
217 |
|
218 if (move(y, x) == ERR) |
|
219 return ERR; |
|
220 |
|
221 return winsrawch(stdscr, ch); |
|
222 } |
|
223 |
|
224 int mvwinsrawch(WINDOW *win, int y, int x, chtype ch) |
|
225 { |
|
226 PDC_LOG(("mvwinsrawch() - called\n")); |
|
227 |
|
228 if (wmove(win, y, x) == ERR) |
|
229 return ERR; |
|
230 |
|
231 return winsrawch(win, ch); |
|
232 } |
|
233 |
|
234 #ifdef PDC_WIDE |
|
235 int wins_wch(WINDOW *win, const cchar_t *wch) |
|
236 { |
|
237 PDC_LOG(("wins_wch() - called\n")); |
|
238 |
|
239 return wch ? winsch(win, *wch) : ERR; |
|
240 } |
|
241 |
|
242 int ins_wch(const cchar_t *wch) |
|
243 { |
|
244 PDC_LOG(("ins_wch() - called\n")); |
|
245 |
|
246 return wins_wch(stdscr, wch); |
|
247 } |
|
248 |
|
249 int mvins_wch(int y, int x, const cchar_t *wch) |
|
250 { |
|
251 PDC_LOG(("mvins_wch() - called\n")); |
|
252 |
|
253 if (move(y, x) == ERR) |
|
254 return ERR; |
|
255 |
|
256 return wins_wch(stdscr, wch); |
|
257 } |
|
258 |
|
259 int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch) |
|
260 { |
|
261 PDC_LOG(("mvwins_wch() - called\n")); |
|
262 |
|
263 if (wmove(win, y, x) == ERR) |
|
264 return ERR; |
|
265 |
|
266 return wins_wch(win, wch); |
|
267 } |
|
268 #endif |