Jürgen,

May I suggest a couple of changes to src/main.cc?

The first thing is a. bug - there's no #include "config.h"  in main.cc  
HAVE_IOCTL_TIOCGWINSZ  is undefined and code that is conditionalized based on 
its existence
won't be compiled. 

I also looked at the changes in context, and think that the code can be 
streamlined a bit.

* the signal handler code for SIGWINCH can be conditionalized based on whether 
HAVE_IOCTL_TIOCGWINSZ is set.  My thought is, if we aren't going to use 
SIGWINCH to change the
column width, why configure the signal handler?
* If the ioctl is available but the preferenece WINCH_sets_pw is not set, 
there's also no need to enable the signal handler.
* The signal handler now has code to make sure that ⎕PW is set between max and 
min valuse.
* There's overlap in the code in the SIGWINCH signal handler and the initial 
set up code based on whether preference WINCH_sets_pw is set or not
  later in the code. I simplified it to call the signal handler routine 
(essentiallly pretending that a signal was received at startup time).

Here's the diffs betwen my code and SVN1808 - it includes both my proposed code 
and the #include of config.h:

===================================================================
--- src/main.cc (revision 1808)
+++ src/main.cc (working copy)
@@ -41,6 +41,8 @@
 #include <sys/socket.h>
 #include <sys/types.h>
 
+#include "config.h"
+
 #if HAVE_IOCTL_TIOCGWINSZ   // plat form has ioctl(fd, TIOCGWINSZ. ...)
 # include <sys/ioctl.h>
 #endif
@@ -132,17 +134,28 @@
    got_WINCH = true;
 
 struct winsize wsize;
-   // TIOCGWINSZ is 0x5413 on GNU/Linux. We use 0x5413 instead of TIOCGWINSZ
-   // if TIOCGWINSZ is not #defined on some platform.
+
+#if HAVE_IOCTL_TIOCGWINSZ
+   // query the window size and set ⎕PW if we have ioctl TIOCGWINSZ
    //
-#ifndef TIOCGWINSZ
-# define TIOCGWINSZ 0x5413
+    
+   // MAX_Quad_PW is 10,000 or so, which is certainly larger than
+   // the number of screen columns. We trust TIOCGWINSZ only if
+   // it is resonably small. We allow it to be too small (and then
+   // increase it). but ignore it if it is too large.
+   //
+   wsize.ws_col = MAX_Quad_PW;   // invalidate the column count
+   if (0 == ioctl(STDIN_FILENO, TIOCGWINSZ, &wsize))
+      {
+        if (wsize.ws_col < MIN_Quad_PW)   // increase too small ws_col
+           wsize.ws_col = MIN_Quad_PW;
+        if (wsize.ws_col > MAX_Quad_PW)   // limit ws_col
+           wsize.ws_col = MAX_Quad_PW;
+        Workspace::set_PW(wsize.ws_col, LOC);
+      }
 #endif
-   if (0 != ioctl(STDIN_FILENO, TIOCGWINSZ, &wsize))   return;
-   if (wsize.ws_col < MIN_Quad_PW)   return;
-   if (wsize.ws_col > MAX_Quad_PW)   return;
-
-   Workspace::set_PW(wsize.ws_col, LOC);
+   // just return if we don't have ioctl TIOCGWINSZ
+   return;
 }
 //----------------------------------------------------------------------------
 /// old sigaction argument for SIGUSR1
@@ -451,34 +464,25 @@
    sigaction(SIGTERM,  &new_TERM_action,      &old_TERM_action);
    sigaction(SIGHUP,   &new_HUP_action,       &old_HUP_action);
    signal(SIGCHLD, SIG_IGN);   // do not create zombies
-   if (UserPreferences::uprefs.WINCH_sets_pw)
-      {
-        sigaction(SIGWINCH, &new_WINCH_action, &old_WINCH_action);
-        signal_WINCH_handler(0);   // pretend window size change
-      }
 
 #if HAVE_IOCTL_TIOCGWINSZ
-   // The platform supports reading back of the window size. If the user
-   // wants ⎕PW to be controlled by the window size, then she most likely
-   // also wants ⎕PW to be controlled by the window size at start-up.
+   // Enable the ability to change ⎕PW on window resize only if the
+   // platform supports ioctl TIOCGWINSZ
    //
+    
    if (UserPreferences::uprefs.WINCH_sets_pw)
       {
-        winsize win_size;
-        win_size.ws_col = MAX_Quad_PW;   // invalidate the column count
-        if (0 == ioctl(STDIN_FILENO, TIOCGWINSZ, &win_size))
-           {
-             // MAX_Quad_PW is 10,000 or so, which is certainly larger than
-             // the number of screen columns. We trust TIOCGWINSZ only if 
-             // it is resonably small. We allow it to be too small (and then
-             // increase it). but ignore it if it is too large.
-             //
-             if (win_size.ws_col < MIN_Quad_PW)   // increase too small ws_col
-                win_size.ws_col = MIN_Quad_PW;
-
-             if (win_size.ws_col < MAX_Quad_PW)   // ognmore large ws_col
-                Workspace::set_PW(win_size.ws_col, LOC);
-           }
+        // IF WINCH_sets_pw preference is enabled, set up a handler for the
+        // SIGWINCH signal.
+        sigaction(SIGWINCH, &new_WINCH_action, &old_WINCH_action);
+         
+        // The platform supports reading back of the window size. If the user
+        // wants ⎕PW to be controlled by the window size, then she most likely
+        // also wants ⎕PW to be controlled by the window size at start-up.
+        // We do this by by using the WINCH signal handler to pretend that
+        // there's a window size change
+        
+        signal_WINCH_handler(0);   // pretend window size change
       }
 #endif

- paul

> On Dec 29, 2024, at 8:08 AM, Dr. Jürgen Sauermann 
> <m...@xn--jrgen-sauermann-zvb.de> wrote:
> 
> Hi Paul,
> 
> thanks, fixed in SVN 1808.
> 
> Best Regards,
> Jürgen
> 

Reply via email to