po 22. 3. 2021 v 22:07 odesílatel Thomas Munro <thomas.mu...@gmail.com> napsal:
> On Tue, Mar 23, 2021 at 1:53 AM Pavel Stehule <pavel.steh...@gmail.com> > wrote: > > po 22. 3. 2021 v 13:13 odesílatel Thomas Munro <thomas.mu...@gmail.com> > napsal: > >> The problem is that Apple's /dev/tty device is defective, and doesn't > >> work in poll(). It always returns immediately with revents=POLLNVAL, > >> but pspg assumes that data is ready and tries to read the keyboard and > >> then blocks until I press a key. This seems to fix it: > >> > >> +#ifndef __APPLE__ > >> + /* macOS can't use poll() on /dev/tty */ > >> state.tty = fopen("/dev/tty", "r+"); > >> +#endif > >> if (!state.tty) > >> state.tty = fopen(ttyname(fileno(stdout)), "r"); > > > > > > it is hell. > > Heh. I've recently spent many, many hours trying to make AIO work on > macOS, and nothing surprises me anymore. BTW I found something from > years ago on the 'net that fits with my observation about /dev/tty: > > https://www.mail-archive.com/bug-gnulib@gnu.org/msg00296.html > > Curious, which other OS did you put that fallback case in for? I'm a > little confused about why it works, so I'm not sure if it's the best > possible change, but I'm not planning to dig any further now, too many > patches, not enough time :-) > Unfortunately, I have no exact evidence. My original implementation was very primitive if (freopen("/dev/tty", "rw", stdin) == NULL) { fprintf(stderr, "cannot to reopen stdin: %s\n", strerror(errno)); exit(1); } Some people reported problems, but I don't know if these issues was related to tty or to freopen In some discussion I found a workaround with reusing stdout and stderr - and then this works well, but I have no feedback about these fallback cases. And because this strategy is used by "less" pager too, I expect so this is a common and widely used workaround. I remember so there was a problems with cygwin and some unix platforms (but maybe very old) there was problem in deeper nesting - some like screen -> psql -> pspg. Directly pspg was working, but it didn't work from psql. Probably somewhere the implementation of pty was not fully correct. > > > Please, can you verify this fix? > > It works perfectly for me on a macOS 11.2 system with that change, > repainting the screen exactly when it should. I'm happy about that > because (1) it means I can confirm that the proposed change to psql is > working correctly on the 3 Unixes I have access to, and (2) I am sure > that a lot of Mac users will appreciate being able to use super-duper > \watch mode when this ships (a high percentage of PostgreSQL users I > know use a Mac as their client machine). > Thank you for verification. I fixed it in master branch > >> A minor problem is that on macOS, _GNU_SOURCE doesn't seem to imply > >> NCURSES_WIDECHAR, so I suspect Unicode will be broken unless you > >> manually add -DNCURSES_WIDECHAR=1, though I didn't check. > > > > It is possible - > > > > can you run "pspg --version" > > Looks like I misunderstood: it is showing "with wide char support", > it's just that the "num" is 0 rather than 1. I'm not planning to > investigate that any further now, but I checked that it can show the > output of SELECT 'špeĉiäl chârãçtérs' correctly. > It is the job of ncursesw - pspg sends data to ncurses in original format - it does only some game with attributes.