bug-ncurses
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mvwchgat breaks ACS chars


From: Thomas Dickey
Subject: Re: mvwchgat breaks ACS chars
Date: Sat, 14 Jul 2018 12:34:09 -0400
User-agent: Mutt/1.5.23 (2014-03-12)

On Fri, Jul 13, 2018 at 12:17:50PM +0200, Pavel Stehule wrote:
> Hi
> 
> I am working on library https://github.com/okbob/ncurses-st-menu, where I
> try to implement shadow under a window. I use mvwchgat function for colour
> changes. Yesterday I found a issue. This function doesn't works with chars
> passed by ACS_xx macros. The unicode chars has not this problem.
> 
> When I apply mvwchgat on hline, then result is 'x' char.

That's the expected behavior.  The ACS_xxx mapping is done at the time
the characters are rendered.  Otherwise, for instance, you couldn't
use the Unicode values indirectly via the chtype values.  That was
part of why I settled on this behavior in 2002;

20021228
        + rewrote lib_acs.c to allow PutAttrChar() to decide how to render
          alternate-characters, i.e., to work with Linux console and UTF-8
          locale.

(There was also some scenario where the ACS_xxx flags would be applied
more than once in the original scheme, causing incorrect output, which
the rewrite addressed).
 
> I wrote test case - see a attachment, please.
> 
> I have ncurses 6.1 patch patch: 20180224
> 
> Is it bug? Is there some alternative solution, how to change colours and
> attributes on specified positions?

You can always read the current attributes for a given position
using win_wchstr(), etc., along with getcchar().  With the current
information, you can modify the cells...

X/Open Curses isn't sufficiently detailed to provide guidance.

In a quick check, Solaris xcurses is too broken to run the test-case
(though reading the source for Illumos suggests that it makes no special
provision to leave ACS_xxx alone), testing with HPUX and AIX curses
leaves the vertical line alone, but does not make the cell bold, either.

Not that it matters, but NetBSD curses treats the ACS_VLINE the same way
as ncurses. (I'd comment on PDCurses as well, but its X11 port's been
broken for quite a while).
 
> Best regards
> 
> Pavel Stehule

> #include <ncurses.h>
> 
> /*
>  * Application demo
>  */
> int
> main()
> {
>       initscr();
>       start_color();
>       clear();
>       cbreak();
>       noecho();
>       keypad(stdscr, TRUE);
> 
>       refresh();
> 
>       init_pair(1, COLOR_WHITE, COLOR_BLUE);
>       init_pair(2, COLOR_WHITE, COLOR_BLACK);
> 
>       wbkgd(stdscr, COLOR_PAIR(1));
> 
>       wmove(stdscr, 5, 5);
>       waddstr(stdscr, "@");
> 
>       wmove(stdscr, 5, 10);
>       waddch(stdscr, ACS_VLINE);
> 
>       mvwprintw(stdscr, 10, 5, "correct output (before mvwchgat)");
>       mvwprintw(stdscr, 11, 5, "press any key");
>       refresh();
>       getch();
> 
>       mvwchgat(stdscr, 5, 5, 1, A_BOLD, 2, NULL);

With Solaris xcurses, that should be WA_BOLD.
The other implementations equate the two sets of names.
 
>       mvwprintw(stdscr, 10, 5, "still correct output (before mvwchgat on 
> hline)");
>       mvwprintw(stdscr, 11, 5, "press any key, ");
>       refresh();
>       getch();
> 
>       mvwchgat(stdscr, 5, 10, 1, A_BOLD, 2, NULL);
> 
>       mvwprintw(stdscr, 10, 5, "hline is broken now");
>       mvwprintw(stdscr, 11, 5, "press any key, .. will quit ");
>       refresh();
>       getch();
> 
>       endwin();
> 
>       return 0;
> }

-- 
Thomas E. Dickey <address@hidden>
https://invisible-island.net
ftp://ftp.invisible-island.net

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]