NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Cooless with feh



    Date:        Sun, 13 Sep 2026 17:49:57 -0600
    From:        "DTB" <trinity@tebibyte.media>
    Message-ID:  <DLELAOTJGZH1.3D0Z8QIIQ9UNX@tebibyte.media>

  | # I have not tried this! You may have to debug.

Yes.

  | sh -ec '
  | while :; do
  | 	pkill feh || true
  | 	feh --class wallpaper -g +0+$y /path/to/wallpaper.tif
  |
  | 	y=$(echo $y 1 + p | dc) # +1 per round
  | 	test $y -gt 100 && y=0  # 0-100
  | 	sleep 5                 # 5s
  | done'

I know nothing about feh, or moving wallpapers (can't even imagine
wanting that) or how smooth a technique like that would be, but as
a sh script that's just painful to look at.

Instead try:

sh -c ' y=0
	while :
	do
		pkill feh 2>/dev/null
		feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif || exit
		y=$(( y + 1 > 100 ? 0 : y + 1 ))
		sleep 5 || exit
	done'

No evil -e, and because of that, no need for the || true after the pkill
(but redirecting stderr, if there is no feh running, no need to be told
about it), the next line might (probably does, but as I don't know feh
I'm not sure)

		feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif &

instead of what I put there - depends whether feh just loads the wallpaper
and exits (in which case you want the first version with "|| true")
or if it remains running, in which case you need the version with '&'
instead, and in that case, between the pkill and the feh you also
need to add "wait" (just that as command), or perhaps "wait $! || :"
with the $! unquoted, so the first time it will just be "wait" which
should do nothing, and later times it will wait for the previous "feh"
to have exited before starting a new one - but starting async ('&' processes)
and never waiting for them to exit isn't a good idea (it won't make
zombie processes, the shell cleans up, but it is also remembering all
the exit status values for no reason).

The "sleep 5 || exit" as I expect that most of the time, that "sleep"
will be what is running, and if interrupted or killed in some other way,
you want the whole script to exit, not just iterate one more time.  That's
the place where the -e might have automated that, but it really is better
to decide when the script should exit because of an error, and code that
explicitly, rather than hoping -e will work as desired (it often doesn't).

And to answer the on-list question, 'y' would be the y coordinate of the
image on the screen, the original script didn't initialise it, hence you
probably would get an error from "-g +0+" as the opion to feh the first
time, and the y=$(echo $y 1 + p | dc) wouldn't have worked either.
This version will gradually move the top of the wallpaper down the
screen.   To move up, init y to 100, and change the "y=" line in the
loop to be:
	y=$(( y - 1 < 0 ? 100 : y - 1 ))

It is quite likely that "100" is wrong, in both versions, and needs to
be the vertical size of your screen, but again, I don't know feh, nor
how it interprets its args, that might be a percentage of the screen size,
rather than a pixel count, for all I know.

kre

ps: the script as a whole (moving down) using async feh might be ...

sh -c ' y=0
	while :
	do
		pkill feh 2>/dev/null
		wait $! || :
		feh --class wallpaper -g +0+"$y" /path/to/wallpaper.tif &
		y=$(( y + 1 > 100 ? 0 : y + 1 ))
		sleep 5 || exit
	done'




Home | Main Index | Thread Index | Old Index