106bfebdeSXin LI /****************************************************************************
2e1865124SBaptiste Daroussin  * Copyright 2018,2020 Thomas E. Dickey                                     *
3e1865124SBaptiste Daroussin  * Copyright 2009-2012,2014 Free Software Foundation, Inc.                  *
406bfebdeSXin LI  *                                                                          *
506bfebdeSXin LI  * Permission is hereby granted, free of charge, to any person obtaining a  *
606bfebdeSXin LI  * copy of this software and associated documentation files (the            *
706bfebdeSXin LI  * "Software"), to deal in the Software without restriction, including      *
806bfebdeSXin LI  * without limitation the rights to use, copy, modify, merge, publish,      *
906bfebdeSXin LI  * distribute, distribute with modifications, sublicense, and/or sell       *
1006bfebdeSXin LI  * copies of the Software, and to permit persons to whom the Software is    *
1106bfebdeSXin LI  * furnished to do so, subject to the following conditions:                 *
1206bfebdeSXin LI  *                                                                          *
1306bfebdeSXin LI  * The above copyright notice and this permission notice shall be included  *
1406bfebdeSXin LI  * in all copies or substantial portions of the Software.                   *
1506bfebdeSXin LI  *                                                                          *
1606bfebdeSXin LI  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1706bfebdeSXin LI  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1806bfebdeSXin LI  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1906bfebdeSXin LI  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
2006bfebdeSXin LI  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2106bfebdeSXin LI  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2206bfebdeSXin LI  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2306bfebdeSXin LI  *                                                                          *
2406bfebdeSXin LI  * Except as contained in this notice, the name(s) of the above copyright   *
2506bfebdeSXin LI  * holders shall not be used in advertising or otherwise to promote the     *
2606bfebdeSXin LI  * sale, use or other dealings in this Software without prior written       *
2706bfebdeSXin LI  * authorization.                                                           *
2806bfebdeSXin LI  ****************************************************************************/
2906bfebdeSXin LI 
3006bfebdeSXin LI /****************************************************************************
3106bfebdeSXin LI  *  Author: Juergen Pfeifer                                                 *
3206bfebdeSXin LI  *                                                                          *
3306bfebdeSXin LI  ****************************************************************************/
3406bfebdeSXin LI 
3506bfebdeSXin LI #include <curses.priv.h>
3606bfebdeSXin LI 
37*7a656419SBaptiste Daroussin MODULE_ID("$Id: lib_driver.c,v 1.9 2020/08/29 19:53:35 tom Exp $")
3806bfebdeSXin LI 
39*7a656419SBaptiste Daroussin #ifndef EXP_WIN32_DRIVER
4006bfebdeSXin LI typedef struct DriverEntry {
4106bfebdeSXin LI     const char *name;
4206bfebdeSXin LI     TERM_DRIVER *driver;
4306bfebdeSXin LI } DRIVER_ENTRY;
4406bfebdeSXin LI 
4506bfebdeSXin LI static DRIVER_ENTRY DriverTable[] =
4606bfebdeSXin LI {
47aae38d10SBaptiste Daroussin #ifdef _WIN32
48aae38d10SBaptiste Daroussin     {"win32console", &_nc_WIN_DRIVER},
4906bfebdeSXin LI #endif
5073f0a83dSXin LI     {"tinfo", &_nc_TINFO_DRIVER}	/* must be last */
5106bfebdeSXin LI };
5206bfebdeSXin LI 
5306bfebdeSXin LI NCURSES_EXPORT(int)
_nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB,const char * name,int * errret)5406bfebdeSXin LI _nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret)
5506bfebdeSXin LI {
5606bfebdeSXin LI     int code = ERR;
5706bfebdeSXin LI     size_t i;
5806bfebdeSXin LI     TERM_DRIVER *res = (TERM_DRIVER *) 0;
5906bfebdeSXin LI     TERM_DRIVER *use = 0;
6006bfebdeSXin LI 
6106bfebdeSXin LI     T((T_CALLED("_nc_get_driver(%p, %s, %p)"),
6206bfebdeSXin LI        (void *) TCB, NonNull(name), (void *) errret));
6306bfebdeSXin LI 
6406bfebdeSXin LI     assert(TCB != 0);
6506bfebdeSXin LI 
6606bfebdeSXin LI     for (i = 0; i < SIZEOF(DriverTable); i++) {
6706bfebdeSXin LI 	res = DriverTable[i].driver;
68aae38d10SBaptiste Daroussin 	if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) {
69aae38d10SBaptiste Daroussin 	    if (res->td_CanHandle(TCB, name, errret)) {
7006bfebdeSXin LI 		use = res;
7106bfebdeSXin LI 		break;
7206bfebdeSXin LI 	    }
7306bfebdeSXin LI 	}
74aae38d10SBaptiste Daroussin     }
7506bfebdeSXin LI     if (use != 0) {
7606bfebdeSXin LI 	TCB->drv = use;
7706bfebdeSXin LI 	code = OK;
7806bfebdeSXin LI     }
7906bfebdeSXin LI     returnCode(code);
8006bfebdeSXin LI }
81*7a656419SBaptiste Daroussin #endif /* !EXP_WIN32_DRIVER */
8206bfebdeSXin LI 
8306bfebdeSXin LI NCURSES_EXPORT(int)
NCURSES_SP_NAME(has_key)8406bfebdeSXin LI NCURSES_SP_NAME(has_key) (SCREEN *sp, int keycode)
8506bfebdeSXin LI {
8606bfebdeSXin LI     T((T_CALLED("has_key(%p, %d)"), (void *) sp, keycode));
87aae38d10SBaptiste Daroussin     returnCode(IsValidTIScreen(sp) ? CallDriver_1(sp, td_kyExist, keycode) : FALSE);
8806bfebdeSXin LI }
8906bfebdeSXin LI 
9006bfebdeSXin LI NCURSES_EXPORT(int)
has_key(int keycode)9106bfebdeSXin LI has_key(int keycode)
9206bfebdeSXin LI {
9306bfebdeSXin LI     return NCURSES_SP_NAME(has_key) (CURRENT_SCREEN, keycode);
9406bfebdeSXin LI }
9506bfebdeSXin LI 
9606bfebdeSXin LI NCURSES_EXPORT(int)
NCURSES_SP_NAME(_nc_mcprint)9706bfebdeSXin LI NCURSES_SP_NAME(_nc_mcprint) (SCREEN *sp, char *data, int len)
9806bfebdeSXin LI {
9906bfebdeSXin LI     int code = ERR;
10006bfebdeSXin LI 
10106bfebdeSXin LI     if (0 != TerminalOf(sp))
102aae38d10SBaptiste Daroussin 	code = CallDriver_2(sp, td_print, data, len);
10306bfebdeSXin LI     return (code);
10406bfebdeSXin LI }
10506bfebdeSXin LI 
10606bfebdeSXin LI NCURSES_EXPORT(int)
mcprint(char * data,int len)10706bfebdeSXin LI mcprint(char *data, int len)
10806bfebdeSXin LI {
10906bfebdeSXin LI     return NCURSES_SP_NAME(_nc_mcprint) (CURRENT_SCREEN, data, len);
11006bfebdeSXin LI }
11106bfebdeSXin LI 
11206bfebdeSXin LI NCURSES_EXPORT(int)
NCURSES_SP_NAME(doupdate)11306bfebdeSXin LI NCURSES_SP_NAME(doupdate) (SCREEN *sp)
11406bfebdeSXin LI {
11506bfebdeSXin LI     int code = ERR;
11606bfebdeSXin LI 
11706bfebdeSXin LI     T((T_CALLED("doupdate(%p)"), (void *) sp));
11806bfebdeSXin LI 
11906bfebdeSXin LI     if (IsValidScreen(sp))
120aae38d10SBaptiste Daroussin 	code = CallDriver(sp, td_update);
12106bfebdeSXin LI 
12206bfebdeSXin LI     returnCode(code);
12306bfebdeSXin LI }
12406bfebdeSXin LI 
12506bfebdeSXin LI NCURSES_EXPORT(int)
doupdate(void)12606bfebdeSXin LI doupdate(void)
12706bfebdeSXin LI {
12806bfebdeSXin LI     return NCURSES_SP_NAME(doupdate) (CURRENT_SCREEN);
12906bfebdeSXin LI }
13006bfebdeSXin LI 
13106bfebdeSXin LI NCURSES_EXPORT(int)
NCURSES_SP_NAME(mvcur)13206bfebdeSXin LI NCURSES_SP_NAME(mvcur) (SCREEN *sp, int yold, int xold, int ynew, int xnew)
13306bfebdeSXin LI {
13406bfebdeSXin LI     int code = ERR;
13506bfebdeSXin LI     TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("mvcur(%p,%d,%d,%d,%d)"),
13606bfebdeSXin LI 				  (void *) sp, yold, xold, ynew, xnew));
13706bfebdeSXin LI     if (HasTerminal(sp)) {
138aae38d10SBaptiste Daroussin 	code = CallDriver_4(sp, td_hwcur, yold, xold, ynew, xnew);
13906bfebdeSXin LI     }
14006bfebdeSXin LI     returnCode(code);
14106bfebdeSXin LI }
14206bfebdeSXin LI 
14306bfebdeSXin LI NCURSES_EXPORT(int)
mvcur(int yold,int xold,int ynew,int xnew)14406bfebdeSXin LI mvcur(int yold, int xold, int ynew, int xnew)
14506bfebdeSXin LI /* optimized cursor move from (yold, xold) to (ynew, xnew) */
14606bfebdeSXin LI {
14706bfebdeSXin LI     return NCURSES_SP_NAME(mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew);
14806bfebdeSXin LI }
149