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