The configure code to determine HAVE_IOCTL_TIOCGWINSZ in config.h doesn't work on macOS:
conftest.cpp:130:11: fatal error: 'asm/termbits.h' file not found
130 | #include <asm/termbits.h> /* for TIOCGWINSZ */
| ^~~~~~~~~~~~~~~~
1 error generated.
configure:22435: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU APL"
| #define PACKAGE_TARNAME "apl"
| #define PACKAGE_VERSION "1.9"
| #define PACKAGE_STRING "GNU APL 1.9"
| #define PACKAGE_BUGREPORT "bug-apl@gnu.org"
| #define PACKAGE_URL "https://www.gnu.org/software/apl/"
| #define HAVE_STDIO_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_WCHAR_H 1
| #define STDC_HEADERS 1
| #define _ALL_SOURCE 1
| #define _DARWIN_C_SOURCE 1
| #define _GNU_SOURCE 1
| #define _HPUX_ALT_XOPEN_SOCKET_API 1
| #define _NETBSD_SOURCE 1
| #define _OPENBSD_SOURCE 1
| #define _POSIX_PTHREAD_SEMANTICS 1
| #define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
| #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
| #define __STDC_WANT_IEC_60559_DFP_EXT__ 1
| #define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
| #define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
| #define __STDC_WANT_LIB_EXT2__ 1
| #define __STDC_WANT_MATH_SPEC_FUNCS__ 1
| #define _TANDEM_SOURCE 1
| #define __EXTENSIONS__ 1
| #define PACKAGE "apl"
| #define VERSION "1.9"
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_NCURSES_H 1
| #define HAVE_TERM_H 1
| #define HAVE_DIRENT_H 1
| #define HAVE_EXECINFO_H 1
| #define HAVE_FCNTL_H 1
| #define HAVE_FENV_H 1
| #define HAVE_FFTW3_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_LIBPNG16_PNG_H 1
| #define HAVE_LIMITS_H 1
| #define HAVE_LOCALE_H 1
| #define HAVE_NETDB_H 1
| #define HAVE_NETINET_IN_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_SYS_UN_H 1
| #define HAVE_TERMIOS_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_UTMPX_H 1
| #define HAVE_VECTOR 1
| #define HAVE_ZLIB_H 1
| #define HAVE_STDBOOL_H 1
| #define cfg_CONFIGURE_ARGS "./configure '--without-gtk3' 'CXXFLAGS=-O3 -I/opt/local/include -std=gnu++17' 'LDFLAGS=-L/opt/local/lib'"
| #define HAVE_SYS_TIME_H 1
| #define HAVE_SYS_PARAM_H 1
| #define HAVE_FORK 1
| #define HAVE_VFORK 1
| #define HAVE_ALARM 1
| #define HAVE_GETPAGESIZE 1
| #define HAVE_WORKING_VFORK 1
| #define HAVE_WORKING_FORK 1
| #define HAVE_MALLOC 1
| #define HAVE_MMAP 1
| #define HAVE_DUP2 1
| #define HAVE_FLOOR 1
| #define HAVE_GETCWD 1
| #define HAVE_GETHOSTBYNAME 1
| #define HAVE_GETTIMEOFDAY 1
| #define HAVE_MEMSET 1
| #define HAVE_MKDIR 1
| #define HAVE_MODF 1
| #define HAVE_MUNMAP 1
| #define HAVE_POW 1
| #define HAVE_REALPATH 1
| #define HAVE_RINT 1
| #define HAVE_RMDIR 1
| #define HAVE_SELECT 1
| #define HAVE_SETENV 1
| #define HAVE_SETLOCALE 1
| #define HAVE_SOCKET 1
| #define HAVE_SQRT 1
| #define HAVE_STRCASECMP 1
| #define HAVE_STRCHR 1
| #define HAVE_STRDUP 1
| #define HAVE_STRNCASECMP 1
| #define HAVE_STRNDUP 1
| #define HAVE_STRERROR 1
| #define HAVE_STRRCHR 1
| #define HAVE_STRSTR 1
| #define HAVE_STRTOL 1
| #define HAVE_UNAME 1
| #define HAVE_LIBPTHREAD 1
| #define HAVE_LIBCURSES 1
| #define HAVE_LIBNCURSES 1
| #define HAVE_LIBM 1
| #define HAVE_LIBDL 1
| #define HAVE_STRUCT_STAT_ST_BLOCKS 1
| #define HAVE_ST_BLOCKS 1
| #define HAVE_XCB_XCB_H 1
| #define HAVE_X11_XLIB_H 1
| #define HAVE_X11_XLIB_XCB_H 1
| #define HAVE_X11_XUTIL_H 1
| #define HAVE_LIBX11 1
| #define HAVE_LIBXCB 1
| #define HAVE_LIBX11_XCB 1
| #define apl_X11 1
| #define HAVE_LIBFFTW3 1
| #define HAVE_LIBPNG 1
| #define HAVE_LIBZ 1
| #define HAVE_SQLITE3 1
| #define apl_SQLITE3 1
| #define apl_POSTGRES 0
| #define HAVE_LIBPCRE2_32 1
| #define HAVE_LIBM 1
| #define HAVE_LIBGSLCBLAS 1
| #define HAVE_LIBGSL 1
| #define apl_GTK3 0
| #define HAVE_GETTIMEOFDAY 1
| /* end confdefs.h. */
| #include <asm/termbits.h> /* for TIOCGWINSZ */
| #include <sys/ioctl.h>
|
| int
| main (void)
| {
| winsize win;
| ioctl(/*fd */ 0, TIOCGWINSZ, &win);
|
| ;
| return 0;
| }
<asm/termbits.h> doesn't exist on macOS, hence the #include failure.
Simply including <sys/ioctl.h> is all that's needed to get the definition of the TIOCGWINSZ ioctl on macOS. I suspect that's the same on Linux as well. I'll test and report back.
- paul
On Dec 28, 2024, at 12:32 PM, Dr. Jürgen Sauermann <mail@jürgen-sauermann.de> wrote:
Hi Elias et al.,
thanks for the hint. I have now (
SVN 1807) changed the code
so that the initial ⎕PW
is set from the size of the GNU APL window if:
1. the platform supports TIOCGWINSZ, and
2. the user has set WINCH-SETS-⎕PW to Yes in one of her preferences
files, and
3. the user has NOT set INITIAL-⎕PW in one of her preferences files,
and
4. the number of columns returned by TIOCGWINSZ is reasonable.
Blake, no need to worry since WINCH-SETS-⎕PW is disabled by default
(and INITIAL-⎕PW
is 80 by default).
Best Regards and happy new year,
Jürgen
On 12/25/24 16:15, Elias Mårtenson
wrote:
Here's what the stty command does to read this infomration:
static int get_win_size (int fd, struct winsize *win)
{
int err = ioctl (fd, TIOCGWINSZ, (char *) win);
return err;
}
Regards,
Elias
Hi Mike,
I have applied your patches -
SVN 1806.
A general problem with the SIGWINCH signal is that it is not
emitted when the apl interpreter
starts up (which make sense because the windows is not
resized at that point in time).
One could think of asking the window manager for the current
window size but even though that
would be possible it is not portable in any way.
The INITIAL-⎕PW is a simple work-around to fix this.
Best Regards,
Jürgen
On 12/23/24 22:47, M.Hall wrote not e:
Yes, I see now the behavior is not quite
right, is it? With INITIAL-⎕PW disabled, the ⎕PW still
starts up at 80, ignoring the window width even with
WINCH-SETS-⎕PW. Somehow we would have to detect if it
was set, and use it only then, instead of always setting
it.
What I found unexpected was setting the initial width in
the preferences file, and not getting it -- having it
overriden by the current window width.
I thought that if the user set the initial ⎕PW in the
preferences file, AND enabled WINCH-SET-PW, they still
ought to get their initial ⎕PW. If they resized the
window later, then the ⎕PW would follow the window
width.
It's like using the command line setting "--PW 80" -- it
overrides everything else, which makes sense. Highest
priority is the command line, then the initial ⎕PW in
the preferences file (if set), then the window width (if
enabled), finally DEFAULT_Quad_PW.
I was just summarizing what I thought was the priority
of the three settings, and trying to make sense of how
they work.
Want 80? Unset both preference settings. Forget they
exist. :-)
Jürgen,
It's macOS that's the problem as Mike states.
I've confirmed with a small C program that the
ioctl TIOCGWINSZ has a different value on macOS
than on Linux.
WINCH-SETS-⎕PW
works without the patch on Linux. With Mike's
first patch, it works the same way on both
platforms.
I'm a little ambivalent about out the second
patch to provide a "priority". I like the way WINCH-SETS-⎕PW works as
it's currently implemented. I tried using Mike's
second patch but
it didn't seem
to work as I would have thought. So I backed it
out. I would think there would be some additonal
work to make it work as Mike wants. Personally
having WINCH-SETS-⎕PW
(which sets ⎕PW to
the window size) is the ultimate override -
you get what you're console column width is
set for. Want 80? Set the console to 80.
- paul
WINCH-SETS-⎕PW did not
originally work, on macOS Sonoma 14.7.2.
Because macOS does not use the same
TIOCGWINSZ magic number that was
hard-coded.
With the first patch,
WINCH-SETS-⎕PW does now work on macOS.
From my original email:
> I noticed that quad-pw wasn't
changing with window resizes on macOS
(Sonoma 14.7.2).
> Here's a patch; there's probably a
better way to do it.
Hi,
I am still not clear about whether the
WINCH-SETS-⎕PW preference
works or does not work on Mike's
platform (which ?). Could someone
please test that?
Thanks,
Jürgen
On 12/22/24 20:03, M.Hall wrote:
Paul Rockwell writes:
> There may be a side effect,
though. With the option set and
Mike's code inserted, ⎕PW will
be set to whatever the current
terminal width is, not the IBM
APL2 default of 80.
Yes. There are three settings
that interact:
- command line "--PW xx"
- preferences "INITIAL-⎕PW
xx"
- preferences "WINCH-SETS-⎕PW"
The command line setting
overrides all others. This makes
sense to me.
INITIAL-⎕PW is active when
WINCH-SETS-⎕PW is off. Also,
good.
When WINCH-SETS-⎕PW is enabled,
the code bypasses the
INITIAL-⎕PW setup. Hmmm.
I think the user's INITIAL-⎕PW
should be used at startup, even
when WINCH-SETS-⎕PW is enabled.
So the startup priority would
be (high to low):
- command line
- INITIAL-⎕PW
- then WINCH
- then default 80 columns
Here's a patch for that, if you
want (applied against the
previous patch):
$ diff -u src/main-orig.cc
src/main.cc
--- src/main-orig.cc
2024-12-19 13:20:04.000000000
-0600
+++ src/main.cc 2024-12-22
10:11:42.000000000 -0600
@@ -449,10 +452,8 @@
sigaction(SIGWINCH,
&new_WINCH_action,
&old_WINCH_action);
signal_WINCH_handler(0); //
pretend window size change
}
- else
- {
-
Workspace::set_PW(UserPreferences::uprefs.initial_pw,
LOC);
- }
+ // honor the user's initial
PW preference, even if WINCH is
enabled
+
Workspace::set_PW(UserPreferences::uprefs.initial_pw,
LOC);
#if PARALLEL_ENABLED
memset(&new_control_BSL_action,
0, sizeof(struct sigaction));
--
Mike
Hall
--
Mike
Hall
--
Mike Hall