From e787cac39ae395f74ddef363ba67474a24f6408d Mon Sep 17 00:00:00 2001 From: xianya Date: Sat, 28 Dec 2024 17:24:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0pdcurses=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=9B=BE=E5=BD=A2=E5=8C=96=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A4=B4=E6=96=87=E4=BB=B6ui.h=EF=BC=8Cpdcurses=E4=BE=9D?= =?UTF-8?q?=E8=B5=96pdcurses.a,curses.h=EF=BC=8C=E5=88=86=E7=A6=BBlogin?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=92=8Cui=E6=A8=A1=E5=9D=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 18 +- include/curses.h | 1440 ++++++++++++++++++++++++++++++++++++++++++++ include/function.h | 23 +- include/myerror.h | 8 +- include/ui.h | 17 + lib/pdcurses.a | Bin 0 -> 195646 bytes login.c | 0 main.c | 31 +- ui.c | 209 +++++++ 9 files changed, 1686 insertions(+), 60 deletions(-) create mode 100644 include/curses.h create mode 100644 include/ui.h create mode 100644 lib/pdcurses.a create mode 100644 login.c create mode 100644 ui.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cce7c21..db8b442 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,19 @@ -cmake_minimum_required(VERSION 3.29) +cmake_minimum_required(VERSION 3.28.6) project(o C) -set(CMAKE_C_STANDARD 11) - -include_directories(include) - -include_directories(data) - +set(CMAKE_C_STANDARD 99) +set(LIBRARY_PATH "${CMAKE_SOURCE_DIR}/lib") +set(LIBRARY_NAME "pdcurses.a") add_executable(o + include/curses.h include/function.h include/sqlite3.h include/sqlite3ext.h include/extern.h include/myerror.h main.c - sqlite3.c) + sqlite3.c + login.c + ui.c + include/ui.h) +target_link_libraries(o "${LIBRARY_PATH}/${LIBRARY_NAME}") \ No newline at end of file diff --git a/include/curses.h b/include/curses.h new file mode 100644 index 0000000..e4ba377 --- /dev/null +++ b/include/curses.h @@ -0,0 +1,1440 @@ +/*----------------------------------------------------------------------* + * PDCurses * + *----------------------------------------------------------------------*/ + +#ifndef __PDCURSES__ +#define __PDCURSES__ 1 + +/*man-start************************************************************** + +Define before inclusion (only those needed): + + XCURSES if building / built for X11 + PDC_RGB if you want to use RGB color definitions + (Red = 1, Green = 2, Blue = 4) instead of BGR + PDC_WIDE if building / built with wide-character support + PDC_DLL_BUILD if building / built as a Windows DLL + PDC_NCMOUSE to use the ncurses mouse API instead + of PDCurses' traditional mouse API + +Defined by this header: + + PDCURSES PDCurses-only features are available + PDC_BUILD API build version + PDC_VER_MAJOR major version number + PDC_VER_MINOR minor version number + PDC_VERDOT version string + +**man-end****************************************************************/ + +#define PDCURSES 1 +#define PDC_BUILD 3907 +#define PDC_VER_MAJOR 3 +#define PDC_VER_MINOR 9 +#define PDC_VERDOT "3.9" + +#define CHTYPE_LONG 1 /* chtype >= 32 bits */ + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +# define PDC_99 1 +#endif + +#if defined(__cplusplus) && __cplusplus >= 199711L +# define PDC_PP98 1 +#endif + +/*----------------------------------------------------------------------*/ + +#include +#include +#include + +#ifdef PDC_WIDE +# include +#endif + +#if defined(PDC_99) && !defined(__bool_true_false_are_defined) +# include +#endif + +#ifdef __cplusplus +extern "C" +{ +# ifndef PDC_PP98 +# define bool _bool +# endif +#endif + +/*---------------------------------------------------------------------- + * + * Constants and Types + * + */ + +#undef FALSE +#define FALSE 0 + +#undef TRUE +#define TRUE 1 + +#undef ERR +#define ERR (-1) + +#undef OK +#define OK 0 + +#if !defined(PDC_PP98) && !defined(__bool_true_false_are_defined) +typedef unsigned char bool; +#endif + +#if _LP64 +typedef unsigned int chtype; +#else +typedef unsigned long chtype; /* 16-bit attr + 16-bit char */ +#endif + +#ifdef PDC_WIDE +typedef chtype cchar_t; +#endif + +typedef chtype attr_t; + +/*---------------------------------------------------------------------- + * + * Version Info + * + */ + +/* Use this structure with PDC_get_version() for run-time info about the + way the library was built, in case it doesn't match the header. */ + +typedef struct +{ + short flags; /* flags OR'd together (see below) */ + short build; /* PDC_BUILD at compile time */ + unsigned char major; /* PDC_VER_MAJOR */ + unsigned char minor; /* PDC_VER_MINOR */ + unsigned char csize; /* sizeof chtype */ + unsigned char bsize; /* sizeof bool */ +} PDC_VERSION; + +enum +{ + PDC_VFLAG_DEBUG = 1, /* set if built with -DPDCDEBUG */ + PDC_VFLAG_WIDE = 2, /* -DPDC_WIDE */ + PDC_VFLAG_UTF8 = 4, /* -DPDC_FORCE_UTF8 */ + PDC_VFLAG_DLL = 8, /* -DPDC_DLL_BUILD */ + PDC_VFLAG_RGB = 16 /* -DPDC_RGB */ +}; + +/*---------------------------------------------------------------------- + * + * Mouse Interface + * + */ + +#if _LP64 +typedef unsigned int mmask_t; +#else +typedef unsigned long mmask_t; +#endif + +typedef struct +{ + int x; /* absolute column, 0 based, measured in characters */ + int y; /* absolute row, 0 based, measured in characters */ + short button[3]; /* state of each button */ + int changes; /* flags indicating what has changed with the mouse */ +} MOUSE_STATUS; + +#define BUTTON_RELEASED 0x0000 +#define BUTTON_PRESSED 0x0001 +#define BUTTON_CLICKED 0x0002 +#define BUTTON_DOUBLE_CLICKED 0x0003 +#define BUTTON_TRIPLE_CLICKED 0x0004 +#define BUTTON_MOVED 0x0005 /* PDCurses */ +#define WHEEL_SCROLLED 0x0006 /* PDCurses */ +#define BUTTON_ACTION_MASK 0x0007 /* PDCurses */ + +#define PDC_BUTTON_SHIFT 0x0008 /* PDCurses */ +#define PDC_BUTTON_CONTROL 0x0010 /* PDCurses */ +#define PDC_BUTTON_ALT 0x0020 /* PDCurses */ +#define BUTTON_MODIFIER_MASK 0x0038 /* PDCurses */ + +#define MOUSE_X_POS (Mouse_status.x) +#define MOUSE_Y_POS (Mouse_status.y) + +/* + * Bits associated with the .changes field: + * 3 2 1 0 + * 210987654321098765432109876543210 + * 1 <- button 1 has changed + * 10 <- button 2 has changed + * 100 <- button 3 has changed + * 1000 <- mouse has moved + * 10000 <- mouse position report + * 100000 <- mouse wheel up + * 1000000 <- mouse wheel down + * 10000000 <- mouse wheel left + * 100000000 <- mouse wheel right + */ + +#define PDC_MOUSE_MOVED 0x0008 +#define PDC_MOUSE_POSITION 0x0010 +#define PDC_MOUSE_WHEEL_UP 0x0020 +#define PDC_MOUSE_WHEEL_DOWN 0x0040 +#define PDC_MOUSE_WHEEL_LEFT 0x0080 +#define PDC_MOUSE_WHEEL_RIGHT 0x0100 + +#define A_BUTTON_CHANGED (Mouse_status.changes & 7) +#define MOUSE_MOVED (Mouse_status.changes & PDC_MOUSE_MOVED) +#define MOUSE_POS_REPORT (Mouse_status.changes & PDC_MOUSE_POSITION) +#define BUTTON_CHANGED(x) (Mouse_status.changes & (1 << ((x) - 1))) +#define BUTTON_STATUS(x) (Mouse_status.button[(x) - 1]) +#define MOUSE_WHEEL_UP (Mouse_status.changes & PDC_MOUSE_WHEEL_UP) +#define MOUSE_WHEEL_DOWN (Mouse_status.changes & PDC_MOUSE_WHEEL_DOWN) +#define MOUSE_WHEEL_LEFT (Mouse_status.changes & PDC_MOUSE_WHEEL_LEFT) +#define MOUSE_WHEEL_RIGHT (Mouse_status.changes & PDC_MOUSE_WHEEL_RIGHT) + +/* mouse bit-masks */ + +#define BUTTON1_RELEASED 0x00000001L +#define BUTTON1_PRESSED 0x00000002L +#define BUTTON1_CLICKED 0x00000004L +#define BUTTON1_DOUBLE_CLICKED 0x00000008L +#define BUTTON1_TRIPLE_CLICKED 0x00000010L +#define BUTTON1_MOVED 0x00000010L /* PDCurses */ + +#define BUTTON2_RELEASED 0x00000020L +#define BUTTON2_PRESSED 0x00000040L +#define BUTTON2_CLICKED 0x00000080L +#define BUTTON2_DOUBLE_CLICKED 0x00000100L +#define BUTTON2_TRIPLE_CLICKED 0x00000200L +#define BUTTON2_MOVED 0x00000200L /* PDCurses */ + +#define BUTTON3_RELEASED 0x00000400L +#define BUTTON3_PRESSED 0x00000800L +#define BUTTON3_CLICKED 0x00001000L +#define BUTTON3_DOUBLE_CLICKED 0x00002000L +#define BUTTON3_TRIPLE_CLICKED 0x00004000L +#define BUTTON3_MOVED 0x00004000L /* PDCurses */ + +/* For the ncurses-compatible functions only, BUTTON4_PRESSED and + BUTTON5_PRESSED are returned for mouse scroll wheel up and down; + otherwise PDCurses doesn't support buttons 4 and 5 */ + +#define BUTTON4_RELEASED 0x00008000L +#define BUTTON4_PRESSED 0x00010000L +#define BUTTON4_CLICKED 0x00020000L +#define BUTTON4_DOUBLE_CLICKED 0x00040000L +#define BUTTON4_TRIPLE_CLICKED 0x00080000L + +#define BUTTON5_RELEASED 0x00100000L +#define BUTTON5_PRESSED 0x00200000L +#define BUTTON5_CLICKED 0x00400000L +#define BUTTON5_DOUBLE_CLICKED 0x00800000L +#define BUTTON5_TRIPLE_CLICKED 0x01000000L + +#define MOUSE_WHEEL_SCROLL 0x02000000L /* PDCurses */ +#define BUTTON_MODIFIER_SHIFT 0x04000000L /* PDCurses */ +#define BUTTON_MODIFIER_CONTROL 0x08000000L /* PDCurses */ +#define BUTTON_MODIFIER_ALT 0x10000000L /* PDCurses */ + +#define ALL_MOUSE_EVENTS 0x1fffffffL +#define REPORT_MOUSE_POSITION 0x20000000L + +/* ncurses mouse interface */ + +typedef struct +{ + short id; /* unused, always 0 */ + int x, y, z; /* x, y same as MOUSE_STATUS; z unused */ + mmask_t bstate; /* equivalent to changes + button[], but + in the same format as used for mousemask() */ +} MEVENT; + +#if defined(PDC_NCMOUSE) && !defined(NCURSES_MOUSE_VERSION) +# define NCURSES_MOUSE_VERSION 2 +#endif + +#ifdef NCURSES_MOUSE_VERSION +# define BUTTON_SHIFT BUTTON_MODIFIER_SHIFT +# define BUTTON_CONTROL BUTTON_MODIFIER_CONTROL +# define BUTTON_CTRL BUTTON_MODIFIER_CONTROL +# define BUTTON_ALT BUTTON_MODIFIER_ALT +#else +# define BUTTON_SHIFT PDC_BUTTON_SHIFT +# define BUTTON_CONTROL PDC_BUTTON_CONTROL +# define BUTTON_ALT PDC_BUTTON_ALT +#endif + +/*---------------------------------------------------------------------- + * + * Window and Screen Structures + * + */ + +typedef struct _win /* definition of a window */ +{ + int _cury; /* current pseudo-cursor */ + int _curx; + int _maxy; /* max window coordinates */ + int _maxx; + int _begy; /* origin on screen */ + int _begx; + int _flags; /* window properties */ + chtype _attrs; /* standard attributes and colors */ + chtype _bkgd; /* background, normally blank */ + bool _clear; /* causes clear at next refresh */ + bool _leaveit; /* leaves cursor where it is */ + bool _scroll; /* allows window scrolling */ + bool _nodelay; /* input character wait flag */ + bool _immed; /* immediate update flag */ + bool _sync; /* synchronise window ancestors */ + bool _use_keypad; /* flags keypad key mode active */ + chtype **_y; /* pointer to line pointer array */ + int *_firstch; /* first changed character in line */ + int *_lastch; /* last changed character in line */ + int _tmarg; /* top of scrolling region */ + int _bmarg; /* bottom of scrolling region */ + int _delayms; /* milliseconds of delay for getch() */ + int _parx, _pary; /* coords relative to parent (0,0) */ + struct _win *_parent; /* subwin's pointer to parent win */ + + /* these are used only if this is a pad */ + struct pdat + { + int _pad_y; + int _pad_x; + int _pad_top; + int _pad_left; + int _pad_bottom; + int _pad_right; + } _pad; /* Pad-properties structure */ +} WINDOW; + +/* Color pair structure */ + +typedef struct +{ + short f; /* foreground color */ + short b; /* background color */ + int count; /* allocation order */ + bool set; /* pair has been set */ +} PDC_PAIR; + +/* Avoid using the SCREEN struct directly -- use the corresponding + functions if possible. This struct may eventually be made private. */ + +typedef struct +{ + bool alive; /* if initscr() called, and not endwin() */ + bool autocr; /* if cr -> lf */ + bool cbreak; /* if terminal unbuffered */ + bool echo; /* if terminal echo */ + bool raw_inp; /* raw input mode (v. cooked input) */ + bool raw_out; /* raw output mode (7 v. 8 bits) */ + bool audible; /* FALSE if the bell is visual */ + bool mono; /* TRUE if current screen is mono */ + bool resized; /* TRUE if TERM has been resized */ + bool orig_attr; /* TRUE if we have the original colors */ + short orig_fore; /* original screen foreground color */ + short orig_back; /* original screen foreground color */ + int cursrow; /* position of physical cursor */ + int curscol; /* position of physical cursor */ + int visibility; /* visibility of cursor */ + int orig_cursor; /* original cursor size */ + int lines; /* new value for LINES */ + int cols; /* new value for COLS */ + mmask_t _trap_mbe; /* trap these mouse button events */ + int mouse_wait; /* time to wait (in ms) for a + button release after a press, in + order to count it as a click */ + int slklines; /* lines in use by slk_init() */ + WINDOW *slk_winptr; /* window for slk */ + int linesrippedoff; /* lines ripped off via ripoffline() */ + int linesrippedoffontop; /* lines ripped off on + top via ripoffline() */ + int delaytenths; /* 1/10ths second to wait block + getch() for */ + bool _preserve; /* TRUE if screen background + to be preserved */ + int _restore; /* specifies if screen background + to be restored, and how */ + unsigned long key_modifiers; /* key modifiers (SHIFT, CONTROL, etc.) + on last key press */ + bool return_key_modifiers; /* TRUE if modifier keys are + returned as "real" keys */ + bool key_code; /* TRUE if last key is a special key; + used internally by get_wch() */ + MOUSE_STATUS mouse_status; /* last returned mouse status */ + short line_color; /* color of line attributes - default -1 */ + attr_t termattrs; /* attribute capabilities */ + WINDOW *lastscr; /* the last screen image */ + FILE *dbfp; /* debug trace file pointer */ + bool color_started; /* TRUE after start_color() */ + bool dirty; /* redraw on napms() after init_color() */ + int sel_start; /* start of selection (y * COLS + x) */ + int sel_end; /* end of selection */ + int *c_buffer; /* character buffer */ + int c_pindex; /* putter index */ + int c_gindex; /* getter index */ + int *c_ungch; /* array of ungotten chars */ + int c_ungind; /* ungetch() push index */ + int c_ungmax; /* allocated size of ungetch() buffer */ + PDC_PAIR *atrtab; /* table of color pairs */ +} SCREEN; + +/*---------------------------------------------------------------------- + * + * External Variables + * + */ + +#ifdef PDC_DLL_BUILD +# ifdef CURSES_LIBRARY +# define PDCEX __declspec(dllexport) extern +# else +# define PDCEX __declspec(dllimport) +# endif +#else +# define PDCEX extern +#endif + +PDCEX int LINES; /* terminal height */ +PDCEX int COLS; /* terminal width */ +PDCEX WINDOW *stdscr; /* the default screen window */ +PDCEX WINDOW *curscr; /* the current screen image */ +PDCEX SCREEN *SP; /* curses variables */ +PDCEX MOUSE_STATUS Mouse_status; +PDCEX int COLORS; +PDCEX int COLOR_PAIRS; +PDCEX int TABSIZE; +PDCEX chtype acs_map[]; /* alternate character set map */ +PDCEX char ttytype[]; /* terminal name/description */ + +/*man-start************************************************************** + +Text Attributes +=============== + +PDCurses uses a 32-bit integer for its chtype: + + +--------------------------------------------------------------------+ + |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|..| 2| 1| 0| + +--------------------------------------------------------------------+ + color pair | modifiers | character eg 'a' + +There are 256 color pairs (8 bits), 8 bits for modifiers, and 16 bits +for character data. The modifiers are bold, underline, right-line, +left-line, italic, reverse and blink, plus the alternate character set +indicator. + +**man-end****************************************************************/ + +/*** Video attribute macros ***/ + +#define A_NORMAL (chtype)0 + +#define A_ALTCHARSET (chtype)0x00010000 +#define A_RIGHT (chtype)0x00020000 +#define A_LEFT (chtype)0x00040000 +#define A_ITALIC (chtype)0x00080000 +#define A_UNDERLINE (chtype)0x00100000 +#define A_REVERSE (chtype)0x00200000 +#define A_BLINK (chtype)0x00400000 +#define A_BOLD (chtype)0x00800000 + +#define A_ATTRIBUTES (chtype)0xffff0000 +#define A_CHARTEXT (chtype)0x0000ffff +#define A_COLOR (chtype)0xff000000 + +#define PDC_COLOR_SHIFT 24 + +#define A_LEFTLINE A_LEFT +#define A_RIGHTLINE A_RIGHT +#define A_STANDOUT (A_REVERSE | A_BOLD) /* X/Open */ + +#define A_DIM A_NORMAL +#define A_INVIS A_NORMAL +#define A_PROTECT A_NORMAL + +#define A_HORIZONTAL A_NORMAL +#define A_LOW A_NORMAL +#define A_TOP A_NORMAL +#define A_VERTICAL A_NORMAL + +#define CHR_MSK A_CHARTEXT /* Obsolete */ +#define ATR_MSK A_ATTRIBUTES /* Obsolete */ +#define ATR_NRM A_NORMAL /* Obsolete */ + +/* For use with attr_t -- X/Open says, "these shall be distinct", so + this is a non-conforming implementation. */ + +#define WA_NORMAL A_NORMAL + +#define WA_ALTCHARSET A_ALTCHARSET +#define WA_BLINK A_BLINK +#define WA_BOLD A_BOLD +#define WA_DIM A_DIM +#define WA_INVIS A_INVIS +#define WA_ITALIC A_ITALIC +#define WA_LEFT A_LEFT +#define WA_PROTECT A_PROTECT +#define WA_REVERSE A_REVERSE +#define WA_RIGHT A_RIGHT +#define WA_STANDOUT A_STANDOUT +#define WA_UNDERLINE A_UNDERLINE + +#define WA_HORIZONTAL A_HORIZONTAL +#define WA_LOW A_LOW +#define WA_TOP A_TOP +#define WA_VERTICAL A_VERTICAL + +#define WA_ATTRIBUTES A_ATTRIBUTES + +/*** Alternate character set macros ***/ + +#define PDC_ACS(w) ((chtype)w | A_ALTCHARSET) + +/* VT100-compatible symbols -- box chars */ + +#define ACS_ULCORNER PDC_ACS('l') +#define ACS_LLCORNER PDC_ACS('m') +#define ACS_URCORNER PDC_ACS('k') +#define ACS_LRCORNER PDC_ACS('j') +#define ACS_RTEE PDC_ACS('u') +#define ACS_LTEE PDC_ACS('t') +#define ACS_BTEE PDC_ACS('v') +#define ACS_TTEE PDC_ACS('w') +#define ACS_HLINE PDC_ACS('q') +#define ACS_VLINE PDC_ACS('x') +#define ACS_PLUS PDC_ACS('n') + +/* VT100-compatible symbols -- other */ + +#define ACS_S1 PDC_ACS('o') +#define ACS_S9 PDC_ACS('s') +#define ACS_DIAMOND PDC_ACS('`') +#define ACS_CKBOARD PDC_ACS('a') +#define ACS_DEGREE PDC_ACS('f') +#define ACS_PLMINUS PDC_ACS('g') +#define ACS_BULLET PDC_ACS('~') + +/* Teletype 5410v1 symbols -- these are defined in SysV curses, but + are not well-supported by most terminals. Stick to VT100 characters + for optimum portability. */ + +#define ACS_LARROW PDC_ACS(',') +#define ACS_RARROW PDC_ACS('+') +#define ACS_DARROW PDC_ACS('.') +#define ACS_UARROW PDC_ACS('-') +#define ACS_BOARD PDC_ACS('h') +#define ACS_LANTERN PDC_ACS('i') +#define ACS_BLOCK PDC_ACS('0') + +/* That goes double for these -- undocumented SysV symbols. Don't use + them. */ + +#define ACS_S3 PDC_ACS('p') +#define ACS_S7 PDC_ACS('r') +#define ACS_LEQUAL PDC_ACS('y') +#define ACS_GEQUAL PDC_ACS('z') +#define ACS_PI PDC_ACS('{') +#define ACS_NEQUAL PDC_ACS('|') +#define ACS_STERLING PDC_ACS('}') + +/* Box char aliases */ + +#define ACS_BSSB ACS_ULCORNER +#define ACS_SSBB ACS_LLCORNER +#define ACS_BBSS ACS_URCORNER +#define ACS_SBBS ACS_LRCORNER +#define ACS_SBSS ACS_RTEE +#define ACS_SSSB ACS_LTEE +#define ACS_SSBS ACS_BTEE +#define ACS_BSSS ACS_TTEE +#define ACS_BSBS ACS_HLINE +#define ACS_SBSB ACS_VLINE +#define ACS_SSSS ACS_PLUS + +/* cchar_t aliases */ + +#ifdef PDC_WIDE +# define WACS_ULCORNER (&(acs_map['l'])) +# define WACS_LLCORNER (&(acs_map['m'])) +# define WACS_URCORNER (&(acs_map['k'])) +# define WACS_LRCORNER (&(acs_map['j'])) +# define WACS_RTEE (&(acs_map['u'])) +# define WACS_LTEE (&(acs_map['t'])) +# define WACS_BTEE (&(acs_map['v'])) +# define WACS_TTEE (&(acs_map['w'])) +# define WACS_HLINE (&(acs_map['q'])) +# define WACS_VLINE (&(acs_map['x'])) +# define WACS_PLUS (&(acs_map['n'])) + +# define WACS_S1 (&(acs_map['o'])) +# define WACS_S9 (&(acs_map['s'])) +# define WACS_DIAMOND (&(acs_map['`'])) +# define WACS_CKBOARD (&(acs_map['a'])) +# define WACS_DEGREE (&(acs_map['f'])) +# define WACS_PLMINUS (&(acs_map['g'])) +# define WACS_BULLET (&(acs_map['~'])) + +# define WACS_LARROW (&(acs_map[','])) +# define WACS_RARROW (&(acs_map['+'])) +# define WACS_DARROW (&(acs_map['.'])) +# define WACS_UARROW (&(acs_map['-'])) +# define WACS_BOARD (&(acs_map['h'])) +# define WACS_LANTERN (&(acs_map['i'])) +# define WACS_BLOCK (&(acs_map['0'])) + +# define WACS_S3 (&(acs_map['p'])) +# define WACS_S7 (&(acs_map['r'])) +# define WACS_LEQUAL (&(acs_map['y'])) +# define WACS_GEQUAL (&(acs_map['z'])) +# define WACS_PI (&(acs_map['{'])) +# define WACS_NEQUAL (&(acs_map['|'])) +# define WACS_STERLING (&(acs_map['}'])) + +# define WACS_BSSB WACS_ULCORNER +# define WACS_SSBB WACS_LLCORNER +# define WACS_BBSS WACS_URCORNER +# define WACS_SBBS WACS_LRCORNER +# define WACS_SBSS WACS_RTEE +# define WACS_SSSB WACS_LTEE +# define WACS_SSBS WACS_BTEE +# define WACS_BSSS WACS_TTEE +# define WACS_BSBS WACS_HLINE +# define WACS_SBSB WACS_VLINE +# define WACS_SSSS WACS_PLUS +#endif + +/*** Color macros ***/ + +#define COLOR_BLACK 0 + +#ifdef PDC_RGB /* RGB */ +# define COLOR_RED 1 +# define COLOR_GREEN 2 +# define COLOR_BLUE 4 +#else /* BGR */ +# define COLOR_BLUE 1 +# define COLOR_GREEN 2 +# define COLOR_RED 4 +#endif + +#define COLOR_CYAN (COLOR_BLUE | COLOR_GREEN) +#define COLOR_MAGENTA (COLOR_RED | COLOR_BLUE) +#define COLOR_YELLOW (COLOR_RED | COLOR_GREEN) + +#define COLOR_WHITE 7 + +/*---------------------------------------------------------------------- + * + * Function and Keypad Key Definitions + * Many are just for compatibility + * + */ + +#define KEY_CODE_YES 0x100 /* If get_wch() gives a key code */ + +#define KEY_BREAK 0x101 /* Not on PC KBD */ +#define KEY_DOWN 0x102 /* Down arrow key */ +#define KEY_UP 0x103 /* Up arrow key */ +#define KEY_LEFT 0x104 /* Left arrow key */ +#define KEY_RIGHT 0x105 /* Right arrow key */ +#define KEY_HOME 0x106 /* home key */ +#define KEY_BACKSPACE 0x107 /* not on pc */ +#define KEY_F0 0x108 /* function keys; 64 reserved */ + +#define KEY_DL 0x148 /* delete line */ +#define KEY_IL 0x149 /* insert line */ +#define KEY_DC 0x14a /* delete character */ +#define KEY_IC 0x14b /* insert char or enter ins mode */ +#define KEY_EIC 0x14c /* exit insert char mode */ +#define KEY_CLEAR 0x14d /* clear screen */ +#define KEY_EOS 0x14e /* clear to end of screen */ +#define KEY_EOL 0x14f /* clear to end of line */ +#define KEY_SF 0x150 /* scroll 1 line forward */ +#define KEY_SR 0x151 /* scroll 1 line back (reverse) */ +#define KEY_NPAGE 0x152 /* next page */ +#define KEY_PPAGE 0x153 /* previous page */ +#define KEY_STAB 0x154 /* set tab */ +#define KEY_CTAB 0x155 /* clear tab */ +#define KEY_CATAB 0x156 /* clear all tabs */ +#define KEY_ENTER 0x157 /* enter or send (unreliable) */ +#define KEY_SRESET 0x158 /* soft/reset (partial/unreliable) */ +#define KEY_RESET 0x159 /* reset/hard reset (unreliable) */ +#define KEY_PRINT 0x15a /* print/copy */ +#define KEY_LL 0x15b /* home down/bottom (lower left) */ +#define KEY_ABORT 0x15c /* abort/terminate key (any) */ +#define KEY_SHELP 0x15d /* short help */ +#define KEY_LHELP 0x15e /* long help */ +#define KEY_BTAB 0x15f /* Back tab key */ +#define KEY_BEG 0x160 /* beg(inning) key */ +#define KEY_CANCEL 0x161 /* cancel key */ +#define KEY_CLOSE 0x162 /* close key */ +#define KEY_COMMAND 0x163 /* cmd (command) key */ +#define KEY_COPY 0x164 /* copy key */ +#define KEY_CREATE 0x165 /* create key */ +#define KEY_END 0x166 /* end key */ +#define KEY_EXIT 0x167 /* exit key */ +#define KEY_FIND 0x168 /* find key */ +#define KEY_HELP 0x169 /* help key */ +#define KEY_MARK 0x16a /* mark key */ +#define KEY_MESSAGE 0x16b /* message key */ +#define KEY_MOVE 0x16c /* move key */ +#define KEY_NEXT 0x16d /* next object key */ +#define KEY_OPEN 0x16e /* open key */ +#define KEY_OPTIONS 0x16f /* options key */ +#define KEY_PREVIOUS 0x170 /* previous object key */ +#define KEY_REDO 0x171 /* redo key */ +#define KEY_REFERENCE 0x172 /* ref(erence) key */ +#define KEY_REFRESH 0x173 /* refresh key */ +#define KEY_REPLACE 0x174 /* replace key */ +#define KEY_RESTART 0x175 /* restart key */ +#define KEY_RESUME 0x176 /* resume key */ +#define KEY_SAVE 0x177 /* save key */ +#define KEY_SBEG 0x178 /* shifted beginning key */ +#define KEY_SCANCEL 0x179 /* shifted cancel key */ +#define KEY_SCOMMAND 0x17a /* shifted command key */ +#define KEY_SCOPY 0x17b /* shifted copy key */ +#define KEY_SCREATE 0x17c /* shifted create key */ +#define KEY_SDC 0x17d /* shifted delete char key */ +#define KEY_SDL 0x17e /* shifted delete line key */ +#define KEY_SELECT 0x17f /* select key */ +#define KEY_SEND 0x180 /* shifted end key */ +#define KEY_SEOL 0x181 /* shifted clear line key */ +#define KEY_SEXIT 0x182 /* shifted exit key */ +#define KEY_SFIND 0x183 /* shifted find key */ +#define KEY_SHOME 0x184 /* shifted home key */ +#define KEY_SIC 0x185 /* shifted input key */ + +#define KEY_SLEFT 0x187 /* shifted left arrow key */ +#define KEY_SMESSAGE 0x188 /* shifted message key */ +#define KEY_SMOVE 0x189 /* shifted move key */ +#define KEY_SNEXT 0x18a /* shifted next key */ +#define KEY_SOPTIONS 0x18b /* shifted options key */ +#define KEY_SPREVIOUS 0x18c /* shifted prev key */ +#define KEY_SPRINT 0x18d /* shifted print key */ +#define KEY_SREDO 0x18e /* shifted redo key */ +#define KEY_SREPLACE 0x18f /* shifted replace key */ +#define KEY_SRIGHT 0x190 /* shifted right arrow */ +#define KEY_SRSUME 0x191 /* shifted resume key */ +#define KEY_SSAVE 0x192 /* shifted save key */ +#define KEY_SSUSPEND 0x193 /* shifted suspend key */ +#define KEY_SUNDO 0x194 /* shifted undo key */ +#define KEY_SUSPEND 0x195 /* suspend key */ +#define KEY_UNDO 0x196 /* undo key */ + +/* PDCurses-specific key definitions -- PC only */ + +#define ALT_0 0x197 +#define ALT_1 0x198 +#define ALT_2 0x199 +#define ALT_3 0x19a +#define ALT_4 0x19b +#define ALT_5 0x19c +#define ALT_6 0x19d +#define ALT_7 0x19e +#define ALT_8 0x19f +#define ALT_9 0x1a0 +#define ALT_A 0x1a1 +#define ALT_B 0x1a2 +#define ALT_C 0x1a3 +#define ALT_D 0x1a4 +#define ALT_E 0x1a5 +#define ALT_F 0x1a6 +#define ALT_G 0x1a7 +#define ALT_H 0x1a8 +#define ALT_I 0x1a9 +#define ALT_J 0x1aa +#define ALT_K 0x1ab +#define ALT_L 0x1ac +#define ALT_M 0x1ad +#define ALT_N 0x1ae +#define ALT_O 0x1af +#define ALT_P 0x1b0 +#define ALT_Q 0x1b1 +#define ALT_R 0x1b2 +#define ALT_S 0x1b3 +#define ALT_T 0x1b4 +#define ALT_U 0x1b5 +#define ALT_V 0x1b6 +#define ALT_W 0x1b7 +#define ALT_X 0x1b8 +#define ALT_Y 0x1b9 +#define ALT_Z 0x1ba + +#define CTL_LEFT 0x1bb /* Control-Left-Arrow */ +#define CTL_RIGHT 0x1bc +#define CTL_PGUP 0x1bd +#define CTL_PGDN 0x1be +#define CTL_HOME 0x1bf +#define CTL_END 0x1c0 + +#define KEY_A1 0x1c1 /* upper left on Virtual keypad */ +#define KEY_A2 0x1c2 /* upper middle on Virt. keypad */ +#define KEY_A3 0x1c3 /* upper right on Vir. keypad */ +#define KEY_B1 0x1c4 /* middle left on Virt. keypad */ +#define KEY_B2 0x1c5 /* center on Virt. keypad */ +#define KEY_B3 0x1c6 /* middle right on Vir. keypad */ +#define KEY_C1 0x1c7 /* lower left on Virt. keypad */ +#define KEY_C2 0x1c8 /* lower middle on Virt. keypad */ +#define KEY_C3 0x1c9 /* lower right on Vir. keypad */ + +#define PADSLASH 0x1ca /* slash on keypad */ +#define PADENTER 0x1cb /* enter on keypad */ +#define CTL_PADENTER 0x1cc /* ctl-enter on keypad */ +#define ALT_PADENTER 0x1cd /* alt-enter on keypad */ +#define PADSTOP 0x1ce /* stop on keypad */ +#define PADSTAR 0x1cf /* star on keypad */ +#define PADMINUS 0x1d0 /* minus on keypad */ +#define PADPLUS 0x1d1 /* plus on keypad */ +#define CTL_PADSTOP 0x1d2 /* ctl-stop on keypad */ +#define CTL_PADCENTER 0x1d3 /* ctl-enter on keypad */ +#define CTL_PADPLUS 0x1d4 /* ctl-plus on keypad */ +#define CTL_PADMINUS 0x1d5 /* ctl-minus on keypad */ +#define CTL_PADSLASH 0x1d6 /* ctl-slash on keypad */ +#define CTL_PADSTAR 0x1d7 /* ctl-star on keypad */ +#define ALT_PADPLUS 0x1d8 /* alt-plus on keypad */ +#define ALT_PADMINUS 0x1d9 /* alt-minus on keypad */ +#define ALT_PADSLASH 0x1da /* alt-slash on keypad */ +#define ALT_PADSTAR 0x1db /* alt-star on keypad */ +#define ALT_PADSTOP 0x1dc /* alt-stop on keypad */ +#define CTL_INS 0x1dd /* ctl-insert */ +#define ALT_DEL 0x1de /* alt-delete */ +#define ALT_INS 0x1df /* alt-insert */ +#define CTL_UP 0x1e0 /* ctl-up arrow */ +#define CTL_DOWN 0x1e1 /* ctl-down arrow */ +#define CTL_TAB 0x1e2 /* ctl-tab */ +#define ALT_TAB 0x1e3 +#define ALT_MINUS 0x1e4 +#define ALT_EQUAL 0x1e5 +#define ALT_HOME 0x1e6 +#define ALT_PGUP 0x1e7 +#define ALT_PGDN 0x1e8 +#define ALT_END 0x1e9 +#define ALT_UP 0x1ea /* alt-up arrow */ +#define ALT_DOWN 0x1eb /* alt-down arrow */ +#define ALT_RIGHT 0x1ec /* alt-right arrow */ +#define ALT_LEFT 0x1ed /* alt-left arrow */ +#define ALT_ENTER 0x1ee /* alt-enter */ +#define ALT_ESC 0x1ef /* alt-escape */ +#define ALT_BQUOTE 0x1f0 /* alt-back quote */ +#define ALT_LBRACKET 0x1f1 /* alt-left bracket */ +#define ALT_RBRACKET 0x1f2 /* alt-right bracket */ +#define ALT_SEMICOLON 0x1f3 /* alt-semi-colon */ +#define ALT_FQUOTE 0x1f4 /* alt-forward quote */ +#define ALT_COMMA 0x1f5 /* alt-comma */ +#define ALT_STOP 0x1f6 /* alt-stop */ +#define ALT_FSLASH 0x1f7 /* alt-forward slash */ +#define ALT_BKSP 0x1f8 /* alt-backspace */ +#define CTL_BKSP 0x1f9 /* ctl-backspace */ +#define PAD0 0x1fa /* keypad 0 */ + +#define CTL_PAD0 0x1fb /* ctl-keypad 0 */ +#define CTL_PAD1 0x1fc +#define CTL_PAD2 0x1fd +#define CTL_PAD3 0x1fe +#define CTL_PAD4 0x1ff +#define CTL_PAD5 0x200 +#define CTL_PAD6 0x201 +#define CTL_PAD7 0x202 +#define CTL_PAD8 0x203 +#define CTL_PAD9 0x204 + +#define ALT_PAD0 0x205 /* alt-keypad 0 */ +#define ALT_PAD1 0x206 +#define ALT_PAD2 0x207 +#define ALT_PAD3 0x208 +#define ALT_PAD4 0x209 +#define ALT_PAD5 0x20a +#define ALT_PAD6 0x20b +#define ALT_PAD7 0x20c +#define ALT_PAD8 0x20d +#define ALT_PAD9 0x20e + +#define CTL_DEL 0x20f /* clt-delete */ +#define ALT_BSLASH 0x210 /* alt-back slash */ +#define CTL_ENTER 0x211 /* ctl-enter */ + +#define SHF_PADENTER 0x212 /* shift-enter on keypad */ +#define SHF_PADSLASH 0x213 /* shift-slash on keypad */ +#define SHF_PADSTAR 0x214 /* shift-star on keypad */ +#define SHF_PADPLUS 0x215 /* shift-plus on keypad */ +#define SHF_PADMINUS 0x216 /* shift-minus on keypad */ +#define SHF_UP 0x217 /* shift-up on keypad */ +#define SHF_DOWN 0x218 /* shift-down on keypad */ +#define SHF_IC 0x219 /* shift-insert on keypad */ +#define SHF_DC 0x21a /* shift-delete on keypad */ + +#define KEY_MOUSE 0x21b /* "mouse" key */ +#define KEY_SHIFT_L 0x21c /* Left-shift */ +#define KEY_SHIFT_R 0x21d /* Right-shift */ +#define KEY_CONTROL_L 0x21e /* Left-control */ +#define KEY_CONTROL_R 0x21f /* Right-control */ +#define KEY_ALT_L 0x220 /* Left-alt */ +#define KEY_ALT_R 0x221 /* Right-alt */ +#define KEY_RESIZE 0x222 /* Window resize */ +#define KEY_SUP 0x223 /* Shifted up arrow */ +#define KEY_SDOWN 0x224 /* Shifted down arrow */ + +#define KEY_MIN KEY_BREAK /* Minimum curses key value */ +#define KEY_MAX KEY_SDOWN /* Maximum curses key */ + +#define KEY_F(n) (KEY_F0 + (n)) + +/*---------------------------------------------------------------------- + * + * Functions + * + */ + +/* Standard */ + +PDCEX int addch(const chtype); +PDCEX int addchnstr(const chtype *, int); +PDCEX int addchstr(const chtype *); +PDCEX int addnstr(const char *, int); +PDCEX int addstr(const char *); +PDCEX int attroff(chtype); +PDCEX int attron(chtype); +PDCEX int attrset(chtype); +PDCEX int attr_get(attr_t *, short *, void *); +PDCEX int attr_off(attr_t, void *); +PDCEX int attr_on(attr_t, void *); +PDCEX int attr_set(attr_t, short, void *); +PDCEX int baudrate(void); +PDCEX int beep(void); +PDCEX int bkgd(chtype); +PDCEX void bkgdset(chtype); +PDCEX int border(chtype, chtype, chtype, chtype, + chtype, chtype, chtype, chtype); +PDCEX int box(WINDOW *, chtype, chtype); +PDCEX bool can_change_color(void); +PDCEX int cbreak(void); +PDCEX int chgat(int, attr_t, short, const void *); +PDCEX int clearok(WINDOW *, bool); +PDCEX int clear(void); +PDCEX int clrtobot(void); +PDCEX int clrtoeol(void); +PDCEX int color_content(short, short *, short *, short *); +PDCEX int color_set(short, void *); +PDCEX int copywin(const WINDOW *, WINDOW *, int, int, int, + int, int, int, int); +PDCEX int curs_set(int); +PDCEX int def_prog_mode(void); +PDCEX int def_shell_mode(void); +PDCEX int delay_output(int); +PDCEX int delch(void); +PDCEX int deleteln(void); +PDCEX void delscreen(SCREEN *); +PDCEX int delwin(WINDOW *); +PDCEX WINDOW *derwin(WINDOW *, int, int, int, int); +PDCEX int doupdate(void); +PDCEX WINDOW *dupwin(WINDOW *); +PDCEX int echochar(const chtype); +PDCEX int echo(void); +PDCEX int endwin(void); +PDCEX char erasechar(void); +PDCEX int erase(void); +PDCEX void filter(void); +PDCEX int flash(void); +PDCEX int flushinp(void); +PDCEX chtype getbkgd(WINDOW *); +PDCEX int getnstr(char *, int); +PDCEX int getstr(char *); +PDCEX WINDOW *getwin(FILE *); +PDCEX int halfdelay(int); +PDCEX bool has_colors(void); +PDCEX bool has_ic(void); +PDCEX bool has_il(void); +PDCEX int hline(chtype, int); +PDCEX void idcok(WINDOW *, bool); +PDCEX int idlok(WINDOW *, bool); +PDCEX void immedok(WINDOW *, bool); +PDCEX int inchnstr(chtype *, int); +PDCEX int inchstr(chtype *); +PDCEX chtype inch(void); +PDCEX int init_color(short, short, short, short); +PDCEX int init_pair(short, short, short); +PDCEX WINDOW *initscr(void); +PDCEX int innstr(char *, int); +PDCEX int insch(chtype); +PDCEX int insdelln(int); +PDCEX int insertln(void); +PDCEX int insnstr(const char *, int); +PDCEX int insstr(const char *); +PDCEX int instr(char *); +PDCEX int intrflush(WINDOW *, bool); +PDCEX bool isendwin(void); +PDCEX bool is_linetouched(WINDOW *, int); +PDCEX bool is_wintouched(WINDOW *); +PDCEX char *keyname(int); +PDCEX int keypad(WINDOW *, bool); +PDCEX char killchar(void); +PDCEX int leaveok(WINDOW *, bool); +PDCEX char *longname(void); +PDCEX int meta(WINDOW *, bool); +PDCEX int move(int, int); +PDCEX int mvaddch(int, int, const chtype); +PDCEX int mvaddchnstr(int, int, const chtype *, int); +PDCEX int mvaddchstr(int, int, const chtype *); +PDCEX int mvaddnstr(int, int, const char *, int); +PDCEX int mvaddstr(int, int, const char *); +PDCEX int mvchgat(int, int, int, attr_t, short, const void *); +PDCEX int mvcur(int, int, int, int); +PDCEX int mvdelch(int, int); +PDCEX int mvderwin(WINDOW *, int, int); +PDCEX int mvgetch(int, int); +PDCEX int mvgetnstr(int, int, char *, int); +PDCEX int mvgetstr(int, int, char *); +PDCEX int mvhline(int, int, chtype, int); +PDCEX chtype mvinch(int, int); +PDCEX int mvinchnstr(int, int, chtype *, int); +PDCEX int mvinchstr(int, int, chtype *); +PDCEX int mvinnstr(int, int, char *, int); +PDCEX int mvinsch(int, int, chtype); +PDCEX int mvinsnstr(int, int, const char *, int); +PDCEX int mvinsstr(int, int, const char *); +PDCEX int mvinstr(int, int, char *); +PDCEX int mvprintw(int, int, const char *, ...); +PDCEX int mvscanw(int, int, const char *, ...); +PDCEX int mvvline(int, int, chtype, int); +PDCEX int mvwaddchnstr(WINDOW *, int, int, const chtype *, int); +PDCEX int mvwaddchstr(WINDOW *, int, int, const chtype *); +PDCEX int mvwaddch(WINDOW *, int, int, const chtype); +PDCEX int mvwaddnstr(WINDOW *, int, int, const char *, int); +PDCEX int mvwaddstr(WINDOW *, int, int, const char *); +PDCEX int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *); +PDCEX int mvwdelch(WINDOW *, int, int); +PDCEX int mvwgetch(WINDOW *, int, int); +PDCEX int mvwgetnstr(WINDOW *, int, int, char *, int); +PDCEX int mvwgetstr(WINDOW *, int, int, char *); +PDCEX int mvwhline(WINDOW *, int, int, chtype, int); +PDCEX int mvwinchnstr(WINDOW *, int, int, chtype *, int); +PDCEX int mvwinchstr(WINDOW *, int, int, chtype *); +PDCEX chtype mvwinch(WINDOW *, int, int); +PDCEX int mvwinnstr(WINDOW *, int, int, char *, int); +PDCEX int mvwinsch(WINDOW *, int, int, chtype); +PDCEX int mvwinsnstr(WINDOW *, int, int, const char *, int); +PDCEX int mvwinsstr(WINDOW *, int, int, const char *); +PDCEX int mvwinstr(WINDOW *, int, int, char *); +PDCEX int mvwin(WINDOW *, int, int); +PDCEX int mvwprintw(WINDOW *, int, int, const char *, ...); +PDCEX int mvwscanw(WINDOW *, int, int, const char *, ...); +PDCEX int mvwvline(WINDOW *, int, int, chtype, int); +PDCEX int napms(int); +PDCEX WINDOW *newpad(int, int); +PDCEX SCREEN *newterm(const char *, FILE *, FILE *); +PDCEX WINDOW *newwin(int, int, int, int); +PDCEX int nl(void); +PDCEX int nocbreak(void); +PDCEX int nodelay(WINDOW *, bool); +PDCEX int noecho(void); +PDCEX int nonl(void); +PDCEX void noqiflush(void); +PDCEX int noraw(void); +PDCEX int notimeout(WINDOW *, bool); +PDCEX int overlay(const WINDOW *, WINDOW *); +PDCEX int overwrite(const WINDOW *, WINDOW *); +PDCEX int pair_content(short, short *, short *); +PDCEX int pechochar(WINDOW *, chtype); +PDCEX int pnoutrefresh(WINDOW *, int, int, int, int, int, int); +PDCEX int prefresh(WINDOW *, int, int, int, int, int, int); +PDCEX int printw(const char *, ...); +PDCEX int putwin(WINDOW *, FILE *); +PDCEX void qiflush(void); +PDCEX int raw(void); +PDCEX int redrawwin(WINDOW *); +PDCEX int refresh(void); +PDCEX int reset_prog_mode(void); +PDCEX int reset_shell_mode(void); +PDCEX int resetty(void); +PDCEX int ripoffline(int, int (*)(WINDOW *, int)); +PDCEX int savetty(void); +PDCEX int scanw(const char *, ...); +PDCEX int scr_dump(const char *); +PDCEX int scr_init(const char *); +PDCEX int scr_restore(const char *); +PDCEX int scr_set(const char *); +PDCEX int scrl(int); +PDCEX int scroll(WINDOW *); +PDCEX int scrollok(WINDOW *, bool); +PDCEX SCREEN *set_term(SCREEN *); +PDCEX int setscrreg(int, int); +PDCEX int slk_attroff(const chtype); +PDCEX int slk_attr_off(const attr_t, void *); +PDCEX int slk_attron(const chtype); +PDCEX int slk_attr_on(const attr_t, void *); +PDCEX int slk_attrset(const chtype); +PDCEX int slk_attr_set(const attr_t, short, void *); +PDCEX int slk_clear(void); +PDCEX int slk_color(short); +PDCEX int slk_init(int); +PDCEX char *slk_label(int); +PDCEX int slk_noutrefresh(void); +PDCEX int slk_refresh(void); +PDCEX int slk_restore(void); +PDCEX int slk_set(int, const char *, int); +PDCEX int slk_touch(void); +PDCEX int standend(void); +PDCEX int standout(void); +PDCEX int start_color(void); +PDCEX WINDOW *subpad(WINDOW *, int, int, int, int); +PDCEX WINDOW *subwin(WINDOW *, int, int, int, int); +PDCEX int syncok(WINDOW *, bool); +PDCEX chtype termattrs(void); +PDCEX attr_t term_attrs(void); +PDCEX char *termname(void); +PDCEX void timeout(int); +PDCEX int touchline(WINDOW *, int, int); +PDCEX int touchwin(WINDOW *); +PDCEX int typeahead(int); +PDCEX int untouchwin(WINDOW *); +PDCEX void use_env(bool); +PDCEX int vidattr(chtype); +PDCEX int vid_attr(attr_t, short, void *); +PDCEX int vidputs(chtype, int (*)(int)); +PDCEX int vid_puts(attr_t, short, void *, int (*)(int)); +PDCEX int vline(chtype, int); +PDCEX int vw_printw(WINDOW *, const char *, va_list); +PDCEX int vwprintw(WINDOW *, const char *, va_list); +PDCEX int vw_scanw(WINDOW *, const char *, va_list); +PDCEX int vwscanw(WINDOW *, const char *, va_list); +PDCEX int waddchnstr(WINDOW *, const chtype *, int); +PDCEX int waddchstr(WINDOW *, const chtype *); +PDCEX int waddch(WINDOW *, const chtype); +PDCEX int waddnstr(WINDOW *, const char *, int); +PDCEX int waddstr(WINDOW *, const char *); +PDCEX int wattroff(WINDOW *, chtype); +PDCEX int wattron(WINDOW *, chtype); +PDCEX int wattrset(WINDOW *, chtype); +PDCEX int wattr_get(WINDOW *, attr_t *, short *, void *); +PDCEX int wattr_off(WINDOW *, attr_t, void *); +PDCEX int wattr_on(WINDOW *, attr_t, void *); +PDCEX int wattr_set(WINDOW *, attr_t, short, void *); +PDCEX void wbkgdset(WINDOW *, chtype); +PDCEX int wbkgd(WINDOW *, chtype); +PDCEX int wborder(WINDOW *, chtype, chtype, chtype, chtype, + chtype, chtype, chtype, chtype); +PDCEX int wchgat(WINDOW *, int, attr_t, short, const void *); +PDCEX int wclear(WINDOW *); +PDCEX int wclrtobot(WINDOW *); +PDCEX int wclrtoeol(WINDOW *); +PDCEX int wcolor_set(WINDOW *, short, void *); +PDCEX void wcursyncup(WINDOW *); +PDCEX int wdelch(WINDOW *); +PDCEX int wdeleteln(WINDOW *); +PDCEX int wechochar(WINDOW *, const chtype); +PDCEX int werase(WINDOW *); +PDCEX int wgetch(WINDOW *); +PDCEX int wgetnstr(WINDOW *, char *, int); +PDCEX int wgetstr(WINDOW *, char *); +PDCEX int whline(WINDOW *, chtype, int); +PDCEX int winchnstr(WINDOW *, chtype *, int); +PDCEX int winchstr(WINDOW *, chtype *); +PDCEX chtype winch(WINDOW *); +PDCEX int winnstr(WINDOW *, char *, int); +PDCEX int winsch(WINDOW *, chtype); +PDCEX int winsdelln(WINDOW *, int); +PDCEX int winsertln(WINDOW *); +PDCEX int winsnstr(WINDOW *, const char *, int); +PDCEX int winsstr(WINDOW *, const char *); +PDCEX int winstr(WINDOW *, char *); +PDCEX int wmove(WINDOW *, int, int); +PDCEX int wnoutrefresh(WINDOW *); +PDCEX int wprintw(WINDOW *, const char *, ...); +PDCEX int wredrawln(WINDOW *, int, int); +PDCEX int wrefresh(WINDOW *); +PDCEX int wscanw(WINDOW *, const char *, ...); +PDCEX int wscrl(WINDOW *, int); +PDCEX int wsetscrreg(WINDOW *, int, int); +PDCEX int wstandend(WINDOW *); +PDCEX int wstandout(WINDOW *); +PDCEX void wsyncdown(WINDOW *); +PDCEX void wsyncup(WINDOW *); +PDCEX void wtimeout(WINDOW *, int); +PDCEX int wtouchln(WINDOW *, int, int, int); +PDCEX int wvline(WINDOW *, chtype, int); + +/* Wide-character functions */ + +#ifdef PDC_WIDE +PDCEX int addnwstr(const wchar_t *, int); +PDCEX int addwstr(const wchar_t *); +PDCEX int add_wch(const cchar_t *); +PDCEX int add_wchnstr(const cchar_t *, int); +PDCEX int add_wchstr(const cchar_t *); +PDCEX int bkgrnd(const cchar_t *); +PDCEX void bkgrndset(const cchar_t *); +PDCEX int border_set(const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *); +PDCEX int box_set(WINDOW *, const cchar_t *, const cchar_t *); +PDCEX int echo_wchar(const cchar_t *); +PDCEX int erasewchar(wchar_t *); +PDCEX int getbkgrnd(cchar_t *); +PDCEX int getcchar(const cchar_t *, wchar_t *, attr_t *, short *, void *); +PDCEX int getn_wstr(wint_t *, int); +PDCEX int get_wch(wint_t *); +PDCEX int get_wstr(wint_t *); +PDCEX int hline_set(const cchar_t *, int); +PDCEX int innwstr(wchar_t *, int); +PDCEX int ins_nwstr(const wchar_t *, int); +PDCEX int ins_wch(const cchar_t *); +PDCEX int ins_wstr(const wchar_t *); +PDCEX int inwstr(wchar_t *); +PDCEX int in_wch(cchar_t *); +PDCEX int in_wchnstr(cchar_t *, int); +PDCEX int in_wchstr(cchar_t *); +PDCEX char *key_name(wchar_t); +PDCEX int killwchar(wchar_t *); +PDCEX int mvaddnwstr(int, int, const wchar_t *, int); +PDCEX int mvaddwstr(int, int, const wchar_t *); +PDCEX int mvadd_wch(int, int, const cchar_t *); +PDCEX int mvadd_wchnstr(int, int, const cchar_t *, int); +PDCEX int mvadd_wchstr(int, int, const cchar_t *); +PDCEX int mvgetn_wstr(int, int, wint_t *, int); +PDCEX int mvget_wch(int, int, wint_t *); +PDCEX int mvget_wstr(int, int, wint_t *); +PDCEX int mvhline_set(int, int, const cchar_t *, int); +PDCEX int mvinnwstr(int, int, wchar_t *, int); +PDCEX int mvins_nwstr(int, int, const wchar_t *, int); +PDCEX int mvins_wch(int, int, const cchar_t *); +PDCEX int mvins_wstr(int, int, const wchar_t *); +PDCEX int mvinwstr(int, int, wchar_t *); +PDCEX int mvin_wch(int, int, cchar_t *); +PDCEX int mvin_wchnstr(int, int, cchar_t *, int); +PDCEX int mvin_wchstr(int, int, cchar_t *); +PDCEX int mvvline_set(int, int, const cchar_t *, int); +PDCEX int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int); +PDCEX int mvwaddwstr(WINDOW *, int, int, const wchar_t *); +PDCEX int mvwadd_wch(WINDOW *, int, int, const cchar_t *); +PDCEX int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); +PDCEX int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); +PDCEX int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int); +PDCEX int mvwget_wch(WINDOW *, int, int, wint_t *); +PDCEX int mvwget_wstr(WINDOW *, int, int, wint_t *); +PDCEX int mvwhline_set(WINDOW *, int, int, const cchar_t *, int); +PDCEX int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); +PDCEX int mvwins_nwstr(WINDOW *, int, int, const wchar_t *, int); +PDCEX int mvwins_wch(WINDOW *, int, int, const cchar_t *); +PDCEX int mvwins_wstr(WINDOW *, int, int, const wchar_t *); +PDCEX int mvwin_wch(WINDOW *, int, int, cchar_t *); +PDCEX int mvwin_wchnstr(WINDOW *, int, int, cchar_t *, int); +PDCEX int mvwin_wchstr(WINDOW *, int, int, cchar_t *); +PDCEX int mvwinwstr(WINDOW *, int, int, wchar_t *); +PDCEX int mvwvline_set(WINDOW *, int, int, const cchar_t *, int); +PDCEX int pecho_wchar(WINDOW *, const cchar_t*); +PDCEX int setcchar(cchar_t*, const wchar_t*, const attr_t, + short, const void*); +PDCEX int slk_wset(int, const wchar_t *, int); +PDCEX int unget_wch(const wchar_t); +PDCEX int vline_set(const cchar_t *, int); +PDCEX int waddnwstr(WINDOW *, const wchar_t *, int); +PDCEX int waddwstr(WINDOW *, const wchar_t *); +PDCEX int wadd_wch(WINDOW *, const cchar_t *); +PDCEX int wadd_wchnstr(WINDOW *, const cchar_t *, int); +PDCEX int wadd_wchstr(WINDOW *, const cchar_t *); +PDCEX int wbkgrnd(WINDOW *, const cchar_t *); +PDCEX void wbkgrndset(WINDOW *, const cchar_t *); +PDCEX int wborder_set(WINDOW *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *); +PDCEX int wecho_wchar(WINDOW *, const cchar_t *); +PDCEX int wgetbkgrnd(WINDOW *, cchar_t *); +PDCEX int wgetn_wstr(WINDOW *, wint_t *, int); +PDCEX int wget_wch(WINDOW *, wint_t *); +PDCEX int wget_wstr(WINDOW *, wint_t *); +PDCEX int whline_set(WINDOW *, const cchar_t *, int); +PDCEX int winnwstr(WINDOW *, wchar_t *, int); +PDCEX int wins_nwstr(WINDOW *, const wchar_t *, int); +PDCEX int wins_wch(WINDOW *, const cchar_t *); +PDCEX int wins_wstr(WINDOW *, const wchar_t *); +PDCEX int winwstr(WINDOW *, wchar_t *); +PDCEX int win_wch(WINDOW *, cchar_t *); +PDCEX int win_wchnstr(WINDOW *, cchar_t *, int); +PDCEX int win_wchstr(WINDOW *, cchar_t *); +PDCEX wchar_t *wunctrl(cchar_t *); +PDCEX int wvline_set(WINDOW *, const cchar_t *, int); +#endif + +/* Quasi-standard */ + +PDCEX chtype getattrs(WINDOW *); +PDCEX int getbegx(WINDOW *); +PDCEX int getbegy(WINDOW *); +PDCEX int getmaxx(WINDOW *); +PDCEX int getmaxy(WINDOW *); +PDCEX int getparx(WINDOW *); +PDCEX int getpary(WINDOW *); +PDCEX int getcurx(WINDOW *); +PDCEX int getcury(WINDOW *); +PDCEX void traceoff(void); +PDCEX void traceon(void); +PDCEX char *unctrl(chtype); + +PDCEX int crmode(void); +PDCEX int nocrmode(void); +PDCEX int draino(int); +PDCEX int resetterm(void); +PDCEX int fixterm(void); +PDCEX int saveterm(void); +PDCEX void setsyx(int, int); + +PDCEX int mouse_set(mmask_t); +PDCEX int mouse_on(mmask_t); +PDCEX int mouse_off(mmask_t); +PDCEX int request_mouse_pos(void); +PDCEX void wmouse_position(WINDOW *, int *, int *); +PDCEX mmask_t getmouse(void); + +/* ncurses */ + +PDCEX int alloc_pair(int, int); +PDCEX int assume_default_colors(int, int); +PDCEX const char *curses_version(void); +PDCEX int find_pair(int, int); +PDCEX int free_pair(int); +PDCEX bool has_key(int); +PDCEX bool is_cleared(const WINDOW *); +PDCEX bool is_idcok(const WINDOW *); +PDCEX bool is_idlok(const WINDOW *); +PDCEX bool is_immedok(const WINDOW *); +PDCEX bool is_keypad(const WINDOW *); +PDCEX bool is_leaveok(const WINDOW *); +PDCEX bool is_nodelay(const WINDOW *); +PDCEX bool is_notimeout(const WINDOW *); +PDCEX bool is_pad(const WINDOW *); +PDCEX bool is_scrollok(const WINDOW *); +PDCEX bool is_subwin(const WINDOW *); +PDCEX bool is_syncok(const WINDOW *); +PDCEX int set_tabsize(int); +PDCEX int use_default_colors(void); +PDCEX int wgetdelay(const WINDOW *); +PDCEX WINDOW *wgetparent(const WINDOW *); +PDCEX int wgetscrreg(const WINDOW *, int *, int *); +PDCEX int wresize(WINDOW *, int, int); + +PDCEX bool has_mouse(void); +PDCEX int mouseinterval(int); +PDCEX mmask_t mousemask(mmask_t, mmask_t *); +PDCEX bool mouse_trafo(int *, int *, bool); +PDCEX int nc_getmouse(MEVENT *); +PDCEX int ungetmouse(MEVENT *); +PDCEX bool wenclose(const WINDOW *, int, int); +PDCEX bool wmouse_trafo(const WINDOW *, int *, int *, bool); + +/* PDCurses */ + +PDCEX int addrawch(chtype); +PDCEX int insrawch(chtype); +PDCEX bool is_termresized(void); +PDCEX int mvaddrawch(int, int, chtype); +PDCEX int mvdeleteln(int, int); +PDCEX int mvinsertln(int, int); +PDCEX int mvinsrawch(int, int, chtype); +PDCEX int mvwaddrawch(WINDOW *, int, int, chtype); +PDCEX int mvwdeleteln(WINDOW *, int, int); +PDCEX int mvwinsertln(WINDOW *, int, int); +PDCEX int mvwinsrawch(WINDOW *, int, int, chtype); +PDCEX int raw_output(bool); +PDCEX int resize_term(int, int); +PDCEX WINDOW *resize_window(WINDOW *, int, int); +PDCEX int waddrawch(WINDOW *, chtype); +PDCEX int winsrawch(WINDOW *, chtype); +PDCEX char wordchar(void); + +#ifdef PDC_WIDE +PDCEX wchar_t *slk_wlabel(int); +#endif + +PDCEX void PDC_debug(const char *, ...); +PDCEX void PDC_get_version(PDC_VERSION *); +PDCEX int PDC_ungetch(int); +PDCEX int PDC_set_blink(bool); +PDCEX int PDC_set_bold(bool); +PDCEX int PDC_set_line_color(short); +PDCEX void PDC_set_title(const char *); + +PDCEX int PDC_clearclipboard(void); +PDCEX int PDC_freeclipboard(char *); +PDCEX int PDC_getclipboard(char **, long *); +PDCEX int PDC_setclipboard(const char *, long); + +PDCEX unsigned long PDC_get_key_modifiers(void); +PDCEX int PDC_return_key_modifiers(bool); + +#ifdef XCURSES +PDCEX WINDOW *Xinitscr(int, char **); +PDCEX void XCursesExit(void); +PDCEX int sb_init(void); +PDCEX int sb_set_horz(int, int, int); +PDCEX int sb_set_vert(int, int, int); +PDCEX int sb_get_horz(int *, int *, int *); +PDCEX int sb_get_vert(int *, int *, int *); +PDCEX int sb_refresh(void); +#endif + +/* NetBSD */ + +PDCEX int touchoverlap(const WINDOW *, WINDOW *); +PDCEX int underend(void); +PDCEX int underscore(void); +PDCEX int wunderend(WINDOW *); +PDCEX int wunderscore(WINDOW *); + +/*** Functions defined as macros ***/ + +/* getch() and ungetch() conflict with some DOS libraries */ + +#define getch() wgetch(stdscr) +#define ungetch(ch) PDC_ungetch(ch) + +#define COLOR_PAIR(n) (((chtype)(n) << PDC_COLOR_SHIFT) & A_COLOR) +#define PAIR_NUMBER(n) (((n) & A_COLOR) >> PDC_COLOR_SHIFT) + +/* These will _only_ work as macros */ + +#define getbegyx(w, y, x) (y = getbegy(w), x = getbegx(w)) +#define getmaxyx(w, y, x) (y = getmaxy(w), x = getmaxx(w)) +#define getparyx(w, y, x) (y = getpary(w), x = getparx(w)) +#define getyx(w, y, x) (y = getcury(w), x = getcurx(w)) + +#define getsyx(y, x) { if (curscr->_leaveit) (y)=(x)=-1; \ + else getyx(curscr,(y),(x)); } + +#ifdef NCURSES_MOUSE_VERSION +# define getmouse(x) nc_getmouse(x) +#endif + +/* Deprecated */ + +#define PDC_save_key_modifiers(x) (OK) +#define PDC_get_input_fd() 0 + +/* return codes from PDC_getclipboard() and PDC_setclipboard() calls */ + +#define PDC_CLIP_SUCCESS 0 +#define PDC_CLIP_ACCESS_ERROR 1 +#define PDC_CLIP_EMPTY 2 +#define PDC_CLIP_MEMORY_ERROR 3 + +/* PDCurses key modifier masks */ + +#define PDC_KEY_MODIFIER_SHIFT 1 +#define PDC_KEY_MODIFIER_CONTROL 2 +#define PDC_KEY_MODIFIER_ALT 4 +#define PDC_KEY_MODIFIER_NUMLOCK 8 + +#ifdef __cplusplus +# ifndef PDC_PP98 +# undef bool +# endif +} +#endif + +#endif /* __PDCURSES__ */ diff --git a/include/function.h b/include/function.h index 4a6db49..d8b1be0 100644 --- a/include/function.h +++ b/include/function.h @@ -4,29 +4,12 @@ #include"sqlite3.h" -#ifndef _INC_STDIO -#define _INC_STDIO -#endif +#include #ifndef FUNCTION_H #define FUNCTION_H int Login(); -void clear(); -void UserSignin(); -void StudentsDesktop(); -void TeachersDesktop(); -void clear(){ - fprintf(stdout,"\033[2J"); //利用转义字符清空屏幕 -} -int Login(){ - sqlite3 *db; - int rc; - rc=sqlite3_open("./include/user.db",db); - if(rc!=SQLITE_OK){ - fprintf(stderr,"无法打开数据库:%s\n",sqlite3_errmsg(db)); - return -1; - } - -} + + #endif //FUNCTION_H diff --git a/include/myerror.h b/include/myerror.h index 989a6ff..de991cc 100644 --- a/include/myerror.h +++ b/include/myerror.h @@ -2,13 +2,9 @@ // Created by zhang on 2024/12/25. // -#ifndef _INC_STDIO -#define _INC_STDIO -#endif +#include -#ifndef FUNCTION_H -#define FUNCTION_H -#endif +#include "function.h" #ifndef MYERROR_H #define MYERROR_H diff --git a/include/ui.h b/include/ui.h new file mode 100644 index 0000000..e5f550a --- /dev/null +++ b/include/ui.h @@ -0,0 +1,17 @@ +// +// Created by zhang on 2024/12/28. +// + +#ifndef O_UI_H +#define O_UI_H +void Login_ui(); + +void UserSignin_ui(); + +void StudentsDesktop_ui(); + +void TeachersDesktop_ui(); + +void Welcome_ui(); + +#endif //O_UI_H diff --git a/lib/pdcurses.a b/lib/pdcurses.a new file mode 100644 index 0000000000000000000000000000000000000000..93a70560a01316857bbc9d0f32bf5b2bf9c32892 GIT binary patch literal 195646 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%0AXAf}gj7zP>9GAy+~plPjxHqKeK6nU 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μW~FvrHIQ<;1#cS4QtT1-_!lV$*Bv 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 literal 0 HcmV?d00001 diff --git a/login.c b/login.c new file mode 100644 index 0000000..e69de29 diff --git a/main.c b/main.c index faa38da..5843d45 100644 --- a/main.c +++ b/main.c @@ -4,31 +4,10 @@ #include #include #include -#include "function.h" -#include "myerror.h" -#include "extern.h" - +#include "./include/function.h" +#include "./include/ui.h" +#include "./include/myerror.h" +#include "./include/extern.h" int main() { - SetConsoleOutputCP(65001); - int isStudent; - while (true) { - fprintf(stdout, "欢迎进入口算系统!\n\n输入1以登录\n输入2以注册"); - int x; - scanf("%d", &x); - if (x == 1) { - isStudent = Login(); - if (isStudent == 1 || isStudent == 0)break; - if (isStudent == -1)continue; - } else if (x == 2) { - //UserSignin(); - clear(); - } else { - //Error_Invalid_input(); - } - } - if (isStudent) { - //StudentsDesktop(); - } else { - //TeachersDesktop(); - } + Welcome_ui(); } diff --git a/ui.c b/ui.c new file mode 100644 index 0000000..27804fb --- /dev/null +++ b/ui.c @@ -0,0 +1,209 @@ +// +// Created by zhang on 2024/12/28. +// +#include +#include +#include "./include/function.h" +#include "./include/curses.h" +#include "./include/ui.h" +#include + +#define BUTTON_WIDTH 12 +#define BUTTON_HEIGHT 3 +#define LOGIN_BTN_X 10 +#define LOGIN_BTN_Y 10 +#define REGISTER_BTN_X 20 +#define REGISTER_BTN_Y 10 +#define USERNAME_X 15 +#define USERNAME_Y 5 +#define PASSWORD_X 15 +#define PASSWORD_Y 7 +#define MAX_INPUT_LEN 30 +void draw_button(WINDOW *win, int x, int y, const char *label, bool is_active) { + if (is_active) { + wattron(win, A_REVERSE); // 激活按钮时反显 + } + mvwprintw(win, y, x + (BUTTON_WIDTH - strlen(label)) / 2, "%s", label); + if (is_active) { + wattroff(win, A_REVERSE); // 反显结束 + } + box(win, 0, 0); // 画按钮的边框 + wrefresh(win); +} + +void draw_login_window() { + // 绘制登录窗口 + clear(); + box(stdscr, 0, 0); + + // 标题 + mvprintw(2, 20, "Login Window"); + + // 用户名 + mvprintw(USERNAME_Y, USERNAME_X - 10, "Username: "); + mvprintw(PASSWORD_Y, PASSWORD_X - 10, "Password: "); + + // 输入框 + mvprintw(USERNAME_Y, USERNAME_X, "____________________________"); + mvprintw(PASSWORD_Y, PASSWORD_X, "____________________________"); + + // 按钮 + mvprintw(LOGIN_BTN_Y, LOGIN_BTN_X, "[ Login ]"); + mvprintw(REGISTER_BTN_Y, REGISTER_BTN_X, "[ Register ]"); + + refresh(); +} + +void handle_mouse_click(MEVENT event) { + // 处理鼠标点击事件 + if (event.bstate & BUTTON1_CLICKED) { + // 判断是否点击了登录按钮 + if (event.x >= LOGIN_BTN_X && event.x <= LOGIN_BTN_X + 9 && + event.y == LOGIN_BTN_Y) { + printw("\nLogin button clicked!\n"); + refresh(); + } + // 判断是否点击了注册按钮 + else if (event.x >= REGISTER_BTN_X && event.x <= REGISTER_BTN_X + 11 && + event.y == REGISTER_BTN_Y) { + printw("\nRegister button clicked!\n"); + refresh(); + } + } +} + +void clear_input_area(int x, int y, int len) { + // 清除输入框区域 + for (int i = 0; i < len; i++) { + mvaddch(y, x + i, ' '); + } +} + +void Login_ui() { + initscr(); // 初始化屏幕 + cbreak(); // 禁用行缓冲 + noecho(); // 不显示输入的字符 + keypad(stdscr, TRUE); // 启用键盘功能(例如箭头键) + mousemask(ALL_MOUSE_EVENTS, NULL); // 启用所有鼠标事件 + curs_set(0); // 隐藏光标 + + draw_login_window(); // 绘制登录窗口 + + char username[MAX_INPUT_LEN + 1] = ""; + char password[MAX_INPUT_LEN + 1] = ""; + int ch; + MEVENT event; + + while (1) { + ch = getch(); // 获取输入 + + if (ch == KEY_MOUSE) { // 检查是否是鼠标事件 + if (nc_getmouse(&event) == OK) { + handle_mouse_click(event); // 处理鼠标点击事件 + } + } + + // 处理键盘输入(用户输入用户名和密码) + if (ch == 10) { // 回车键 + printw("\n登录成功!\n"); + break; + } + + // 如果是在用户名或密码框中输入 + if (ch == KEY_BACKSPACE || ch == 127) { // 退格键 + // 删除输入框中的最后一个字符 + if (strlen(username) > 0) { + username[strlen(username) - 1] = '\0'; + clear_input_area(USERNAME_X, USERNAME_Y, MAX_INPUT_LEN); + mvprintw(USERNAME_Y, USERNAME_X, "%s", username); + } + } else if (isprint(ch)) { // 只接受可打印的字符 + if (strlen(username) < MAX_INPUT_LEN) { + username[strlen(username)] = ch; + username[strlen(username) + 1] = '\0'; + mvprintw(USERNAME_Y, USERNAME_X, "%s", username); + } + } + + refresh(); + } + + endwin(); // 结束 ncurses 模式 + return; +} +// 用于绘制按钮的函数 + +void Welcome_ui() { + MEVENT event; + int startx, starty; + int button_x, button_y; + + // 初始化ncurses环境 + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + + // 启用鼠标事件 + mousemask(ALL_MOUSE_EVENTS, NULL); + + // 获取屏幕的尺寸 + int rows, cols; + getmaxyx(stdscr, rows, cols); + + // 计算按钮的显示位置 + startx = cols / 2 - BUTTON_WIDTH / 2; + starty = rows / 2 - 2; // 使文本和按钮垂直居中 + + // 打印欢迎文本 + mvprintw(starty - 3, startx, "欢迎来到我们的程序!"); + refresh(); + + // 创建两个按钮的窗口 + WINDOW *login_button_win = newwin(BUTTON_HEIGHT, BUTTON_WIDTH, starty, startx); + WINDOW *register_button_win = newwin(BUTTON_HEIGHT, BUTTON_WIDTH, starty + BUTTON_HEIGHT + 1, startx); + + // 绘制按钮 + draw_button(login_button_win, 0, 0, "Login", false); + draw_button(register_button_win, 0, 0, "Signin", false); + + refresh(); + + bool login_active = false; + bool register_active = false; + + while (1) { + int ch = getch(); + if (ch == KEY_MOUSE) { + if (nc_getmouse(&event) == OK) { + // 检查点击的区域是否是登录按钮 + if (event.x >= startx && event.x < startx + BUTTON_WIDTH && event.y >= starty && event.y < starty + BUTTON_HEIGHT) { + login_active = true; + register_active = false; + draw_button(login_button_win, 0, 0, "Login", true); // 激活登录按钮 + draw_button(register_button_win, 0, 0, "Signin", false); // 取消激活注册按钮 + printw("您点击了登录按钮!\n"); + } + // 检查点击的区域是否是注册按钮 + else if (event.x >= startx && event.x < startx + BUTTON_WIDTH && event.y >= starty + BUTTON_HEIGHT + 1 && event.y < starty + BUTTON_HEIGHT + 1 + BUTTON_HEIGHT) { + login_active = false; + register_active = true; + draw_button(login_button_win, 0, 0, "登录", false); // 取消激活登录按钮 + draw_button(register_button_win, 0, 0, "注册", true); // 激活注册按钮 + printw("您点击了注册按钮!\n"); + } + refresh(); + } + } + + // 按 'q' 键退出 + if (ch == 'q') { + break; + } + } + + // 清理退出 + endwin(); + return; +}