<div dir="ltr"><div>Hi there,</div><div><br></div><div>My high level goal is to be able to map an arbitrary keyboard combination to another one. I know that there is already a lot of web resources regarding this, but I ended up writing C++ using xlib, since everything else didn't work out for me.</div><div><br></div><div>Three typical use cases would be:</div><div><br></div><div>- Capslock + j should behave as if I pressed Left (move cursor for text navigation)</div><div>- Capslock + h should behave as if I pressed CTRL + Left (jumps over words)</div><div>- Capslock + Alt + h should behave as if I pressed CTRL + Shift + Left (selects words)  </div><div><br></div><div>An important requirement is, that holding down a shortcut should behave as if I *kept* pressing the combination it was mapped to.</div><div><br></div><div>I already tried using xmodmap as well xbindkeys with xdotool, but there was always something which didn't work out.</div><div><br></div><div>That's why my current approach is to directly use Xlib with XGrabKey, XNextEvent and XSendEvent. This works surprisingly well, but has two problems (the first being the major one):</div><div><br></div><div>- When I keep pressing the shortcut, the text cursor (caret) will move as expected, BUT it will be invisible as long as I'm pressing the shortcut, which is very annoying. After I release the shortcut, the caret will become visible again. I couldn't find any documentation nor workaround for this behaviour. Does anybody know anything about this?</div><div><br></div><div>- It does not work in all programs. I've read that some programs choose to ignore XEvents, if there were simulated. My current plan is to patch my local xlib so that the "send_event" flag is always False. See [1]. If you have a better idea, I'd be glad to hear it.</div><div><br></div><div>As a workaround for these problems, I already tried using XTestFakeKeyEvent, but this has its own problem. Since it doesn't allow to specify modifiers, each modifier has to be send as a keypress event. However, this only works if I send events for releasing the actually pressed keys on the keyboard beforehand. And due to this reason, I cannot stop the mapped shortcut by releasing the keys on my keyboard, since there were already released virtually.</div><div><br></div><div>My main problem is the one of the "invisible caret" since I don't have any idea how to fix this. Any pointers would be highly appreciated!</div><div><br></div><div>Thank you</div><div>Philipp</div><div><br></div><div>[1] <a href="http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html">http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html</a></div><div><br></div><div>Philipp Otto <<a href="mailto:philipp.4096@gmail.com">philipp.4096@gmail.com</a>> schrieb am Mo., 24. Apr. 2017 um 09:35 Uhr:</div><div>Hi there,</div><div><br></div><div>My high level goal is to be able to map an arbitrary keyboard combination to another one. I know that there is already a lot of web resources regarding this, but I ended up writing C++ using xlib, since everything else didn't work out for me.</div><div><br></div><div>Three typical use cases would be:</div><div><br></div><div>- Capslock + j should behave as if I pressed Left (move cursor for text navigation)</div><div>- Capslock + h should behave as if I pressed CTRL + Left (jumps over words)</div><div>- Capslock + Alt + h should behave as if I pressed CTRL + Shift + Left (selects words)  </div><div><br></div><div>An important requirement is, that holding down a shortcut should behave as if I *kept* pressing the combination it was mapped to.</div><div><br></div><div>I already tried using xmodmap as well xbindkeys with xdotool, but there was always something which didn't work out.</div><div><br></div><div>That's why my current approach is to directly use Xlib with XGrabKey, XNextEvent and XSendEvent. This works surprisingly well, but has two problems (the first being the major one):</div><div><br></div><div>- When I keep pressing the shortcut, the text cursor (caret) will move as expected, BUT it will be invisible as long as I'm pressing the shortcut, which is very annoying. After I release the shortcut, the caret will become visible again. I couldn't find any documentation nor workaround for this behaviour. Does anybody know anything about this?</div><div><br></div><div>- It does not work in all programs. I've read that some programs choose to ignore XEvents, if there were simulated. My current plan is to patch my local xlib so that the "send_event" flag is always False. See [1]. If you have a better idea, I'd be glad to hear it.</div><div><br></div><div>As a workaround for these problems, I already tried using XTestFakeKeyEvent, but this has its own problem. Since it doesn't allow to specify modifiers, each modifier has to be send as a keypress event. However, this only works if I send events for releasing the actually pressed keys on the keyboard beforehand. And due to this reason, I cannot stop the mapped shortcut by releasing the keys on my keyboard, since there were already released virtually.</div><div><br></div><div>My main problem is the one of the "invisible caret" since I don't have any idea how to fix this. Any pointers would be highly appreciated!</div><div><br></div><div>Thank you</div><div>Philipp</div><div><br></div><div>[1] <a href="http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html">http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html</a></div></div>