]> Pileus Git - ~andy/gtk/commitdiff
[broadway] Handle keyboard modifiers in state
authorAlexander Larsson <alexl@redhat.com>
Thu, 14 Apr 2011 19:35:48 +0000 (21:35 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 14 Apr 2011 19:36:42 +0000 (21:36 +0200)
gdk/broadway/broadway.js
gdk/broadway/gdkdisplay-broadway.c
gdk/broadway/gdkdisplay-broadway.h
gdk/broadway/gdkeventsource.c

index 683172adeeaab94d41f8df81903db8a27e743081..e8e2ea444e9a028c4d9ce59b266c69e26528fb0f 100644 (file)
@@ -951,6 +951,14 @@ function getEffectiveEventTarget (id) {
 }
 
 function updateForEvent(ev) {
+    lastState &= ~(GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK);
+    if (ev.shiftKey)
+       lastState |= GDK_SHIFT_MASK;
+    if (ev.ctrlKey)
+       lastState |= GDK_CONTROL_MASK;
+    if (ev.altKey)
+       lastState |= GDK_MOD1_MASK;
+
     lastTimeStamp = ev.timeStamp;
     if (ev.target.surface && ev.target.surface.window) {
        var win = ev.target.surface.window;
@@ -2555,7 +2563,7 @@ function handleKeyDown(e) {
        // browser behaviors or it has no corresponding keyPress
        // event, then send it immediately
        if (!ignoreKeyEvent(ev))
-           sendInput("k", [keysym]);
+           sendInput("k", [keysym, lastState]);
        suppress = true;
     }
 
@@ -2600,7 +2608,7 @@ function handleKeyPress(e) {
 
     // Send the translated keysym
     if (keysym > 0)
-       sendInput ("k", [keysym]);
+       sendInput ("k", [keysym, lastState]);
 
     // Stop keypress events just in case
     return cancelEvent(ev);
@@ -2619,7 +2627,7 @@ function handleKeyUp(e) {
     }
 
     if (keysym > 0)
-       sendInput ("K", [keysym]);
+       sendInput ("K", [keysym, lastState]);
     return cancelEvent(ev);
 }
 
index 75a639fc8c497fbf50039ad97a02a8d7e93b8cc6..cdab101ab5136eb88cfc71e6d4baeb885c024308 100644 (file)
@@ -263,6 +263,8 @@ parse_input_message (BroadwayInput *input, const char *message)
   case 'k':
   case 'K':
     msg.key.key = strtol(p, &p, 10);
+    p++; /* Skip , */
+    msg.key.state = strtol(p, &p, 10);
     break;
 
   case 'g':
index 3a414e29db9eb98432fd69dc4132056a7dd4d84b..2f6003725ccb91ef5ff697272732c90bda5ac25b 100644 (file)
@@ -79,6 +79,7 @@ typedef struct {
 
 typedef struct {
   BroadwayInputBaseMsg base;
+  guint32 state;
   int key;
 } BroadwayInputKeyMsg;
 
index e7f8574d587d58af2eb15dde9c2286c47ce1f3ad..18fbe645bd342b6aa14fbd1212c302e2a872e720 100644 (file)
@@ -259,10 +259,13 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
        event->key.window = g_object_ref (window);
        event->key.time = message->base.time;
        event->key.keyval = message->key.key;
+       event->key.state = message->key.state;
        event->key.hardware_keycode = message->key.key;
        event->key.length = 0;
        gdk_event_set_device (event, display->core_pointer);
 
+       display_broadway->last_state = message->key.state;
+
        node = _gdk_event_queue_append (display, event);
        _gdk_windowing_got_event (display, node, event, message->base.serial);
       }