[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