Klipper - snippets

Duncan 1i5t5.duncan at cox.net
Thu Dec 29 05:42:11 GMT 2016


Stephen Dowdy posted on Wed, 28 Dec 2016 14:54:54 -0700 as excerpted:

> Michael,
> 
> I don't know the current state of KDE applications, but at least on
> Debian Stable, there's a plasma applet called 'paste' that lets you
> paste snippets.

Does Debian stable use frameworks5/plasma5 for plasma yet, or is 
everything still kde4/plasma4 (aka plasma1).  If it's 5, the plasmoid 
should be available and generally usable for all of plasma5.  If it's 4, 
there's very little still shipping that, except for the occasional still 
supported long-term-stale^H^Hble.

> as long as you have exec() you can do anything.

True, that. =:^)  I use the "exec/script it" idea with all sorts of 
stuff, including yasp-scripted (yet another sysmon plasmoid) early in 
kde4, eventually migrated to superkaramba later, and I guess soon to be 
migrated to something else again, as superkaramba is now EOL, no more 
updates or porting to frameworks/plasma5, altho the kde4 version 
continues to be functional for now, and will likely remain that way until 
the distros finally drop kdelibs4/qt4.

> You could leverage the klipper Actions to do something similar, though
> it would be a bit more "hackish".
> 
> 
> Setup a regular expression like @K -- If you type, then double click
> that, and have automatic enabled (or, alternatively, if you use
> <CTRL><ALTR><R> to invoke manual klipper actions popupmenu), you would
> have a popup menu with all your commands that could be things like:
> 
> 
>    Command=echo FLIMFLAM
> 
>    Output Handling=Replace Clipboard
> 
> (organize as many commands that echo what you want under a single
> klipper action)
> 
> 
> then you'd just have to paste.  I don't see a way in klipper to
> auto-paste

I hadn't thought of that, but it's right up my alley in terms of things 
I'd be likely to try if I were desperate enough.  See below. Meanwhile, 
I'm going to have to keep the idea in mind now, just in case.  Thanks!  
=:^)

> Also, you can use 'khotkeys' to create a global shortcut that performs
> keyboard input.  (but you'd likely run out of keyboard combos, or forget
> them.)  also, i think khotkeys was destined for deprecation?

Well, sort of, khotkeys itself has been phased out, yes, but not the 
general hotkey functionality, which is controlled by kglobalaccel in 
plasma5.  Tho AFAIK the mouse gestures functionality is gone, as is the 
applications-menu hotkey association mechanism, and the input-typing-
emulation as suggested here, as well.  But plasma5 still has configurable 
exec-based hotkey-triggered launching via kglobalaccel, and as you said, 
exec ultimately gets you pretty much everything.  While it doesn't have 
the nice GUI setup that khotkeys did with its apps-menu and kmenuedit 
hotkeys association (kmenuedit is still there, just without the hotkeys 
feature), and the mouse-gestures and emulated typing stuff is gone, as 
long as you know how to run the app at the command-line, you can still 
configure kglobalaccel to associate a command with a global hotkey launch-
trigger.

FWIW, I was a bit concerned about that myself, tho not as much as I would 
have been, due to ... (below).  But once I saw what they actually did, it 
wasn't as bad as I thought it would be, and in fact I had tried the menu 
associated hotkey launchers and mouse gestures and ended up not really 
using them, gestures because I could never remember them, hotkey 
triggered menu item launchers because... well, again, below.


> probably many other solutions.  (i recall a very simple Xt X11
> application from many years ago that did similar things)

Check out sxhkd (simple X hotkey daemon), xdotool, xdo (IIRC a simpler 
variant of xdotool), evrouter, xbindkeys, and perhaps wmctrl and xprop, 
which compliment the others on the X window management side, thus 
rounding out a full set of X scripting tools.  Also, the xf86-input-
mtouch touchpad/touchscreen pointing device driver, to drive mouse 
"button" events based on gestures such as pinch, 2/3/4-finger-swipe in 
each of the four directions, etc.  Most of these I actually use here, 
either starting them with kde/plasma, or calling them in my own scripts 
when various hotkey or mouse "button" events (as configured in the mtouch 
driver) trigger.

My initial kde3 khotkeys setup was based on the fact that in kde3, 
khotkeys could be configured with hotkey "chains", and I had done just 
that, the reason being that I wanted more shortcuts than I had extra keys 
to launch them with, and than I could easily remember without some help, 
anyway.  So I configured a couple of those "extra" keys as chained 
launcher keys, such that I could hit launcher-g-p, for instance, to 
launch first the games submenu (g), then kpat (p).  Similarly, launch-w-b 
would be launch-web-submenu (w), bank (b), and launch-f-e would be file 
submenu, kwrite (editor).

Unfortunately, kde4 broke that, as chained hotkeys were no longer 
possible in kde4's khotkeys.  So I had to come up with a workaround.

Well I looked at various more generic solutions and the only one I could 
find that directly supported chained hotkeys was xbindkeys in its 
advanced mode.  The only problem was that its advanced mode was scripted 
using guile/scheme, which I didn't already know, and learning it just for 
that was a rather steeper learning curve than I was after, as this was 
only one of several problems I had to find a solution to, to get kde4 
working with the functionality I had in kde3, and I was on a deadline as 
my distro was phasing out kde3 because upstream kde was, even tho kde4 
was still so very very broken for my usage and that of so many others, 
and despite the Aaron S's (president of KDE eV at the time) very public 
_promise_ that kde3 would be supported as long as there were users -- so 
much for /that/!

The key insight to my ultimate solution came as I was beginning to study 
guile/scheme.  The eureka moment was realizing that if I could find or 
script a popup menu app, that instead of using key chaining, all I had to 
do was have kde's khotkeys recognize the first hotkey and use it to 
launch this popup menu, which could then reinvoke itself as necessary, 
nesting as many submenus deep as I wanted to chain, with each invocation 
only dealing with a single level of the chain.

So that's what I ultimately hacked together, using what I *DID* know, 
bash scripting, with a special konsole profile invoked running my bash-
based hotkey script to display a list of (possibly shift and/or control 
modified, since those are the modifiers passed thru konsole on to 
whatever it's running) single hotkeys, along with their associated 
commands.

So then I could use the kde-based hotkey to launch the initial popup, 
with its config, files, games, media, power, web, etc. single-key (c/f/g/
m/p/w) initial popup menu, using bash's read command configured to read a 
single character, which would then launch the appropriate submenu, which 
in turn would launch the desired app (normally, in a few cases I went 
another submenu deep, like a hotkeys submenu under config, with choices 
of hotkey menu file to edit).

Great.  That worked well and effectively gave me my chained hotkey 
functionality back, altho scripting it all in bash was obviously rather 
slower than it would have been had I known C/C++ or whatever and could 
have designed and built a real elf-based executable, instead of the bash 
script that I used because that's what I already knew.

Time went on, and I upgraded keyboards and bought a fancy new touchpad.  
But the problem with the keyboard was that some of its "extra" keys 
weren't recognized by X.  Which is where evrouter comes in.  While it has 
some hotkey functionality, its real purpose and strength is in mapping 
events that X doesn't recognize onto something that it does recognize, 
usually emission of a keysym that the various other hotkeys apps can 
recognize and trigger on, or a shell command, tho it has a few other 
command modes as well.

Similarly for the touchpad but xf86-input-mtouch is the solution there.  
It recognizes gestures such as two-finger-pinch-in/out or three-finger-
swipe-left/right/up/down, and translates those into mouse-button-events, 
generally using the button numbers above 7, since 1-3 are conventional 
left/right/middle, 4/5 are vertical-scroll, and 6/7 are horizontal-scroll.

That gives you simulated high-button X-based mouse events, but as there's 
no standard mapping for them as there is for buttons 1-7, you still need 
something else to see those button events and translate them into actual 
practical work.

Which is where sxhkd comes in, since it can see those high-numbered X 
mouse button events and do something with them, emitting a string of 
characters, for instance, or running a command.

As it happens, sxhkd is easy enough to configure, that given I already 
had it running to handle those high-button events, particularly once I 
started the kde5/frameworks5/plasma5 upgrade and I had to reconfigure 
kde's hotkeys again, I ended up moving pretty much all my generic hotkey 
config to sxhkd.  So it's what's watching for my "launch" key now, to 
launch the still bash-script-in-konsole based hotkey menu stuff.

Which leaves kde's hotkey config pretty much only handling kde-specific 
hotkeys, mostly kwin related (switching desktop, moving windows to a 
different desktop, activating the grid or cube or alt-tab switchers, 
maximizing/normalizing, moving and resizing windows, etc), tho there's a 
few for the plasma-desktop itself (switching activities, activating kmenu, 
etc), ksession-manager (logging out), etc.

So as I mentioned above, while kglobalaccel still lets you map arbitrary 
commands to hotkeys, it's functionality I don't use that much any more, 
primarily because kde keeps changing stuff as it did with the kde4 and 
now frameworks5/plasma5 upgrades, and if it continues to work AT ALL 
(which the kde4 hotkey chaining did NOT), I keep having to reconfigure it 
every few years.  But with the plasma5 upgrade, I had relatively little 
of that to worry about, because I already had most of the generic stuff 
in the bash-and-konsole-based popup menu config.  And I took that 
opportunity to move even MORE of it to desktop-generic, sxhkd mostly, to 
avoid that problem in the future.

Tho of course the switch/upgrade from X to wayland is going to be 
trouble, and I guess there the only app that really has global reach is 
the window manager, kwin, so there's quite some chance I'll either be 
back to configuring generic global hotkeys via plasma/kwin again, or 
perhaps there will be some third-party solution developed that will be 
configurable as the compositor, but will pass the actual compositing 
duties on to kwin, while only handling the global hotkeys (passing on to 
kwin what it isn't configured to handle itself, of course).  In any case, 
that's a bridge to be crossed when I come to it, and wayland's changing 
enough other stuff that this will probably be only one of several 
concerns I have to worry about then, but meanwhile, there's going to be 
enough legacy X-based stuff around, for long enough, that there's 
unlikely to be the immediate pressure to switch that was so horrible when 
they dumped kde3 support after promising not to, as they did.

Meanwhile...  tying up a dangling loose end, much of the above is global 
scope, while for some of those high-button events and for a few special 
key events, I wanted/needed application or window scope.  For instance, I 
have the touchpad pinch-in/out event (as mapped to a particular high-
button pair) set to globally trigger kwin's zoom, so I can zoom in/out 
globally, regardless of the app that's in focus.  That only requires the 
mtouch input driver mapping the pinch to the high-button event, and sxhkd 
then mapping that high-button event to kwin's zoom functionality.  But 
the corresponding two-finger rotate, I wanted to rotate images in 
gwenview, for instance, while doing nothing in most other apps, and 
something else that's per-app individual in a couple other apps, instead 
of the closest equivalent global functionality, which would be xrandr's 
monitor rotation, something I don't find particularly practical (unlike a 
global zoom function).

So then I needed some way to figure out what the in-focus window was, and 
whether it matched gwenview's main window, or whatever other specific 
window.  That's where xprop comes in.  Via scripting I can use wmctrl to 
get the X window ID of the active window, and feed that to xprop to get 
the window class, window title, etc.  Basically the same stuff that kwin's 
window rules uses, but here exposed in a script so I can logically match 
window class and window title, etc, against preset strings, to see if the 
active window is actually gwenview, or whatever.

So I have a helper script called winpropis, that matches a property given 
on the commandline, against a string, also given on the commandline.  
Then I have a script called winactiveis, that has some hard-coded preset 
strings that match various properties of a given window, that calls 
winpropis, to see if the given property of the active window matches the 
desired preset, returning true if all the configured properties match 
appropriately, false otherwise.

Then, in sxhkd, I can do for example:

winactiveis gwenview && <command for gwenview> \
winactiveis someotherapp && <command for it> \
winactiveis somethirdapp && <command for it> \
...

Finally, xdotool is often what I call in the actual command. 

So putting it all together, here's my sxhkd configuration for buttons 18 
and 19, rotate, along with the (# denoted) comments as in the file:

################################################################################
# 18,19: rotate: app-context
button18
    [[ winactiveis gwenview || winactiveis okular ]] && xdotool key Left
button19
    [[ winactiveis gwenview || winactiveis okular ]] && xdotool key Right
################################################################################

When either of those two specific app windows are active, and ONLY when 
one of them is active (as determined by the xprop comparison via winactive 
is), I invoke xdotool, telling it to type a single key, left, for the 
button corresponding to touchpad rotate left, right for the button 
corresponding to touchpad rotate right.  Those two apps, in turn, have 
their keymapping set so they rotate the image using those keys.

Here's a more complex example (a few lines are wrapped for posting):

################################################################################
# 8,9: swipe3up/down: app-specific
# gwenview: start-page/up
# firefox: zoom out/in
# orion: (cancel)/"gl n" (*100)
button8
        winactiveis gwenview && xdotool key super+Return ; \
        winactiveis firefox && xdotool key ctrl+minus ; \
        winactiveis orion && { \
                killall xdotool; \
                dbusref=`kdialog --title Orion --progressbar "  Orion:    
Autoinput killed              " 2`; \
                qdbus $dbusref autoClose true; \
                for sec in 1 2; do \
                        sleep 1; \
                        qdbus $dbusref Set "" value $((sec++)); \
                done; \
        }
button9
        winactiveis gwenview && xdotool key Escape ; \
        winactiveis firefox && xdotool key ctrl+plus ; \
        winactiveis orion && xdotool getactivewindow type --window %1 --
delay 1400 \
                "gl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl 
ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl ngl 
ngl ngl ngl ngl ngl ngl ngl ngl ngl"
################################################################################



So... umm... back on the original topic...


As you can see my usage is primarily for hotkeys, not to invoke 
"snippets", and is rather advanced compared to that required just for 
snippets, which would require little more than some hotkey app, perhaps 
kglobalaccel, or perhaps the more generic sxhkd, or one of the others, 
along with something like xdotool, if the selected hotkey app didn't 
allow direct or easy snippet triggering.  But kglobalaccel and xdotool 
together could do it, or sxhkd and xdotool, or evrouter by itself could 
do it, tho it's primarily designed for hardware event translation and the 
configuration for this purpose would be somewhat obtuse/abstruse, such 
that either of the above pairings would be more natural.  And xbindkeys 
really has quite a bit of functionality (tho it's been long enough since 
I looked at it in detail that I really forgot the detail, just 
remembering that it really does have rather advanced functionality), but 
to access the more advanced stuff you'll need to know guile/scheme.

-- 
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 mailing list