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