Keysym to modifiers state

Cvetelin Andreev cvetelin.a at komero.net
Wed Nov 2 07:44:54 PST 2005


Hi Jim,

I thought that my goal was clear.
I've asked "So is there a way to get the modifiers state from the keysym?".
For example how could i differ XK_A and XK_a.
For both keysym XKeysymToKeycode returns one and the same value.

XSendEvent requires KeyEvent structure as parameter.
KeyEvent has 'keycode' and 'state' fields. I can fill the 'keycode' field  
with XKeysymToKeycode, but what about the 'state' field?

I'll explain it in details

I want to have function sendEvent

void sendEvent(int down, Keysym key)

where down indicates KeyPress or KeyRelease event and 'key' defines a  
keysum.

This function sends a KeyEvent to the window that has the input focus

If I use XTest extension the function will looks like that:

void sendEvent(Bool down, KeySym key)
{
         KeyCode k;
         int isbutton = 0;

         k = XKeysymToKeycode(dpy, (KeySym) keysym);

         if (k != NoSymbol)
         {
                 XTestFakeKeyEvent(dpy, k, down, CurrentTime);
                 XFlush(dpy);
         }
}

Or if I don't use XTest extension:
void sendEvent(Bool down, KeySym key)
{
         KeyCode k;

         k = XKeysymToKeycode(dpy, (KeySym) keysym);

         if (k != NoSymbol)
         {
                 XKeyEvent event;

                 event.display = dpy;
                 event.window = root;
                 event.root = root;
                 event.subwindow = None;
                 event.time = CurrentTime;
                 event.x = 0;
                 event.y = 0;
                 event.x_root = 0;
                 event.y_root = 0;
                 event.same_screen = True;

                 event.type = down ? KeyPress : KeyRelease;
                 event.keycode = k;
                 event.state = 0;

                 XSendEvent(event.display, InputFocus, True,  
KeyPressMask|KeyReleaseMask, (XEvent *)&event);

                 XFlush(dpy);
         }
}

Look at the second implementation (no XTest extension).
there is an assignment event.state = 0; which tells that there is no  
modifiers mask. No shift/ctrl/alt/Mod etc was pressed.

The problem is the following:

What happens if you call the function as shown:

sendEvent(True, XK_a);
sendEvent(False, XK_a);

?

The answer is: The input window will recieve XKeyEvent and (if possible)  
will display 'a' character.

What happens if you call the function like this: (with XK_A keysym, not  
with XK_a)

sendEvent(True, XK_A);
sendEvent(False, XK_A);
?

The result will be the same: printed 'a' character.

But in the second case the expected result is A (uppercase).

Why is that?
The answer is in the assignmen event.state = 0;

If you pass event.state = ShiftMask; then the output will be the response  
key with Shiftmask (upprecase).

How can I determine when to pass ShiftMask, when to pass ContorlMask ot  
ModMask?


The solution i found:
If I want capital 'a' - 'A' here is the sequence i must perform:

sendEvent(True, XK_Shift_L);
sendEvent(True, XK_a);
sendEvent(False, XK_a);
sendEvent(False, XK_Shift_L);

I hope I was clear enough.


On Wed, 02 Nov 2005 15:51:30 +0200, Jim Gettys <jg at freedesktop.org> wrote:

> How the list of keysyms and modifiers in an event gets mapped to a
> particular keysym is a matter of convention and input method; I'm not up
> on the exact details used under what circumstances, a lot of the I18N
> work having gone on when I was doing things other than X.  This can get
> quite complex for some languages, involving multiple key presses (e.g.
> many Asian languages).  So I don't have a simple answer for you.
>
> Arguably, there should be some way in X to send (cognizant) clients a
> unicode character: at the moment, there is not any I'm aware of, beyond
> sending a keypress event having previously defined a keysym out of the
> unicode part of the keysym address space.
>
> Anyone else on the list have anything to help Cvetelin with?
>
> Cvetelin, what *exactly* are you trying to achieve?  Understanding your
> *goal* would help people help you, and it is very unlikely you are
> trying to solve a problem that hasn't been solved before.  Just asking
> how you do something in a preconceived fashion isn't very enlightening
> to the mailing list.
> 				- Jim Gettys
>
>
>
> On Wed, 2005-11-02 at 15:20 +0200, Cvetelin Andreev wrote:
>> Tell me where to find some help for my problem please.
>>
>> On Tue, 01 Nov 2005 14:51:10 +0200, Cvetelin Andreev
>> <cvetelin.a at komero.net> wrote:
>>
>> > Hi all,
>> >
>> > After a week researching did not find some answers.
>> >
>> > I want to send a KeyEvent with XSendEvent with specified keysym. But  
>> the
>> > KeyEvent structure requres keycode (which is system dependant) and
>> > modifiers. I can obtain the keycode from the keysym with
>> > KKeysymToKeycode,
>> > but what about modifiers?
>> > A solution is to get the keycode, and to test this keycode with all
>> > modifiers masks for equality with the original keysym with
>> > XKeycodeToKeysym (or ewith constructing event with each modifiers
>> > combination and test it with XLookupString). However the combinations  
>> of
>> > modifiers are large number.
>> >
>> > So is there a way to get the modifiers state from the keysym?
>> >
>>
>>
>>
>
> _______________________________________________
> xorg mailing list
> xorg at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xorg
>



-- 
Cvetelin Andreev



More information about the xorg mailing list