Cedilla (ç) symbol using American Keyboards in Linux

Disclaimer: this article refers to using Linux with an American keyboard to type Portuguese (pt-br) text, using the ‘us-intl’ keyboard layout.

One of the things that bothered me when upgrading between Ubuntu versions a while back (Feisty for Gutsy? Hardy? I can’t remember) is the changed behavior for inputting the Cedilla ‘ç’ symbol using American keyboards.

Ok, in fact, this behavior changed twice over the time, so I can remember at least three ways of doing that:

  1. Press the the single-quote (‘) key, then letter ‘c’ (' then c). In the us-intl keyboard layout, the single quote is a dead-key commonly used to insert an acute sign over vowels: á, é, í, ó, ú. Pressing the single-quote twice produces the single quote itself. A few years ago, the Cedilla sign was inputted by combining the single-quote dead key with the letter ‘c’ itself. This behavior changed: now, ' then c produces ć – maybe to support languages that require this symbol (after all we’re abusing the us-international layout) or simply a question of consistency.
  2. Combining the Right-Alt key with the comma (,) symbol (Ralt+,). After the change in the above item was introduced, the us-intl layout was tuned to allow many other types of symbols (Can you say UTF-8?). The Right-Alt key came to be what is called a Level-3 modifier (that is, a key modifier that works just like Shift, Ctrl and Alt/Meta – that is not a dead-key). With this modifier, one could produce several other symbols commonly used in western languages other than English itself, i.e.: ¡, ß, æ, ñ, ø etc. Also, the Level-3 modifier also allow us to input commonly used symbols that are outside the English alphabet: ², ³, ©, ®, ¢, § etc.
  3. Combining Right-Alt with the comma (,) symbol as dead-key, then pressing letter ‘c’ (Ralt+, then c). This is the the behavior introduced with newer versions of the us-intl keyboard layout. Just like before, you use the Right-Alt key as a Level-3 modifier, but instead of inserting the symbol directly, this key combination acts like a dead-key, waiting for the next key-press to determine what symbol is being inputted. In fact, this behavior was introduced with the ‘alt-intl’ layout which is said to mimic the previous behavior of us-intl (first item above) – well, at least for me it doesn’t exactly mimics the former behavior, and I personally prefer the second option.

Choosing between the second and the third options above is pretty straightforward if you’re using a relatively recent Linux distribution with Gnome 2.x and Xorg. Just use gnome-keyboard-properties to choose between USA International (with dead keys) or USA Alternative International (former us_intl) for the behavior found in item 2 and 3 above respectively. You can also have both configured and change between layouts using the Keyboard Indicator gnome applet:

gnome-keyboard-properties screenshot

gnome-keyboard-properties screenshot

In case you are not using Gnome and prefer to configure it directly in Xorg’s configuration, edit the InputDevice section at the X.org server configuration file, usually /etc/X11/xorg.conf, to look like below:

  • Cedilla not as dead-key (behavior 2 above):
    Section "InputDevice"
    	Identifier	"Generic Keyboard"
    	Driver		"kbd"
    	Option		"XkbRules"	"xorg"
    	Option		"XkbModel"	"pc105"
    	Option		"XkbLayout"	"us"
    	Option		"XkbVariant"	"intl"
    #	Option		"XkbOptions"	"lv3:ralt_switch"
    EndSection
  • Cedilla as dead-key (behavior 3 above):
    Section "InputDevice"
    	Identifier	"Generic Keyboard"
    	Driver		"kbd"
    	Option		"XkbRules"	"xorg"
    	Option		"XkbModel"	"pc105"
    	Option		"XkbLayout"	"us"
    	Option		"XkbVariant"	"alt-intl"
    #	Option		"XkbOptions"	"lv3:ralt_switch"
    EndSection

The line with “XkbOptions” “lv3:ralt_switch” was indifferent to (at least) the Cedilla behavior, thus I commented it (I have a feeling that the ralt_switch behavior is included anyway for both variants).

Troubleshooting

If even after doing the above you can’t get the desired behavior, check the following:

  • Your window manager configuration usually precedes your X server configuration – That is, if you configured your keyboard layout using Gnome or KDE tools, the settings in your xorg.conf are probably being ignored. Within gnome, you can use gconf-editor and browse to /desktop/gnome/peripherals/keyboard/kdb to check the current effective configuration. Leave a comment if you know how to override this.
  • Your X server may have been automagically configured by HAL and friends. You can check that by opening the X server log (usually /var/log/Xorg.0.log) and looking for the evdev module. There should be a couple of messages showing which model/layout/variant was chosen:
    (**) Option "xkb_rules" "evdev"
    (**) AT Translated Set 2 keyboard: xkb_rules: "evdev"
    (**) Option "xkb_model" "pc102"
    (**) AT Translated Set 2 keyboard: xkb_model: "pc102"
    (**) Option "xkb_layout" "us"
    (**) AT Translated Set 2 keyboard: xkb_layout: "us"
    (**) Option "xkb_variant" "alt-intl"
    (**) AT Translated Set 2 keyboard: xkb_variant: "alt-intl"
    (**) Option "xkb_options" "lv3:ralt_switch"
    (**) AT Translated Set 2 keyboard: xkb_options: "lv3:ralt_switch"

    In this case, you can either:

    • Disable auto-detection from the X.org side, adding an “AutoAddDevices” “off” option to your ServerLayout section (at the xorg.conf file):
      Section "ServerLayout"
      	Identifier	"Default Layout"
      	Screen		"Default Screen"
      	InputDevice	"Synaptics Touchpad"
      	Option		"AutoAddDevices" "off"
      EndSection
    • Create a policy at the HAL side, by creating a .fdi file, e.g.: /etc/hal/fdi/policy/10-keyboard.fdi, that reads:
      <?xml version="1.0" encoding="UTF-8"?>
        <deviceinfo version="0.2">
          <device>
            <match key="info.capabilities" contains="input.keys">
              <merge key="input.x11_options.XkbVariant" type="string">intl</merge>
              <merge key="input.xkb.variant" type="string">intl</merge>
            </match>
          </device>
        </deviceinfo>

      (Change the variant from intl for alt-intl according to your choice). Remember to restart the HAL daemon (hald) for the changes to take effect

  • More information about HAL and the evdev module can be found at this blog post.

I hope this post was useful to shed some light into this (somewhat common) problem among pt-br users that don’t necessarily use Brazilian keyboards or run their systems in that locale. Leave a comment if you find this post useful, have questions, comments, corrections, anything ;-)

-Klaus

5 comments for “Cedilla (ç) symbol using American Keyboards in Linux

  1. Marek
    April 25, 2013 at 11:48 am

    Just came across this…

    If you want a c with cedilla, the keyboard combination is first “CTRL-,” then “c”.

    If you want a capital c cedilla, then it is “CTRL-,” followed by “SHIFT
    -c”.

    Marek

  2. May 21, 2012 at 1:35 pm

    Is there any way to get the old behavior back?

  3. hiok
    October 18, 2010 at 9:36 pm

    Man, this was really enlightening. I’m brazilian and got stuck on this around several distributions I’ve used or installed on friend’s computers. Now I can choose between behaviours, and stop wondering how the hell did I fix this that one last time.
    Much thanks./

  4. October 6, 2010 at 6:39 am

    thanks for sharing!

  5. matthew
    June 11, 2009 at 4:53 pm

    Thanks for this clarifying post, Klaus. Do you by any chance know how one would go about restoring behavior number 1? It is much more convenient for those typing in languages that do not have ć.

    -Matthew

Leave a Reply