ncurses 6.1 - patch 20190623
[ncurses.git] / ncurses / tinfo / tinfo_driver.c
index 477cbbc24f37221b5742c954660a4990bc8fa8c2..c779c82044aa6472d8f5df772751ae792cdad529 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2008-2016,2017 Free Software Foundation, Inc.              *
+ * Copyright (c) 2008-2017,2018 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 
 /****************************************************************************
  *  Author: Juergen Pfeifer                                                 *
- *                                                                          *
+ *     and: Thomas E. Dickey                                                *
  ****************************************************************************/
 
 #include <curses.priv.h>
-#define CUR ((TERMINAL*)TCB)->type.
+#define CUR TerminalType((TERMINAL*)TCB).
 #include <tic.h>
 #include <termcap.h>           /* ospeed */
 
@@ -51,7 +51,7 @@
 # endif
 #endif
 
-MODULE_ID("$Id: tinfo_driver.c,v 1.47 2017/03/28 09:15:24 tom Exp $")
+MODULE_ID("$Id: tinfo_driver.c,v 1.63 2018/11/24 22:17:03 tom Exp $")
 
 /*
  * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
@@ -115,7 +115,7 @@ drv_Name(TERMINAL_CONTROL_BLOCK * TCB)
 }
 
 static void
-get_baudrate(TERMINAL * termp)
+get_baudrate(TERMINAL *termp)
 {
     int my_ospeed;
     int result;
@@ -161,17 +161,20 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
     TCB->magic = TCBMAGIC;
 
 #if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP)
-    status = _nc_setup_tinfo(tname, &termp->type);
+    status = _nc_setup_tinfo(tname, &TerminalType(termp));
+    T(("_nc_setup_tinfo returns %d", status));
 #else
+    T(("no database available"));
     status = TGETENT_NO;
 #endif
 
     /* try fallback list if entry on disk */
     if (status != TGETENT_YES) {
-       const TERMTYPE *fallback = _nc_fallback(tname);
+       const TERMTYPE2 *fallback = _nc_fallback2(tname);
 
        if (fallback) {
-           termp->type = *fallback;
+           T(("found fallback entry"));
+           TerminalType(termp) = *fallback;
            status = TGETENT_YES;
        }
     }
@@ -185,10 +188,11 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
        }
     }
     result = TRUE;
+#if NCURSES_EXT_NUMBERS
+    _nc_export_termtype2(&termp->type, &TerminalType(termp));
+#endif
 #if !USE_REENTRANT
-#define MY_SIZE (size_t) NAMESIZE - 1
-    _nc_STRNCPY(ttytype, termp->type.term_names, MY_SIZE);
-    ttytype[MY_SIZE] = '\0';
+    save_ttytype(termp);
 #endif
 
     if (command_character)
@@ -203,6 +207,14 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
     if (sp == 0 && NC_ISATTY(termp->Filedes)) {
        get_baudrate(termp);
     }
+#if NCURSES_EXT_NUMBERS
+#define cleanup_termtype() \
+    _nc_free_termtype2(&TerminalType(termp)); \
+    _nc_free_termtype(&termp->type)
+#else
+#define cleanup_termtype() \
+    _nc_free_termtype2(&TerminalType(termp))
+#endif
 
     if (generic_type) {
        /*
@@ -212,12 +224,15 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
        if ((VALID_STRING(cursor_address)
             || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home)))
            && VALID_STRING(clear_screen)) {
+           cleanup_termtype();
            ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname);
        } else {
+           cleanup_termtype();
            ret_error1(TGETENT_NO, "I need something more specific.\n", tname);
        }
     }
     if (hard_copy) {
+       cleanup_termtype();
        ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname);
     }
 
@@ -882,12 +897,9 @@ drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
 
     /* we know how to recognize mouse events under "xterm" */
     if (sp != 0) {
-       if (key_mouse != 0) {
-           if (!strcmp(key_mouse, xterm_kmous)
-               || strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) {
-               init_xterm_mouse(sp);
-           }
-       } else if (strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) {
+       if (NonEmpty(key_mouse)) {
+           init_xterm_mouse(sp);
+       } else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) {
            if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK)
                init_xterm_mouse(sp);
        }
@@ -1012,12 +1024,18 @@ drv_setfilter(TERMINAL_CONTROL_BLOCK * TCB)
 {
     AssertTCB();
 
-    clear_screen = 0;
-    cursor_down = parm_down_cursor = 0;
-    cursor_address = 0;
-    cursor_up = parm_up_cursor = 0;
-    row_address = 0;
-    cursor_home = carriage_return;
+    /* *INDENT-EQLS* */
+    clear_screen     = ABSENT_STRING;
+    cursor_address   = ABSENT_STRING;
+    cursor_down      = ABSENT_STRING;
+    cursor_up        = ABSENT_STRING;
+    parm_down_cursor = ABSENT_STRING;
+    parm_up_cursor   = ABSENT_STRING;
+    row_address      = ABSENT_STRING;
+    cursor_home      = carriage_return;
+
+    if (back_color_erase)
+       clr_eos = ABSENT_STRING;
 }
 
 static void
@@ -1064,8 +1082,13 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
        while (i + 1 < length) {
            if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) {
                real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET;
-               if (sp != 0)
+               T(("#%d real_map[%s] = %s",
+                  (int) i,
+                  _tracechar(UChar(acs_chars[i])),
+                  _tracechtype(real_map[UChar(acs_chars[i])])));
+               if (sp != 0) {
                    sp->_screen_acs_map[UChar(acs_chars[i])] = TRUE;
+               }
            }
            i += 2;
        }
@@ -1095,7 +1118,6 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
                   ? "DIFF"
                   : "SAME"),
                _nc_visbuf(show));
-
        _nc_unlock_global(tracef);
     }
 #endif /* TRACE */