|
|
1.1 ! root 1: /* $Id: win32cio.c,v 1.43 2004/10/20 11:24:26 deuce 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 <windows.h> /* INPUT_RECORD, etc. */ ! 35: #include <genwrap.h> ! 36: #include <stdio.h> /* stdin */ ! 37: ! 38: #include "ciolib.h" ! 39: #include "keys.h" ! 40: #include "vidmodes.h" ! 41: #include "win32cio.h" ! 42: ! 43: const int cio_tabs[10]={9,17,25,33,41,49,57,65,73,80}; ! 44: ! 45: struct keyvals { ! 46: int VirtualKeyCode ! 47: ,Key ! 48: ,Shift ! 49: ,CTRL ! 50: ,ALT; ! 51: }; ! 52: ! 53: const struct keyvals keyval[] = ! 54: { ! 55: {VK_BACK, 0x08, 0x08, 0x7f, 0x0e00}, ! 56: {VK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, ! 57: {VK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, ! 58: {VK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, ! 59: {VK_SPACE, 0x20, 0x20, 0x0300, 0x20,}, ! 60: {'0', '0', ')', 0, 0x8100}, ! 61: {'1', '1', '!', 0, 0x7800}, ! 62: {'2', '2', '@', 0x0300, 0x7900}, ! 63: {'3', '3', '#', 0, 0x7a00}, ! 64: {'4', '4', '$', 0, 0x7b00}, ! 65: {'5', '5', '%', 0, 0x7c00}, ! 66: {'6', '6', '^', 0x1e, 0x7d00}, ! 67: {'7', '7', '&', 0, 0x7e00}, ! 68: {'8', '8', '*', 0, 0x7f00}, ! 69: {'9', '9', '(', 0, 0x8000}, ! 70: {'A', 'a', 'A', 0x01, 0x1e00}, ! 71: {'B', 'b', 'B', 0x02, 0x3000}, ! 72: {'C', 'c', 'C', 0x03, 0x2e00}, ! 73: {'D', 'd', 'D', 0x04, 0x2000}, ! 74: {'E', 'e', 'E', 0x05, 0x1200}, ! 75: {'F', 'f', 'F', 0x06, 0x2100}, ! 76: {'G', 'g', 'G', 0x07, 0x2200}, ! 77: {'H', 'h', 'H', 0x08, 0x2300}, ! 78: {'I', 'i', 'I', 0x09, 0x1700}, ! 79: {'J', 'j', 'J', 0x0a, 0x2400}, ! 80: {'K', 'k', 'K', 0x0b, 0x2500}, ! 81: {'L', 'l', 'L', 0x0c, 0x2600}, ! 82: {'M', 'm', 'M', 0x0d, 0x3200}, ! 83: {'N', 'n', 'N', 0x0e, 0x3100}, ! 84: {'O', 'o', 'O', 0x0f, 0x1800}, ! 85: {'P', 'p', 'P', 0x10, 0x1900}, ! 86: {'Q', 'q', 'Q', 0x11, 0x1000}, ! 87: {'R', 'r', 'R', 0x12, 0x1300}, ! 88: {'S', 's', 'S', 0x13, 0x1f00}, ! 89: {'T', 't', 'T', 0x14, 0x1400}, ! 90: {'U', 'u', 'U', 0x15, 0x1600}, ! 91: {'V', 'v', 'V', 0x16, 0x2f00}, ! 92: {'W', 'w', 'W', 0x17, 0x1100}, ! 93: {'X', 'x', 'X', 0x18, 0x2d00}, ! 94: {'Y', 'y', 'Y', 0x19, 0x1500}, ! 95: {'Z', 'z', 'Z', 0x1a, 0x2c00}, ! 96: {VK_PRIOR, 0x4900, 0x4900, 0x8400, 0x9900}, ! 97: {VK_NEXT, 0x5100, 0x5100, 0x7600, 0xa100}, ! 98: {VK_END, 0x4f00, 0x4f00, 0x7500, 0x9f00}, ! 99: {VK_HOME, 0x4700, 0x4700, 0x7700, 0x9700}, ! 100: {VK_LEFT, 0x4b00, 0x4b00, 0x7300, 0x9b00}, ! 101: {VK_UP, 0x4800, 0x4800, 0x8d00, 0x9800}, ! 102: {VK_RIGHT, 0x4d00, 0x4d00, 0x7400, 0x9d00}, ! 103: {VK_DOWN, 0x5000, 0x5000, 0x9100, 0xa000}, ! 104: {VK_INSERT, 0x5200, 0x5200, 0x9200, 0xa200}, ! 105: {VK_DELETE, 0x5300, 0x5300, 0x9300, 0xa300}, ! 106: {VK_NUMPAD0, '0', 0x5200, 0x9200, 0}, ! 107: {VK_NUMPAD1, '1', 0x4f00, 0x7500, 0}, ! 108: {VK_NUMPAD2, '2', 0x5000, 0x9100, 0}, ! 109: {VK_NUMPAD3, '3', 0x5100, 0x7600, 0}, ! 110: {VK_NUMPAD4, '4', 0x4b00, 0x7300, 0}, ! 111: {VK_NUMPAD5, '5', 0x4c00, 0x8f00, 0}, ! 112: {VK_NUMPAD6, '6', 0x4d00, 0x7400, 0}, ! 113: {VK_NUMPAD7, '7', 0x4700, 0x7700, 0}, ! 114: {VK_NUMPAD8, '8', 0x4800, 0x8d00, 0}, ! 115: {VK_NUMPAD9, '9', 0x4900, 0x8400, 0}, ! 116: {VK_MULTIPLY, '*', '*', 0x9600, 0x3700}, ! 117: {VK_ADD, '+', '+', 0x9000, 0x4e00}, ! 118: {VK_SUBTRACT, '-', '-', 0x8e00, 0x4a00}, ! 119: {VK_DECIMAL, '.', '.', 0x5300, 0x9300}, ! 120: {VK_DIVIDE, '/', '/', 0x9500, 0xa400}, ! 121: {VK_F1, 0x3b00, 0x5400, 0x5e00, 0x6800}, ! 122: {VK_F2, 0x3c00, 0x5500, 0x5f00, 0x6900}, ! 123: {VK_F3, 0x3d00, 0x5600, 0x6000, 0x6a00}, ! 124: {VK_F4, 0x3e00, 0x5700, 0x6100, 0x6b00}, ! 125: {VK_F5, 0x3f00, 0x5800, 0x6200, 0x6c00}, ! 126: {VK_F6, 0x4000, 0x5900, 0x6300, 0x6d00}, ! 127: {VK_F7, 0x4100, 0x5a00, 0x6400, 0x6e00}, ! 128: {VK_F8, 0x4200, 0x5b00, 0x6500, 0x6f00}, ! 129: {VK_F9, 0x4300, 0x5c00, 0x6600, 0x7000}, ! 130: {VK_F10, 0x4400, 0x5d00, 0x6700, 0x7100}, ! 131: {VK_F11, 0x8500, 0x8700, 0x8900, 0x8b00}, ! 132: {VK_F12, 0x8600, 0x8800, 0x8a00, 0x8c00}, ! 133: {0xdc, '\\', '|', 0x1c, 0x2b00}, ! 134: {0xbf, '/', '?', 0, 0x3500}, ! 135: {0xbd, '-', '_', 0x1f, 0x8200}, ! 136: {0xbb, '=', '+', 0, 0x8300}, ! 137: {0xdb, '[', '{', 0x1b, 0x1a00}, ! 138: {0xdd, ']', '}', 0x1d, 0x1b00}, ! 139: {0xba, ';', ':', 0, 0x2700}, ! 140: {0xde, '\'', '"', 0, 0x2800}, ! 141: {0xbc, ',', '<', 0, 0x3300}, ! 142: {0xbe, '.', '>', 0, 0x3400}, ! 143: {0xc0, '`', '~', 0, 0x2900}, ! 144: {0, 0, 0, 0, 0} /** END **/ ! 145: }; ! 146: ! 147: static int lastch=0; ! 148: static int domouse=1; ! 149: static DWORD last_state=0; ! 150: static int LastX=-1, LastY=-1; ! 151: static int xpos=1; ! 152: static int ypos=1; ! 153: ! 154: static int currattr=7; ! 155: static int modeidx=3; ! 156: ! 157: WORD DOStoWinAttr(int newattr) ! 158: { ! 159: WORD ret=0; ! 160: ! 161: if(newattr&0x01) ! 162: ret|=FOREGROUND_BLUE; ! 163: if(newattr&0x02) ! 164: ret|=FOREGROUND_GREEN; ! 165: if(newattr&0x04) ! 166: ret|=FOREGROUND_RED; ! 167: if(newattr&0x08) ! 168: ret|=FOREGROUND_INTENSITY; ! 169: if(newattr&0x10) ! 170: ret|=BACKGROUND_BLUE; ! 171: if(newattr&0x20) ! 172: ret|=BACKGROUND_GREEN; ! 173: if(newattr&0x40) ! 174: ret|=BACKGROUND_RED; ! 175: if(newattr&0x80) ! 176: ret|=BACKGROUND_INTENSITY; ! 177: return(ret); ! 178: } ! 179: ! 180: unsigned char WintoDOSAttr(WORD newattr) ! 181: { ! 182: unsigned char ret=0; ! 183: ! 184: if(newattr&FOREGROUND_BLUE) ! 185: ret|=0x01; ! 186: if(newattr&FOREGROUND_GREEN) ! 187: ret|=0x02; ! 188: if(newattr&FOREGROUND_RED) ! 189: ret|=0x04; ! 190: if(newattr&FOREGROUND_INTENSITY) ! 191: ret|=0x08; ! 192: if(newattr&BACKGROUND_BLUE) ! 193: ret|=0x10; ! 194: if(newattr&BACKGROUND_GREEN) ! 195: ret|=0x20; ! 196: if(newattr&BACKGROUND_RED) ! 197: ret|=0x40; ! 198: if(newattr&BACKGROUND_INTENSITY) ! 199: ret|=0x80; ! 200: return(ret); ! 201: } ! 202: ! 203: int win32_getchcode(WORD code, DWORD state) ! 204: { ! 205: int i; ! 206: ! 207: for(i=0;keyval[i].Key;i++) { ! 208: if(keyval[i].VirtualKeyCode==code) { ! 209: if(state & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED)) ! 210: return(keyval[i].ALT); ! 211: if(state & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) ! 212: return(keyval[i].CTRL); ! 213: if(state & (SHIFT_PRESSED)) ! 214: return(keyval[i].Shift); ! 215: return(keyval[i].Key); ! 216: } ! 217: } ! 218: return(0); ! 219: } ! 220: ! 221: int win32_keyboardio(int isgetch) ! 222: { ! 223: INPUT_RECORD input; ! 224: DWORD num=0; ! 225: ! 226: while(1) { ! 227: if(lastch) { ! 228: if(isgetch) { ! 229: int ch; ! 230: ch=lastch&0xff; ! 231: lastch>>=8; ! 232: return(ch); ! 233: } ! 234: else ! 235: return(TRUE); ! 236: } ! 237: ! 238: while(1) { ! 239: GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &num); ! 240: if(num || mouse_pending()) ! 241: break; ! 242: if(isgetch) ! 243: SLEEP(1); ! 244: else ! 245: return(FALSE); ! 246: } ! 247: ! 248: if(mouse_pending()) { ! 249: lastch=CIO_KEY_MOUSE; ! 250: continue; ! 251: } ! 252: ! 253: if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num) ! 254: || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT)) ! 255: continue; ! 256: ! 257: switch(input.EventType) { ! 258: case KEY_EVENT: ! 259: if(input.Event.KeyEvent.bKeyDown) ! 260: lastch=win32_getchcode(input.Event.KeyEvent.wVirtualKeyCode, input.Event.KeyEvent.dwControlKeyState); ! 261: break; ! 262: case MOUSE_EVENT: ! 263: if(domouse) { ! 264: if(input.Event.MouseEvent.dwMousePosition.X+1 != LastX || input.Event.MouseEvent.dwMousePosition.Y+1 != LastY) { ! 265: LastX=input.Event.MouseEvent.dwMousePosition.X+1; ! 266: LastY=input.Event.MouseEvent.dwMousePosition.Y+1; ! 267: ciomouse_gotevent(CIOLIB_MOUSE_MOVE,LastX,LastY); ! 268: } ! 269: if(last_state != input.Event.MouseEvent.dwButtonState) { ! 270: switch(input.Event.MouseEvent.dwButtonState ^ last_state) { ! 271: case FROM_LEFT_1ST_BUTTON_PRESSED: ! 272: if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) ! 273: ciomouse_gotevent(CIOLIB_BUTTON_1_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 274: else ! 275: ciomouse_gotevent(CIOLIB_BUTTON_1_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 276: break; ! 277: case FROM_LEFT_2ND_BUTTON_PRESSED: ! 278: if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) ! 279: ciomouse_gotevent(CIOLIB_BUTTON_2_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 280: else ! 281: ciomouse_gotevent(CIOLIB_BUTTON_2_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 282: break; ! 283: case RIGHTMOST_BUTTON_PRESSED: ! 284: if(input.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED) ! 285: ciomouse_gotevent(CIOLIB_BUTTON_3_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 286: else ! 287: ciomouse_gotevent(CIOLIB_BUTTON_3_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1); ! 288: break; ! 289: } ! 290: last_state=input.Event.MouseEvent.dwButtonState; ! 291: } ! 292: } ! 293: } ! 294: } ! 295: } ! 296: ! 297: int win32_kbhit(void) ! 298: { ! 299: return(win32_keyboardio(FALSE)); ! 300: } ! 301: ! 302: int win32_getch(void) ! 303: { ! 304: return(win32_keyboardio(TRUE)); ! 305: } ! 306: ! 307: int win32_getche(void) ! 308: { ! 309: int ch; ! 310: ! 311: ch=win32_getch(); ! 312: if(ch) ! 313: putch(ch); ! 314: return(ch); ! 315: } ! 316: ! 317: #ifndef ENABLE_EXTENDED_FLAGS ! 318: #define ENABLE_INSERT_MODE 0x0020 ! 319: #define ENABLE_QUICK_EDIT_MODE 0x0040 ! 320: #define ENABLE_EXTENDED_FLAGS 0x0080 ! 321: #define ENABLE_AUTO_POSITION 0x0100 ! 322: #endif ! 323: ! 324: int win32_initciolib(long inmode) ! 325: { ! 326: DWORD conmode; ! 327: int i,j; ! 328: ! 329: if(!isatty(fileno(stdin))) ! 330: return(0); ! 331: if(!GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &conmode)) ! 332: return(0); ! 333: conmode&=~(ENABLE_PROCESSED_INPUT|ENABLE_QUICK_EDIT_MODE); ! 334: conmode|=ENABLE_MOUSE_INPUT; ! 335: if(!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), conmode)) ! 336: return(0); ! 337: ! 338: if(!GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &conmode)) ! 339: return(0); ! 340: conmode&=~ENABLE_PROCESSED_OUTPUT; ! 341: conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT; ! 342: if(!SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), conmode)) ! 343: return(0); ! 344: ! 345: win32_textmode(inmode); ! 346: cio_api.mouse=1; ! 347: return(1); ! 348: } ! 349: ! 350: int win32_hidemouse(void) ! 351: { ! 352: /* domouse=0; */ ! 353: return(0); ! 354: } ! 355: ! 356: int win32_showmouse(void) ! 357: { ! 358: /* domouse=1; */ ! 359: return(0); ! 360: } ! 361: ! 362: void win32_textmode(int mode) ! 363: { ! 364: int i; ! 365: COORD sz; ! 366: SMALL_RECT rc; ! 367: ! 368: for(i=0;i<NUMMODES;i++) { ! 369: if(vparams[i].mode==mode) ! 370: modeidx=i; ! 371: } ! 372: sz.X=vparams[modeidx].cols; ! 373: sz.Y=vparams[modeidx].rows; ! 374: rc.Left=0; ! 375: rc.Right=vparams[modeidx].cols-1; ! 376: rc.Top=0; ! 377: rc.Bottom=vparams[modeidx].rows-1; ! 378: SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),sz); ! 379: SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE),TRUE,&rc); ! 380: SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),sz); ! 381: } ! 382: ! 383: int win32_gettext(int left, int top, int right, int bottom, void* buf) ! 384: { ! 385: CHAR_INFO *ci; ! 386: int x; ! 387: int y; ! 388: COORD bs; ! 389: COORD bc; ! 390: SMALL_RECT reg; ! 391: unsigned char *bu; ! 392: ! 393: bu=buf; ! 394: bs.X=right-left+1; ! 395: bs.Y=bottom-top+1; ! 396: bc.X=0; ! 397: bc.Y=0; ! 398: reg.Left=left-1; ! 399: reg.Right=right-1; ! 400: reg.Top=top-1; ! 401: reg.Bottom=bottom-1; ! 402: ci=(CHAR_INFO *)malloc(sizeof(CHAR_INFO)*(bs.X*bs.Y)); ! 403: ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),ci,bs,bc,®); ! 404: for(y=0;y<=(bottom-top);y++) { ! 405: for(x=0;x<=(right-left);x++) { ! 406: bu[((y*bs.X)+x)*2]=ci[(y*bs.X)+x].Char.AsciiChar; ! 407: bu[(((y*bs.X)+x)*2)+1]=WintoDOSAttr(ci[(y*bs.X)+x].Attributes); ! 408: } ! 409: } ! 410: free(ci); ! 411: return 1; ! 412: } ! 413: ! 414: void win32_gettextinfo(struct text_info* info) ! 415: { ! 416: info->currmode=vparams[modeidx].mode; ! 417: info->curx=xpos; ! 418: info->cury=ypos; ! 419: info->attribute=currattr; ! 420: info->screenheight=vparams[modeidx].rows; ! 421: info->screenwidth=vparams[modeidx].cols; ! 422: } ! 423: ! 424: void win32_gotoxy(int x, int y) ! 425: { ! 426: COORD cp; ! 427: ! 428: xpos=x; ! 429: ypos=y; ! 430: cp.X=x-1; ! 431: cp.Y=y-1; ! 432: if(!dont_move_cursor) ! 433: SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cp); ! 434: } ! 435: ! 436: void win32_highvideo(void) ! 437: { ! 438: win32_textattr(currattr|0x08); ! 439: } ! 440: ! 441: ! 442: void win32_lowvideo(void) ! 443: { ! 444: win32_textattr(currattr&0xf8); ! 445: } ! 446: ! 447: ! 448: void win32_normvideo(void) ! 449: { ! 450: win32_textattr(7); ! 451: } ! 452: ! 453: int win32_puttext(int left, int top, int right, int bottom, void* buf) ! 454: { ! 455: CHAR_INFO *ci; ! 456: int x; ! 457: int y; ! 458: COORD bs; ! 459: COORD bc; ! 460: SMALL_RECT reg; ! 461: unsigned char *bu; ! 462: ! 463: bu=buf; ! 464: bs.X=right-left+1; ! 465: bs.Y=bottom-top+1; ! 466: bc.X=0; ! 467: bc.Y=0; ! 468: reg.Left=left-1; ! 469: reg.Right=right-1; ! 470: reg.Top=top-1; ! 471: reg.Bottom=bottom-1; ! 472: ci=(CHAR_INFO *)malloc(sizeof(CHAR_INFO)*(bs.X*bs.Y)); ! 473: for(y=0;y<bs.Y;y++) { ! 474: for(x=0;x<bs.X;x++) { ! 475: ci[(y*bs.X)+x].Char.AsciiChar=bu[((y*bs.X)+x)*2]; ! 476: ci[(y*bs.X)+x].Attributes=DOStoWinAttr(bu[(((y*bs.X)+x)*2)+1]); ! 477: } ! 478: } ! 479: WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),ci,bs,bc,®); ! 480: free(ci); ! 481: return 1; ! 482: } ! 483: ! 484: void win32_textattr(int newattr) ! 485: { ! 486: /* SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),DOStoWinAttr(newattr)); */ ! 487: currattr=newattr; ! 488: } ! 489: ! 490: ! 491: void win32_textbackground(int newcolor) ! 492: { ! 493: win32_textattr((currattr&0x0f)|((newcolor&0xf0)<<4)); ! 494: } ! 495: ! 496: ! 497: void win32_textcolor(int newcolor) ! 498: { ! 499: win32_textattr((currattr&0xf0)|((newcolor&0x0f)<<4)); ! 500: } ! 501: ! 502: void win32_setcursortype(int type) ! 503: { ! 504: CONSOLE_CURSOR_INFO ci; ! 505: ! 506: switch(type) { ! 507: case _NOCURSOR: ! 508: ci.bVisible=FALSE; ! 509: ci.dwSize=1; ! 510: break; ! 511: ! 512: case _SOLIDCURSOR: ! 513: ci.bVisible=TRUE; ! 514: ci.dwSize=99; ! 515: break; ! 516: ! 517: default: /* Normal cursor */ ! 518: ci.bVisible=TRUE; ! 519: ci.dwSize=13; ! 520: break; ! 521: } ! 522: SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&ci); ! 523: } ! 524: ! 525: int win32_wherex(void) ! 526: { ! 527: return(xpos); ! 528: } ! 529: ! 530: int win32_wherey(void) ! 531: { ! 532: return(ypos); ! 533: } ! 534: ! 535: int win32_putch(int ch) ! 536: { ! 537: struct text_info ti; ! 538: unsigned char buf[2]; ! 539: ! 540: buf[0]=ch; ! 541: buf[1]=currattr; ! 542: ! 543: gettextinfo(&ti); ! 544: switch(ch) { ! 545: case '\r': ! 546: win32_gotoxy(1,ypos); ! 547: break; ! 548: case '\n': ! 549: if(ypos==ti.winbottom-ti.wintop+1) ! 550: wscroll(); ! 551: else ! 552: win32_gotoxy(xpos,ypos+1); ! 553: break; ! 554: case '\b': ! 555: if(ti.curx>ti.winleft) { ! 556: buf[0]=' '; ! 557: win32_gotoxy(xpos-1,ypos); ! 558: puttext(xpos,ypos,xpos,ypos,buf); ! 559: } ! 560: break; ! 561: case 7: /* Bell */ ! 562: MessageBeep(MB_OK); ! 563: break; ! 564: default: ! 565: if(ypos==ti.winbottom-ti.wintop+1 ! 566: && xpos==ti.winright-ti.winleft+1) { ! 567: puttext(xpos,ypos,xpos,ypos,buf); ! 568: win32_gotoxy(1,ypos); ! 569: wscroll(); ! 570: } ! 571: else { ! 572: if(xpos==ti.winright-ti.winleft+1) { ! 573: puttext(xpos,ypos,xpos,ypos,buf); ! 574: win32_gotoxy(1,ypos+1); ! 575: } ! 576: else { ! 577: puttext(xpos,ypos,xpos,ypos,buf); ! 578: win32_gotoxy(xpos+1,ypos); ! 579: } ! 580: } ! 581: break; ! 582: } ! 583: return(ch); ! 584: } ! 585: ! 586: void win32_settitle(const char *title) ! 587: { ! 588: SetConsoleTitle(title); ! 589: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.