]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/tinfo_driver.c
ncurses 6.2 - patch 20200531
[ncurses.git] / ncurses / tinfo / tinfo_driver.c
index f1c98ddf72c96c0fc01e08d16a83935308bcab67..3089cf0aa4fb605398289b2c7279b9b25204d4ff 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 2008-2016,2017 Free Software Foundation, Inc.              *
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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            *
@@ -51,7 +52,7 @@
 # endif
 #endif
 
-MODULE_ID("$Id: tinfo_driver.c,v 1.59 2017/09/10 21:08:46 tom Exp $")
+MODULE_ID("$Id: tinfo_driver.c,v 1.69 2020/05/27 23:55:56 tom Exp $")
 
 /*
  * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
@@ -144,6 +145,8 @@ get_baudrate(TERMINAL *termp)
 #undef SETUP_FAIL
 #define SETUP_FAIL FALSE
 
+#define NO_COPY {}
+
 static bool
 drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
 {
@@ -162,7 +165,9 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
 
 #if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP)
     status = _nc_setup_tinfo(tname, &TerminalType(termp));
+    T(("_nc_setup_tinfo returns %d", status));
 #else
+    T(("no database available"));
     status = TGETENT_NO;
 #endif
 
@@ -171,6 +176,7 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
        const TERMTYPE2 *fallback = _nc_fallback2(tname);
 
        if (fallback) {
+           T(("found fallback entry"));
            TerminalType(termp) = *fallback;
            status = TGETENT_YES;
        }
@@ -181,7 +187,10 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
        if (status == TGETENT_ERR) {
            ret_error0(status, "terminals database is inaccessible\n");
        } else if (status == TGETENT_NO) {
-           ret_error1(status, "unknown terminal type.\n", tname);
+           ret_error1(status, "unknown terminal type.\n",
+                      tname, NO_COPY);
+       } else {
+           ret_error0(status, "unexpected return-code\n");
        }
     }
     result = TRUE;
@@ -222,15 +231,18 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
             || (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);
+           ret_error1(TGETENT_YES, "terminal is not really generic.\n",
+                      tname, NO_COPY);
        } else {
            cleanup_termtype();
-           ret_error1(TGETENT_NO, "I need something more specific.\n", tname);
+           ret_error1(TGETENT_NO, "I need something more specific.\n",
+                      tname, NO_COPY);
        }
     }
     if (hard_copy) {
        cleanup_termtype();
-       ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname);
+       ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n",
+                  tname, NO_COPY);
     }
 
     returnBool(result);
@@ -344,23 +356,23 @@ drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
        if (set_a_foreground) {
            TPUTS_TRACE("set_a_foreground");
            NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
-                                   TPARM_1(set_a_foreground, color), 1, outc);
+                                   TIPARM_1(set_a_foreground, color), 1, outc);
        } else {
            TPUTS_TRACE("set_foreground");
            NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
-                                   TPARM_1(set_foreground,
-                                           toggled_colors(color)), 1, outc);
+                                   TIPARM_1(set_foreground,
+                                            toggled_colors(color)), 1, outc);
        }
     } else {
        if (set_a_background) {
            TPUTS_TRACE("set_a_background");
            NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
-                                   TPARM_1(set_a_background, color), 1, outc);
+                                   TIPARM_1(set_a_background, color), 1, outc);
        } else {
            TPUTS_TRACE("set_background");
            NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
-                                   TPARM_1(set_background,
-                                           toggled_colors(color)), 1, outc);
+                                   TIPARM_1(set_background,
+                                            toggled_colors(color)), 1, outc);
        }
     }
 }
@@ -752,10 +764,10 @@ drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b)
            tp[b].red, tp[b].green, tp[b].blue));
 
        NCURSES_PUTP2("initialize_pair",
-                     TPARM_7(initialize_pair,
-                             pair,
-                             tp[f].red, tp[f].green, tp[f].blue,
-                             tp[b].red, tp[b].green, tp[b].blue));
+                     TIPARM_7(initialize_pair,
+                              pair,
+                              tp[f].red, tp[f].green, tp[f].blue,
+                              tp[b].red, tp[b].green, tp[b].blue));
     }
 }
 
@@ -788,7 +800,7 @@ drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB,
     AssertTCB();
     if (initialize_color != NULL) {
        NCURSES_PUTP2("initialize_color",
-                     TPARM_4(initialize_color, color, r, g, b));
+                     TIPARM_4(initialize_color, color, r, g, b));
     }
 }
 
@@ -814,7 +826,7 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB,
        if (set_color_pair) {
            TPUTS_TRACE("set_color_pair");
            NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
-                                   TPARM_1(set_color_pair, pair), 1, outc);
+                                   TIPARM_1(set_color_pair, pair), 1, outc);
            return;
        } else if (sp != 0) {
            _nc_pair_content(SP_PARM, pair, &fg, &bg);
@@ -894,11 +906,8 @@ 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(SP_TERMTYPE term_names, "xterm") != 0) {
-               init_xterm_mouse(sp);
-           }
+       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);
@@ -1082,8 +1091,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;
        }
@@ -1113,7 +1127,6 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
                   ? "DIFF"
                   : "SAME"),
                _nc_visbuf(show));
-
        _nc_unlock_global(tracef);
     }
 #endif /* TRACE */
@@ -1330,23 +1343,29 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag)
        unsigned ch = (unsigned) c;
        if (flag) {
            while ((s = _nc_expand_try(sp->_key_ok,
-                                      ch, &count, (size_t) 0)) != 0
-                  && _nc_remove_key(&(sp->_key_ok), ch)) {
-               code = _nc_add_to_try(&(sp->_keytry), s, ch);
-               free(s);
-               count = 0;
-               if (code != OK)
-                   break;
+                                      ch, &count, (size_t) 0)) != 0) {
+               if (_nc_remove_key(&(sp->_key_ok), ch)) {
+                   code = _nc_add_to_try(&(sp->_keytry), s, ch);
+                   free(s);
+                   count = 0;
+                   if (code != OK)
+                       break;
+               } else {
+                   free(s);
+               }
            }
        } else {
            while ((s = _nc_expand_try(sp->_keytry,
-                                      ch, &count, (size_t) 0)) != 0
-                  && _nc_remove_key(&(sp->_keytry), ch)) {
-               code = _nc_add_to_try(&(sp->_key_ok), s, ch);
-               free(s);
-               count = 0;
-               if (code != OK)
-                   break;
+                                      ch, &count, (size_t) 0)) != 0) {
+               if (_nc_remove_key(&(sp->_keytry), ch)) {
+                   code = _nc_add_to_try(&(sp->_key_ok), s, ch);
+                   free(s);
+                   count = 0;
+                   if (code != OK)
+                       break;
+               } else {
+                   free(s);
+               }
            }
        }
     }