]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_bkgd.c
ncurses 6.2 - patch 20210418
[ncurses.git] / ncurses / base / lib_bkgd.c
index aa1db21e4fa8f5f050b8fc0ae64a55eecf2dd91c..23effc7cd141f5a24f944ccf102e67c84a0367c2 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc.              *
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2016 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            *
@@ -36,7 +37,9 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_bkgd.c,v 1.53 2019/08/17 20:59:41 tom Exp $")
+MODULE_ID("$Id: lib_bkgd.c,v 1.62 2021/02/13 20:06:54 tom Exp $")
+
+static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
 
 /*
  * Set the window's background information.
@@ -48,7 +51,7 @@ static NCURSES_INLINE void
 #endif
 wbkgrndset(WINDOW *win, const ARG_CH_T ch)
 {
-    T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracech_t(ch)));
+    T((T_CALLED("wbkgrndset(%p,%s)"), (void *) win, _tracech_t(ch)));
 
     if (win) {
        attr_t off = AttrOf(win->_nc_bkgd);
@@ -102,26 +105,36 @@ NCURSES_EXPORT(void)
 wbkgdset(WINDOW *win, chtype ch)
 {
     NCURSES_CH_T wch;
+    T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracechtype(ch)));
     SetChar2(wch, ch);
     wbkgrndset(win, CHREF(wch));
+    returnVoid;
 }
 
 /*
  * Set the window's background information and apply it to each cell.
  */
-#if USE_WIDEC_SUPPORT
-NCURSES_EXPORT(int)
-#else
 static NCURSES_INLINE int
-#undef wbkgrnd
-#endif
-wbkgrnd(WINDOW *win, const ARG_CH_T ch)
+_nc_background(WINDOW *win, const ARG_CH_T ch, bool narrow)
 {
 #undef  SP_PARM
 #define SP_PARM SP             /* to use Charable() */
     int code = ERR;
 
-    T((T_CALLED("wbkgd(%p,%s)"), (void *) win, _tracech_t(ch)));
+#if USE_WIDEC_SUPPORT
+    T((T_CALLED("%s(%p,%s)"),
+       narrow ? "wbkgd" : "wbkgrnd",
+       (void *) win,
+       _tracecchar_t(ch)));
+#define TraceChar(c) _tracecchar_t2(1, &(c))
+#else
+    T((T_CALLED("%s(%p,%s)"),
+       "wbkgd",
+       (void *) win,
+       _tracech_t(ch)));
+    (void) narrow;
+#define TraceChar(c) _tracechar(CharOf(c))
+#endif
 
     if (SP == 0) {
        ;
@@ -142,6 +155,14 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch)
            SetPair(new_bkgd, 0);
        }
 
+       /* avoid setting background-character to a null */
+       if (CharOf(new_bkgd) == 0) {
+           NCURSES_CH_T tmp_bkgd = blank;
+           SetAttr(tmp_bkgd, AttrOf(new_bkgd));
+           SetPair(tmp_bkgd, GetPair(new_bkgd));
+           new_bkgd = tmp_bkgd;
+       }
+
        memset(&old_bkgd, 0, sizeof(old_bkgd));
        (void) wgetbkgrnd(win, &old_bkgd);
 
@@ -159,7 +180,7 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch)
            old_pair = 0;
        }
        T(("... old background char %s, attr %s, pair %d",
-          _tracechar(CharOf(old_char)), _traceattr(old_attr), old_pair));
+          TraceChar(old_char), _traceattr(old_attr), old_pair));
 
        new_char = new_bkgd;
        RemAttr(new_char, ~A_CHARTEXT);
@@ -167,14 +188,18 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch)
        new_pair = GetPair(new_bkgd);
 
        /* SVr4 limits background character to printable 7-bits */
-       if (!Charable(new_bkgd)) {
+       if (
+#if USE_WIDEC_SUPPORT
+              narrow &&
+#endif
+              !Charable(new_bkgd)) {
            new_char = old_char;
        }
        if (!(new_attr & A_COLOR)) {
            new_pair = 0;
        }
        T(("... new background char %s, attr %s, pair %d",
-          _tracechar(CharOf(new_char)), _traceattr(new_attr), new_pair));
+          TraceChar(new_char), _traceattr(new_attr), new_pair));
 
        (void) wbkgrndset(win, CHREF(new_bkgd));
 
@@ -195,7 +220,19 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch)
                attr_t tmp_attr = AttrOf(*cp);
 
                if (CharEq(*cp, old_bkgd)) {
-                   SetChar2(*cp, CharOf(new_char));
+#if USE_WIDEC_SUPPORT
+                   if (!narrow) {
+                       if (Charable(new_bkgd)) {
+                           SetChar2(*cp, CharOf(new_char));
+                       } else {
+                           SetChar(*cp, L' ', AttrOf(new_char));
+                       }
+                       memcpy(cp->chars,
+                              new_char.chars,
+                              CCHARW_MAX * sizeof(cp->chars[0]));
+                   } else
+#endif
+                       SetChar2(*cp, CharOf(new_char));
                }
                if (tmp_pair != 0) {
                    if (tmp_pair == old_pair) {
@@ -219,10 +256,18 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch)
     returnCode(code);
 }
 
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(int)
+wbkgrnd(WINDOW *win, const ARG_CH_T ch)
+{
+    return _nc_background(win, ch, FALSE);
+}
+#endif
+
 NCURSES_EXPORT(int)
 wbkgd(WINDOW *win, chtype ch)
 {
     NCURSES_CH_T wch;
     SetChar2(wch, ch);
-    return wbkgrnd(win, CHREF(wch));
+    return _nc_background(win, CHREF(wch), TRUE);
 }