20

This xte command, when I run it in a terminal, triggers Expo mode:

xte 'keydown Super_L' 'key S' 'keyup Super_L'

However, when I put this in my .xbindkeysrc file:

"xte 'keydown Super_L' 'key S' 'keyup Super_L'"
  b:11

Nothing happens when I click the button. The following binding makes the letter X appear in my console when I press button 11:

"xte 'key X'"
  b:11

So why doesn't the Expo binding work?


This is the verbose output of xbindkeys -n -v when clicking button 11:

Button press !
e.xbutton.button=11
e.xbutton.state=16
"xte 'keydown Super_L' 'key W' 'keyup Super_L'"
    m:0x0 + b:11   (mouse)
got screen 0 for window 2bb
Start program with fork+exec call
Button release !
e.xbutton.button=11
e.xbutton.state=16

And nothing happens. Does this have anything to do with the way xbindkeys executes the command? (fork+exec call)


Attempt number two.

expo.sh:

#!/usr/bin/env bash
export DISPLAY=:0
xte 'keydown Super_L' 'key S' 'keyup Super_L'

Executing this script from the command line activates Expo. Binding it in xbindkeys:

"sh ~/expo.sh"
  b:11

Clicking mouse button 11:

Button press !
e.xbutton.button=11
e.xbutton.state=16
"sh ~/expo.sh"
    m:0x0 + b:11   (mouse)
got screen 0 for window 2bb
Start program with fork+exec call

Nothing happens!

Hubro
  • 1,293

6 Answers6

20

Another simpler solution: instead of using just "b:11" in the xbindkeys definition, use "b:11 + release". It will wait until you release the button to fire the command.

Example:

"sh ~/expo.sh"
  b:11 + release
user215129
  • 216
  • 2
  • 2
8

This is very weird. It turns out that if my mouse button is still pressed (not yet released) when the Super+W keystroke is simulated, nothing happens. I don't know who to blame for that (perhaps Cinnamon?). I have worked around it though, by adding a short delay to the xte command:

xte 'usleep 100000' 'keydown Super_L' 'key S' 'keyup Super_L'

It now waits 0.1 seconds before simulating Super+S. If I press and hold the mouse button more than 0.1 seconds, nothing happens.

This is a workaround answer. I'd much prefer a proper answer.

Hubro
  • 1,293
2

I faced the same problem.

"xte 'key b'"

was working in the console but not in the xbindkeys parameter file. I changed b by his keysym code, using the "xev" command to obtain it :

"xte 'key Ox62'"

It worked for me

1

Try with +Release

"xte 'keydown Super_L' 'key S' 'keyup Super_L'"
b:11 + Release

That may help.

1

Have similar issue while using sxhkcd keymapper. It turns out your actual shortcut keys are detected as still being pressed.

There are some semi-workarounds:

  • look for the release event
  • add sleep 0.2 in front of your command
  • use shortcut with leader-key
  • release your shortcut modifiers in front of your xte sequence

However you cant get realtime actions with that =)

muru
  • 207,228
possum999
  • 31
  • 3
0

I have seen this problem of the bound key still being pressed (like shift, control, etc) years ago. I made extensive notes about it in my X windows event handling hints and tips file...

https://antofthy.gitlab.io/info/X/event_handling.txt

One solution as give, is give the user time to release the keys

But a another is to send your own keyup events to release the key for the user!

A third solution is to use xdotool and its --clearmodifiers option... For example typing a email address...

xdotool type  --clearmodifiers -delay 0 'email.address@machine.com'

There is one BIG cavat to watch out for... Recursive Macros May sure your macros does not send the sequence for the same macro! If you do you will have the macro repeating over and over!

anthony
  • 334