diff options
Diffstat (limited to 'usr.sbin/pcvt/fed/select.c')
-rw-r--r-- | usr.sbin/pcvt/fed/select.c | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/usr.sbin/pcvt/fed/select.c b/usr.sbin/pcvt/fed/select.c new file mode 100644 index 000000000000..b6993bb1f52a --- /dev/null +++ b/usr.sbin/pcvt/fed/select.c @@ -0,0 +1,334 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * select.c, 3.00, last edit-date: [Sun Jan 2 20:09:36 1994] + */ + +/*--------------------------------------------------------------------------- + * + * select.c font editor select character + * ---------------------------------------------------- + * + * written by Hellmuth Michaelis, hm@hcshh.hcs.de + * + * -hm first public release + * -hm debugging + * + *---------------------------------------------------------------------------*/ + +#include "fed.h" + +int sc, sr, scurchar; + +int edit(); + +void sel_mode(void) +{ + mvwprintw(cmd_win,1,1,"(E)dit "); + mvwprintw(cmd_win,2,1,"(M)ove "); + mvwprintw(cmd_win,3,1,"exchan(G)e "); + mvwprintw(cmd_win,4,1,"(Q)uit/Save "); + mvwprintw(cmd_win,5,1,"e(X)it/Undo "); + mvwprintw(cmd_win,6,1," "); + mvwprintw(cmd_win,7,1," "); + mvwprintw(cmd_win,8,1," "); + + mvwprintw(cmd_win,9 ,1," "); + mvwprintw(cmd_win,10,1," "); + mvwprintw(cmd_win,11,1," "); + mvwprintw(cmd_win,12,1," "); + mvwprintw(cmd_win,13,1,"(^P)rev Line"); + mvwprintw(cmd_win,14,1,"(^N)ext Line"); + mvwprintw(cmd_win,15,1,"(^F)orwd Col"); + mvwprintw(cmd_win,16,1,"(^B)ack Col"); + wrefresh(cmd_win); +} + +int selectc() +{ + int c, r; + int ret; + char h, l; + unsigned int k_ch; + + c = (curchar / 16); + r = (curchar % 16); + + for(;;) + { + dis_cmd(" Select Character"); + + sel_mode(); + + curchar = r + (c*16); + + display(curchar); + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattron(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_REVERSE); + wmove(set_win,(r+1),((c*2)+1)); + wrefresh(set_win); + + k_ch = wgetch(set_win); + + switch(k_ch) + { + case K_LEFT: + case KEY_LEFT: + if(c > 0) + { + normal_set(r,c); + c--; + } + break; + + case K_DOWN: + case KEY_DOWN: + if(r < 15) + { + normal_set(r,c); + r++; + } + break; + + case K_UP: + case KEY_UP: + if(r > 0) + { + normal_set(r,c); + r--; + } + break; + + case K_RIGHT: + case KEY_RIGHT: + if(c < 15) + { + normal_set(r,c); + c++; + } + break; + + case 'e': + case 'E': + edit_mode(); + dis_cmd(" Edit Character"); + display(curchar); + ret = edit(); + if(ret == 1) + save_ch(); + break; + + case 'g': + case 'G': + dis_cmd(" Exchange: select Destination, then press RETURN or any other Key to ABORT"); + sr = r; + sc = c; + scurchar = curchar; + if((curchar = sel_dest()) == -1) + { /* failsafe */ + r = sr; + c = sc; + curchar = scurchar; + } + else + { /* valid return */ + normal_set(r,c); + c = (curchar / 16); + r = (curchar % 16); + xchg_ch(scurchar,curchar); + } + break; + + case 'm': + case 'M': + dis_cmd(" Move: select Destination, then press RETURN or any other Key to ABORT"); + sr = r; + sc = c; + scurchar = curchar; + if((curchar = sel_dest()) == -1) + { /* failsafe */ + r = sr; + c = sc; + curchar = scurchar; + } + else + { /* valid return */ + normal_set(r,c); + c = (curchar / 16); + r = (curchar % 16); + move_ch(scurchar,curchar); + } + break; + + case 'q': + case 'Q': + normal_set(r,c); + wrefresh(set_win); + return(1); + break; + + case 'x': + case 'X': + normal_set(r,c); + wrefresh(set_win); + return(0); + break; + + case 0x0c: + wrefresh(curscr); + break; + + default: + beep(); + break; + + } + } +} + +void normal_set(int r, int c) +{ + char h, l; + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattroff(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wmove(set_win,(r+1),((c*2)+1)); +} + +int sel_dest(void) +{ + int c, r; + char h, l; + unsigned int k_ch; + + c = (curchar / 16); + r = (curchar % 16); + + for(;;) + { + + curchar = r + (c*16); + + display(curchar); + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattron(set_win,A_UNDERLINE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_UNDERLINE); + wmove(set_win,(r+1),((c*2)+1)); + wrefresh(set_win); + + k_ch = wgetch(set_win); + + switch(k_ch) + { + case K_LEFT: + case KEY_LEFT: + if(c > 0) + { + normal_uset(r,c); + c--; + } + break; + + case K_DOWN: + case KEY_DOWN: + if(r < 15) + { + normal_uset(r,c); + r++; + } + break; + + case K_UP: + case KEY_UP: + if(r > 0) + { + normal_uset(r,c); + r--; + } + break; + + case K_RIGHT: + case KEY_RIGHT: + if(c < 15) + { + normal_uset(r,c); + c++; + } + break; + + case '\r': + case '\n': + normal_uset(r,c); + return(r + (c*16)); + + case 0x0c: + wrefresh(curscr); + break; + + default: + normal_uset(r,c); + return(-1); + } + } +} + +void normal_uset(int r, int c) +{ + char h, l; + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + + wattroff(set_win,A_UNDERLINE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wmove(set_win,(r+1),((c*2)+1)); + + if((r==sr) && (c==sc)) + { + wattron(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_REVERSE); + wmove(set_win,(r+1),((c*2)+1)); + } +} + + + +/*---------------------------------- E O F ----------------------------------*/ |