bashsimplecurses icon indicating copy to clipboard operation
bashsimplecurses copied to clipboard

100% width doesn't work on MacOS, always 80 chars wide

Open mrjones-plip opened this issue 3 years ago • 6 comments

Intro

Hi there! I'm really pleased with bashsimplecurses - thank you!! I've just launched a tool that uses it and we're seeing that MacOS users do not get a full width window when running a script that declares window "100% wide window" "red" "100%" Instead an 80 char wide window is shown. Since our script displays information that some times is wider than 80 chars, it'd be great if bashsimplecurses supported full width on MacOS.

Steps to reproduce

  1. Be on MacOS - tested on 10.13.6 and 11.x & in ohmyzsh, bash and sh
  2. Clone this repo (as of 054a04a)
  3. cd into ./bashsimplecurses/examples
  4. Create a file called macos.sh with this contents:
    #!/bin/bash
    . `dirname $0`/../simple_curses.sh
    main (){
        window "100% wide window" "red" "100%"
        append "`date`"
        endwin
    }
    main_loop -t 0.5 "$@"
    
  5. Run chmod +x macos.sh&& ./macos.sh

Expected: Window is shown full width of current terminal Actual: Window is always shown at 80 chars wide, no bigger, no smaller

Related - setting it to 50% in the script seems to show it at 40 chars wide ( i guess half of the 80 chars it thinks the terminal always is)

Screenshots

Here's a local shell on Ubuntu 20.04/ohmyzsh on the top and and SSH shell on macos/ohmyzsh on the bottom. The first shows a screen ~107 chars wide, the second shows one ~40 chars wide:

too narrow too wide

Here's the same script running on in a local shell on MacOS:

native mac os

mrjones-plip avatar Aug 24 '21 22:08 mrjones-plip

Doing a little poking around, the problem seems to stem from the tput cols call in the window() function. When I call it on the bare command line on MacOS I get the accurate answer. When it's called in the subshell in window(), it ALWAYS returns 80.

I wonder if it has to do with an old version of ncurses? On my Ubuntu 18 box i get ncurses 6.1.20180127 but on the two MacOS boxes I just tested on (one High Sierra 10.13.6 and one Big Sur 11.4) they both have the exact same version: ncurses 5.7.20081102

mrjones-plip avatar Aug 25 '21 19:08 mrjones-plip

ah - confirmed! I used Homebrew and to upgrade ncurses on my MacOS box:

/usr/local/Cellar/ncurses/6.2/bin/tput -V
ncurses 6.2.20200212

I then forced Bash simple curses to use this version and the problem went away. I'll do a little more testing to see if there's a way to be backwards compatible with out any regressions.

mrjones-plip avatar Aug 25 '21 19:08 mrjones-plip

So, my work around is to:

  1. install Homebew
  2. install ncurses: brew install ncurses
  3. add a symlink for tput where it should be (caution, version specific!): ln -s /usr/local/Cellar/ncurses/6.2/bin/tput /usr/local/bin/
  4. inside my main() function, redefine the PATH so that it prioritizes the Homebrew version over the native one:
    main ()
       # check for brew installed tput for MacOS, backwards compatible with linux/WSL2
       PATH=/usr/local/opt/ncurses/bin/:$PATH
       ...
    

While a hassle for MacOS users, it's an OK enough work around for now.

Leaving this ticket open for maintainers to do with as they please!

mrjones-plip avatar Aug 25 '21 22:08 mrjones-plip

Right, we should add a requirement check in the script.

metal3d avatar May 20 '23 09:05 metal3d

So, my work around is to:

  1. install Homebew
  2. install ncurses: brew install ncurses
  3. add a symlink for tput where it should be (caution, version specific!): ln -s /usr/local/Cellar/ncurses/6.2/bin/tput /usr/local/bin/
  4. inside my main() function, redefine the PATH so that it prioritizes the Homebrew version over the native one:
    main ()
       # check for brew installed tput for MacOS, backwards compatible with linux/WSL2
       PATH=/usr/local/opt/ncurses/bin/:$PATH
       ...
    

While a hassle for MacOS users, it's an OK enough work around for now.

Leaving this ticket open for maintainers to do with as they please!

I tried but it does not work for me.

I tried this:

# error
$ cd /usr/local/Cellar
no such file or directory: /usr/local/Cellar

# but instead
$ brew --prefix ncurses                  
/opt/homebrew/opt/ncurses

# I feel this should work
$ sudo ln -s /opt/homebrew/opt/ncurses/bin/tput /usr/local/bin/

```

But same result :-/

pascalandy avatar Mar 05 '24 17:03 pascalandy

@pascalandy - sorry my work around didn't work for you! That said, if you did indeed get it installed with brew at the path you specified, then step 4 should still work. Maybe edit your main() function to redefine PATH like so?

PATH=/opt/homebrew/opt/ncurses/bin/:$PATH

mrjones-plip avatar Mar 05 '24 17:03 mrjones-plip