Linux Alternative to Windows PowerToys Quick Accent - Type German umlauts the same way!
Missing PowerToys Quick Accent on Linux? This is the solution! Type German umlauts (ä, ö, ü, ß) on US/English keyboard layouts using the exact same hold + space gesture you know from Windows. Native Fcitx5 input method addon with clipboard-free operation, works on X11 and Wayland.
Like PowerToys Quick Accent, but better:
- Same intuitive gesture (hold letter + space/arrow keys)
- Configurable activation keys (just like PowerToys)
- No clipboard interference (unlike many Linux alternatives)
- Works system-wide on X11 and Wayland
- 20 customizable character mappings
Unlike other solutions that use clipboard manipulation or keyboard simulation, this Fcitx5 addon uses direct text insertion (commitString()), which means:
✅ NO clipboard interference - Your clipboard stays untouched ✅ NO root permissions - Runs as normal user ✅ Works on X11 AND Wayland - Native support for both ✅ Zero latency - Hold & Wait pattern, no backspace needed ✅ Perfect integration - Part of Fcitx5, not a background daemon ✅ Fully customizable - 20 configurable character mappings ✅ Flexible activation - Choose Space, Arrow keys, or combinations as leader key
stateDiagram-v2
[*] --> Waiting: Press 'a'
Waiting --> Umlaut: Leader key within 400ms
Waiting --> Normal: Release or timeout
Umlaut --> [*]: ä ✨
Normal --> [*]: a
Note: Leader key is Space by default. You can configure it to Left/Right Arrow or combinations in fcitx5-config-qt.
This addon works differently than normal typing. Understanding this helps you adapt faster.
graph LR
N1[Key Press] --> N2[System outputs 'b'<br/>INSTANTLY]
N2 --> N3[Appears on screen]
N4[Key Release] --> N5[Ignored by system]
style N1 fill:#e3f2fd,stroke:#1976d2,stroke-width:3px,color:#000
style N2 fill:#c8e6c9,stroke:#388e3c,stroke-width:3px,color:#000
style N3 fill:#c8e6c9,stroke:#388e3c,stroke-width:3px,color:#000
style N4 fill:#f5f5f5,stroke:#757575,stroke-width:2px,color:#000
style N5 fill:#f5f5f5,stroke:#757575,stroke-width:2px,color:#000
Timing: 0ms delay - Output on Press ✓
graph LR
A1[Key Press] --> A2[Addon filters event<br/>START WAITING]
A2 --> A3[Waiting...]
A3 --> A4[Key Release<br/>within 400ms]
A4 --> A5[Output normal letter<br/>DELAYED]
A5 --> A6[Appears on screen]
style A1 fill:#e3f2fd,stroke:#1976d2,stroke-width:3px,color:#000
style A2 fill:#fff9c4,stroke:#f57f17,stroke-width:3px,color:#000
style A3 fill:#fff9c4,stroke:#f57f17,stroke-width:3px,color:#000
style A4 fill:#ffecb3,stroke:#f57f17,stroke-width:3px,color:#000
style A5 fill:#ffccbc,stroke:#d84315,stroke-width:3px,color:#000
style A6 fill:#ffccbc,stroke:#d84315,stroke-width:3px,color:#000
Timing: 100-300ms delay - Output on Release ⚠
graph LR
S1[Key Press] --> S2[Addon filters event<br/>START WAITING]
S2 --> S3[Waiting...]
S3 --> S4[Leader Key Press<br/>within 400ms]
S4 --> S5[Output umlaut 'ö'<br/>SUCCESS]
S5 --> S6[Appears on screen]
style S1 fill:#e3f2fd,stroke:#1976d2,stroke-width:3px,color:#000
style S2 fill:#fff9c4,stroke:#f57f17,stroke-width:3px,color:#000
style S3 fill:#fff9c4,stroke:#f57f17,stroke-width:3px,color:#000
style S4 fill:#e1f5fe,stroke:#0288d1,stroke-width:3px,color:#000
style S5 fill:#c8e6c9,stroke:#388e3c,stroke-width:3px,color:#000
style S6 fill:#c8e6c9,stroke:#388e3c,stroke-width:3px,color:#000
Timing: 100-400ms delay - Output on Leader Key ✓
sequenceDiagram
participant User
participant Keyboard
participant Screen
Note over User,Screen: What Users EXPECT (Normal Typing)
User->>Keyboard: Press 'o'
Keyboard->>Screen: 'o' appears INSTANTLY
Note right of Screen: ✓ 0ms delay<br/>Direct feedback
Note over User,Screen: ━━━━━━━━━━━━━━━━━━━━━━━━━━
Note over User,Screen: What Addon DELIVERS
User->>Keyboard: Press 'o'
Note right of Keyboard: Filtered, waiting...
Keyboard->>Keyboard: Wait 100-300ms...
User->>Keyboard: Release 'o'
Keyboard->>Screen: 'o' appears DELAYED
Note right of Screen: ⚠ 100-300ms delay<br/>Feels like "lag"
| Action | Normal Letter | Addon Letter (a,o,u,s) |
|---|---|---|
| Output Trigger | Key Press | Key Release or Space |
| Timing | Instant (0ms) | Delayed (100-400ms) |
| Feel | Direct feedback | Slight "lag" |
| Muscle Memory | Confirmed ✓ | Takes adjustment ⚠ |
Why is it different?
- Normal typing: Press = Output (rising edge)
- With addon: Press is filtered, we must wait for decision
- Release → normal letter
- Space → umlaut
- Timeout → normal letter
Default mappings (configurable):
Lowercase (400ms delay): a→ä | o→ö | u→ü | s→ß
Uppercase (700ms delay, longer for coordination): A→Ä | O→Ö | U→Ü
Note: The uppercase delay is longer because typing Shift+Letter+Space requires more finger coordination.
All character mappings are fully customizable! You can configure up to 20 custom input→output mappings via fcitx5-config-qt. See the "Customizing Character Mappings" section below for details.
- Arch Linux (or compatible distro)
- Fcitx5 - Input Method Framework
- CMake and extra-cmake-modules - For building
- GCC with C++20 support - For compilation
The easiest way to install:
git clone https://github.com/Maik-0000FF/schnelle-umlaute.git
cd schnelle-umlaute
./install.shThe script will:
- Check and install dependencies
- Build and install the addon
- Configure environment variables automatically
- Guide you through the setup
After installation: Logout and login, then run fcitx5-config-qt to add "Schnelle Umlaute" to your input methods.
For Arch Linux users, the package will be available on AUR:
yay -S schnelle-umlaute-fcitx5
# or
paru -S schnelle-umlaute-fcitx5If you prefer manual installation:
1. Install Dependencies
sudo pacman -S fcitx5 fcitx5-configtool fcitx5-qt fcitx5-gtk cmake extra-cmake-modules gcc2. Build the Addon
cd addon
./build.sh3. Install
cd build
sudo make install4. Configure Environment Variables
For the addon to work in ALL applications (GTK, Qt, browsers, terminals, etc.), set up environment variables:
mkdir -p ~/.config/environment.d
cat > ~/.config/environment.d/fcitx5.conf << 'EOF'
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5
GLFW_IM_MODULE=ibus
EOFNote: GLFW_IM_MODULE=ibus is required for Kitty terminal and other GLFW-based applications.
5. Logout and Login
IMPORTANT: You must logout and login again for the environment variables to take effect!
# After logout/login, verify Fcitx5 is running:
fcitx5 -r-
Open Fcitx5 configuration:
fcitx5-config-qt
-
Go to "Input Method" tab (Eingabemethode)
-
Click "+" to add a new input method
-
Search for "Schnelle Umlaute"
-
Add it to your input methods
-
Click "Apply" or "OK"
-
Switch to Schnelle Umlaute input method (default:
Ctrl+Space)- When active, the Fcitx5 tray icon will show "Ää"
- When using normal keyboard, it shows "En" or "US"
-
Type umlauts:
| Want | Hold | Press Leader Key | Result |
|---|---|---|---|
| ä | a | Space (default) | ä |
| ö | o | Space (default) | ö |
| ü | u | Space (default) | ü |
| ß | s | Space (default) | ß |
| Ä | A (Shift+a) | Space (default) | Ä |
| Ö | O (Shift+o) | Space (default) | Ö |
| Ü | U (Shift+u) | Space (default) | Ü |
Note: Leader key is Space by default, but can be configured to Left/Right Arrow or combinations (see below).
- Type normally: If you don't press the leader key within the time window, the normal letter appears
You can customize the timing delays to match your typing speed:
-
Via GUI (recommended):
fcitx5-config-qt
- Select "Schnelle Umlaute" in the Input Method list
- Click the Configure button (wrench icon)
- Adjust DelayLowercase (default: 400ms) and DelayUppercase (default: 700ms)
- Valid range: 50-2000ms
- Enter any exact value - no rounding applied
-
Via config file (alternative):
nano ~/.config/fcitx5/conf/schnelle-umlaute.conf[DelayLowercase] # Range: 50-2000ms, any exact value accepted Value=400 [DelayUppercase] # Range: 50-2000ms, any exact value accepted Value=700
-
Restart Fcitx5 to apply changes:
fcitx5 -r
Tips:
- Start with defaults (400ms/700ms) and adjust if needed
- Faster typists may prefer shorter delays (300ms/600ms)
- Slower, more deliberate typing benefits from longer delays (500ms/800ms)
- Uppercase delay should be ~300ms longer than lowercase (harder to coordinate Shift+Letter+Space)
You can customize which key activates the umlaut transformation. This feature is inspired by PowerToys Quick Accents on Windows.
Available Options:
- Space (Default) - Simple and intuitive
- LeftArrow - Cursor moves back, convenient for continued typing
- RightArrow - Cursor moves forward
- SpaceOrLeft - Either Space or Left Arrow works
- SpaceOrRight - Either Space or Right Arrow works
- LeftOrRight - Either Left or Right Arrow works
- All - All three keys work (Space, Left Arrow, Right Arrow)
How to configure:
-
Via GUI (recommended):
fcitx5-config-qt
- Select "Schnelle Umlaute" in the Input Method list
- Click the Configure button (wrench icon)
- Find "Activation key (Leader Key)" dropdown
- Select your preferred option
- Click Apply
-
Via config file (alternative):
nano ~/.config/fcitx5/conf/schnelle-umlaute.conf# Options: Space, LeftArrow, RightArrow, SpaceOrLeft, SpaceOrRight, LeftOrRight, All LeaderKey=Space
-
Restart Fcitx5 to apply changes:
fcitx5 -r
Tips:
- Space works well for most users and feels natural
- Arrow keys can be useful if you want to combine umlaut input with cursor movement
- Combinations (e.g., SpaceOrRight) give you flexibility without committing to one key
You can customize which input characters produce which outputs! The addon provides 20 mapping slots that you can configure freely.
Default mappings (first 7 slots):
| Input | Output | Description |
|---|---|---|
| a | ä | German lowercase umlaut |
| o | ö | German lowercase umlaut |
| u | ü | German lowercase umlaut |
| s | ß | German sharp S |
| A | Ä | German uppercase umlaut |
| O | Ö | German uppercase umlaut |
| U | Ü | German uppercase umlaut |
How to customize:
-
Via GUI (recommended):
fcitx5-config-qt
- Select "Schnelle Umlaute" in the Input Method list
- Click the Configure button (wrench icon)
- Scroll down to see mapping fields:
- Input 1 / Output 1 (default: a → ä)
- Input 2 / Output 2 (default: o → ö)
- ...and so on up to slot 20
- Edit any Input/Output pair you want
- Empty slots are ignored
- Click "Defaults" button to restore German umlauts
- Click Apply
-
Via config file (alternative):
nano ~/.config/fcitx5/conf/schnelle-umlaute.conf# Custom mapping example Mapping1Input=a Mapping1Output=ä Mapping2Input=o Mapping2Output=ö # Add your own mappings Mapping8Input=e Mapping8Output=é Mapping9Input=n Mapping9Output=ñ
-
Restart Fcitx5 to apply changes:
fcitx5 -r
Example use cases:
- French accents: Add mappings for é, è, ê, à, ç, etc.
- Spanish characters: ñ, á, í, ó, ú
- Custom shortcuts: Map
j→Hallofor quick text expansion - Math symbols: Map
p→π,d→∂, etc. - Emoji: Map
h→❤️,s→😊,b→🍺
Tips:
- Use the first 7 slots for your most common characters
- Empty slots (both Input and Output empty) are ignored
- Input can be any single character
- Output can be any string (including multi-character strings!)
- Changes take effect immediately after
fcitx5 -r
This is a native Fcitx5 addon written in C++, using the Fcitx5 InputMethodEngineV2 API.
Key Components:
addon/src/schnelle-umlaute.cpp- Main addon logic with Hold & Wait implementationaddon/CMakeLists.txt- Build configurationaddon/data/schnelle-umlaute.conf- Fcitx5 addon registration
How it works internally:
- Fcitx5 calls our
keyEvent()handler for every key - When accent key (a/o/u/s) is pressed: suppress output, start timer
- If Space within delay (400ms lowercase, 700ms uppercase): call
commitString(umlaut)for direct insertion - If timeout or key released: call
commitString(normalLetter) - No clipboard, no key simulation - pure text insertion!
| Approach | Clipboard-Free | No Root | X11 | Wayland | Complexity |
|---|---|---|---|---|---|
| Fcitx5 Addon (This) | ✅ | ✅ | ✅ | ✅ | Medium |
| evdev-rs + xclip | ❌ | ❌ | ✅ | Low | |
| IBus | ✅ | ✅ | ✅ | ✅ | High |
| XTest | ✅ | ❌ | ✅ | ❌ | Low |
Check if all files are installed:
ls /usr/lib/fcitx5/schnelle-umlaute.so
ls /usr/share/fcitx5/addon/schnelle-umlaute.conf
ls /usr/share/fcitx5/addon/schnelle-umlaute.conf.in # For GUI config options
ls /usr/share/fcitx5/inputmethod/schnelle-umlaute.conf # This is important!If missing, reinstall:
cd addon/build
sudo make install
fcitx5 -rIf the addon appears but you can't see DelayLowercase/DelayUppercase settings:
-
Check if the config descriptor is installed:
ls /usr/share/fcitx5/addon/schnelle-umlaute.conf.in
-
If missing, reinstall the addon:
cd addon && ./build.sh && cd build && sudo make install && fcitx5 -r
You need to set environment variables and logout/login:
mkdir -p ~/.config/environment.d
cat > ~/.config/environment.d/fcitx5.conf << 'EOF'
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5
GLFW_IM_MODULE=ibus
EOFThen logout and login again for changes to take effect.
- Make sure you're switched to "Schnelle Umlaute" input method (Ctrl+Space)
- Check Fcitx5 is running:
ps aux | grep fcitx5 - Try holding the key longer before pressing Space
- Verify environment variables are set:
echo $GTK_IM_MODULE(should output "fcitx5")
If you can see "Schnelle Umlaute" in fcitx5-config-qt but cannot activate it, or if Fcitx5 stopped working after a system crash:
-
Check Fcitx5 status:
fcitx5-remote
- Should show:
1(inactive) or2(active) - If it shows:
0→ Fcitx5 not initialized
- Should show:
-
Restart Fcitx5:
fcitx5 -r
-
Activate addon:
fcitx5-remote -s schnelle-umlaute
-
Verify:
fcitx5-remote -n # Should show: schnelle-umlaute fcitx5-remote # Should show: 2 (active)
This is common after system crashes or unexpected shutdowns.
If you see a warning about Fcitx5 not being launched by KWin, fix it for optimal Wayland experience:
- Open System Settings → Virtual Keyboard (or search for "virtuell")
- Select "Fcitx 5" from the dropdown (instead of "None")
- Apply changes
- Restart your session (logout/login)
This enables the native Wayland input method protocol and eliminates the warning.
Symptom: The input method indicator doesn't change when pressing Ctrl+Space in Kitty, or the indicator appears in other windows instead of Kitty.
Cause: Kitty's Wayland text-input implementation doesn't properly register the input context with Fcitx5, causing Fcitx5 to not recognize the Kitty window.
Solution: Configure Kitty to use X11 (XWayland) instead of native Wayland:
-
Add to
~/.config/kitty/kitty.conf:linux_display_server x11 -
Restart all Kitty windows (close and reopen)
-
Test: Press Ctrl+Space in Kitty - the input method indicator should now appear in Kitty
Note: Make sure you also have GLFW_IM_MODULE=ibus set in your environment variables (see step 4 of Installation).
Make sure you have C++20 support:
gcc --version # Should be 11 or newer./uninstall.shThe script will:
- Remove all installed files
- Ask if you want to remove environment configuration
- Restart Fcitx5
cd addon/build
sudo make uninstall
fcitx5 -rOr remove files manually:
sudo rm /usr/lib/fcitx5/schnelle-umlaute.so
sudo rm /usr/share/fcitx5/addon/schnelle-umlaute.conf
sudo rm /usr/share/fcitx5/addon/schnelle-umlaute.conf.in
sudo rm /usr/share/fcitx5/addon/org.fcitx.Fcitx5.Addon.SchnelleUmlaute.metainfo.xml
sudo rm /usr/share/fcitx5/inputmethod/schnelle-umlaute.conf
rm ~/.config/environment.d/fcitx5.conf # Optional: remove environment config
fcitx5 -r- INSTALL.md - Complete installation guide with troubleshooting
- addon/README.md - Detailed addon documentation
Contributions welcome! This addon is:
- Written in C++20
- Uses Fcitx5 InputMethodEngineV2 API
- Built with CMake
Help keep Schnelle Umlaute awesome! Here's how you can contribute:
graph TB
Start["🍺 Ways to Support<br/>Schnelle Umlaute"]
subgraph one["💰 Financial"]
Bitcoin["₿ Bitcoin Donation<br/><code>bc1q6gmpgfn4wx2hx2c3njgpep9tl00etma9k7w6d4</code><br/><i>Every ä, ö, ü counts!</i>"]
end
subgraph two["🌟 Community"]
Star["⭐ Star the Repository<br/><i>Show your appreciation</i>"]
Share["📢 Share with Others<br/><i>Spread the word</i>"]
Report["🐛 Report Bugs<br/><i>Help improve quality</i>"]
end
subgraph three["🛠️ Development"]
Code["🔧 Contribute Code<br/><i>Add features or fixes</i>"]
Docs["📝 Improve Documentation<br/><i>Help others learn</i>"]
Ideas["💡 Suggest Features<br/><i>Shape the roadmap</i>"]
end
Start --> one
Start --> two
Start --> three
style Start fill:#64b5f6,stroke:#1976d2,stroke-width:3px,color:#000
style Bitcoin fill:#ff8a65,stroke:#d84315,stroke-width:2px,color:#000
style Star fill:#81c784,stroke:#388e3c,stroke-width:2px,color:#000
style Share fill:#81c784,stroke:#388e3c,stroke-width:2px,color:#000
style Report fill:#81c784,stroke:#388e3c,stroke-width:2px,color:#000
style Code fill:#ba68c8,stroke:#7b1fa2,stroke-width:2px,color:#000
style Docs fill:#ba68c8,stroke:#7b1fa2,stroke-width:2px,color:#000
style Ideas fill:#ba68c8,stroke:#7b1fa2,stroke-width:2px,color:#000
Because every umlaut saved is a keystroke earned - and keystrokes fuel open source! ⌨️✨
GPL-3.0+
Created by Maik-0000FF
Inspired by Windows PowerToys Quick Accent
Built with:
- Fcitx5 - Input Method Framework
- C++20 - Modern C++ with chrono and optional
- CMake - Build system
- Extra CMake Modules (ECM) - KDE build tools
Version: 0.1.1 Status: Working - tested and functional Date: 2025-10-25