|
|
1.1 root 1: /* $Id: curs_cio.c,v 1.15 2004/09/22 21:55:32 rswindell Exp $ */
2:
3: /****************************************************************************
4: * @format.tab-size 4 (Plain Text/Source Code File Header) *
5: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
6: * *
7: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
8: * *
9: * This library is free software; you can redistribute it and/or *
10: * modify it under the terms of the GNU Lesser General Public License *
11: * as published by the Free Software Foundation; either version 2 *
12: * of the License, or (at your option) any later version. *
13: * See the GNU Lesser General Public License for more details: lgpl.txt or *
14: * http://www.fsf.org/copyleft/lesser.html *
15: * *
16: * Anonymous FTP access to the most recent released source is available at *
17: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
18: * *
19: * Anonymous CVS access to the development source and modification history *
20: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
21: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
22: * (just hit return, no password is necessary) *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
24: * *
25: * For Synchronet coding style and modification guidelines, see *
26: * http://www.synchro.net/source.html *
27: * *
28: * You are encouraged to submit any modifications (preferably in Unix diff *
29: * format) via e-mail to [email protected] *
30: * *
31: * Note: If this box doesn't appear square, then you need to fix your tabs. *
32: ****************************************************************************/
33:
34: #include <sys/time.h>
35: #include <stdarg.h>
36: #include <stdio.h>
37: #include <stdlib.h>
38: #include <unistd.h>
39:
40: #include "gen_defs.h" /* xpdev, for BOOL/TRUE/FALSE */
41:
42: #include "ciolib.h"
43: #include "curs_cio.h"
44: #include "keys.h"
45: #include "mouse.h"
46: #include "vidmodes.h"
47:
48: static unsigned char curs_nextgetch=0;
49: const int curs_tabs[10]={9,17,25,33,41,49,57,65,73,80};
50:
51: static int lastattr=0;
52: static long mode;
53:
54: short curses_color(short color)
55: {
56: switch(color)
57: {
58: case 0 :
59: return(COLOR_BLACK);
60: case 1 :
61: return(COLOR_BLUE);
62: case 2 :
63: return(COLOR_GREEN);
64: case 3 :
65: return(COLOR_CYAN);
66: case 4 :
67: return(COLOR_RED);
68: case 5 :
69: return(COLOR_MAGENTA);
70: case 6 :
71: return(COLOR_YELLOW);
72: case 7 :
73: return(COLOR_WHITE);
74: case 8 :
75: return(COLOR_BLACK);
76: case 9 :
77: return(COLOR_BLUE);
78: case 10 :
79: return(COLOR_GREEN);
80: case 11 :
81: return(COLOR_CYAN);
82: case 12 :
83: return(COLOR_RED);
84: case 13 :
85: return(COLOR_MAGENTA);
86: case 14 :
87: return(COLOR_YELLOW);
88: case 15 :
89: return(COLOR_WHITE);
90: }
91: return(0);
92: }
93:
94: int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf)
95: {
96: int x,y;
97: int fillpos=0;
98: unsigned char attr;
99: unsigned char fill_char;
100: unsigned char orig_attr;
101: int oldx, oldy;
102: struct text_info ti;
103: unsigned char *fill;
104:
105: fill=fillbuf;
106: gettextinfo(&ti);
107:
108: if( sx < 1
109: || sy < 1
110: || ex < 1
111: || ey < 1
112: || sx > ti.screenwidth
113: || sy > ti.screenheight
114: || sx > ex
115: || sy > ey
116: || ex > ti.screenwidth
117: || ey > ti.screenheight
118: || fill==NULL)
119: return(0);
120:
121: getyx(stdscr,oldy,oldx);
122: orig_attr=lastattr;
123: for(y=sy-1;y<=ey-1;y++)
124: {
125: for(x=sx-1;x<=ex-1;x++)
126: {
127: fill_char=fill[fillpos++];
128: attr=fill[fillpos++];
129: textattr(attr);
130: move(y, x);
131: _putch(fill_char,FALSE);
132: }
133: }
134: textattr(orig_attr);
135: move(oldy, oldx);
136: refresh();
137: return(1);
138: }
139:
140: int curs_gettext(int sx, int sy, int ex, int ey, void *fillbuf)
141: {
142: int x,y;
143: int fillpos=0;
144: chtype attr;
145: unsigned char attrib;
146: unsigned char colour;
147: int oldx, oldy;
148: unsigned char thischar;
149: int ext_char;
150: struct text_info ti;
151: unsigned char *fill;
152:
153: fill=fillbuf;
154: gettextinfo(&ti);
155:
156: if( sx < 1
157: || sy < 1
158: || ex < 1
159: || ey < 1
160: || sx > ti.screenwidth
161: || sy > ti.screenheight
162: || sx > ex
163: || sy > ey
164: || ex > ti.screenwidth
165: || ey > ti.screenheight
166: || fill==NULL)
167: return(0);
168:
169: getyx(stdscr,oldy,oldx);
170: for(y=sy-1;y<=ey-1;y++)
171: {
172: for(x=sx-1;x<=ex-1;x++)
173: {
174: attr=mvinch(y, x);
175: if(attr&A_REVERSE) {
176: thischar=attr&255-'A'+1;
177: }
178: else if(attr&A_ALTCHARSET) {
179: if(!(mode==CIOLIB_MODE_CURSES_IBM)){
180: ext_char=A_ALTCHARSET|(attr&255);
181: /* likely ones */
182: if (ext_char == ACS_CKBOARD)
183: {
184: thischar=176;
185: }
186: else if (ext_char == ACS_BOARD)
187: {
188: thischar=177;
189: }
190: else if (ext_char == ACS_BSSB)
191: {
192: thischar=218;
193: }
194: else if (ext_char == ACS_SSBB)
195: {
196: thischar=192;
197: }
198: else if (ext_char == ACS_BBSS)
199: {
200: thischar=191;
201: }
202: else if (ext_char == ACS_SBBS)
203: {
204: thischar=217;
205: }
206: else if (ext_char == ACS_SBSS)
207: {
208: thischar=180;
209: }
210: else if (ext_char == ACS_SSSB)
211: {
212: thischar=195;
213: }
214: else if (ext_char == ACS_SSBS)
215: {
216: thischar=193;
217: }
218: else if (ext_char == ACS_BSSS)
219: {
220: thischar=194;
221: }
222: else if (ext_char == ACS_BSBS)
223: {
224: thischar=196;
225: }
226: else if (ext_char == ACS_SBSB)
227: {
228: thischar=179;
229: }
230: else if (ext_char == ACS_SSSS)
231: {
232: thischar=197;
233: }
234: else if (ext_char == ACS_BLOCK)
235: {
236: thischar=219;
237: }
238: else if (ext_char == ACS_UARROW)
239: {
240: thischar=30;
241: }
242: else if (ext_char == ACS_DARROW)
243: {
244: thischar=31;
245: }
246:
247: /* unlikely (Not in ncurses) */
248: else if (ext_char == ACS_SBSD)
249: {
250: thischar=181;
251: }
252: else if (ext_char == ACS_DBDS)
253: {
254: thischar=182;
255: }
256: else if (ext_char == ACS_BBDS)
257: {
258: thischar=183;
259: }
260: else if (ext_char == ACS_BBSD)
261: {
262: thischar=184;
263: }
264: else if (ext_char == ACS_DBDD)
265: {
266: thischar=185;
267: }
268: else if (ext_char == ACS_DBDB)
269: {
270: thischar=186;
271: }
272: else if (ext_char == ACS_BBDD)
273: {
274: thischar=187;
275: }
276: else if (ext_char == ACS_DBBD)
277: {
278: thischar=188;
279: }
280: else if (ext_char == ACS_DBBS)
281: {
282: thischar=189;
283: }
284: else if (ext_char == ACS_SBBD)
285: {
286: thischar=190;
287: }
288: else if (ext_char == ACS_SDSB)
289: {
290: thischar=198;
291: }
292: else if (ext_char == ACS_DSDB)
293: {
294: thischar=199;
295: }
296: else if (ext_char == ACS_DDBB)
297: {
298: thischar=200;
299: }
300: else if (ext_char == ACS_BDDB)
301: {
302: thischar=201;
303: }
304: else if (ext_char == ACS_DDBD)
305: {
306: thischar=202;
307: }
308: else if (ext_char == ACS_BDDD)
309: {
310: thischar=203;
311: }
312: else if (ext_char == ACS_DDDB)
313: {
314: thischar=204;
315: }
316: else if (ext_char == ACS_BDBD)
317: {
318: thischar=205;
319: }
320: else if (ext_char == ACS_DDDD)
321: {
322: thischar=206;
323: }
324: else if (ext_char == ACS_SDBD)
325: {
326: thischar=207;
327: }
328: else if (ext_char == ACS_DSBS)
329: {
330: thischar=208;
331: }
332: else if (ext_char == ACS_BDSD)
333: {
334: thischar=209;
335: }
336: else if (ext_char == ACS_BSDS)
337: {
338: thischar=210;
339: }
340: else if (ext_char == ACS_DSBB)
341: {
342: thischar=211;
343: }
344: else if (ext_char == ACS_SDBB)
345: {
346: thischar=212;
347: }
348: else if (ext_char == ACS_BDSB)
349: {
350: thischar=213;
351: }
352: else if (ext_char == ACS_BSDB)
353: {
354: thischar=214;
355: }
356: else if (ext_char == ACS_DSDS)
357: {
358: thischar=215;
359: }
360: else if (ext_char == ACS_SDSD)
361: {
362: thischar=216;
363: }
364: else
365: {
366: thischar=attr&255;
367: }
368: }
369: else {
370: if (ext_char == ACS_UARROW)
371: {
372: thischar=30;
373: }
374: else if (ext_char == ACS_DARROW)
375: {
376: thischar=31;
377: }
378: else
379: {
380: thischar=attr&255;
381: }
382: }
383: }
384: else
385: thischar=attr;
386: fill[fillpos++]=(unsigned char)(thischar);
387: attrib=0;
388: if (attr & A_BOLD)
389: {
390: attrib |= 8;
391: }
392: if (attr & A_BLINK)
393: {
394: attrib |= 128;
395: }
396: colour=PAIR_NUMBER(attr&A_COLOR)-1;
397: colour=((colour&56)<<1)|(colour&7);
398: fill[fillpos++]=colour|attrib;
399: }
400: }
401: move(oldy, oldx);
402: return(1);
403: }
404:
405: void curs_textattr(int attr)
406: {
407: chtype attrs=A_NORMAL;
408: int colour;
409:
410: if (lastattr==attr)
411: return;
412:
413: lastattr=attr;
414:
415: if (attr & 8) {
416: attrs |= A_BOLD;
417: }
418: if (attr & 128)
419: {
420: attrs |= A_BLINK;
421: }
422: colour = COLOR_PAIR( ((attr&7)|((attr>>1)&56))+1 );
423: #ifdef NCURSES_VERSION_MAJOR
424: attrset(attrs);
425: color_set(colour,NULL);
426: #else
427: attrset(attrs|colour);
428: #endif
429: /* bkgdset(colour); */
430: bkgdset(colour);
431: }
432:
433: int curs_kbhit(void)
434: {
435: struct timeval timeout;
436: fd_set rfds;
437:
438: if(curs_nextgetch)
439: return(1);
440: if(mouse_pending())
441: return(1);
442: timeout.tv_sec=0;
443: timeout.tv_usec=0;
444: FD_ZERO(&rfds);
445: FD_SET(fileno(stdin),&rfds);
446:
447: return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout));
448: }
449:
450: void curs_delay(long msec)
451: {
452: usleep(msec*1000);
453: }
454:
455: int curs_wherey(void)
456: {
457: int x,y;
458: getyx(stdscr,y,x);
459: return(y+1);
460: }
461:
462: int curs_wherex(void)
463: {
464: int x,y;
465: getyx(stdscr,y,x);
466: return(x+1);
467: }
468:
469: int _putch(unsigned char ch, BOOL refresh_now)
470: {
471: int ret;
472: chtype cha;
473:
474: if(!(mode==CIOLIB_MODE_CURSES_IBM))
475: {
476: switch(ch)
477: {
478: case 30:
479: cha=ACS_UARROW;
480: break;
481: case 31:
482: cha=ACS_DARROW;
483: break;
484: case 176:
485: cha=ACS_CKBOARD;
486: break;
487: case 177:
488: cha=ACS_BOARD;
489: break;
490: case 178:
491: cha=ACS_BOARD;
492: break;
493: case 179:
494: cha=ACS_SBSB;
495: break;
496: case 180:
497: cha=ACS_SBSS;
498: break;
499: case 181:
500: cha=ACS_SBSD;
501: break;
502: case 182:
503: cha=ACS_DBDS;
504: break;
505: case 183:
506: cha=ACS_BBDS;
507: break;
508: case 184:
509: cha=ACS_BBSD;
510: break;
511: case 185:
512: cha=ACS_DBDD;
513: break;
514: case 186:
515: cha=ACS_DBDB;
516: break;
517: case 187:
518: cha=ACS_BBDD;
519: break;
520: case 188:
521: cha=ACS_DBBD;
522: break;
523: case 189:
524: cha=ACS_DBBS;
525: break;
526: case 190:
527: cha=ACS_SBBD;
528: break;
529: case 191:
530: cha=ACS_BBSS;
531: break;
532: case 192:
533: cha=ACS_SSBB;
534: break;
535: case 193:
536: cha=ACS_SSBS;
537: break;
538: case 194:
539: cha=ACS_BSSS;
540: break;
541: case 195:
542: cha=ACS_SSSB;
543: break;
544: case 196:
545: cha=ACS_BSBS;
546: break;
547: case 197:
548: cha=ACS_SSSS;
549: break;
550: case 198:
551: cha=ACS_SDSB;
552: break;
553: case 199:
554: cha=ACS_DSDB;
555: break;
556: case 200:
557: cha=ACS_DDBB;
558: break;
559: case 201:
560: cha=ACS_BDDB;
561: break;
562: case 202:
563: cha=ACS_DDBD;
564: break;
565: case 203:
566: cha=ACS_BDDD;
567: break;
568: case 204:
569: cha=ACS_DDDB;
570: break;
571: case 205:
572: cha=ACS_BDBD;
573: break;
574: case 206:
575: cha=ACS_DDDD;
576: break;
577: case 207:
578: cha=ACS_SDBD;
579: break;
580: case 208:
581: cha=ACS_DSBS;
582: break;
583: case 209:
584: cha=ACS_BDSD;
585: break;
586: case 210:
587: cha=ACS_BSDS;
588: break;
589: case 211:
590: cha=ACS_DSBB;
591: break;
592: case 212:
593: cha=ACS_SDBB;
594: break;
595: case 213:
596: cha=ACS_BDSB;
597: break;
598: case 214:
599: cha=ACS_BSDB;
600: break;
601: case 215:
602: cha=ACS_DSDS;
603: break;
604: case 216:
605: cha=ACS_SDSD;
606: break;
607: case 217:
608: cha=ACS_SBBS;
609: break;
610: case 218:
611: cha=ACS_BSSB;
612: break;
613: case 219:
614: cha=ACS_BLOCK;
615: break;
616: default:
617: cha=ch;
618: }
619: }
620: else
621: cha=ch;
622:
623: if(!cha)
624: cha=' ';
625: if(cha == ' ')
626: ret=addch(A_BOLD|' ');
627: else if (cha<' ') {
628: attron(A_REVERSE);
629: ret=addch(cha+'A'-1);
630: attroff(A_REVERSE);
631: }
632: else
633: ret=addch(cha);
634:
635: if(refresh_now)
636: refresh();
637:
638: return(ret);
639: }
640:
641: void curs_gotoxy(int x, int y)
642: {
643: move(y-1,x-1);
644: refresh();
645: }
646:
647: void call_endwin(void)
648: {
649: endwin();
650: }
651:
652: int curs_initciolib(long inmode)
653: {
654: short fg, bg, pair=0;
655:
656: #ifdef XCURSES
657: char *argv[2]={"ciolib",NULL};
658:
659: Xinitscr(1,argv);
660: #else
661: char *term;
662: SCREEN *tst;
663:
664: term=getenv("TERM");
665: if(term==NULL)
666: return(0);
667: tst=newterm(term,stdout,stdin);
668: if(tst==NULL)
669: return(0);
670: endwin();
671: initscr();
672: #endif
673: start_color();
674: cbreak();
675: noecho();
676: nonl();
677: keypad(stdscr, TRUE);
678: scrollok(stdscr,FALSE);
679: raw();
680: halfdelay(1);
681: atexit(call_endwin);
682:
683: /* Set up color pairs */
684: for(bg=0;bg<8;bg++) {
685: for(fg=0;fg<8;fg++) {
686: init_pair(++pair,curses_color(fg),curses_color(bg));
687: }
688: }
689: mode = inmode;
690: #ifdef NCURSES_VERSION_MAJOR
691: if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION) {
692: mouseinterval(0);
693: cio_api.mouse=1;
694: }
695: else
696: mousemask(0,NULL);
697: #endif
698: return(1);
699: }
700:
701: void curs_gettextinfo(struct text_info *info)
702: {
703: getmaxyx(stdscr, info->screenheight, info->screenwidth);
704: if(has_colors())
705: info->currmode=COLOR_MODE;
706: else
707: info->currmode=MONO;
708: info->curx=wherex();
709: info->cury=wherey();
710: info->attribute=lastattr;
711: }
712:
713: void curs_setcursortype(int type) {
714: switch(type) {
715: case _NOCURSOR:
716: curs_set(0);
717: break;
718:
719: case _SOLIDCURSOR:
720: curs_set(2);
721: break;
722:
723: default: /* Normal cursor */
724: curs_set(1);
725: break;
726:
727: }
728: refresh();
729: }
730:
731: int curs_putch(int c)
732: {
733: struct text_info ti;
734: int ret;
735: int i;
736:
737: ret=c;
738: switch(c) {
739: case '\r':
740: gotoxy(1,wherey());
741: break;
742: case '\n':
743: gettextinfo(&ti);
744: if(wherey()==ti.winbottom-ti.wintop+1) {
745: wscroll();
746: }
747: else {
748: gotoxy(wherex(),wherey()+1);
749: }
750: break;
751: case 0x07:
752: beep();
753: break;
754: case 0x08:
755: gotoxy(wherex()-1,wherey());
756: _putch(' ',FALSE);
757: gotoxy(wherex()-1,wherey());
758: break;
759: case '\t':
760: for(i=0;i<10;i++) {
761: if(curs_tabs[i]>wherex()) {
762: while(wherex()<curs_tabs[i]) {
763: putch(' ');
764: }
765: break;
766: }
767: }
768: if(i==10) {
769: putch('\r');
770: putch('\n');
771: }
772: break;
773: default:
774: gettextinfo(&ti);
775: if(wherey()==ti.winbottom-ti.wintop+1
776: && wherex()==ti.winright-ti.winleft+1) {
777: if(_putch(c,TRUE)==ERR)
778: ret=EOF;
779: else {
780: wscroll();
781: gotoxy(ti.winleft,ti.cury);
782: }
783: }
784: else {
785: if(wherex()==ti.winright-ti.winleft+1) {
786: if(_putch(c,TRUE)==ERR)
787: ret=EOF;
788: else
789: gotoxy(ti.winleft,ti.cury+1);
790: }
791: else {
792: if(_putch(c,TRUE)==ERR)
793: ret=EOF;
794: else
795: gotoxy(ti.curx+1,ti.cury);
796: }
797: }
798: break;
799: }
800: }
801:
802: int curs_getch(void)
803: {
804: int ch;
805: MEVENT mevnt;
806:
807: if(curs_nextgetch) {
808: ch=curs_nextgetch;
809: curs_nextgetch=0;
810: }
811: else {
812: while((ch=getch())==ERR && !mouse_pending());
813: if(mouse_pending()) {
814: curs_nextgetch=CIO_KEY_MOUSE>>8;
815: ch=CIO_KEY_MOUSE & 0xff;
816: }
817: else {
818: if(ch > 255) {
819: switch(ch) {
820: case KEY_DOWN: /* Down-arrow */
821: curs_nextgetch=0x50;
822: ch=0;
823: break;
824:
825: case KEY_UP: /* Up-arrow */
826: curs_nextgetch=0x48;
827: ch=0;
828: break;
829:
830: case KEY_LEFT: /* Left-arrow */
831: curs_nextgetch=0x4b;
832: ch=0;
833: break;
834:
835: case KEY_RIGHT: /* Right-arrow */
836: curs_nextgetch=0x4d;
837: ch=0;
838: break;
839:
840: case KEY_HOME: /* Home key (upward+left arrow) */
841: curs_nextgetch=0x47;
842: ch=0;
843: break;
844:
845: case KEY_BACKSPACE: /* Backspace (unreliable) */
846: ch=8;
847: break;
848:
849: case KEY_F(1): /* Function Key */
850: curs_nextgetch=0x3b;
851: ch=0;
852: break;
853:
854: case KEY_F(2): /* Function Key */
855: curs_nextgetch=0x3c;
856: ch=0;
857: break;
858:
859: case KEY_F(3): /* Function Key */
860: curs_nextgetch=0x3d;
861: ch=0;
862: break;
863:
864: case KEY_F(4): /* Function Key */
865: curs_nextgetch=0x3e;
866: ch=0;
867: break;
868:
869: case KEY_F(5): /* Function Key */
870: curs_nextgetch=0x3f;
871: ch=0;
872: break;
873:
874: case KEY_F(6): /* Function Key */
875: curs_nextgetch=0x40;
876: ch=0;
877: break;
878:
879: case KEY_F(7): /* Function Key */
880: curs_nextgetch=0x41;
881: ch=0;
882: break;
883:
884: case KEY_F(8): /* Function Key */
885: curs_nextgetch=0x42;
886: ch=0;
887: break;
888:
889: case KEY_F(9): /* Function Key */
890: curs_nextgetch=0x43;
891: ch=0;
892: break;
893:
894: case KEY_F(10): /* Function Key */
895: curs_nextgetch=0x44;
896: ch=0;
897: break;
898:
899: case KEY_F(11): /* Function Key */
900: curs_nextgetch=0x57;
901: ch=0;
902: break;
903:
904: case KEY_F(12): /* Function Key */
905: curs_nextgetch=0x58;
906: ch=0;
907: break;
908:
909: case KEY_DC: /* Delete character */
910: curs_nextgetch=0x53;
911: ch=0;
912: break;
913:
914: case KEY_IC: /* Insert char or enter insert mode */
915: curs_nextgetch=0x52;
916: ch=0;
917: break;
918:
919: case KEY_EIC: /* Exit insert char mode */
920: curs_nextgetch=0x52;
921: ch=0;
922: break;
923:
924: case KEY_NPAGE: /* Next page */
925: curs_nextgetch=0x51;
926: ch=0;
927: break;
928:
929: case KEY_PPAGE: /* Previous page */
930: curs_nextgetch=0x49;
931: ch=0;
932: break;
933:
934: case KEY_ENTER: /* Enter or send (unreliable) */
935: curs_nextgetch=0x0d;
936: ch=0;
937: break;
938:
939: case KEY_A1: /* Upper left of keypad */
940: curs_nextgetch=0x47;
941: ch=0;
942: break;
943:
944: case KEY_A3: /* Upper right of keypad */
945: curs_nextgetch=0x49;
946: ch=0;
947: break;
948:
949: case KEY_B2: /* Center of keypad */
950: curs_nextgetch=0x4c;
951: ch=0;
952: break;
953:
954: case KEY_C1: /* Lower left of keypad */
955: curs_nextgetch=0x4f;
956: ch=0;
957: break;
958:
959: case KEY_C3: /* Lower right of keypad */
960: curs_nextgetch=0x51;
961: ch=0;
962: break;
963:
964: case KEY_BEG: /* Beg (beginning) */
965: curs_nextgetch=0x47;
966: ch=0;
967: break;
968:
969: case KEY_CANCEL: /* Cancel */
970: curs_nextgetch=0x03;
971: ch=0;
972: break;
973:
974: case KEY_END: /* End */
975: curs_nextgetch=0x4f;
976: ch=0;
977: break;
978:
979: case KEY_SELECT: /* Select - Is "End" in X */
980: curs_nextgetch=0x4f;
981: ch=0;
982: break;
983:
984: case KEY_MOUSE: /* Mouse stuff */
985: if(getmouse(&mevnt)==OK) {
986: int evnt=0;
987: switch(mevnt.bstate) {
988: case BUTTON1_PRESSED:
989: evnt=CIOLIB_BUTTON_1_PRESS;
990: break;
991: case BUTTON1_RELEASED:
992: evnt=CIOLIB_BUTTON_1_RELEASE;
993: break;
994: case BUTTON2_PRESSED:
995: evnt=CIOLIB_BUTTON_2_PRESS;
996: break;
997: case BUTTON2_RELEASED:
998: evnt=CIOLIB_BUTTON_2_RELEASE;
999: break;
1000: case BUTTON3_PRESSED:
1001: evnt=CIOLIB_BUTTON_3_PRESS;
1002: break;
1003: case BUTTON3_RELEASED:
1004: evnt=CIOLIB_BUTTON_3_RELEASE;
1005: break;
1006: case REPORT_MOUSE_POSITION:
1007: evnt=CIOLIB_MOUSE_MOVE;
1008: break;
1009: }
1010: ciomouse_gotevent(evnt, mevnt.x+1, mevnt.y+1);
1011: }
1012: break;
1013:
1014: default:
1015: curs_nextgetch=0xff;
1016: ch=0;
1017: break;
1018: }
1019: }
1020: }
1021: }
1022: return(ch);
1023: }
1024:
1025: int curs_getche(void)
1026: {
1027: int ch;
1028:
1029: if(curs_nextgetch)
1030: return(curs_getch());
1031: ch=curs_getch();
1032: if(ch)
1033: putch(ch);
1034: return(ch);
1035: }
1036:
1037: void curs_textmode(int mode)
1038: {
1039: return;
1040: }
1041:
1042: int curs_hidemouse(void)
1043: {
1044: /*
1045: #ifdef NCURSES_VERSION_MAJOR
1046: mousemask(0,NULL);
1047: return(0);
1048: #else
1049: return(-1);
1050: #endif
1051: */
1052: }
1053:
1054: int curs_showmouse(void)
1055: {
1056: /*
1057: #ifdef NCURSES_VERSION_MAJOR
1058: if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION)
1059: return(0);
1060: #endif
1061: return(-1);
1062: */
1063: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.