My last update talked about better visual feedback for Compose sequences in GTK’s input methods. I did not explicitly mention dead keys back then, but historically, X11 has treated dead keys and Compose sequences in exactly the same way.
Dead keys are a feature of certain keyboard layouts where you can hit a key that does not produce a character by itself, but modifies the next key you type. Typically, this is used for accents that can be combined with different base characters. For example, type <dead_acute> <a>
to produce á or <dead_acute> <o>
to produce ó.
Traditionally, dead keys were really dead – you didn’t get any visual feedback before the final result appears. With the improvements described in the last update, we now show dead keys as they are entered:
That is a nice improvement. But as it turned out, not everybody was happy.
The shared treatment of Compose sequences and dead keys has some implications: one is that entering a non-existing sequence such as <dead_grave> <x>
will produce a beep, and no output. That is acceptable for a Compose sequence that you explicitly started with the Compose key, but not so great when you maybe meant to enter `x.
The people who decided to use Compose sequences for dead keys foresaw the need to actually enter spacing accents every now and then, and added sequences such as <dead_grave> <space>
and <dead_grave> <dead_grave>
for producing a single ` character.
While that is a nice thought, it is still pretty inconvenient, since you need to type <dead_grave>
six time to produce ```, e.g. for entering code examples in markdown.
After thinking about this for a while and comparing what other systems do, we’ve made two changes, that will hopefully make dead keys as convenient to use as any other keys on your keyboard.
- When a
<dead key> <key>
sequence does not match one of our Compose sequences, commit the individual keys - When a
<dead key>
follows another<dead key>
, commit the first one, and treat the second as the beginning of a new Compose sequence
Together, this makes it so that typing <dead_acute> <a>
produces á, typing <dead_grave> <x>
produces `x, and you only need to type <dead_grave>
three times to enter ```:
Much better!