Marc's Public Blog - Linux Hacking


All | Aquariums | Arduino | Btrfs | Cars | Cats | Clubbing | Dining | Diving | Electronics | Exercising | Flying | Hiking | Linux | Linuxha | Monuments | Museums | Nz2019 | Public | Rc | Sciencemuseums | Snow | Solar | Trips

This page has a few of my blog entries about linux, but my main linux page is here
Picture of Linus


Table of Content for linux:

More pages: January 2019 December 2018 March 2018 January 2018 September 2017 January 2017 October 2016 August 2016 July 2016 June 2016 February 2016 January 2016 May 2015 March 2015 January 2015 October 2014 May 2014 April 2014 March 2014 January 2014 November 2013 September 2013 May 2013 March 2013 January 2013 December 2012 August 2012 May 2012 March 2012 January 2012 December 2011 August 2011 July 2011 January 2011 October 2010 August 2010 June 2010 April 2010 March 2010 January 2010 December 2009 November 2009 September 2009 August 2009 July 2009 May 2009 January 2009 December 2008 November 2008 October 2008 January 2008 November 2007 August 2007 July 2006 January 2006 August 2005 April 2005 November 2004 March 2004 February 2004




2019/01/24 Linux.conf.au 2019: Using Open Hardware from my shirt to OS testing for Google's Fuchsia
π 2019-01-24 01:01 in Arduino, Electronics, Linux
I've been going to linux.conf.au for 18 years now (since 2001), and presented a fair amount of linux talks related there, but the big change for me was the open hardware miniconf that started in 2010. Thanks to its projects every year, I got to learn a lot about microcontrollers and some about electronics.
This talk was my first non linux talk which detailled everything I learned from those miniconfs and projects I worked that stemmed from them. I presented it at LCA 2019 Christchurch.

you can find the talk pdf here: http://marc.merlins.org/linux/talks/Using_Open_Hardware/Using_Open_Hardware.pdf (you'll want this one to get all the clickable links in the slides)
you can view the talk slides in html here or below:

Talk video below:

I arrived the sunday before the conference and helped out the open hardware organizers with a bit of last minute setup. I also got to do some last minute testing and tuning of my panels:

hacked up ESP32 with level converters on breadboard to run 3x 64x32 SmartMatrix panels with SmartMatrix::GFX
hacked up ESP32 with level converters on breadboard to run 3x 64x32 SmartMatrix panels with SmartMatrix::GFX

64x64 P3.8 SmartMatrix::GFX panel vs 3x 64x32 SmartMatrix::GFX P4 flexible panels vs 4x 16x16 FastLED::NeoMatrix P10 panels
64x64 P3.8 SmartMatrix::GFX panel vs 3x 64x32 SmartMatrix::GFX P4 flexible panels vs 4x 16x16 FastLED::NeoMatrix P10 panels

After finishing the code tuning and demos just in time, gave a 20mn miniconf talk on the history of linux.conf.au hardware miniconf. I went through how much I learned from those confs and what I was able to achieve as a result. I sure got to learn a lot about microcontroller and driver programming:




I wasn't able to bring my burning man 4096 neopixel matrix, it doesn't even fit in my car, but the irony is that my small 64x64 rgbpanel has the same resolution and fits easily in my backpack
I wasn't able to bring my burning man 4096 neopixel matrix, it doesn't even fit in my car, but the irony is that my small 64x64 rgbpanel has the same resolution and fits easily in my backpack

The 64x64 compact display is showing the hand X-ray here
The 64x64 compact display is showing the hand X-ray here

A few days later, I gave the longer version of my talk at the main conference. By then it had grown to over 160 slides in a 45mn slot, or 16 seconds per slide. Ooops...

  • The full talk went into details on what I learned in the hardware hacking field, a lot of it was simply electricity, U=RI, wires, pre-made components (small inline volt/amp meters, DC-DC converters, and so forth).
  • I also gave a is a quick summary of my hacking an arduino board to turn it into a sleep analysis machine, a longer talk I gave elsewhere in 2012.
  • There is a section on what I learned from Tridge and RC planes with ardupilot
  • I had to mention microcontroller hacking and driver writing for IoTuz on ESP32 given how much I learned from it
  • And IoTuz got me to write a primitive Neopixel driver for ESP32, a very slippery slope that led me to many LED projects
  • http://marc.merlins.org/perso/arduino/post_2015-01-06_Driver-for-direct-driving-single-to-3-color-LED-Matrices-with-software-PWM.html
  • http://marc.merlins.org/perso/arduino/post_2017-04-03_Arduino-328P-Uno-Teensy3_1-ESP8266-ESP32-IR-and-Neopixels.html
  • http://marc.merlins.org/perso/arduino/post_2017-04-24_Adafruit-GFX-on-NeoMatrix-and-RGB-Matrix-Panel-Demo.html
  • http://marc.merlins.org/perso/arduino/post_2017-06-02_LED-Pants-and-Shirt-Programmed-With-Arduino-on-ESP8266.html
  • http://marc.merlins.org/perso/arduino/post_2018-04-23_FastLED_NeoMatrix-library_-how-to-do-Matrices-with-FastLED-and-Adafruit_GFX.html
  • http://marc.merlins.org/perso/arduino/post_2018-05-29_EDM-Party-Shirt-powered-with-FastLED_NeoMatrix-and-Adafruit_GFX_-plus-160Wh-_10Ah-4S_-worth-of-lipos.html
  • http://marc.merlins.org/perso/arduino/post_2018-07-13_AnimatedGIFs-for-SmartMatrix-or-NeoMatrix-_Neopixel-WS2812B_-from-SDcard-or-SPIFFS_-on-Teensy-3_x_-ESP8266_-or-ESP32.html
  • http://marc.merlins.org/perso/arduino/post_2018-07-30_Building-a-64x64-Neopixel-Neomatrix-_4096-pixels_-running-NeoMatrix-FastLED-IR.html
  • https://github.com/marcmerlin/SmartMatrix_GFX
  • and for good measure the talk ends with how I was able to apply some of that knowledge to design simple solutions for hardware testing racks for Google's Fuchsia on arm platforms.


  • Hopefully the talk and/or slides are useful to you. Links:

  • http://marc.merlins.org/linux/talks/Using_Open_Hardware/Using_Open_Hardware.pdf
  • http://marc.merlins.org/linux/talks/Using_Open_Hardware
  • http://marc.merlins.org/perso/arduino
  • https://www.youtube.com/watch?v=YqeBXCCabo0
  • 2019/01/21 Donkey Car with Tensorflow Video Analysis at Open Hardware Miniconf at Linux.Conf.au 2018
    π 2019-01-21 01:01 in Arduino, Linux
    This year, the Open Hardware Miniconf team designed a donkeycar for us at LCA 2019 Christchurch. It's a car that navigates by itself using its onboard camera connected to a Raspberry Pi using training video data gathered and analysed offline by tensorflow. That sure was an ambitious project!

    I arrived the day before to help finish up the kits for the next morning:



    the cars were eager to perform :)
    the cars were eager to perform :)

    Andy and Jon who ended up working all night to make sure the kits would work the next morning
    Andy and Jon who ended up working all night to make sure the kits would work the next morning


    The next morning, we showed up to build the kit:




    rPi with custom last minute hat for the donkey car
    rPi with custom last minute hat for the donkey car

    done!
    done!

    Jon gave a talk about the car design
    Jon gave a talk about the car design

    Nice way to support 5V neopixels on 3.3V microcontrollers
    Nice way to support 5V neopixels on 3.3V microcontrollers

    We then had a few talks:



    Including mine on the history of linux.conf.au hardware miniconf


    After the miniconf, we had a few tries at getting our own cars to self drive after training:


    I decked out my car with neopixels, because bling! :)
    I decked out my car with neopixels, because bling! :)


    2019/01/21 Linux.Conf.au 2019 in Christchurch
    π 2019-01-21 01:01 in Linux
    This year, LCA was back in New Zealand in the city of Christchurch.


    nice car parked outside
    nice car parked outside



    The first day, I went to the Open Hardware Miniconf to build a monkey car with video analysis fed to tensorflow

    LCA had lots of attendees as usual, enough ot overfill the main keynote room. The usual suspects/friends were there as usual:







    Ah yes, the shirt and glasses, that's because of my talk Using Open Hardware from my shirt to OS testing for Google's Fuchsia

    Lots of talks, thankfully they were recorded as there were 2-3x as many talks as I was able to see:



    really nice keynote showing how to hack insulin dispensers to deliver the right amount at the right time
    really nice keynote showing how to hack insulin dispensers to deliver the right amount at the right time



    Commodore 65 slide presentation program
    Commodore 65 slide presentation program

    fpga based cell phone running alongside a commodore 65 fpga, awesome
    fpga based cell phone running alongside a commodore 65 fpga, awesome







    Rusty's keynote for the win :)
    Rusty's keynote for the win :)



    the first LCA in 1999
    the first LCA in 1999

    Rusty gave a few talks since then :)
    Rusty gave a few talks since then :)


    very interesting talk on how painful it was to take over grsecurity maintenance
    very interesting talk on how painful it was to take over grsecurity maintenance

    Random pictures:

    love this little laptop I found
    love this little laptop I found

    As usual, nice parties in the evenings: speaker dinner, professional DNS, Penguin Dinner, and nice adhoc BBQ on friday:











    And just like this, it was conference close:




    next year will be the Gold Coast
    next year will be the Gold Coast

    thank you, come again :)
    thank you, come again :)

    2018/12/20 Accessing USB Devices In Docker (ttyUSB0, /dev/bus/usb/... for fastboot, adb) without using --privileged
    π 2018-12-20 01:01 in Linux

    Problem:You want to use devices like /dev/ttyUSB0 or need to access raw USB devices under /dev/bus/usb in a docker container

    This is not going to work easily for a variety of reasons. Let's go through them.

    Before I go there, yes, giving --privileged will "fix" all your problems but it will also give full access to everything in your container, where the container can wipe the host device, steal password from memory outside the container and so forth. Maybe that's ok for you anyway, but if not, read on:

    /dev/ttyUSB0 does not show up under /dev in the container

    This does 2 things: 1) create the device in the container, and 2) give the container write access to the block device (more or that later)

    docker run --device=/dev/ttyUSB0 -i -t --entrypoint /bin/bash --cap-add SYS_PTRACE debian:amd64

    I added SYS_PTRACE so that you can use strace -e trace=file command to debug access problems

    /dev/bus or /dev/serial do not show up under /dev in the container

    Try this:
    docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash --cap-add SYS_PTRACE debian:amd64

    This will make /dev/bus and /dev/serial show up as bind mounts in your container. Yet you will find that _fastboot devices or adb_ will not work. Strace will show you permission denied. What you want instead is this:

    docker run --device=/dev/bus -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash --cap-add SYS_PTRACE debian:amd64

    See https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

    This mounts /dev/bus in your container and gives you access to all the block/character devices in there. Now, fastboot will work. Well, it will work until...

    /dev/bus, fastboot/adb work until I disconnect/reconnect the device

    Yeah, this is where things get more hairy. what the --device command above did was give access to all the block/character devices that existed when your container was created. If new ones appear (unplugging and replugging a device or rebooting it), those don't work.
    I have not found a way to get docker to make them work after the container has started.

    Thankfully there is a clue here: https://www.kernel.org/doc/Documentation/cgroup-v1/devices.txt

    You want to go back to running

    docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash --cap-add SYS_PTRACE debian:amd64

    Then, grab the container ID in $A:

    A=$( docker ps |awk '/bin.bash/ { print $1 }' )

    Note the major number of your device:

    root@fuchsia-tests-x64-lab01-0002:/sys/fs/cgroup# l /dev/bus/usb/004/* | head -1
    crw-rw-r-- 1 root root 189, 384 Dec 18 17:51 /dev/bus/usb/004/001
    Here it's 189. What changes it the minor number (384) when you plug/unplug devices.

    Finally, tell the linux container via an opaque cgroup interface, that all character devices of major number 189, are allowed:

    root@fuchsia-tests-x64-lab01-0002:~# echo 'c 189:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow 

    After that, things should work.

    My /dev/ttyUSB device keeps changing and the new one isn't allowed

    See above and run
    root@fuchsia-tests-x64-lab01-0002:~# echo 'c 188:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow 

    Then inside the container, create them all:

    root@f47dbbab392b:/dev# for i in $(seq 1 255); do mknod ttyUSB$i c 188 $i; done

    Hope this helps!

    2018/12/20 Getting Around USB3 xhci 32 Device Limit "Max number of devices this xHCI host supports is 32"
    π 2018-12-20 01:01 in Linux
    Are you stuck with xhci_hcd 0000:00:14.0: Max number of devices this xHCI host supports is 32 ?

    Wait, you're saying, but USB should support 127 devices (which include hub ports), why only 32?
    Well, xhci/USB3 actually has an extra limit of 96 endpoints and each device uses 3 endpoints, which leaves you with only 32 devices. Yes, this is terrible, I agree. It's also not well documented and few people know how to get around it.
    https://forums.intel.com/s/question/0D50P00004905stSAA/hardware-limitations-on-usb-endpoints-xhci?language=en_US contains more details, although apparently some further details are only available under NDA, but it looks like a mess.

    Originally I found this page which explains how to connect USB3 hubs with USB2 cables to save a few USB IDs, but ultimately it does not contain the real solution which is:
    If you need more than 32 devices, do not use (and disable) USB3/xhci
    Yes, it is that sad, intel has actually designed a newer USB that is much much worse than the previous version as far as number of devices is concerned.

    What wasn't clear to me is that xhci supports USB2 and USB1 devices, but no matter what devices you use (USB2 or USB1), you're still limited by that artificial 32 device limit that is due to the broken design of xhci as long as the xhci controller is handling those USB2/USB1 devices for you.
    I've been told that some motherboards auto assign their USB ports to an ehci controller or xhci controller depending on what you plug into them. If so, this is the time to plug your USB3 hub with a USB2 cable to force the port to be routed to EHCI. This didn't work on the motherboard I tried on, however.

    Now, the good news is that because motherboards try to work with older operating systems that may not support xhci, they usually provide an ehci controller too, the only issue is to get those USB ports assigned to the ehci controller(s).

    How do you do this?

  • Turn off USB3 in the bios altogether (what I did). The supermicro motherboard I was using is old enough that it actually contains 2 ehci chips which then multiplied the number of devices you can plug in, gave me 8x more devices than when I had USB3 enabled (ehci can do close to 128 instead of 32 and 2 controllers instead of 1).
  • remove/blacklist the linux xhci driver modules. If the motherboard auto assigns xhci/ehci depending on what driver is loaded, this should work
  • If the motherboard only comes with an xhci controller, you are up a creek without a paddle, but you can still get an external USB2 PCI(-e) card: https://www.amazon.com/gp/product/B002RL8V7E "PCIe USB 2.0 Card - PCI-E USB 2.0 Card" actually comes with 2 USB1 controllers and one USB2 controller. It's not very clear how they are assigned (maybe dynamically depending on what is plugged into the ports). In either case the USB1 and USB2 have the high device limit you're looking for, but if somehow you're needing lots of devices (past 128), you may be able to get more out of the USB1.1 controllers (although at USB1 speeds, so that's probably not what you want). This is how that external card looks like
  • 06:04.0 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62)
    06:04.1 USB controller: VIA Technologies, Inc. VT82xx/62xx UHCI USB 1.1 Controller (rev 62)
    06:04.2 USB controller: VIA Technologies, Inc. USB 2.0 (rev 65)

    In the case of my supermicro board, I didn't look at how the two EHCI (USB2) controllers were routed, but it had extra USB cables on the motherboard, so I bought USB headers installed them on the front, and moved some USB devices to them: https://www.amazon.com/gp/product/B00NMBXUXI .

    Note that you likely don't want to buy a USB-3 PCI(-e) card like https://www.amazon.com/gp/product/B00FPIMICA because it creates a new root hub but only allows a measly extra 30-ish devices to be added (vs 120+ with the USB2 card mentioned above).

    Big thanks to

  • Alan Stern who helped me figure this out in https://www.spinics.net/lists/linux-usb/msg175224.html
  • Ruchira Ravoori from fuchsia kernel team who explained things to me further and pointed me to https://forums.intel.com/s/question/0D50P00004905stSAA/hardware-limitations-on-usb-endpoints-xhci?language=en_US
  • 2018/03/09 Btrfs Tips: Rescuing A Btrfs Send Receive Relationship
    π 2018-03-09 01:01 in Btrfs, Linux
    I had a problem when migrating disks and moving read only btrfs receive snapshots. I did a
    btrfs snapshot dir1/Video_ro.20180220_21:03:41 dir2/Video_ro.20180220_21:03:41 
    which in turn broke the snapshot by making it read-write and losing the btrfs receive relationship (Received UUID)

    Later, I wanted to re-establish the btrfs send/receive relationship since it was an 8TB subvolume, and I wanted to avoid having to copy back all the data I already had there. Simply making the destination snapshot read only again did not work

    The solution was python-btrfs, and this code: https://github.com/knorrie/python-btrfs/commit/1ace623f95300ecf581b1182780fd6432a46b24d

    gargamel:python-btrfs/examples# ./set_received_uuid.py 2afc7a5e-107f-d54b-8929-197b80b70828 31337 1234.5678 /mnt/btrfs_bigbackup/DS1/Video_ro.20180220_21:03:411G Current subvolume information: subvol_id: 94887 received_uuid: 00000000-0000-0000-0000-000000000000 stime: 0.0 (1970-01-01T00:00:00) stransid: 0 rtime: 0.0 (1970-01-01T00:00:00) rtransid: 0

    Setting received subvolume...

    Resulting subvolume information: subvol_id: 94887 received_uuid: 2afc7a5e-107f-d54b-8929-197b80b70828 stime: 1234.5678 (1970-01-01T00:20:34.567800) stransid: 31337 rtime: 1520488877.415709329 (2018-03-08T06:01:17.415709) rtransid: 255755

    Then make it read-only again: gargamel:python-btrfs/examples# btrfs property set -ts /mnt/btrfs_bigbackup/DS1/Video_ro.20180220_21:03:41 ro true

    But this didn't work: ABORT: btrfs send -p /mnt/btrfs_pool1/Video_ro.20180220_21:03:41 Video_ro.20180308_07:50:06 | btrfs receive /mnt/btrfs_bigbackup/DS1//. failed At subvol Video_ro.20180308_07:50:06 At snapshot Video_ro.20180308_07:50:06 ERROR: cannot find parent subvolume

    You can see that with set_received_uuid.py, I set Received UUID to match UUID on the source:

    gargamel:/mnt/btrfs_pool1# btrfs subvolume show /mnt/btrfs_bigbackup/DS1/Video_ro.20180220_21:03:41 DS1/Video_ro.20180220_21:03:41
            Name:                   Video_ro.20180220_21:03:41
            UUID:                   cb4f343c-5e79-7f49-adf0-7ce0b29f23b3
            Parent UUID:            0e220a4f-6426-4745-8399-0da0084f8b23 
            Received UUID:          2afc7a5e-107f-d54b-8929-197b80b70828 << changed this
            Creation time:          2018-02-20 21:13:36 -0800
            Subvolume ID:           94887
            Generation:             250689
            Gen at creation:        250689
            Parent ID:              89160
            Top level ID:           89160
            Flags:                  readonly
            Snapshot(s):
    

    Name: Video_ro.20180220_21:03:41 UUID: 2afc7a5e-107f-d54b-8929-197b80b70828 Parent UUID: e5ec5c1e-6b49-084e-8820-5a8cfaa1b089 Received UUID: 0e220a4f-6426-4745-8399-0da0084f8b23 Creation time: 2018-02-20 21:03:42 -0800 Subvolume ID: 11228 Generation: 4174 Gen at creation: 4150 Parent ID: 5 Top level ID: 5 Flags: readonly

    Turns out however that because the source had a Parent UUID value too, I was actually supposed to set Received UUID on the destination to it:

    gargamel:python-btrfs/examples# ./set_received_uuid.py 0e220a4f-6426-4745-8399-0da0084f8b23 313 37 1234.5678 /mnt/btrfs_bigbackup/DS1/Video_ro.20180220_21:03:41 Current subvolume information: subvol_id: 94887 received_uuid: 2afc7a5e-107f-d54b-8929-197b80b70828 stime: 1234.5678 (1970-01-01T00:20:34.567800) stransid: 31337 rtime: 1520488877.415709329 (2018-03-08T06:01:17.415709) rtransid: 255755

    Setting received subvolume...

    Resulting subvolume information: subvol_id: 94887 received_uuid: 0e220a4f-6426-4745-8399-0da0084f8b23 stime: 1234.5678 (1970-01-01T00:20:34.567800) stransid: 31337 rtime: 1520537034.890253770 (2018-03-08T19:23:54.890254) rtransid: 256119

    gargamel:python-btrfs/examples# btrfs property set -ts /mnt/btrfs_bigbackup/DS1/Video_ro.201802 20_21:03:41 ro true

    After this, I was able to re-start my btrfs send/receive and /mnt/btrfs_bigbackup/DS1/Video_ro.201802 20_21:03:41 was properly accepted as a destination. Yeah!

    2018/01/22 Lolibot, FPGA Primer, MicroPython for ESP8266/ESP32 and Protocol Analysis at Open Hardware Miniconf at Linux.Conf.au 2018
    π 2018-01-22 01:01 in Arduino, Linux
    Got to play with a lot of hardware at LCA 2018:
  • ESP32 micropython programmed robot
  • Learned the very basics (and pains) of how to program an FPGA
  • MicroPython programming and handling
  • Protocol Analysis (1wire) with a USB protocol sniffer.
  • Definitely worth the time I spent, even if some miniconfs made me miss a bunch of talks, but it was worth it :)

    Lolibot:







    our fearless team was honest about how they do the work every year :)
    our fearless team was honest about how they do the work every year :)

    The next day, I went to the FPGA training/miniconf:


    Bunnie Huang was one of the attendees
    Bunnie Huang was one of the attendees

    FPGAs are definitely 'interesting', you can use some of the gates to emulate a CPU, and others to run bare metal code
    FPGAs are definitely 'interesting', you can use some of the gates to emulate a CPU, and others to run bare metal code

    It was useful to learn more about MicroPython the next day, definitely a faster way to work on ESP8266/ESP32 SOCs:


    ESP32
    ESP32


    Tim nicely setup a hardware rig to flash the little TOMU boards that fit in your USB slot:


    The last day, we learned how to use a USB logic analyser to debug 1wire timing issues:


    protocol analysis is what Tridge eats for breakfast ;)
    protocol analysis is what Tridge eats for breakfast ;)

    2018/01/22 Linux.Conf.au 2018 in Sydney
    π 2018-01-22 01:01 in Linux
    Another year, another LCA still. Back to Sydney for the 3rd time. Outside of the nice talks, and the fantastic work of recording all the talks and posting them almost real time, the highlight of LCA this year were [all the open hardware miniconfs I was able to attend|perso/arduino/post_2018-01-22_Lolibot_-FPGA-Primer_-MicroPython-for-ESP8266-ESP32-and-Protocol-Analysis-at-Open-Hardware-Miniconf-at-Linux_Conf_au-2018.html].

    A few pictures from the conf:

    Selfie!
    Selfie!



    I got to meet and chat with Bunnie Huang, cool
    I got to meet and chat with Bunnie Huang, cool

    Like every year, we had the penguin dinner and the PDNS:



    winner of the best suit!
    winner of the best suit!



    Random slides:







    looking forward to next year
    looking forward to next year

    See more images for Linux.Conf.au 2018 in Sydney
    2017/09/03 Xorg Switching From Xmodmap To Xkbcomp and Setxkbmap
    π 2017-09-03 01:01 in Linux
    I've been typing french on qwerty keyboards for close to 25 years. Using dead keys is a pain, and having characters like ` be dead key characters without using a compose key to enable them as dead characters, is even more of a pain.
    While the compose solution works, compose + ' + release + e to get é is kind of painful, so I wrote an xmodmap file that simply allowed right alt + e for é, right alt + shift + e for è.

    After 20+ years of using this xmodmap file with Xorg, it finally stopped working and causing more Xorg bugs that were not going to be fixed.

    keycode 105 = Multi_key
    keycode 108 = Mode_switch Alt_R Meta_R
    

    keycode 15 = 6 asciicircum dead_circumflex dead_circumflex keycode 49 = grave asciitilde dead_grave dead_grave keycode 48 = apostrophe quotedbl dead_acute dead_diaeresis

    keycode 38 = a A agrave agrave acircumflex adiaeresis keycode 26 = e E eacute egrave ecircumflex ediaeresis keycode 30 = u U ugrave ugrave ucircumflex udiaeresis keycode 31 = i I icircumflex idiaeresis keycode 32 = o O ocircumflex odiaeresis keycode 54 = c C ccedilla ccedilla

    I'll skip the choice words on the Xorg team for just letting xmodmap rot and die. Then, I'll express more dissatisfaction on how they didn't just give a converter. This "I'm going to break you and I don't really care" attitude, even if non willful, is not cool.

    So, I was left to fix my own problem, ok, after all I've been fixing linux problems for more than 20 years, so it can't be so bad, right? Well, it was. It took me hours and hours over multiple days. Searching implies that something seemingly simple as typing

    setxkbmap -model pc104 -layout us -variant intl (or altgr-intl)
    should work, but it did not. I got the compose key working on right CTRL, but not right ALT.

    More googling gave me this:

    setxkbmap -model pc104 -layout us -variant intl (or altgr-intl) -option -option lv3:ralt_switch,compose:rctrl,eurosign:4
    And finally I could get € by typing right ALT + 4, but I didn't get é when I typed right ALT + e. Dead keys did work though (right CTRL + ' + e = é), but that's a lot slower than just typing right ALT + e at the same time.

    After hours of going nowhere on reading that it should work, when it clearly didn't, I finally managed to dump my key mappings (that along isn't really documented well either):

    xkbcomp -xkb :0 
    actually dumps all the keys into a file called server-0.xkb. I then started editing it, and realized that my Xmodmap converted file had
        key <AD03> {
            type= "ALPHABETIC",
            symbols[Group1]= [               e,               E ]
            symbols[Group2]= [          eacute,          egrave ],
            symbols[Group3]= [     ecircumflex,      ediaeresis ],
            symbols[Group4]= [     ecircumflex,      ediaeresis ]
        };
    when apparently I needed:
        key <AD03> {
            type= "FOUR_LEVEL",
            symbols[Group1]= [               e,               E ,          eacute,          egrave ]
        };
    (lvl3 mapping doesn't seem to activate Group2 reliably, or at all, so I had to switch from type= "ALPHABETIC" to type= "FOUR_LEVEL" and that _finally_ worked).

    So now I have a ~/xkb-keymap file that I can load with

    xkbcomp ~/xkb-keymap :0
    Honestly, I have no idea why I had to do all this, or why it works apparently more simply for others. I have xorg 1:7.7+19 on debian testing.

    I'm attaching my whole file if it helps someone (congratulation if google brings you to this page)

    xkb_keymap {
    xkb_keycodes "evdev+aliases(qwerty)" {
        minimum = 8;
        maximum = 255;
         <ESC> = 9;
        <AE01> = 10;
        <AE02> = 11;
        <AE03> = 12;
        <AE04> = 13;
        <AE05> = 14;
        <AE06> = 15;
        <AE07> = 16;
        <AE08> = 17;
        <AE09> = 18;
        <AE10> = 19;
        <AE11> = 20;
        <AE12> = 21;
        <BKSP> = 22;
         <TAB> = 23;
        <AD01> = 24;
        <AD02> = 25;
        <AD03> = 26;
        <AD04> = 27;
        <AD05> = 28;
        <AD06> = 29;
        <AD07> = 30;
        <AD08> = 31;
        <AD09> = 32;
        <AD10> = 33;
        <AD11> = 34;
        <AD12> = 35;
        <RTRN> = 36;
        <LCTL> = 37;
        <AC01> = 38;
        <AC02> = 39;
        <AC03> = 40;
        <AC04> = 41;
        <AC05> = 42;
        <AC06> = 43;
        <AC07> = 44;
        <AC08> = 45;
        <AC09> = 46;
        <AC10> = 47;
        <AC11> = 48;
        <TLDE> = 49;
        <LFSH> = 50;
        <BKSL> = 51;
        <AB01> = 52;
        <AB02> = 53;
        <AB03> = 54;
        <AB04> = 55;
        <AB05> = 56;
        <AB06> = 57;
        <AB07> = 58;
        <AB08> = 59;
        <AB09> = 60;
        <AB10> = 61;
        <RTSH> = 62;
        <KPMU> = 63;
        <LALT> = 64;
        <SPCE> = 65;
        <CAPS> = 66;
        <FK01> = 67;
        <FK02> = 68;
        <FK03> = 69;
        <FK04> = 70;
        <FK05> = 71;
        <FK06> = 72;
        <FK07> = 73;
        <FK08> = 74;
        <FK09> = 75;
        <FK10> = 76;
        <NMLK> = 77;
        <SCLK> = 78;
         <KP7> = 79;
         <KP8> = 80;
         <KP9> = 81;
        <KPSU> = 82;
         <KP4> = 83;
         <KP5> = 84;
         <KP6> = 85;
        <KPAD> = 86;
         <KP1> = 87;
         <KP2> = 88;
         <KP3> = 89;
         <KP0> = 90;
        <KPDL> = 91;
        <LVL3> = 92;
        <LSGT> = 94;
        <FK11> = 95;
        <FK12> = 96;
        <KATA> = 98;
        <HIRA> = 99;
        <HENK> = 100;
        <HKTG> = 101;
        <MUHE> = 102;
        <KPEN> = 104;
        <RCTL> = 105;
        <KPDV> = 106;
        <PRSC> = 107;
        <RALT> = 108;
        <LNFD> = 109;
        <HOME> = 110;
          <UP> = 111;
        <PGUP> = 112;
        <LEFT> = 113;
        <RGHT> = 114;
         <END> = 115;
        <DOWN> = 116;
        <PGDN> = 117;
         <INS> = 118;
        <DELE> = 119;
        <MUTE> = 121;
        <VOL-> = 122;
        <VOL+> = 123;
        <POWR> = 124;
        <KPEQ> = 125;
        <I126> = 126;
        <PAUS> = 127;
        <I128> = 128;
        <I129> = 129;
        <HNGL> = 130;
        <HJCV> = 131;
        <LWIN> = 133;
        <RWIN> = 134;
        <COMP> = 135;
        <STOP> = 136;
        <AGAI> = 137;
        <PROP> = 138;
        <UNDO> = 139;
        <FRNT> = 140;
        <COPY> = 141;
        <OPEN> = 142;
        <PAST> = 143;
        <FIND> = 144;
         <CUT> = 145;
        <HELP> = 146;
        <I147> = 147;
        <I148> = 148;
        <I150> = 150;
        <I151> = 151;
        <I152> = 152;
        <I153> = 153;
        <I155> = 155;
        <I156> = 156;
        <I157> = 157;
        <I158> = 158;
        <I159> = 159;
        <I160> = 160;
        <I162> = 162;
        <I163> = 163;
        <I164> = 164;
        <I165> = 165;
        <I166> = 166;
        <I167> = 167;
        <I169> = 169;
        <I170> = 170;
        <I171> = 171;
        <I172> = 172;
        <I173> = 173;
        <I174> = 174;
        <I175> = 175;
        <I176> = 176;
        <I177> = 177;
        <I179> = 179;
        <I180> = 180;
        <I181> = 181;
        <I182> = 182;
        <I185> = 185;
        <I186> = 186;
        <I187> = 187;
        <I188> = 188;
        <I189> = 189;
        <I190> = 190;
        <FK13> = 191;
        <FK14> = 192;
        <FK15> = 193;
        <FK16> = 194;
        <FK17> = 195;
        <FK18> = 196;
        <FK21> = 199;
        <FK22> = 200;
        <FK23> = 201;
        <MDSW> = 203;
         <ALT> = 204;
        <META> = 205;
        <SUPR> = 206;
        <HYPR> = 207;
        <I208> = 208;
        <I209> = 209;
        <I210> = 210;
        <I211> = 211;
        <I212> = 212;
        <I213> = 213;
        <I214> = 214;
        <I215> = 215;
        <I216> = 216;
        <I218> = 218;
        <I220> = 220;
        <I223> = 223;
        <I224> = 224;
        <I225> = 225;
        <I226> = 226;
        <I227> = 227;
        <I228> = 228;
        <I229> = 229;
        <I231> = 231;
        <I232> = 232;
        <I233> = 233;
        <I234> = 234;
        <I235> = 235;
        <I236> = 236;
        <I237> = 237;
        <I238> = 238;
        <I239> = 239;
        <I240> = 240;
        <I241> = 241;
        <I242> = 242;
        <I243> = 243;
        <I244> = 244;
        <I245> = 245;
        <I246> = 246;
        indicator 1 = "Caps Lock";
        indicator 2 = "Num Lock";
        indicator 3 = "Scroll Lock";
        indicator 4 = "Compose";
        indicator 5 = "Kana";
        indicator 6 = "Sleep";
        indicator 7 = "Suspend";
        indicator 8 = "Mute";
        indicator 9 = "Misc";
        indicator 10 = "Mail";
        indicator 11 = "Charging";
        virtual indicator 12 = "Shift Lock";
        virtual indicator 13 = "Group 2";
        virtual indicator 14 = "Mouse Keys";
        alias <AC12> = <BKSL>;
        alias <MENU> = <COMP>;
        alias <HZTG> = <TLDE>;
        alias <LMTA> = <LWIN>;
        alias <RMTA> = <RWIN>;
        alias <ALGR> = <RALT>;
        alias <KPPT> = <I129>;
        alias <LatQ> = <AD01>;
        alias <LatW> = <AD02>;
        alias <LatE> = <AD03>;
        alias <LatR> = <AD04>;
        alias <LatT> = <AD05>;
        alias <LatY> = <AD06>;
        alias <LatU> = <AD07>;
        alias <LatI> = <AD08>;
        alias <LatO> = <AD09>;
        alias <LatP> = <AD10>;
        alias <LatA> = <AC01>;
        alias <LatS> = <AC02>;
        alias <LatD> = <AC03>;
        alias <LatF> = <AC04>;
        alias <LatG> = <AC05>;
        alias <LatH> = <AC06>;
        alias <LatJ> = <AC07>;
        alias <LatK> = <AC08>;
        alias <LatL> = <AC09>;
        alias <LatZ> = <AB01>;
        alias <LatX> = <AB02>;
        alias <LatC> = <AB03>;
        alias <LatV> = <AB04>;
        alias <LatB> = <AB05>;
        alias <LatN> = <AB06>;
        alias <LatM> = <AB07>;
    };
    

    xkb_types "complete" {

    virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;

    type "ONE_LEVEL" { modifiers= none; level_name[Level1]= "Any"; }; type "TWO_LEVEL" { modifiers= Shift; map[Shift]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; }; type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; }; type "KEYPAD" { modifiers= Shift+NumLock; map[Shift]= Level2; map[NumLock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Number"; }; type "SHIFT+ALT" { modifiers= Shift+Alt; map[Shift+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Shift+Alt"; }; type "PC_CONTROL_LEVEL2" { modifiers= Control; map[Control]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Control"; }; type "PC_LCONTROL_LEVEL2" { modifiers= LControl; map[LControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LControl"; }; type "PC_RCONTROL_LEVEL2" { modifiers= RControl; map[RControl]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RControl"; }; type "PC_ALT_LEVEL2" { modifiers= Alt; map[Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Alt"; }; type "PC_LALT_LEVEL2" { modifiers= LAlt; map[LAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "LAlt"; }; type "PC_RALT_LEVEL2" { modifiers= RAlt; map[RAlt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "RAlt"; }; type "CTRL+ALT" { modifiers= Control+Alt; map[Control+Alt]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Ctrl+Alt"; }; type "LOCAL_EIGHT_LEVEL" { modifiers= Shift+Lock+Control+LevelThree; map[Shift+Lock]= Level1; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Control]= Level5; map[Shift+Lock+Control]= Level5; map[Shift+Control]= Level6; map[Lock+Control]= Level6; map[Control+LevelThree]= Level7; map[Shift+Lock+Control+LevelThree]= Level7; map[Shift+Control+LevelThree]= Level8; map[Lock+Control+LevelThree]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; level_name[Level4]= "Shift Level3"; level_name[Level5]= "Ctrl"; level_name[Level6]= "Shift Ctrl"; level_name[Level7]= "Level3 Ctrl"; level_name[Level8]= "Shift Level3 Ctrl"; }; type "THREE_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Level3"; }; type "EIGHT_LEVEL" { modifiers= Shift+LevelThree+LevelFive; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level8; map[Shift+Lock+LevelThree+LevelFive]= Level7; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "EIGHT_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree+LevelFive; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; map[LevelFive]= Level5; map[Shift+LevelFive]= Level6; map[Lock+LevelFive]= Level6; preserve[Lock+LevelFive]= Lock; map[LevelThree+LevelFive]= Level7; map[Shift+LevelThree+LevelFive]= Level8; map[Lock+LevelThree+LevelFive]= Level7; preserve[Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelThree+LevelFive]= Level8; preserve[Shift+Lock+LevelThree+LevelFive]= Lock; map[Shift+Lock+LevelFive]= Level1; preserve[Shift+Lock+LevelFive]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "X"; level_name[Level6]= "X Shift"; level_name[Level7]= "X Alt Base"; level_name[Level8]= "X Shift Alt"; }; type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level4; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_SEMIALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level4; preserve[Shift+Lock+LevelThree]= Lock; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_MIXED_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift+NumLock]= Level1; map[NumLock]= Level2; map[Shift]= Level2; map[LevelThree]= Level3; map[NumLock+LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; }; type "FOUR_LEVEL_X" { modifiers= Shift+Control+Alt+LevelThree; map[LevelThree]= Level2; map[Shift+LevelThree]= Level3; map[Control+Alt]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Alt Base"; level_name[Level3]= "Shift Alt"; level_name[Level4]= "Ctrl+Alt"; }; type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[Lock]= Level4; preserve[Lock]= Lock; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock+LevelThree]= Level3; preserve[Lock+LevelThree]= Lock; map[Shift+Lock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "AltGr Base"; level_name[Level4]= "Shift AltGr"; }; type "FOUR_LEVEL_PLUS_LOCK" { modifiers= Shift+Lock+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Lock]= Level5; map[Shift+Lock]= Level2; map[Lock+LevelThree]= Level3; map[Shift+Lock+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "Lock"; }; type "FOUR_LEVEL_KEYPAD" { modifiers= Shift+NumLock+LevelThree; map[Shift]= Level2; map[NumLock]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[NumLock+LevelThree]= Level4; map[Shift+NumLock+LevelThree]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Number"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Alt Number"; }; };

    xkb_compatibility "complete" {

    virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;

    interpret.useModMapMods= AnyLevel; interpret.repeat= False; interpret.locking= False; interpret ISO_Level2_Latch+Exactly(Shift) { useModMapMods=level1; action= LatchMods(modifiers=Shift,clearLocks,latchToLock); }; interpret Shift_Lock+AnyOf(Shift+Lock) { action= LockMods(modifiers=Shift); }; interpret Num_Lock+AnyOf(all) { virtualModifier= NumLock; action= LockMods(modifiers=NumLock); }; interpret ISO_Lock+AnyOf(all) { action= ISOLock(modifiers=modMapMods,affect=all); }; interpret ISO_Level3_Shift+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOf(all) { virtualModifier= LevelThree; useModMapMods=level1; action= LockMods(modifiers=LevelThree); }; interpret Alt_L+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Alt_R+AnyOf(all) { virtualModifier= Alt; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_L+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Meta_R+AnyOf(all) { virtualModifier= Meta; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_L+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Super_R+AnyOf(all) { virtualModifier= Super; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_L+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Hyper_R+AnyOf(all) { virtualModifier= Hyper; action= SetMods(modifiers=modMapMods,clearLocks); }; interpret Scroll_Lock+AnyOf(all) { virtualModifier= ScrollLock; action= LockMods(modifiers=modMapMods); }; interpret ISO_Level5_Shift+AnyOf(all) { virtualModifier= LevelFive; useModMapMods=level1; action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOf(all) { virtualModifier= LevelFive; action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOf(all) { virtualModifier= LevelFive; action= LockMods(modifiers=LevelFive); }; interpret Mode_switch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= SetGroup(group=+1); }; interpret ISO_Level3_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelThree,clearLocks); }; interpret ISO_Level3_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); }; interpret ISO_Level3_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelThree); }; interpret ISO_Group_Latch+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LatchGroup(group=2); }; interpret ISO_Next_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=+1); }; interpret ISO_Prev_Group+AnyOfOrNone(all) { virtualModifier= AltGr; useModMapMods=level1; action= LockGroup(group=-1); }; interpret ISO_First_Group+AnyOfOrNone(all) { action= LockGroup(group=1); }; interpret ISO_Last_Group+AnyOfOrNone(all) { action= LockGroup(group=2); }; interpret KP_1+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_End+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret KP_2+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_Down+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=+1); }; interpret KP_3+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_Next+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret KP_4+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_Left+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+0); }; interpret KP_6+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_Right+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+0); }; interpret KP_7+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_Home+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret KP_8+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_Up+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+0,y=-1); }; interpret KP_9+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_Prior+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret KP_5+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_Begin+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret KP_F2+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_Divide+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret KP_F3+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_Multiply+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret KP_F4+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Subtract+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=3); }; interpret KP_Separator+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_Add+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default,count=2); }; interpret KP_0+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Insert+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=lock); }; interpret KP_Decimal+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret KP_Delete+AnyOfOrNone(all) { repeat= True; action= LockPtrBtn(button=default,affect=unlock); }; interpret F25+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=1); }; interpret F26+AnyOfOrNone(all) { repeat= True; action= SetPtrDflt(affect=button,button=2); }; interpret F27+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=-1); }; interpret F29+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=-1); }; interpret F31+AnyOfOrNone(all) { repeat= True; action= PtrBtn(button=default); }; interpret F33+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=-1,y=+1); }; interpret F35+AnyOfOrNone(all) { repeat= True; action= MovePtr(x=+1,y=+1); }; interpret Pointer_Button_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default); }; interpret Pointer_Button1+AnyOfOrNone(all) { action= PtrBtn(button=1); }; interpret Pointer_Button2+AnyOfOrNone(all) { action= PtrBtn(button=2); }; interpret Pointer_Button3+AnyOfOrNone(all) { action= PtrBtn(button=3); }; interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { action= PtrBtn(button=default,count=2); }; interpret Pointer_DblClick1+AnyOfOrNone(all) { action= PtrBtn(button=1,count=2); }; interpret Pointer_DblClick2+AnyOfOrNone(all) { action= PtrBtn(button=2,count=2); }; interpret Pointer_DblClick3+AnyOfOrNone(all) { action= PtrBtn(button=3,count=2); }; interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { action= LockPtrBtn(button=default,affect=both); }; interpret Pointer_Drag1+AnyOfOrNone(all) { action= LockPtrBtn(button=1,affect=both); }; interpret Pointer_Drag2+AnyOfOrNone(all) { action= LockPtrBtn(button=2,affect=both); }; interpret Pointer_Drag3+AnyOfOrNone(all) { action= LockPtrBtn(button=3,affect=both); }; interpret Pointer_EnableKeys+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret Pointer_Accelerate+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=+1); }; interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { action= SetPtrDflt(affect=button,button=-1); }; interpret AccessX_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXKeys); }; interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { action= LockControls(controls=AccessXFeedback); }; interpret RepeatKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=RepeatKeys); }; interpret SlowKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=SlowKeys); }; interpret BounceKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=BounceKeys); }; interpret StickyKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=StickyKeys); }; interpret MouseKeys_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeys); }; interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { action= LockControls(controls=MouseKeysAccel); }; interpret Overlay1_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay1); }; interpret Overlay2_Enable+AnyOfOrNone(all) { action= LockControls(controls=Overlay2); }; interpret AudibleBell_Enable+AnyOfOrNone(all) { action= LockControls(controls=AudibleBell); }; interpret Terminate_Server+AnyOfOrNone(all) { action= Terminate(); }; interpret Alt_L+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Alt_R+AnyOfOrNone(all) { action= SetMods(modifiers=Alt,clearLocks); }; interpret Meta_L+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Meta_R+AnyOfOrNone(all) { action= SetMods(modifiers=Meta,clearLocks); }; interpret Super_L+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Super_R+AnyOfOrNone(all) { action= SetMods(modifiers=Super,clearLocks); }; interpret Hyper_L+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Hyper_R+AnyOfOrNone(all) { action= SetMods(modifiers=Hyper,clearLocks); }; interpret Shift_L+AnyOfOrNone(all) { action= SetMods(modifiers=Shift,clearLocks); }; interpret XF86Switch_VT_1+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=1,!same); }; interpret XF86Switch_VT_2+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=2,!same); }; interpret XF86Switch_VT_3+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=3,!same); }; interpret XF86Switch_VT_4+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=4,!same); }; interpret XF86Switch_VT_5+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=5,!same); }; interpret XF86Switch_VT_6+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=6,!same); }; interpret XF86Switch_VT_7+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=7,!same); }; interpret XF86Switch_VT_8+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=8,!same); }; interpret XF86Switch_VT_9+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=9,!same); }; interpret XF86Switch_VT_10+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=10,!same); }; interpret XF86Switch_VT_11+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=11,!same); }; interpret XF86Switch_VT_12+AnyOfOrNone(all) { repeat= True; action= SwitchScreen(screen=12,!same); }; interpret XF86Ungrab+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x55,data[1]=0x6e,data[2]=0x67,data[3]=0x72,data[4]=0x61,data[5]=0x62,data[6]=0x00); }; interpret XF86ClearGrab+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x43,data[1]=0x6c,data[2]=0x73,data[3]=0x47,data[4]=0x72,data[5]=0x62,data[6]=0x00); }; interpret XF86Next_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret XF86Prev_VMode+AnyOfOrNone(all) { repeat= True; action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); }; interpret ISO_Level5_Shift+AnyOfOrNone(all) { action= SetMods(modifiers=LevelFive,clearLocks); }; interpret ISO_Level5_Latch+AnyOfOrNone(all) { action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); }; interpret ISO_Level5_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=LevelFive); }; interpret Caps_Lock+AnyOfOrNone(all) { action= LockMods(modifiers=Lock); }; interpret Any+Exactly(Lock) { action= LockMods(modifiers=Lock); }; interpret Any+AnyOf(all) { action= SetMods(modifiers=modMapMods,clearLocks); }; indicator "Caps Lock" { !allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { !allowExplicit; whichModState= locked; modifiers= NumLock; }; indicator "Scroll Lock" { whichModState= locked; modifiers= ScrollLock; }; indicator "Shift Lock" { !allowExplicit; whichModState= locked; modifiers= Shift; }; indicator "Group 2" { !allowExplicit; groups= 0xfe; }; indicator "Mouse Keys" { indicatorDrivesKeyboard; controls= mouseKeys; }; };

    xkb_symbols "pc+us+inet(evdev)+level3(ralt_switch)+compose(rctrl)+eurosign(4)" {

    name[group1]="English (US)";

    key <ESC> { [ Escape ] }; key <AE01> { [ 1, exclam ] }; key <AE02> { [ 2, at ] }; key <AE03> { [ 3, numbersign ] }; key <AE04> { type= "FOUR_LEVEL", symbols[Group1]= [ 4, dollar, EuroSign, NoSymbol ] }; key <AE05> { [ 5, percent ] }; key <AE06> { [ 6, asciicircum ] }; key <AE07> { [ 7, ampersand ] }; key <AE08> { [ 8, asterisk ] }; key <AE09> { [ 9, parenleft ] }; key <AE10> { [ 0, parenright ] }; key <AE11> { [ minus, underscore ] }; key <AE12> { [ equal, plus ] }; key <BKSP> { [ BackSpace ] }; key <TAB> { [ Tab, ISO_Left_Tab ] }; key <AD01> { type= "ALPHABETIC", symbols[Group1]= [ q, Q ] }; key <AD02> { type= "ALPHABETIC", symbols[Group1]= [ w, W ] }; key <AD03> { type= "FOUR_LEVEL", symbols[Group1]= [ e, E , eacute, egrave ] }; key <AD04> { type= "ALPHABETIC", symbols[Group1]= [ r, R ] }; key <AD05> { type= "ALPHABETIC", symbols[Group1]= [ t, T ] }; key <AD06> { type= "ALPHABETIC", symbols[Group1]= [ y, Y ] }; key <AD07> { type= "FOUR_LEVEL", symbols[Group1]= [ u, U, ugrave, ucircumflex ] }; key <AD08> { type= "FOUR_LEVEL", symbols[Group1]= [ i, I, icircumflex, idiaeresis ] }; key <AD09> { type= "FOUR_LEVEL", symbols[Group1]= [ o, O, ocircumflex, odiaeresis ] }; key <AD10> { type= "ALPHABETIC", symbols[Group1]= [ p, P ] }; key <AD11> { [ bracketleft, braceleft ] }; key <AD12> { [ bracketright, braceright ] }; key <RTRN> { [ Return ] }; key <LCTL> { [ Control_L ] }; key <AC01> { type= "FOUR_LEVEL", symbols[Group1]= [ a, A, agrave, acircumflex ] }; key <AC02> { type= "ALPHABETIC", symbols[Group1]= [ s, S ] }; key <AC03> { type= "ALPHABETIC", symbols[Group1]= [ d, D ] }; key <AC04> { type= "ALPHABETIC", symbols[Group1]= [ f, F ] }; key <AC05> { type= "ALPHABETIC", symbols[Group1]= [ g, G ] }; key <AC06> { type= "ALPHABETIC", symbols[Group1]= [ h, H ] }; key <AC07> { type= "ALPHABETIC", symbols[Group1]= [ j, J ] }; key <AC08> { type= "ALPHABETIC", symbols[Group1]= [ k, K ] }; key <AC09> { type= "ALPHABETIC", symbols[Group1]= [ l, L ] }; key <AC10> { [ semicolon, colon ] }; key <AC11> { [ apostrophe, quotedbl ] }; key <TLDE> { [ grave, asciitilde ] }; key <LFSH> { [ Shift_L ] }; key <BKSL> { [ backslash, bar ] }; key <AB01> { type= "ALPHABETIC", symbols[Group1]= [ z, Z ] }; key <AB02> { type= "ALPHABETIC", symbols[Group1]= [ x, X ] }; key <AB03> { type= "FOUR_LEVEL", symbols[Group1]= [ c, C, ccedilla, ccedilla ] }; key <AB04> { type= "ALPHABETIC", symbols[Group1]= [ v, V ] }; key <AB05> { type= "ALPHABETIC", symbols[Group1]= [ b, B ] }; key <AB06> { type= "ALPHABETIC", symbols[Group1]= [ n, N ] }; key <AB07> { type= "ALPHABETIC", symbols[Group1]= [ m, M ] }; key <AB08> { [ comma, less ] }; key <AB09> { [ period, greater ] }; key <AB10> { [ slash, question ] }; key <RTSH> { [ Shift_R ] }; key <KPMU> { type= "CTRL+ALT", symbols[Group1]= [ KP_Multiply, XF86ClearGrab ] }; key <LALT> { [ Alt_L, Meta_L ] }; key <SPCE> { [ space ] }; key <CAPS> { [ Caps_Lock ] }; key <FK01> { type= "CTRL+ALT", symbols[Group1]= [ F1, XF86Switch_VT_1 ] }; key <FK02> { type= "CTRL+ALT", symbols[Group1]= [ F2, XF86Switch_VT_2 ] }; key <FK03> { type= "CTRL+ALT", symbols[Group1]= [ F3, XF86Switch_VT_3 ] }; key <FK04> { type= "CTRL+ALT", symbols[Group1]= [ F4, XF86Switch_VT_4 ] }; key <FK05> { type= "CTRL+ALT", symbols[Group1]= [ F5, XF86Switch_VT_5 ] }; key <FK06> { type= "CTRL+ALT", symbols[Group1]= [ F6, XF86Switch_VT_6 ] }; key <FK07> { type= "CTRL+ALT", symbols[Group1]= [ F7, XF86Switch_VT_7 ] }; key <FK08> { type= "CTRL+ALT", symbols[Group1]= [ F8, XF86Switch_VT_8 ] }; key <FK09> { type= "CTRL+ALT", symbols[Group1]= [ F9, XF86Switch_VT_9 ] }; key <FK10> { type= "CTRL+ALT", symbols[Group1]= [ F10, XF86Switch_VT_10 ] }; key <NMLK> { [ Num_Lock ] }; key <SCLK> { [ Scroll_Lock ] }; key <KP7> { [ KP_Home, KP_7 ] }; key <KP8> { [ KP_Up, KP_8 ] }; key <KP9> { [ KP_Prior, KP_9 ] }; key <KPSU> { type= "CTRL+ALT", symbols[Group1]= [ KP_Subtract, XF86Prev_VMode ] }; key <KP4> { [ KP_Left, KP_4 ] }; key <KP5> { [ KP_Begin, KP_5 ] }; key <KP6> { [ KP_Right, KP_6 ] }; key <KPAD> { type= "CTRL+ALT", symbols[Group1]= [ KP_Add, XF86Next_VMode ] }; key <KP1> { [ KP_End, KP_1 ] }; key <KP2> { [ KP_Down, KP_2 ] }; key <KP3> { [ KP_Next, KP_3 ] }; key <KP0> { [ KP_Insert, KP_0 ] }; key <KPDL> { [ KP_Delete, KP_Decimal ] }; key <LVL3> { [ ISO_Level3_Shift ] }; key <LSGT> { type= "FOUR_LEVEL", symbols[Group1]= [ less, greater, bar, brokenbar ] }; key <FK11> { type= "CTRL+ALT", symbols[Group1]= [ F11, XF86Switch_VT_11 ] }; key <FK12> { type= "CTRL+ALT", symbols[Group1]= [ F12, XF86Switch_VT_12 ] }; key <KATA> { [ Katakana ] }; key <HIRA> { [ Hiragana ] }; key <HENK> { [ Henkan_Mode ] }; key <HKTG> { [ Hiragana_Katakana ] }; key <MUHE> { [ Muhenkan ] }; key <KPEN> { [ KP_Enter ] }; key <RCTL> { type= "TWO_LEVEL", symbols[Group1]= [ Multi_key, Multi_key ] }; key <KPDV> { type= "CTRL+ALT", symbols[Group1]= [ KP_Divide, XF86Ungrab ] }; key <PRSC> { type= "PC_ALT_LEVEL2", symbols[Group1]= [ Print, Sys_Req ] }; key <RALT> { type= "ONE_LEVEL", symbols[Group1]= [ ISO_Level3_Shift ] }; key <LNFD> { [ Linefeed ] }; key <HOME> { [ Home ] }; key <UP> { [ Up ] }; key <PGUP> { [ Prior ] }; key <LEFT> { [ Left ] }; key <RGHT> { [ Right ] }; key <END> { [ End ] }; key <DOWN> { [ Down ] }; key <PGDN> { [ Next ] }; key <INS> { [ Insert ] }; key <DELE> { [ Delete ] }; key <MUTE> { [ XF86AudioMute ] }; key <VOL-> { [ XF86AudioLowerVolume ] }; key <VOL+> { [ XF86AudioRaiseVolume ] }; key <POWR> { [ XF86PowerOff ] }; key <KPEQ> { [ KP_Equal ] }; key <I126> { [ plusminus ] }; key <PAUS> { type= "PC_CONTROL_LEVEL2", symbols[Group1]= [ Pause, Break ] }; key <I128> { [ XF86LaunchA ] }; key <I129> { [ KP_Decimal, KP_Decimal ] }; key <HNGL> { [ Hangul ] }; key <HJCV> { [ Hangul_Hanja ] }; key <LWIN> { [ Super_L ] }; key <RWIN> { [ Super_R ] }; key <COMP> { [ Menu ] }; key <STOP> { [ Cancel ] }; key <AGAI> { [ Redo ] }; key <PROP> { [ SunProps ] }; key <UNDO> { [ Undo ] }; key <FRNT> { [ SunFront ] }; key <COPY> { [ XF86Copy ] }; key <OPEN> { [ SunOpen ] }; key <PAST> { [ XF86Paste ] }; key <FIND> { [ Find ] }; key <CUT> { [ XF86Cut ] }; key <HELP> { [ Help ] }; key <I147> { [ XF86MenuKB ] }; key <I148> { [ XF86Calculator ] }; key <I150> { [ XF86Sleep ] }; key <I151> { [ XF86WakeUp ] }; key <I152> { [ XF86Explorer ] }; key <I153> { [ XF86Send ] }; key <I155> { [ XF86Xfer ] }; key <I156> { [ XF86Launch1 ] }; key <I157> { [ XF86Launch2 ] }; key <I158> { [ XF86WWW ] }; key <I159> { [ XF86DOS ] }; key <I160> { [ XF86ScreenSaver ] }; key <I162> { [ XF86RotateWindows ] }; key <I163> { [ XF86Mail ] }; key <I164> { [ XF86Favorites ] }; key <I165> { [ XF86MyComputer ] }; key <I166> { [ XF86Back ] }; key <I167> { [ XF86Forward ] }; key <I169> { [ XF86Eject ] }; key <I170> { [ XF86Eject, XF86Eject ] }; key <I171> { [ XF86AudioNext ] }; key <I172> { [ XF86AudioPlay, XF86AudioPause ] }; key <I173> { [ XF86AudioPrev ] }; key <I174> { [ XF86AudioStop, XF86Eject ] }; key <I175> { [ XF86AudioRecord ] }; key <I176> { [ XF86AudioRewind ] }; key <I177> { [ XF86Phone ] }; key <I179> { [ XF86Tools ] }; key <I180> { [ XF86HomePage ] }; key <I181> { [ XF86Reload ] }; key <I182> { [ XF86Close ] }; key <I185> { [ XF86ScrollUp ] }; key <I186> { [ XF86ScrollDown ] }; key <I187> { [ parenleft ] }; key <I188> { [ parenright ] }; key <I189> { [ XF86New ] }; key <I190> { [ Redo ] }; key <FK13> { [ XF86Tools ] }; key <FK14> { [ XF86Launch5 ] }; key <FK15> { [ XF86Launch6 ] }; key <FK16> { [ XF86Launch7 ] }; key <FK17> { [ XF86Launch8 ] }; key <FK18> { [ XF86Launch9 ] }; key <FK21> { [ XF86TouchpadToggle ] }; key <FK22> { [ XF86TouchpadOn ] }; key <FK23> { [ XF86TouchpadOff ] }; key <MDSW> { [ Mode_switch ] }; key <ALT> { [ NoSymbol, Alt_L ] }; key <META> { [ NoSymbol, Meta_L ] }; key <SUPR> { [ NoSymbol, Super_L ] }; key <HYPR> { [ NoSymbol, Hyper_L ] }; key <I208> { [ XF86AudioPlay ] }; key <I209> { [ XF86AudioPause ] }; key <I210> { [ XF86Launch3 ] }; key <I211> { [ XF86Launch4 ] }; key <I212> { [ XF86LaunchB ] }; key <I213> { [ XF86Suspend ] }; key <I214> { [ XF86Close ] }; key <I215> { [ XF86AudioPlay ] }; key <I216> { [ XF86AudioForward ] }; key <I218> { [ Print ] }; key <I220> { [ XF86WebCam ] }; key <I223> { [ XF86Mail ] }; key <I224> { [ XF86Messenger ] }; key <I225> { [ XF86Search ] }; key <I226> { [ XF86Go ] }; key <I227> { [ XF86Finance ] }; key <I228> { [ XF86Game ] }; key <I229> { [ XF86Shop ] }; key <I231> { [ Cancel ] }; key <I232> { [ XF86MonBrightnessDown ] }; key <I233> { [ XF86MonBrightnessUp ] }; key <I234> { [ XF86AudioMedia ] }; key <I235> { [ XF86Display ] }; key <I236> { [ XF86KbdLightOnOff ] }; key <I237> { [ XF86KbdBrightnessDown ] }; key <I238> { [ XF86KbdBrightnessUp ] }; key <I239> { [ XF86Send ] }; key <I240> { [ XF86Reply ] }; key <I241> { [ XF86MailForward ] }; key <I242> { [ XF86Save ] }; key <I243> { [ XF86Documents ] }; key <I244> { [ XF86Battery ] }; key <I245> { [ XF86Bluetooth ] }; key <I246> { [ XF86WLAN ] }; modifier_map Control { <LCTL> }; modifier_map Shift { <LFSH> }; modifier_map Shift { <RTSH> }; modifier_map Mod1 { <LALT> }; modifier_map Lock { <CAPS> }; modifier_map Mod2 { <NMLK> }; modifier_map Mod5 { <LVL3> }; modifier_map Mod4 { <LWIN> }; modifier_map Mod4 { <RWIN> }; modifier_map Mod5 { <MDSW> }; modifier_map Mod1 { <META> }; modifier_map Mod4 { <SUPR> }; modifier_map Mod4 { <HYPR> }; };

    xkb_geometry "pc(pc104)" {

    width= 470; height= 180;

    alias <AC00> = <CAPS>; alias <AA00> = <LCTL>;

    baseColor= "white"; labelColor= "black"; xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; description= "Generic 104";

    shape "NORM" { corner= 1, { [ 18, 18 ] }, { [ 2, 1 ], [ 16, 16 ] } }; shape "BKSP" { corner= 1, { [ 38, 18 ] }, { [ 2, 1 ], [ 36, 16 ] } }; shape "TABK" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "BKSL" { corner= 1, { [ 28, 18 ] }, { [ 2, 1 ], [ 26, 16 ] } }; shape "RTRN" { corner= 1, { [ 42, 18 ] }, { [ 2, 1 ], [ 40, 16 ] } }; shape "CAPS" { corner= 1, { [ 33, 18 ] }, { [ 2, 1 ], [ 31, 16 ] } }; shape "LFSH" { corner= 1, { [ 42, 18 ] }, { [ 2, 1 ], [ 40, 16 ] } }; shape "RTSH" { corner= 1, { [ 52, 18 ] }, { [ 2, 1 ], [ 50, 16 ] } }; shape "MODK" { corner= 1, { [ 27, 18 ] }, { [ 2, 1 ], [ 25, 16 ] } }; shape "SMOD" { corner= 1, { [ 23, 18 ] }, { [ 2, 1 ], [ 21, 16 ] } }; shape "SPCE" { corner= 1, { [ 113, 18 ] }, { [ 2, 1 ], [ 111, 16 ] } }; shape "KP0" { corner= 1, { [ 37, 18 ] }, { [ 2, 1 ], [ 35, 16 ] } }; shape "KPAD" { corner= 1, { [ 18, 37 ] }, { [ 2, 1 ], [ 16, 35 ] } }; shape "LEDS" { { [ 75, 20 ] } }; shape "LED" { { [ 5, 1 ] } }; section "Function" { key.color= "grey20"; priority= 7; top= 22; left= 19; width= 351; height= 19; row { top= 1; left= 1; keys { { <ESC>, "NORM", 1 }, { <FK01>, "NORM", 20, color="white" }, { <FK02>, "NORM", 1, color="white" }, { <FK03>, "NORM", 1, color="white" }, { <FK04>, "NORM", 1, color="white" }, { <FK05>, "NORM", 11, color="white" }, { <FK06>, "NORM", 1, color="white" }, { <FK07>, "NORM", 1, color="white" }, { <FK08>, "NORM", 1, color="white" }, { <FK09>, "NORM", 11, color="white" }, { <FK10>, "NORM", 1, color="white" }, { <FK11>, "NORM", 1, color="white" }, { <FK12>, "NORM", 1, color="white" }, { <PRSC>, "NORM", 8, color="white" }, { <SCLK>, "NORM", 1, color="white" }, { <PAUS>, "NORM", 1, color="white" } }; }; }; // End of "Function" section

    section "Alpha" { key.color= "white"; priority= 8; top= 61; left= 19; width= 287; height= 95; row { top= 1; left= 1; keys { { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 }, { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 }, { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 }, { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 }, { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 }, { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 }, { <AE12>, "NORM", 1 }, { <BKSP>, "BKSP", 1, color="grey20" } }; }; row { top= 20; left= 1; keys { { <TAB>, "TABK", 1, color="grey20" }, { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 }, { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 }, { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 }, { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 }, { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 }, { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 }, { <BKSL>, "BKSL", 1 } }; }; row { top= 39; left= 1; keys { { <CAPS>, "CAPS", 1, color="grey20" }, { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 }, { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 }, { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 }, { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 }, { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 }, { <AC11>, "NORM", 1 }, { <RTRN>, "RTRN", 1, color="grey20" } }; }; row { top= 58; left= 1; keys { { <LFSH>, "LFSH", 1, color="grey20" }, { <AB01>, "NORM", 1 }, { <AB02>, "NORM", 1 }, { <AB03>, "NORM", 1 }, { <AB04>, "NORM", 1 }, { <AB05>, "NORM", 1 }, { <AB06>, "NORM", 1 }, { <AB07>, "NORM", 1 }, { <AB08>, "NORM", 1 }, { <AB09>, "NORM", 1 }, { <AB10>, "NORM", 1 }, { <RTSH>, "RTSH", 1, color="grey20" } }; }; row { top= 77; left= 1; keys { { <LCTL>, "MODK", 1, color="grey20" }, { <LWIN>, "SMOD", 1, color="grey20" }, { <LALT>, "SMOD", 1, color="grey20" }, { <SPCE>, "SPCE", 1 }, { <RALT>, "SMOD", 1, color="grey20" }, { <RWIN>, "SMOD", 1, color="grey20" }, { <MENU>, "SMOD", 1, color="grey20" }, { <RCTL>, "SMOD", 1, color="grey20" } }; }; }; // End of "Alpha" section

    section "Editing" { key.color= "grey20"; priority= 9; top= 61; left= 312; width= 58; height= 95; row { top= 1; left= 1; keys { { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 }, { <PGUP>, "NORM", 1 } }; }; row { top= 20; left= 1; keys { { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 }, { <PGDN>, "NORM", 1 } }; }; row { top= 58; left= 20; keys { { <UP>, "NORM", 1 } }; }; row { top= 77; left= 1; keys { { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 }, { <RGHT>, "NORM", 1 } }; }; }; // End of "Editing" section

    section "Keypad" { key.color= "grey20"; priority= 10; top= 61; left= 376; width= 77; height= 95; row { top= 1; left= 1; keys { { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 }, { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 } }; }; row { top= 20; left= 1; keys { { <KP7>, "NORM", 1, color="white" }, { <KP8>, "NORM", 1, color="white" }, { <KP9>, "NORM", 1, color="white" }, { <KPAD>, "KPAD", 1 } }; }; row { top= 39; left= 1; keys { { <KP4>, "NORM", 1, color="white" }, { <KP5>, "NORM", 1, color="white" }, { <KP6>, "NORM", 1, color="white" } }; }; row { top= 58; left= 1; keys { { <KP1>, "NORM", 1, color="white" }, { <KP2>, "NORM", 1, color="white" }, { <KP3>, "NORM", 1, color="white" }, { <KPEN>, "KPAD", 1 } }; }; row { top= 77; left= 1; keys { { <KP0>, "KP0", 1, color="white" }, { <KPDL>, "NORM", 1, color="white" } }; }; }; // End of "Keypad" section

    solid "LedPanel" { top= 22; left= 377; priority= 0; color= "grey10"; shape= "LEDS"; }; indicator "Num Lock" { top= 37; left= 382; priority= 1; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Caps Lock" { top= 37; left= 407; priority= 2; onColor= "green"; offColor= "green30"; shape= "LED"; }; indicator "Scroll Lock" { top= 37; left= 433; priority= 3; onColor= "green"; offColor= "green30"; shape= "LED"; }; text "NumLockLabel" { top= 25; left= 378; priority= 4; width= 19.8; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Num\nLock"; }; text "CapsLockLabel" { top= 25; left= 403; priority= 5; width= 26.4; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Caps\nLock"; }; text "ScrollLockLabel" { top= 25; left= 428; priority= 6; width= 39.6; height= 10; XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; text= "Scroll\nLock"; }; };

    };

    2017/01/17 Linux.conf.au 2017, Hobart
    π 2017-01-17 01:01 in Linux
    As another full circle LCA, this one came back to Hobart, Tasmania (our last time was in 2009|/perso/linux/post_2009-01-21_Linux_conf_au-2009-in-Tasmania.html].



    As every year, a nice collection of talks












    and of course great parties too:






    And afer a week, it was over, 'till next year:



    See more images for Linux.conf.au 2017, Hobart

    More pages: January 2019 December 2018 March 2018 January 2018 September 2017 January 2017 October 2016 August 2016 July 2016 June 2016 February 2016 January 2016 May 2015 March 2015 January 2015 October 2014 May 2014 April 2014 March 2014 January 2014 November 2013 September 2013 May 2013 March 2013 January 2013 December 2012 August 2012 May 2012 March 2012 January 2012 December 2011 August 2011 July 2011 January 2011 October 2010 August 2010 June 2010 April 2010 March 2010 January 2010 December 2009 November 2009 September 2009 August 2009 July 2009 May 2009 January 2009 December 2008 November 2008 October 2008 January 2008 November 2007 August 2007 July 2006 January 2006 August 2005 April 2005 November 2004 March 2004 February 2004