[kde-linux] can't get XF86XKEject xmodmap'd and working in/with KDE

Duncan 1i5t5.duncan at cox.net
Fri Mar 22 10:37:10 UTC 2013


Dmt Ops posted on Thu, 21 Mar 2013 21:45:02 -0700 as excerpted:

> I'm key mapping a custom keyboard in KED

I wasn't familiar with KED, so googled it.  Google suggests "KDE", so 
given the list, I'll assume you meant that.

(I DID learn what a "KED" was in EMT/emergency-medical-tech terms, tho.  
Assuming you don't know either, try entering "ked" on wikipedia and/or 
youtube (the wikipedia diagram wasn't particularly helpful, but the 
youtube videos make it clear!  FWIW I used minitube here, as I don't run 
the proprietary flash plugin and thus youtube doesn't play in my browser, 
but minitube handles it =:^) and learn as I just did.  "Kendrick 
Extraction Device", to help extract victims from car accidents, etc, 
where there may be neck or spine injury, while minimizing the chance of 
additional injury including possible paralysis due to that spine injury.  
I hadn't the foggiest before you prompted my search, so thanks! =:^)

> on:
> 
>     lsb_release -rd
>         Description:    openSUSE 12.3 (x86_64)
>         Release:        12.3
> 
>     kde4-config -version
>         Qt: 4.8.4 KDE Development Platform: 4.10.1 "release 545"
>         kde4-config: 1.0

Thanks for including that information.  Way too many people don't include 
their kde version, and for people on other distributions that don't have 
a clue what kde shipped with that particular distro release...

Meanwhile, a request, before we get into the issue at hand...

Please post in plain text, not HTML, on the list.  Some people prefer to 
use clients that don't parse the HTML for security or other reasons, and 
the raw HTML isn't very pretty to look at.  I know I'm not the only one 
that believes if it takes HTML to make it worth reading, it's NOT worth 
reading.  (FWIW, your post included both HTML and plain text.)  
Fortunately, most folks are happy to switch to plain-text-only when 
asked.  After all, it doesn't pay to irritate the people that could have 
your answer. =:^)

Now to the issue at hand...

> I want to map a multi-key chord ("fn"+"F12") in KDE to "eject" my DVD
> drive.
> 
> The keys are active
> 
> @ xev
> 
>     press "F12"
>         KeyRelease event, serial 40, synthetic NO, window 0x3a00001,
>             root 0x264, subw 0x0, time 2099398, (426,527),
>             root:(430,591), state 0x10, keycode 96
>             (keysym 0xffc9, F12), same_screen YES,
>             XLookupString gives 0 bytes:
>             XFilterEvent returns: False
> 
> 
>     press "fn"
>         KeyPress event, serial 40, synthetic NO, window 0x3a00001,
>             root 0x264, subw 0x0, time 2103556, (426,527),
>             root:(430,591), state 0x10, keycode 135
>             (keysym 0xffe8, Meta_R), same_screen YES,
>             XLookupString gives 0 bytes:
>             XmbLookupString gives 0 bytes:
>             XFilterEvent returns: False

Cool!  I routinely use xev for key diagnostics too. =:^)

FWIW I had no idea what "fn" was, especially in a context where it was 
clearly not the function keys F1-F12, but Meta_R... THAT I understand 
(well, to some degree).

> The keysym for eject is defined
> 
>     grep -i eject /usr/include/X11/XF86keysym.h
>        #define XF86XK_Eject  0x1008FF2C /* Eject device (e.g. DVD) */
> 
> 1st mod'ing a single-key solution,
> 
>     edit ~/.Xmodmap 
>     -    keycode  96 = F12 F12 F12 F12 F12 F12 XF86Switch_VT_12
>     +    keycode  96 = XF86XK_Eject F12 F12 F12 F12 F12 XF86Switch_VT_12
> 
> then
> 
>     xmodmap ~/.Xmodmap
> 
> returns
> 
>     xmodmap ~/.Xmodmap
>         xmodmap:  /home/user/.Xmodmap:89:
>         bad keysym name 'XF86XK_Eject' in keysym list
>         xmodmap:  1 error encountered, aborting.
> 
> otoh, mod'ing again
> 
>     edit ~/.Xmodmap
>     -    keycode  96 = XF86XK_Eject F12 F12 F12 F12 F12 XF86Switch_VT_12
>     +    keycode  96 = XF86Eject F12 F12 F12 F12 F12 XF86Switch_VT_12
> 
> now
> 
>     xmodmap ~/.Xmodmap
> 
> succeeds
> 
> @ xev
> 
>     KeyPress event, serial 40, synthetic NO, window 0x3600001,
>         root 0x264, subw 0x0, time 2922751, (596,464),
>         root:(600,528), state 0x10, keycode 96
>         (keysym 0x1008ff2c, XF86Eject), same_screen YES,
>         XLookupString gives 0 bytes:
>         XmbLookupString gives 0 bytes:
>         XFilterEvent returns: False
> 
> (1) Should not .Xmodmap not use the "XF86XK_Eject" keysym defined in
> 
>     /usr/include/X11/XF86keysym.h
> 
> instead of requiring
> 
>     "XF86Eject"
> 
> or does the keycode definition NOT use the keysym ?

I've never used xmodmap so I can't answer that question definitively.  
However, my keyboard (a logitech cordless desktop pro) does have a number 
of "extra" keys, which xev normally reports as XF86Home, XF86AudioPlay, 
etc.  And those keynames (without any XK_) are what khotkeys uses as 
well. So an educated guess is that the XK_ is a stripped prefix, leaving 
only XF86Eject.

But...

> (2) In any case, what next steps do I need to take to 1st get a single-,
> then two-, key-press to actually eject the drive drawer?  So far, I've
> not managed with any keystroke to actually get the drive to
> eject.

I believe you're conflating two separate things here, the NAME of the key 
(XF86Eject, as you've mapped it, apparently a meta-modified F12, 
otherwise), with the FUNCTION the key triggers (media ejection).  You 
simply changed the name of the key, but that's just the name, it has to 
map to a function, and something has to do that mapping.  KDE does have 
default mappings for some more common keys including XF86Audio* 
(RaiseVolume, LowerVolume, Mute, etc), but XF86Eject is apparently not 
common enough to get a default mapping.  (Or maybe enough people have two 
or more removable media devices, a few years ago it would have been a CD 
burner and a DVD player, these days it'd be a DVD burner and a Bluray 
player), that the kde folks were afraid they'd choose the wrong one to 
eject, so they left that undefined.)

Here's where khotkeys steps in.  Or rather, there's three related kde 
hotkeys (and configurations) that affect hotkeys/shortcuts in kde4, 
khotkeys (aka custom shortcuts) being the one of interest here, with at 
least three different configuration methods available to configure what 
you want.


The first thing you need to do is find a command (very likely CLI, 
command-line interface, not GUI) that does what you need.  Once you have 
an appropriate command, you can setup a kde hotkey that triggers it, just 
as you can setup a hotkey to trigger any other command.

Assuming you don't have a different preference, see if you have an 
"eject" command.  Very likely you will, as it's part of the util-linux 
package which includes such basics as mount, dmesg, fsck, etc, so it's 
pretty standard for Linux installations.

Now run "eject" from the commandline and see if it does what you'd 
expect.  (Note that additionally, depending on the device, it can often 
be used to close an open tray, as well as eject/open a closed tray.)  If 
it does, you have a good command.  If that doesn't work, you may need to 
add the device name or other options as appropriate.  You will likely 
find the eject (1) manpage useful in this case.


Once you have a command that works from the command line, you need to map 
a kde hotkey to it.  As mentioned above, there's at least three ways to 
do this.  Two of them are found in "the application formerly known as 
kcontrol"[1], under common appearance and behavior, shortcuts and 
gestures, custom shortcuts.  Or run kcmshell4 khotkeys to get the same 
module by itself.[2]

Note that khotkeys allows configuration of mouse-gesture triggers as well 
as keyboard shortcuts, and that you can choose to have them be available 
from only a single app, or globally, which I guess you'd want.  I'll omit 
the specific steps here as I expect that if you can figure out xmodmap, 
you can figure this out from here, but if you get stuck, holler for the 
step-by-step.

You should be able to assign either the default Meta-F12, or the xmodmap-
modified XF86Eject, depending on how that key is actually defined when 
you set it up in khotkeys.  Take your pick.

One additional note about khotkeys:  In kde3 it was possible to setup 
multikey triggers (say XF86Eject, 1, to eject your cdburner, XF86Eject, 
2, to eject your bluray player), thus effectively allowing you to have 
the first key act as a menu-launcher for all the actions defined as a 
combo of it and a second key (in the example above, hitting XF86Eject 
would popup a submenu with two entries, 1 and 2).[3]  In kde4, that's not 
possible, except that standard X modified keys count separately from 
their unmodified variant, so Shift-XF86Eject, Alt-XF86Eject, Alt-Shift-
XF86Eject, and plain unmodified XF86Eject, all are separately defined 
hotkeys.  (At least that's the way it normally works when there's a 
separate XF86Eject key, or in my case XF86Home, etc.  With your 
definition of Meta-F12 as XF86Eject, I'm not sure if it'll still be 
XF86Eject with the other modifiers applied or not.  But it should be 
either that or the modifiers F12.  Either way it'd be the same key, just 
different names for it.)  But say XF86Eject, 1, won't map.  It'll take 
the XF86Eject, without a way to add the second sequential key, the 1, to 
it.

There has been a bug filed against that multi-key regression from kde3 
since early kde4, and at least at one point around kde 4.3, it on the 
most-popular-bugs list, but based on a comment from one of the devs, qt4 
simply didn't have the required functionality available to map, as 
apparently qt3 did, and nobody raw-coded it in kde apart from qt, so...  
In a different context, however, I read that the required functionality 
went into qt5 well before even the qt5 betas, or at least that's the way 
I interpreted what I read, so with kde frameworks aka kde5, hopefully 
that functionality will reappear.

But your choice of Meta-F12 (or equivalently if you keep the xmodmap 
setting, XF86Eject) should work, since that's seen as a single X-modified 
key, not two separate keys.

The other two ways of configuring a solution involve another step.  Use 
kmenuedit to create a menu entry  (or create the *.desktop file manually 
yourself, if you're familiar enough with the format to do so) for the 
command, setting an icon, etc, just as you would for any other custom 
menu entry you might create.

With that done and the entry in kde's menu, you can set a hotkey for the 
menu entry, again, just as you would for any other menu entry.  This can 
be done in kmenuedit as well, or you can use khotkeys (aka Custom 
shortcuts, the kcontrol applet mentioned above) to setup or manage the 
entry.  Personally, I've found that kmenuedit works well for the initial 
setup, but that after you've setup a few, managing them can be easier in 
khotkeys, since you're managing ONLY the hotkeys there, whereas in 
kmenuedit, you're managing the whole applications menu.

But as I said above, if all you're doing is setting up a shortcut for a 
command you'd otherwise enter at the command prompt, doing it directly 
via khotkeys is the easiest method.

---
[1] "The application formerly known as kcontrol":  That description takes 
a hint from the description from "the artist formerly known as Prince". 
kcontrol was the kde3 name.  It's called system settings in kde4, altho 
by and large they're user-specific kde-specific settings having little or 
nothing to do with the global system settings that the "system setting" 
name suggests, or even with, say, CLI apps, run by the same user!  The 
time can be set for the system there, and there's a few other similarly 
global settings, but for the most part it's kde specific settings for 
that specific user, and kcontrol thus remains by far the most accurate 
name.  Meanwhile, despite the inaccurate user-facing name, the modules 
themselves are still "kcm's", kcontrol-modules, and in ordered to run 
just one of them, you still run kcmshell4.  And last I checked (kde 4.5 
or so), kde's bugzilla still used the kcontrol name for that module, as 
well.

[2] The kcmshell4 subcommands for the other two applets under shortcuts 
and gestures are keys, which brings up the global shortcut dialog, where 
global hotkeys for kwin, plasma, kmix, etc, are configured, and 
standard_actions, which configures the default kde-standard hotkeys used 
across multiple kde apps, like cut/copy/paste, undo/redo, print, prefs 
dialog, etc.  But it's khotkeys that we're interested in here.

[3] Thus, I had a whole stack of hotkeys assigned to a combination of 
XF86Home and a letter key, or a number key, or... with the XF86Home key 
thus acting as a launcher menu key.  In my head, then, instead of 
XF86Home, I'd say, Launch, and they sequence would be for example, 
Launch, B, to launch the web Browser, Launch, P, to launch kpatience, 
Launch, F, to launch the file manager (konqueror in file-management mode 
back then, now it'd be dolphin by default), Launch, T, for a terminal 
window (konsole), etc.

As a result of this regression I had a /terrible/ time migrating to kde4, 
since all my stacked hotkeys, and the "muscle memory" behind them, no 
longer worked!  So I started looking for a generic alternative.  I did 
eventually find one that would have worked, xbindkeys, but only in 
advanced mode, which used a form of scheme script to allow all sorts of 
interesting things. (In addition to multi-keys hit sequentially, which is 
what I was after, you could setup a short keypress to do one thing, while 
a long one did another, or setup arbitrary modifiers that all had to be 
hit at the same time, like X-based modifiers except you could make any 
key the modifier, etc.)  But I didn't know scheme, and despite kde's very 
public promise of support for kde3 as long as it had users, kde had 
DROPPED support for kde3 and gentoo was going to be dropping support a 
few months later as a result, so I needed a workable kde4 solution for 
this and a whole list of other things reasonably quickly, and I really 
had no time to learn a new scripting language to do it!

Fortunately, while playing around with xbindkeys I had an epiphany.  
Instead of a single app having to handle the whole sequence of hotkeys I 
wanted to use at once, I could handle them one at a time, having the 
first hotkey launch an app that grabbed the second, which could if 
necessary be an app that grabbed the third, etc.

And I DID know bash!  So I set myself the task of hacking up a bash 
script to handle things instead of having to learn scheme.  What I ended 
up with was a recursively called script.  I have khotkeys setup with a 
single hotkey (the familiar XF86Home), which opens a konsole window with 
a script that takes exactly one key.  Because I'm handling it with a bash 
script in a konsole window, I don't have quite the flexibility that 
khotkeys3 gave me, only the unmodified key, the shifted key, and the 
control-key version.  And some of the control-keys are off limits (^M and 
^J, for instance, carriage-return and line-feed.  So instead of the two-
key-sequence approach I used in kde3, I use a three-key-sequence, with 
XF86Home popping up the script with a categories menu loaded (games, net, 
config, terms, media, etc, hotkeys g, n, c, t, m, respectively), with 
each category hotkey in turn recursively loading the same script, with 
that category's menu.  So for instance the media category menu looks like 
this (mt is a scripted shortcut to mount, with my dedicated media and 
news/nntp partitions, configured to be mountable by my ordinary user, 
available for mount or umount, mpc is the music player client, a CLI 
controller for mpd, the music player daemon, I mentioned minitube, the 
youtube player, above, it's worth noting that on a US keyboard <> are the 
shifted ,. keys, so those four are shifted and unshifted versions of the 
same two keys, right next to each other):

#key    description     command
####    ###########     ###############################

<       player-prev     mpc prev
,       player-play     mpc play
>       player-next     mpc next
.       player-stop     mpc stop

m       m.media         mt m m
M       u.media         mt m u

n       m.news          mt n m
N       u.news          mt n u

u       minitube        minitube

Enter key from first column.
Auto-cancel in 30 sec.: 


Thus, using XF86Home as my launch key, configured thru khotkeys to launch 
the script with the initial categories menu:

Launch m .   ... (m=media) stops the media player.

Launch m u   ... launches minitube.

Meanwhile...

Launch n b   ... (net, bank) launches my browser with my bank login.

Launch g p   ... (games, kpat) launches kpat... patience/solitaire

Launch g P   ... (games, palapeli) launches palapeli, kde's jigsaw puzzler

Launch t t   ... (terminals, normal-terminal) a normal konsole window

Launch t z   ... (terminals, z) konsole, sudoing to my admin user (z)

It works reasonably well, tho there's a bit more latency than I'd like 
since it IS a bash script, so I have to be careful not to hit the 
sequence keys too fast, or it sits on the second menu waiting for a key 
as I hit the second key before the menu launched.

-- 
Duncan - List replies preferred.   No HTML msgs.
"Every nonfree program has a lord, a master --
and if you use the program, he is your master."  Richard Stallman




More information about the kde-linux mailing list