]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/pcvt/fed/select.c
merge fix for boot-time hang on centos' xen
[FreeBSD/FreeBSD.git] / usr.sbin / pcvt / fed / select.c
1 /*
2  * Copyright (c) 1992, 2000 Hellmuth Michaelis
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 /*---------------------------------------------------------------------------
28  *
29  *      select.c                font editor select character
30  *      ----------------------------------------------------
31  *
32  *      last edit-date: [Mon Mar 27 16:38:50 2000]
33  *
34  * $FreeBSD$
35  *
36  *---------------------------------------------------------------------------*/
37
38 #include "fed.h"
39
40 int sc, sr, scurchar;
41
42 int edit();
43
44 void sel_mode(void)
45 {
46         mvwprintw(cmd_win,1,1,"(E)dit      ");
47         mvwprintw(cmd_win,2,1,"(M)ove      ");
48         mvwprintw(cmd_win,3,1,"exchan(G)e  ");
49         mvwprintw(cmd_win,4,1,"(Q)uit/Save ");
50         mvwprintw(cmd_win,5,1,"e(X)it/Undo ");
51         mvwprintw(cmd_win,6,1,"            ");
52         mvwprintw(cmd_win,7,1,"            ");
53         mvwprintw(cmd_win,8,1,"            ");
54
55         mvwprintw(cmd_win,9 ,1,"            ");
56         mvwprintw(cmd_win,10,1,"            ");
57         mvwprintw(cmd_win,11,1,"            ");
58         mvwprintw(cmd_win,12,1,"            ");
59         mvwprintw(cmd_win,13,1,"(^P)rev Line");
60         mvwprintw(cmd_win,14,1,"(^N)ext Line");
61         mvwprintw(cmd_win,15,1,"(^F)orwd Col");
62         mvwprintw(cmd_win,16,1,"(^B)ack  Col");
63         wrefresh(cmd_win);
64 }
65
66 int selectc()
67 {
68         int c, r;
69         int ret;
70         char h, l;
71         unsigned int k_ch;
72
73         c = (curchar / 16);
74         r = (curchar % 16);
75
76         for(;;)
77         {
78                 dis_cmd("   Select Character");
79
80                 sel_mode();
81
82                 curchar = r + (c*16);
83
84                 display(curchar);
85
86                 h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT);
87                 l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT);
88                 wattron(set_win,A_REVERSE);
89                 mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l);
90                 wattroff(set_win,A_REVERSE);
91                 wmove(set_win,(r+1),((c*2)+1));
92                 wrefresh(set_win);
93
94                 k_ch = wgetch(set_win);
95
96                 switch(k_ch)
97                 {
98                         case K_LEFT:
99                         case KEY_LEFT:
100                                 if(c > 0)
101                                 {
102                                         normal_set(r,c);
103                                         c--;
104                                 }
105                                 break;
106
107                         case K_DOWN:
108                         case KEY_DOWN:
109                                 if(r < 15)
110                                 {
111                                         normal_set(r,c);
112                                         r++;
113                                 }
114                                 break;
115
116                         case K_UP:
117                         case KEY_UP:
118                                 if(r > 0)
119                                 {
120                                         normal_set(r,c);
121                                         r--;
122                                 }
123                                 break;
124
125                         case K_RIGHT:
126                         case KEY_RIGHT:
127                                 if(c < 15)
128                                 {
129                                         normal_set(r,c);
130                                         c++;
131                                 }
132                                 break;
133
134                         case 'e':
135                         case 'E':
136                                 edit_mode();
137                                 dis_cmd("   Edit Character");
138                                 display(curchar);
139                                 ret = edit();
140                                 if(ret == 1)
141                                         save_ch();
142                                 break;
143
144                         case 'g':
145                         case 'G':
146                                 dis_cmd("   Exchange: select Destination, then press RETURN or any other Key to ABORT");
147                                 sr = r;
148                                 sc = c;
149                                 scurchar = curchar;
150                                 if((curchar = sel_dest()) == -1)
151                                 { /* failsafe */
152                                         r = sr;
153                                         c = sc;
154                                         curchar = scurchar;
155                                 }
156                                 else
157                                 { /* valid return */
158                                         normal_set(r,c);
159                                         c = (curchar / 16);
160                                         r = (curchar % 16);
161                                         xchg_ch(scurchar,curchar);
162                                 }
163                                 break;
164
165                         case 'm':
166                         case 'M':
167                                 dis_cmd("   Move: select Destination, then press RETURN or any other Key to ABORT");
168                                 sr = r;
169                                 sc = c;
170                                 scurchar = curchar;
171                                 if((curchar = sel_dest()) == -1)
172                                 { /* failsafe */
173                                         r = sr;
174                                         c = sc;
175                                         curchar = scurchar;
176                                 }
177                                 else
178                                 { /* valid return */
179                                         normal_set(r,c);
180                                         c = (curchar / 16);
181                                         r = (curchar % 16);
182                                         move_ch(scurchar,curchar);
183                                 }
184                                 break;
185
186                         case 'q':
187                         case 'Q':
188                                 normal_set(r,c);
189                                 wrefresh(set_win);
190                                 return(1);
191                                 break;
192
193                         case 'x':
194                         case 'X':
195                                 normal_set(r,c);
196                                 wrefresh(set_win);
197                                 return(0);
198                                 break;
199
200                         case 0x0c:
201                                 wrefresh(curscr);
202                                 break;
203
204                         default:
205                                 beep();
206                                 break;
207
208                 }
209         }
210 }
211
212 void normal_set(int r, int c)
213 {
214         char h, l;
215
216         h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT);
217         l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT);
218         wattroff(set_win,A_REVERSE);
219         mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l);
220         wmove(set_win,(r+1),((c*2)+1));
221 }
222
223 int sel_dest(void)
224 {
225         int c, r;
226         char h, l;
227         unsigned int k_ch;
228
229         c = (curchar / 16);
230         r = (curchar % 16);
231
232         for(;;)
233         {
234
235                 curchar = r + (c*16);
236
237                 display(curchar);
238
239                 h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT);
240                 l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT);
241                 wattron(set_win,A_UNDERLINE);
242                 mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l);
243                 wattroff(set_win,A_UNDERLINE);
244                 wmove(set_win,(r+1),((c*2)+1));
245                 wrefresh(set_win);
246
247                 k_ch = wgetch(set_win);
248
249                 switch(k_ch)
250                 {
251                         case K_LEFT:
252                         case KEY_LEFT:
253                                 if(c > 0)
254                                 {
255                                         normal_uset(r,c);
256                                         c--;
257                                 }
258                                 break;
259
260                         case K_DOWN:
261                         case KEY_DOWN:
262                                 if(r < 15)
263                                 {
264                                         normal_uset(r,c);
265                                         r++;
266                                 }
267                                 break;
268
269                         case K_UP:
270                         case KEY_UP:
271                                 if(r > 0)
272                                 {
273                                         normal_uset(r,c);
274                                         r--;
275                                 }
276                                 break;
277
278                         case K_RIGHT:
279                         case KEY_RIGHT:
280                                 if(c < 15)
281                                 {
282                                         normal_uset(r,c);
283                                         c++;
284                                 }
285                                 break;
286
287                         case '\r':
288                         case '\n':
289                                 normal_uset(r,c);
290                                 return(r + (c*16));
291
292                         case 0x0c:
293                                 wrefresh(curscr);
294                                 break;
295
296                         default:
297                                 normal_uset(r,c);
298                                 return(-1);
299                 }
300         }
301 }
302
303 void normal_uset(int r, int c)
304 {
305         char h, l;
306
307         h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT);
308         l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT);
309
310         wattroff(set_win,A_UNDERLINE);
311         mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l);
312         wmove(set_win,(r+1),((c*2)+1));
313
314         if((r==sr) && (c==sc))
315         {
316                 wattron(set_win,A_REVERSE);
317                 mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l);
318                 wattroff(set_win,A_REVERSE);
319                 wmove(set_win,(r+1),((c*2)+1));
320         }
321 }
322
323
324
325 /*---------------------------------- E O F ----------------------------------*/