No Description

ohnonot c69f4333b1 calculating font dimensions with awk instead of pure bash 5 days ago
helperscripts ade4e9f792 almost perfect 1 year ago
screenshots 8752af4608 github to notabug 1 year ago
.gitignore ade4e9f792 almost perfect 1 year ago 052db5ca74 some changes 1 year ago
marquee1 052db5ca74 some changes 1 year ago
termss c69f4333b1 calculating font dimensions with awk instead of pure bash 5 days ago


A terminal screensaver to replace xscreensaver & Co.
Written in bash.


  • the termss wrapper script: It will hide the mouse pointer (*), convert screen resolution to font characters, open a fullscreen terminal window (urxvt) and execute a command given as an argument. Then it starts listening to events, and will kill everything as soon as you wiggle your mouse pointer or type anything. Just like any screensaver. No screen locking.
    If you use dunst as your notification daemon, termss will pause dunst while the screensaver is active. If you have dunst in your $PATH, and it is not running, it will be started first.
  • a script (marquee1) designed to run inside that window. It first shows some output in nice toilet fonts in random colors and position, then sprinkles the whole thing with stars, waits, and starts again.


The Xorg X server has a screensaver builtin; settings can be queried via xset.

The marquee scripts in this repository are attempts at creating a simple "Marquee"-type screensaver: print the output of some command on screen, with variation in position & color (**).

The whole thing requires at least one more program that is capable of activating termss according to xset screensaver settings.

xss is one such program, and it is the one I'm using. It also comes with some useful extra utilities such as xsswin which can embed other applications in a fullscreen window, and xkeygrab to lock the screen.

xss-lock is another, and so is xautolock (this link for FreeBSD's Freshports; look under "Master Sites" to find sources).

Essentially these three programs do the same thing: They provide a mechanism to start an external application when the X server says "no user activity, time to start the screensaver".


The scripts currently do not have any command line options, modifications have to be done by editing the scripts themselves, and so there aren't really any dependencies, but if one wanted to get by without editing anything, one would need:

the termss script itself

  • Xorg (no wayland, no text-only install)
  • bash. Absolutely.
  • urxvt terminal emulator
  • Terminus font
  • xdotool
  • xlsfonts, possibly part of xorg-xlsfonts
  • xrandr, possibly part of xorg-xrandr
  • xinput, possibly part of xorg-xinput
  • hhpc to hide the pointer
  • optionally (for secure ungrabbing & pointer hiding) setxkbmap, possibly part of xorg-setxkbmap
  • optionally dunst
  • optionally (for the screencast option) imagemagick and gifsicle
  • grep, pidof, kill, killall

the marquee scripts

  • toilet to create banners
  • mpi-panel for media player info (also from here)
  • ncurses to provide tput
  • pv to slow down output
  • date and od (both coreutils)

The scripts

It isn't hard to imagine all the programs one can run in fullscreen to make for a nice screensaver, but this repository uses a terminal emulator.
The urxvt terminal emulator has a fullscreen option; others might have it too, or your window manager can provide it, but I recommend to use urxvt or xterm. In any case it must be able to use the old bitmapped xfonts.

The two included scripts make use of the figlet and toilet utilities, to print large characters on screen. Toilet has nicer fonts, imo.

One could also run pipes for example, or asciiquarium...

You will need a command like this in your autostart:

xss termss /path/to/termss/marquee1 &
# or
xss termss asciiquarium &
# or
xss termss sh -c 'cmatrix|lolcat'
# etc.


This is work in progress, you need to review and likely edit the scripts, there's not enough quality control etc.
But once it works, it works well enough. Stable, one could say.

(*) There are some situations where the mouse pointer cannot be hidden because some application grabbed it, so it should be ungrabbed first. However, that needs to be enabled first because it is potentially less secure. I have enabled it because I do not lock the screen anyhow. But you should know that termss keeps this option enabled for the remainder of that X session.
You can set insecure=0 inside the script, which uses an alternative method that is good enough for most cases, and ungrabbing stays disabled.

(**) It is said that burn-in isn't an issue on LCD screens, but I still feel better varying the position of the text across the whole screen. Apart from that, I need some basic information on the screen, large enough so I can also see it from the kitchen, and colours are always nice.