As I was browsing Tonsky’s blog for yesterday’s post, I noticed the pretty mouse pointers. Are those new? Better yet: When you click, they change their shapes! That’s something I’ve only seen in games so far. How fun!
Two questions:
- Wouldn’t this be cool to have in your operation system? Or is this already a thing? In some application maybe?
- How is this done in HTML and CSS? I only know about the
cursorproperty in CSS, is there acursor-pressedproperty as well?
Okay, that was more than two questions. As for the implementation, it’s an
:active pseudo-selector applied to some usually-not-clickable elements, including the page body.
Cool, I didn’t know you could do that!
body { cursor:url('pointer1.png'); }
body:active { cursor:url('pointer2.png'); }
See it in action: Click around in the area below, or try it on a separate page. (Sorry, mobile or tablet users: This only works with a mouse or trackball…)
Good thing I made the perfect test picture for that in 1998! :)
Modern GUIs are often not great. Back in the days™, it was mostly pre-installed crapware and printer utilities that used idiosyncratic controls and their very own colors and window decorations because, well, just because. Somewhere along the road, common buttons, checkboxes, title bars, and window controls went out of fashion, and when everything became a web-app or was styled like one, things took a turn for the (even) worse. Nowadays, you cannot even tell if a window is active by looking at its title bar, let alone drag or resize it easily.
Yes, this is…
- the rambling of a grumpy nerd,
- a platitude,
- covered in tons of opionated articles already*,
- and true. :)
Recently, I especially enjoyed reading this post about the downfall of native GUIs and these thoughts on the shortcomings of “invisible” design.
I’m currently working on a long-overdue Coppenheimer update – the last one was nearly two years ago, and its recent popularity gave me a little nudge. As I’m not a wasm, emscripten, or C++ guy, progress is slow (i. e. getting it to compile again after the vAmigaWeb merge and making sure everything still works), but I’ve got to the point where I’m thinking about new features. That’s where these blog posts struck a nerve: One thing I certainly won’t change are the GUI elements!
Originally I chose AmigaOS 2/3-inspired buttons for some authentic retro feeling, and because
I wanted to try out the border-image CSS
feature
(I love what modern browsers can do out-of-the-box with plain HTML and CSS).
But looking back at it now, having oldschool buttons and checkboxes with classic fake-3D borders makes for a nice user experience as well. As in: The interface communicates clearly what is clickable and where, you don’t need to hover with your mouse pointer over possible controls, guess the meaning of minimalist icons, or guess-click (I hope). It was also a huge help when making the GUI: I just crammed in all the buttons I needed and balanced them a little with spacing and alignment – done! It’s a mess and not very logical, but you quickly find your way around if you try.
Or maybe I just like the look, and it amuses me how its approachability is a breath of fresh air in 2026? Although it’s 35 years old now?
Probably that, yes. :)
PS: I did notice one thing I might change: I applied the “disabled” state inconsistenly – with the authentic ghosting pattern for checkboxes, and an opacity change for the pause/step buttons. Tsk, tsk…
Edit: *) Some of my favorites:
- Benjamin Button Reviews macOS
- It’s hard to justify Tahoe icons
- Gnome Files: A detailed UI examination
- The struggle of resizing windows on macOS Tahoe
- In Loving Memory of Square Checkbox
- The Decline of Usability: Revisited
- And don’t forget to visit (play?) User Inyerface for a good laugh.
- Oooh, and I just found this gem: Grumpy Website
Small addendum to my previous post: To put their signature on the “3-Demon” release in 1988, The Bitstoppers didn’t only put a README, an intro, and some deeply nested directories onto the disk – they also included a custom, Bitstoppers-branded mouse pointer as well! Funny that I missed that, because I myself extracted and manually categorized that mouse pointer, among thousands of others, and wrote a little web app that lets me link to it, complete with an OpenGraph-compatible preview image:
But that’s what shower thoughts are for, I guess. To make up for the slip-up, here’s a recording of Bitstoppers’ fabulously oldschool cracktro. Year!
The other day on pouët, the question came up when people started naming Amiga executable files with an “.exe” suffix, which isn’t really necessary under AmigaOS. Interesting question! I started scanning the disk images I collected for the Amiga Pointer Archive. At least in the TOSEC disk images, .exe files occur as early as 1987, and maybe earlier overall.
While the file names scrolled by, I noticed something funny: Endless
directory structures that seemed to repeat themselves. Take “3-Demon” from 1988,
contained in 3-Demon v1.0 (1988)(Mimetics)[h TBS].adf –
an early 3D editor, apparently:
This specific disk was spread by The Bitstoppers — they put a README file in front of it, added a little intro…
…and also left their name on the disk as a directory name. When you list the disk contents with AmigaDOS, you get:
1> dir df1:
c (dir)
objects (dir)
devs (dir)
s (dir)
fonts (dir)
libs (dir)
** THE BITSTOPPERS ** (dir)
»> BST <« !ReadMe!
.info 3-Demon
3-Demon.info BST
Disk.info Example 1.3demon
However, when you try to list all files recursively with dir df1: all, the system crashes:
Neat! Keep those lamers from listing your directories, hehe!
But is this a clever file system trick, maybe with a directory containing itself, causing the dir command to
exhaust all memory or overflow internal buffers? Kind of like a ZIP bomb –
an Amiga directory bomb?
At least for this disk, it’s not. If we analyze the ADF image in a file system analyzer like vAmigaDOS, we can follow the directory tree. Amiga OFS file contents are split up in 512-byte blocks, with references to their neighbors, parents, and children. Starting from the root block at 880, we get:
[880] 3-Demon: /> block 880
Block : 880
Type : ROOT
Header Key : 0
Checksum : 0x19ca146d
Name : 3-Demon
Created : 18-Mar-88 11:53:49
Modified : 18-Mar-88 11:53:49
Bitmap blocks : 1012
Bitmap extension block : 0
Hash table : 7 -> 883 (.info)
8 -> 925 (c)
10 -> 887 (3-Demon)
13 -> 886 (Example 1.3demon)
17 -> 894 (objects)
22 -> 926 (devs)
24 -> 899 (s)
28 -> 960 (!ReadMe!)
39 -> 924 (fonts)
40 -> 952 ( »> BST <« )
44 -> 932 (BST)
46 -> 954 (libs)
47 -> 958 ( ** THE BITSTOPPERS ** )
54 -> 882 (Disk.info)
[880] 3-Demon: /> block 958
Block : 958
Type : USERDIR
Header Key : 958
Checksum : 0xe48554e4
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:36
Parent : 880
Next : 0
Hash table : 47 -> 961 ( ** THE BITSTOPPERS ** )
[880] 3-Demon: /> block 961
Block : 961
Type : USERDIR
Header Key : 961
Checksum : 0xe4855475
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:37
Parent : 958
Next : 0
Hash table : 47 -> 962 ( ** THE BITSTOPPERS ** )
[...many more blocks omitted...]
[880] 3-Demon: /> block 1009
Block : 1009
Type : USERDIR
Header Key : 1009
Checksum : 0xe48555e3
Name : ** THE BITSTOPPERS **
Comment :
Created : 16-Feb-87 18:45:47
Parent : 1008
Next : 0
Hash table :
So it’s turtles directories all the way down – just more
than dir can handle. Listing all the directories in vAmigaDOS
doesn’t crash your browser or gives the “unresponsive JavaScript” warning, it just outputs a very long list:
Still, the question remains: Is it possible to create an evil directory structure? One that contains itself, or maybe a parent and a child that point to each other?
Surprisingly, yes! We can get dir to crash without wasting 512 bytes for each dummy directory, saving
precious disk space! It just
takes some adjustments in a hex editor…
- create a blank ADF disk image
- makedir evil
- makedir evil/evil
block 880 (0x370) = root block
block 881 (0x371) = disk bitmap
block 882 (0x372) = directory "evil" (path: "evil")
block 883 (0x373) = sub-directory "evil" (path: "evil/evil")
- find the top-level "evil" disk block
882 * 512 bytes = offset 451584 = 0x6e400
0006e400: 0000 0002 0000 0372 0000 0000 0000 0000 .......r........
0006e410: 0000 0000 8f9a 2d16 0000 0000 0000 0000 ......-.........
checksum: need to adjust that by 1
0006e420: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e430: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e440: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e450: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e460: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e470: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e480: 0000 0000 0000 0000 0000 0373 0000 0000 ...........s....
hashtable with child reference
to "evil" sub-directory; let it
point to ourselves = 0372
0006e490: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e4f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e500: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e510: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e520: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e530: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e540: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e550: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e560: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e570: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e580: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e590: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5a0: 0000 0000 0000 44b1 0000 0575 0000 0802 ......D....u....
0006e5b0: 0465 7669 6c00 0000 0000 0000 0000 0000 .evil...........
0006e5c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0006e5f0: 0000 0000 0000 0370 0000 0000 0000 0002 .......p........
…and voilà!
Here’s the resulting disk. Let’s see what other utilities we can crash with it…
I had a hunch that vAmigaDOS would be cleverer than that, and I was right. It notices something is fishy right away. Boooring! :)
That’s Finnish for “Valentines’s Day cheese”. Also, it’s not really “Valentine’s Day” in Finland – ystävänpäivä is more like friends’ day.
Here’s a piece from Finland’s public broadcasting company, Yle, looking at Valentine’s Day rituals around the world. To the Finns, it’s all very romantic, and thus weird. :)
But why cheese? Because it was my inspiration for Yle’s Valentine’s Day Pixel Festival organized by Dan Farrimond a. k. a. illarterate. My thought process went like this:
- Valentine’s Day, what do I draw…
- Hearts, roses, smooching – it’s all a bit cheesy
- Hah!
Yle’s V-day-around-the-world article ends with a teaser for their own Teletext event, featuring these two lovely pieces:
Humppa! If that isn’t my cheese! :)
Take a bite of all the other entries as well. There’s even a raccoon not made by RaccoonViolet!
PS: Any resemblance with the I choo- choo- choose you intro I made a year ago is purely coincidental…








