Controlling X windows windows — wmctrl

So I wanted to be able to run an arbitrary X windows application and put it where I want on the desktop.

Some applications have a geometry flag, but many don’t. For my test case, I am using DOSBox.

There’s a nice old DOSBox application, BCLOCK. When it runs it looks like this:

Screen shot of bclock running in a DOSBox window.

Bclock — the block clock. When the screen fills up with grey, the day is done.

So, let’s see if I can get it to appear where I want — say the bottom-right corner of the screen. After much hunting around, I found wmctrl. So:

$ sudo apt-get install wmctrl

$ wmctrl -l
0x00200005  0 hostname
0x00c00003 -1 hostname Top Expanded Edge Panel
0x00c00017 -1 hostname Bottom Expanded Edge Panel
0x00e00006 -1 hostname x-caja-desktop
0x02600010  0 hostname Edit Post ‹ Darren Goossens — WordPress - Mozilla Firefox
0x02e00005  0 hostname mrxvt

OK, now run a DOSBox session that is customised to start BCLOCK, then repeat the ‘list windows’ command; yep, it’s there, with an extra line added to the end of the output:

0x0300001c  0 hostname DOSBox 0.74, Cpu speed:     3000 cycles, Frameskip  5, Program:   BCLOCK

If I want to close the application, I can type:

wmctrl -c 'BCLOCK'

OK, how about moving it around? There’s an option -r <WIN> -e <MVARG> where… well, I’ll quote the help:

Specifies a change to the position and size
         of the window. The format of the argument is:
          : Gravity specified as a number. The numbers are
            defined in the EWMH specification. The value of
            zero is particularly useful, it means "use the
            default gravity of the window".
         ,: Coordinates of new position of the window.
         ,: New width and height of the window.

OK, and there the useful command:

$ wmctrl -lG

Which gives position and size of each window. So, I can manually put the window where I want it then use wmctrl to tell me its coords, then use a script including the correct wmctrl command to position the window…

Check if it puts it where I want (note the unspaced commas):

$ wmctrl -r 'BCLOCK' -e 0,2238,1261,-1,-1 

Yep, it’s a champion.
OK, so now I can start an application with a little script that runs the app then puts it where I want it.

Here’s the script:

$ cat run_bclock_in_the_corner
dosbox -conf /home/username/installs/bclock/dosbox_bclock.conf &
sleep 2s
wmctrl -r 'BCLOCK' -e 0,2238,1261,-1,-1

I might even put it in my startup file.

Screen shot.

Bclock down in the corner.

Trivial for you, maybe, but I am pleased.


Mnemo’s Memory

Over at, I got hold of a copy of Mnemo’s Memory by David Versace.

Cover of book.

Mnemo’s Memory; print-on-demand version.

Versace is an engaging writer, never short of an idea or a humorous aside. The two outstanding pieces here are ‘The Lighthouse at Cape Defeat’, which I first encountered in Aurealis, and the title story, which was new to me and shows off his penchant for steampunk, complete with smoked glass lenses, chuffing dirigibles and clockwork men. Both make full use of his ability to turn a nice metaphor and to create a fantasy world of which the story seems a real inhabitant, rather than a world that seems to exist just so the story can work.

Lengthy stories alternate with flash fiction — it works well. It’s almost impossible not to read the short one after the long one.

He’s distributing the ebook for nada, nix, nuttin’ over at his website; do yourself a favour.


GLib-GIO-ERROR **: Settings schema ‘somethingorother’ is not installed

Note that all this applies just as well to eye of mate. And in fact some other applications (eg nautilus) may show the same error on installation.

Installing via Cygwin’s setup.exe, eog (eye of gnome), installed via Cygwin’s setup.exe, does not run but throws arror:

(eog:19220): GLib-GIO-ERROR **: Settings schema 'org.gnome.eog.plugins' is not installed

I know almost nothing about this stuff, but… Tried installing ‘gnome-settings-daemon’ ‘cos it had ‘settings’ in the title and ‘gnome’… (added a whole bunch of dependencies, but what the hell). Nope, did not help.

Start actually thinking…

$ gsettings  list-schemas

org.gnome.eog.plugins was not there!

where is it and why is it not added?

$ find /usr -iname "*eog*xml*"


OK, so something’s out there.

$ apropos schemas
glib-compile-schemas (1) - GSettings schema compiler

Okay. Got no idea what that is but it looks promising.

$ glib-compile-schemas
You should give exactly one directory name

OK, then how about:

$ glib-compile-schemas /usr/share/glib-2.0/schemas/

Warning: Schema “org.gnome.crypto.cache” has path “/desktop/gnome/crypto/cache/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.crypto.pgp” has path “/desktop/gnome/crypto/pgp/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.locale” has path “/system/locale/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.proxy” has path “/system/proxy/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.proxy.http” has path “/system/proxy/http/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.proxy.https” has path “/system/proxy/https/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.proxy.ftp” has path “/system/proxy/ftp/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.
Warning: Schema “org.gnome.system.proxy.socks” has path “/system/proxy/socks/”.  Paths starting with “/apps/”, “/desktop/” or “/system/” are deprecated.

Good: warnings, but not errors.

now eog works,(throws an error, but works).

$ eog

** (eog:11212): WARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
Screenshot of eye of gnome showing a file image.

Eye of Gnome working on Cygwin after my kludgy fix.

(Actually, that error went away for some reason…)


Eye of what?

top on cygwin

Note to self: Install top on Cygwin.

apt-cyg is useful.

$ apt-cyg searchall top.exe

$ apt-cyg install procps

Or use setup.exe to install procps

Screenshop of top on cygwin

top on cygwin.


Debian firmware errors — NIC

Extract of output of dmesg:

<pre> $ dmesg | grep firmware

[ 178.948233] r8169 0000:03:00.0: firmware: failed to load rtl_nic/rtl8168e-3.fw (-2)
[ 178.948252] r8169 0000:03:00.0: Direct firmware load for rtl_nic/rtl8168e-3.fw failed with error -2
[ 178.948257] r8169 0000:03:00.0 enp3s0: unable to load firmware patch rtl_nic/rtl8168e-3.fw (-2)


Well, my NIC is RealTek, so… go to Debian package search page and search for ‘realtek’…

Package firmware-realtek

    stretch (stable) (kernel): Binary firmware for Realtek wired/wifi/BT adapters [non-free]
    20161130-3: all

OK, I do not have non-free in my etc/apt/sources.list file, so…

$ sudo vim /etc/apt/sources.list

and add non-free repositories:

$ cat /etc/apt/sources.list

# deb cdrom:[Debian GNU/Linux 9.3.0 _Stretch_ - Official amd64 DVD Binary-1 20171209-12:11]/ stretch contrib main

deb cdrom:[Debian GNU/Linux 9.3.0 _Stretch_ - Official amd64 DVD Binary-1 20171209-12:11]/ stretch contrib main

deb stretch main non-free
deb-src stretch main non-free


$ sudo apt-get update
$ sudo apt-get install firmware-realtek

and error goes away!

mrxvt on cygwin — 2018 style

I’ve installed mrxvt on Cygwin once before — it was not as simple as it might have been. So I’ve moved jobs and computers and now I want to install it on Cygwin on Win 10 64-bit. Again, not as simple as I might have liked.

First, install the dependencies for building:

These are: xorg-server-devel, automake, autoconf, libtool, make (thought more about make below)

I used

$ apt-cyg install xorg-server-devel automake autoconf libtool

from the Cygwin command line, but you may just as well use setup.exe.

Then, grab the sources. Let’s try both — stable and unstable.

First, tried 0.4.2 — turns out I need to specify build type.

$ ./
$ ./configure --enable-everything --disable-debug --build amd64
$ make

Bingo! The binary is in src/mrxvt.exe and I can ‘$ make install‘ if I want.

How about 0.5.4 now?

There is no, so copy it in from 0.4.2 (or just run ./configure without bootstrap).

$ cp ../mrxvt-0.4.2/ .
$ ./bootstrap
$ make
C:/Users/darren/installs/getgnuwin32/GetGnuWin32/gnuwin32/bin/make all-recursive
make[1]: Entering directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4'
Making all in doc
make[2]: Entering directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4/doc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4/doc'
Making all in src
make[2]: Entering directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4/src'
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c command.c
gcc: fatal error: no input files
compilation terminated.
make[2]: *** [command.o] Error 1
make[2]: Leaving directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `C:/cygwin64/home/darren/installs/mrxvt/mrxvt-0.5.4'
make: *** [all] Error 2

Errors! On the other hand, it seems to be getting make from a gnuwin32 install, not from Cygwin. Worry about that later.

First, did this — went into src and ran the compile command for command.c manually (copied from output above):

$ cd src
$ gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c command.c
command.c: In function ‘rxvt_process_keyrelease’:
command.c:2801:2: warning: ‘XKeycodeToKeysym’ is deprecated [-Wdeprecated-declarations]
ks = XKeycodeToKeysym(r->Xdisplay, ev->keycode, 0);
In file included from rxvt.h:222:0,
from command.c:40:
/usr/include/X11/Xlib.h:1687:15: note: declared here
extern KeySym XKeycodeToKeysym(

And that indeed generates process.o. So, what if I run the compile command on all the .c files manually? It’s not hard. Here’s a little script:

$ cat file
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c command.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c debug.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c encoding.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c grkelot.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c init.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c logging.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c macros.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c main.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c menubar.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c misc.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c mjpg.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c mpng.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c netdisp.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c pixmap.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c ptytty.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c rxvt.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c rxvtmem.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c screen.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar-next.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar-plain.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar-rxvt.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar-sgi.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c scrollbar-xterm.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c session.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c strings.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c tabbar.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c transparent.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c xdefaults.c
gcc -DPKG_CONF_DIR=\"/usr/local/etc/mrxvt\" -I. -I.. -g -O2 -Wall -fPIC -c xftacs.c

(I just made this by copying the compile command and listing all .c files to a file then prepending the compile command to each line using vim).

OK, in src, where my file full of compile commands is called ‘file’:

$ bash file

OK, yes! Now I have a bunch of .o files. Now go to build directory and rerun make.

$ cd ..
$ make

Success! The mrxvt.exe binary in in the 0.5.4 src directory. I can run both:

screenshot of the two versions of mrxvt, both running

mrxvt × 2

Now I can install whichever one I want to use.

Question: Was the 0.5.4 problem real or due to using the wrong make.exe? After moving the .o and mrxvt.exe out of src, tried this:

$ apt-cyg install make
$ which make
$ ./configure --enable-everything --disable-debug --build amd64
$ make
gcc: fatal error: no input files

So, no, the problem was not the wrong make.

Next: added to menu:

$ cd /usr/share/applications/
$ cp uxterm.desktop mrxvt.desktop

Then changed references to uxterm to mrxvt, and changed the icon name to mrxvt-48x48:

$ cat mrxvt.desktop
[Desktop Entry]
Comment=tabbed terminal emulator for the X window system

My mrxvt icon. Take it if you like!


Then, went to this post, copied the png mrxvt icon and used gimp to save it as a 48 × 48 .png file called mrxvt-48x48.png, and put it in:


But then I found the icons in /usr/local/share/pixmaps/ so I just used one of them instead.

Tah. Dah.

Casiowriter cw-16 character set (American keyboard)

Printed on thermal paper and scanned (and post-processed in ImageJ to tidy it up, but only a little). Includes some Greek, a good set of math symbols, accented characters, including the ability to put any accent on any letter, some fractions, degree/minute/second symbols, paragraph marks (pilcrow, is it?). Pre-dates euro, of course, otherwise pretty useful.

Scanned typed document.

Complete character set from Casiowriter cw-16, shown as typed on thermal paper.


Just for reference.

xFig fonts print OK and export OK but do not display on screen: fixed

I’m using cygwin, but this problem can happen elsewhere and is because xFig’s expectations as to where to find some fonts are thwarted by more modern distributions in which the font tree is a little bit changed.

First, we create the place xFig expects to find fonts:

$ mkdir /usr/share/fonts/default/

Then we start by copying in the Type1 fonts from wherever the distro has put them. In my case:

$ cp -r /usr/share/X11/fonts/Type1 /usr/share/fonts/default

Then, cos I could, I copied in a whole bunch of type 1 (afm/pfa) fonts into the new subdirectory; I don’t care about duplication; copied them in from wherever I could find them:

$ find /usr/share/ -iname "*.pfa"
$ find /usr/share/ -iname "*.afm"

Once they were all in there, update the databases that are kept in the font directory:

$ mkfontscale /usr/share/fonts/default/Type1
$ mkfontdir   /usr/share/fonts/default/Type1

Then; if you type

$ xset -q

at the prompt you’ll get something like:

$ xset -q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000000
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off
    03: Shift Lock:  off    04: Group 2:     off    05: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  31
  auto repeating keys:  00feffffdffffbbf
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  2/1    threshold:  4
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  600    cycle:  600
  default colormap:  0x20    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
DPMS (Energy Star):
  Display is not capable of DPMS

For this, the important bit is the Font Path bit; we need to add the new directory to the fontpath.d by making a soft link in there (.d means directory):

cd /etc/X11/fontpath.d/

ln -s /usr/share/fonts/default/Type1 fonts-default

Then rehash the X windows font database:

xset fp rehash

Yep, some success…

Now, running xFig…

Screen grab from xFig showing font's on screen as well as in exprted version.

A range of fonts in xFig, at an arbitrary size (19 pt); they all show onscreen as well as in the exported/printed version. They did not before the incantation above.


Note: If it is telling you:

Warning: Missing charsets in String to FontSet conversion

don’t worry — it’s probably due to a utf8 locale:

 $ locale

If you change the LC_CTYPE setting to the same but without the .UTF-8 on the end, the message will go away; but it’s not important.

If I launch xFig like this:

$ LC_CTYPE=en_GB xfig

I don’t get the message.


Crop every page in a multipage PDF file

Apply the same crop to every page in a multipage PDF file. Requires pdftk, Ghostscript, and sometimes pdf2ps/ps2pdf.

See end of post for copy of bash script. Found it at:

I found best to use gv to get the right, left, top, bottom pixels to crop, then explicitly specify using the -t switch.

$ ./ -t "2 182 3 183" cw16.pdf cw16_crop.pdf

Note the quote marks around the crop values. They are in order left, top, right, bottom.

Try on Casiowriter manual from (See this bit of nonsense.)


Image of front page of manual, showing large white space bands at top and bottom.

Before using

After (though one page — the second — came out wrong and I don’t know why, but I fixed that by first processing the original PDF, first I went pdf2ps then ps2pdf and made a cleaned up PDF; then all was perfect when I ran the cropper):

Image of front page of manual, showing no large white space bands at top and bottom.


The script:

$ cat

function usage () {
  echo "Usage: `basename $0` [Options]  []"
  echo " * Removes white margins from each page in the file. (Default operation)"
  echo " * Trims page edges by given amounts. (Alternative operation)"
  echo "If only  is given, it is overwritten with the cropped output."
  echo "Options:"
  echo " -m \" [ [ ]]\""
  echo "    adds extra margins in default operation mode. Unit is bp. A single number"
  echo "    is used for all margins, two numbers \" \" are applied to the"
  echo "    right and bottom margins alike."
  echo " -t \" [ [ ]]\""
  echo "    trims outer page edges by the given amounts. Unit is bp. A single number"
  echo "    is used for all trims, two numbers \" \" are applied to the"
  echo "    right and bottom trims alike."
  echo " -hires"
  echo "    %%HiResBoundingBox is used in default operation mode."
  echo " -help"
  echo "    prints this message."

mar=(0 0 0 0); tri=(0 0 0 0)

while getopts m:t:h: opt
  case $opt
    eval mar=($OPTARG)
    [[ -z "${mar[1]}" ]] && mar[1]=${mar[0]}
    [[ -z "${mar[2]}" || -z "${mar[3]}" ]] && mar[2]=${mar[0]} && mar[3]=${mar[1]}
    eval tri=($OPTARG)
    [[ -z "${tri[1]}" ]] && tri[1]=${tri[0]}
    [[ -z "${tri[2]}" || -z "${tri[3]}" ]] && tri[2]=${tri[0]} && tri[3]=${tri[1]}
    if [[ "$OPTARG" == "ires" ]]
      usage 1>&2; exit 0
    usage 1>&2; exit 1
shift $((OPTIND-1))

[[ -z "$1" ]] && echo "`basename $0`: missing filename" 1>&2 && usage 1>&2 && exit 1
[[ -n "$1" ]] && output=$1 && shift;

    [[ "$c" -eq 0 ]] && gs -dNOPAUSE -q -dBATCH -sDEVICE=bbox "$input" 2>&1 | grep "%%$bbtype"
    pdftk "$input" output - uncompress
) | perl -w -n -s -e '
  BEGIN {@m=split /\s+/, $mar; @t=split /\s+/, $tri;}
  if (/BoundingBox:\s+([\d\.\s]+\d)/) { push @bbox, $1; next;}
  elsif (/\/MediaBox\s+\[([\d\.\s]+\d)\]/) { @mb=split /\s+/, $1; next; }
  elsif (/pdftk_PageNum\s+(\d+)/) {
      print "/MediaBox [", join(" ", @mb), "]\n";
    } else {
      @bb=split /\s+/, $bbox[$p];
      print "/MediaBox [", join(" ", @bb), "]\n";
' -- -mar="${mar[*]}" -tri="${tri[*]}" -c=$c | pdftk - output "$output" compress

Thanks to the inventor!


Casiowriter CW-16: Fax rolls and batteries

What can I say? It was $5. A significant problem with these old things is that the cartridges/cassettes/ribbons/whatever are proprietary and no longer getting made. On the other hand, this old Casio can print thermally as well as using ink, and I have a bunch of old fax rolls kicking around.

Here is the test page (insert paper, hold down ‘code’ while turning on). It actually looks a lot better than this scan.

Did not come with a carry bag or AC adapter, but runs fine off 4 D-cells. Of course, they are worth more than the machine is.

At first it would not print properly using ink. It turned out the little cog that drags the tape through the cassette had come off. I found it inside the machine and, with a bit of jiggery pokery and a little dismantling and remantling, got it to work again. That was pleasing. Here is a fuzzy picture of the ‘compliance plate’. According to, 1034105 is as unknown as all the others. I think they came out around 1984 or so.

So the consumables are the batteries and the fax paper, and the ribbon, but at least the ribbon is optional. You can have ribbon and plain paper or no ribbon and fax paper. Options, 1985 style.

This is the cassette. They are meant to be used once. If you rewind it, you can see the letters that have been pressed out of it. When these kinds of machines came into offices and such, this became a security concern. I have not bothered to read the previous owner(s) correspondence, but I did rewind the tape a little just to see if I could rewind it. It works pretty well. Not very well, since where the ink has been used there is no ink at all, but it was just an experiment. You can see the sticky tape I put on it (the clips that hold it together did not work too well on reassembly…)

Oh, here’s the LCD. It does not hold a lot of words, but it is useful, and easily viewable in bright light, unlike the screen on a modern laptop. Indeed, this is quite a reasonable machine for typing outdoors.

Actual user review: This was a fairly low-end machine in its day, but it is quite usable. It can print 12 or 10 pitch, double width, bold, underline. It has direct print (like a normal typewriter), line print (print a line once it is finished, either by return key or reaching the margin) and a reasonably effective fully justified mode, in which when it hits the right margin it adjusts word spacing before printing the line. It is easy to fix spelling mistakes, though much quicker if you don’t need to use the spell checker. The keyboard is not great. It lacks the positive feel of a good computer keyboard (say IBM-M), and also the sensitive touch of a modern keyboard. I found when I tried to type fast I often dropped letters. That’s probably the main failing, really. It’s quite large, not really compact, either. For example, does not fit in a standard-size briefcase. So it is a bit odd — it can run off batteries, as if it’s meant to be ported around, but it has a large footprint and is bulky to carry — bulkier than, say, an Olympia SF. (Which was not the last, was it?)

The 24-pin dot-matrix type is a bit spidery, especially thermally, though there are 5 impression levels. There is a good range of characters, including proper superscript 2 and 3, a few Greek letters and mathematical symbols. Can set line spacing, tabs, margins, etc. Recommends against using textured paper.

Conclusion: In 2017, even free is probably too expensive, but in its day it would have been a useful compromise between price, portability and capability. At least the thermal printing means the lack of replacement cassettes does not brick it.

Why oh why oh.