A KWin/Plasma 6 input-method-v1 proxy that restores the Brazilian
ç when a dead-acute key (' or ´) is followed by c — without
disabling the on-screen keyboard (plasma-keyboard or Maliit).
Chromium and its derivatives (Google Chrome, Brave, Edge, Opera,
Vivaldi — anything that renders with WebContents) no longer
accept the ' + c sequence as ç on Brazilian / US-International
layouts under Wayland.
Expected behavior:
' + c → ç
' + C → Ç
Current behavior in Chromium:
' + c → ć (U+0107, c with acute — Polish letter)
Cause: Chromium now combines the dead acute directly onto the c,
ignoring the Brazilian XCompose rule that maps that sequence to
ç (U+00E7). It affects both US-International with dead keys and
pt-BR variants that emit dead_acute.
Other browsers (Firefox, WebKit/GNOME Web) still respect XCompose
and are unaffected. Native GTK/Qt apps, IDEs and text editors keep
working as expected. The regression is limited to Chromium and
everything that inherits from it.
bigcedilla fixes the problem outside the browser, at the
Wayland protocol layer — so it works for every app on the system,
not only Chromium.
┌─────────┐ IM v1 ┌─────────────┐ IM v1 ┌──────────────────┐
│ KWin │ ─────────► │ bigcedilla │ ─────────► │ plasma-keyboard │
│ Plasma6 │ │ (proxy) │ │ or maliit-kbd │
└─────────┘ ◄───────── └─────────────┘ ◄───────── └──────────────────┘
│
│ intercept dead_acute + c
▼
commit_string("ç") → KWin
- KWin treats
bigcedillaas the system input method (the[Wayland] InputMethodfield inkwinrc). bigcedillaopens its own private Wayland socket and starts the real on-screen keyboard (plasma-keyboard by default; switch to Maliit viaBIGCEDILLA_CHILD_IM=maliit-keyboard).- Everything the on-screen keyboard emits is forwarded as-is. Touch typing keeps working.
- In parallel,
bigcedillacallsgrab_keyboardon the IM context and runs hardware keysyms through a tiny compose state machine. Only thedead_acute + csequence is intercepted and rewritten ascommit_string("ç")(or"Ç"for capitalc). - Every other key is replayed via
context.key()so the focused app processes it normally — including its ownXCompose, shortcuts, etc.
cd pkgbuild
makepkg -siThen, as the desktop user (not root):
bigcedilla-configure-kwin
qdbus6 org.kde.KWin /KWin reconfigureTo revert at any time:
bigcedilla-restore-maliit
qdbus6 org.kde.KWin /KWin reconfigurecargo build --release
sudo install -Dm755 target/release/bigcedilla /usr/bin/bigcedilla
sudo install -Dm644 pkgbuild/bigcedilla.desktop \
/usr/share/applications/bigcedilla.desktop
sudo install -Dm755 pkgbuild/bigcedilla-configure-kwin /usr/bin/
sudo install -Dm755 pkgbuild/bigcedilla-restore-maliit /usr/bin/| Environment variable | Effect |
|---|---|
BIGCEDILLA_CHILD_IM |
Path or basename of the child on-screen keyboard. Default: plasma-keyboard, fallback maliit-keyboard. Set to maliit-keyboard to force Maliit when both are installed. |
BIGCEDILLA_FORCE |
1 always activate, 0 always skip. Bypasses the layout/locale check. |
RUST_LOG=debug |
Verbose log (includes keysyms — local debugging only). |
bigcedilla-check-layout decides whether the proxy is useful for the
current account. It returns success when any of the following holds:
LANG/LC_*matchespt_*,ca_*,oc_*,fur_*- KDE
kxkbrc(orlocalectl/setxkbmapfallback) reports a layout in{br, pt, ca, oc} - a
uslayout uses anintloraltgr-intlvariant
It is wired in two places:
- The user systemd unit (
pkgbuild/bigcedilla.service) calls it asExecCondition=— if the layout does not benefit, the unit silently exits without spawning the proxy. bigcedilla-configure-kwinrefuses to registerbigcedillaas the KWin input method when the check fails, unless invoked with--forceorBIGCEDILLA_FORCE=1.
Layouts with ç as a direct key (French AZERTY, Turkish, Albanian,
Azeri, Tatar) are intentionally skipped — they were never affected by
the Chromium regression.
- KWin / Plasma 6 in a Wayland session
plasma-keyboardormaliit-keyboardinstalledlibxkbcommon,wayland
GPL-3.0-or-later.