67 55 50 35 bytes
:()(read -p4$[i^=2]mJ?9h -sn6 :)
The code contains three occurrences of the CSI byte (0x9b). Most browsers will display them using the Windows-1252 encoding (small right angle bracket).
The code defines a function named
:, which paints the entire terminal green or black on left click, then calls itself. It requires xterm (or equivalent) and the ISO-8859-1 encoding (or similar).
Thanks to @ais523 for suggesting xterm, which saves 4 bytes!
How it works
:(...) creates a function named
: that executes
The read command does the actual magic.
-pspecifies an input prompt, which is printed to STDOUT.
$[i^=2]is an arithmetic expansion which XORs the variable i with 2. i may initially be unset; when this occurs, it will be treated as 0.
All parts of the prompt have special meanings to the terminal emulator.
›4$[i^=2]msets the background color to green if i = 2 and black if i = 0.
›Jclears the terminal from the current cursor position to the end, painting it in the selected background color.
›?9hcaptures the mouse in supported terminals. Each click will send six characters to the terminal, namely
←represents the ESC byte (0x1b).
←[indicates an escape sequence,
bthe button (0x20 + the button number),
xthe x coordinate of the click (0x20 + coordinate), and
ythe y coordinate.
-sn6makes read silent (the from mouse input won't be echoed to the terminal) and stops after reading exactly 6 bytes. It saves the input in the REPLY variable, but we're not interested in the output it produces.
Finally, once read finishes (after exactly one mouse click),
: recursively call itself, entering an infinite loop.
Creation and invocation
$ printf ':()(read -p\x9b4$[i^=2]m\x9bJ\x9b?9h -sn6\n:)\n:' > checkbox.sh $ xxd -g 1 checkbox.sh 0000000: 3a 28 29 28 72 65 61 64 20 2d 70 9b 34 24 5b 69 :()(read -p.4$[i 0000010: 5e 3d 32 5d 6d 9b 4a 9b 3f 39 68 20 2d 73 6e 36 ^=2]m.J.?9h -sn6 0000020: 0a 3a 29 0a 3a .:).: $ LANG=en_US xterm -e bash checkbox.sh