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: Sun, 15 Jul 2018 06:53:35 -0400
User-agent: Mutt/1.5.23 (2014-03-12)

On Sun, Jul 15, 2018 at 10:57:40AM +0200, Pavel Stehule wrote:
> 2018-07-14 18:34 GMT+02:00 Thomas Dickey <address@hidden>:
> 
> > 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...
> >
> >
>   mvwin_wchnstr(stdscr, 5, 10, buffer, 1);
>   rs1 = getcchar(&buffer[0], wch, &attr, &pair, NULL);
>   rs2 = setcchar(obuf, wch, A_BOLD, COLOR_PAIR(2), NULL);

perhaps something like this:

    attr &= ~WA_ALTCHARSET;
    rs2 = setcchar(obuf, wch, attr | A_BOLD, COLOR_PAIR(2), NULL);

>   mvwadd_wchnstr(stdscr, 6, 10, obuf, 1);
> 
> This doesn't work too, but I found it. The problem is the lost of attribute
> A_ALTCHARSET

agreed
 
> I understand to this issue now. Thank you for hint.

no problem (report bugs)
 
> > 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
> >

-- 
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]