On Sun, Apr 18, 2021 at 04:26:05PM +0200, Max Schillinger wrote:
> svkbd allows you to create keys for symbols of the second (=shift) layer by
> defining them with a modifier included, like:
>
> { "|", "|", XK_backslash, 1, XK_Shift_L },
>
> This key creates a pipe symbol by sending shift + backslash. But
> unfortunately, this way you can't emit get the original symbol (backslash)
> anymore. So you still need a separate key for typing a backslash, wasting
> precious space on the screen.
>
> The appended patch fixes this by allowing to neutralize the shift by tapping
> this key with shift. It works both by tapping first shift, then the pipe key
> on the on-screen keyboard, or by clicking the pipe key with the middle mouse
> button (assuming XK_Shift_L is set as the button 2 mod).
>
> This way you can create a "flipped" backslash/pipe key:
>
> { "|", "\\", XK_backslash, 1, XK_Shift_L },
>
> This patch works equally for AltGr symbols in a `de`-based layout. For
> example:
>
> { "~", "+", XK_plus, 1, XK_ISO_Level3_Shift },
>
> (In the German QWERTZ layout, you enter "~" with AltGr-"+".)
>
> Best regards,
> Max
>
> ---
> svkbd.c | 36 +++++++++++++++++++++++-------------
> 1 file changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/svkbd.c b/svkbd.c
> index f9b951d..61778c6 100644
> --- a/svkbd.c
> +++ b/svkbd.c
> @@ -198,16 +198,19 @@ buttonpress(XEvent *e)
> if (!(k = findkey(ev->x, ev->y)))
> return;
>
> - if (k->modifier) {
> - mod = k->modifier;
> - } else {
> - for (i = 0; i < LENGTH(buttonmods); i++) {
> - if (ev->button == buttonmods[i].button) {
> - mod = buttonmods[i].mod;
> - break;
> - }
> + for (i = 0; i < LENGTH(buttonmods); i++) {
> + if (ev->button == buttonmods[i].button) {
> + mod = buttonmods[i].mod;
> + break;
> }
> }
> +
> + if (k->modifier) {
> + if (mod == k->modifier)
> + mod = 0;
> + else
> + mod = k->modifier;
> + }
> press(k, mod);
> }
>
> @@ -231,7 +234,9 @@ buttonrelease(XEvent *e)
> if (ev->x < 0 || ev->y < 0) {
> unpress(NULL, mod);
> } else if ((k = findkey(ev->x, ev->y))) {
> - if (k->modifier)
> + if (k->modifier == mod)
> + unpress(k, 0);
> + else if (k->modifier)
> unpress(k, k->modifier);
> else
> unpress(k, mod);
> @@ -564,6 +569,7 @@ void
> unpress(Key *k, KeySym buttonmod)
> {
> int i;
> + Bool neutralizebuttonmod = False;
>
> if (k != NULL) {
> switch(k->keysym) {
> @@ -589,10 +595,13 @@ unpress(Key *k, KeySym buttonmod)
> /* simulate the press event, as we postponed it earlier in
> press() */
> for (i = 0; i < numkeys; i++) {
> if (keys[i].pressed && IsModifierKey(keys[i].keysym)) {
> - simulate_keypress(keys[i].keysym);
> + if (keys[i].keysym == buttonmod)
> + neutralizebuttonmod = True;
> + else
> + simulate_keypress(keys[i].keysym);
> }
> }
> - if (buttonmod) {
> + if (buttonmod && !neutralizebuttonmod) {
> simulate_keypress(buttonmod);
> }
> simulate_keypress(k->keysym);
> @@ -615,14 +624,15 @@ unpress(Key *k, KeySym buttonmod)
> }
> }
>
> - if (buttonmod) {
> + if (buttonmod && !neutralizebuttonmod) {
> simulate_keyrelease(buttonmod);
> }
>
> if ((k == NULL) || (!IsModifierKey(k->keysym))) {
> for (i = 0; i < numkeys; i++) {
> if (keys[i].pressed && IsModifierKey(keys[i].keysym)) {
> - simulate_keyrelease(keys[i].keysym);
> + if (!(keys[i].keysym == buttonmod &&
> neutralizebuttonmod))
> + simulate_keyrelease(keys[i].keysym);
> keys[i].pressed = 0;
> drawkey(&keys[i]);
> }
> --
> 2.25.1
>
>
Hi,
>From the description it sounds useful to me.
Any users of svkbd have opinions or objections about this patch? I don't use
svkbd at the moment.
--
Kind regards,
Hiltjo