Forward press timestamps
This commit is contained in:
		@ -72,7 +72,7 @@ struct _EekGtkKeyboardPrivate
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static EekColor * color_from_gdk_color    (GdkColor    *gdk_color);
 | 
					static EekColor * color_from_gdk_color    (GdkColor    *gdk_color);
 | 
				
			||||||
static void       on_key_pressed          (EekKeyboard *keyboard,
 | 
					static void       on_key_pressed          (EekKeyboard *keyboard,
 | 
				
			||||||
                                           EekKey      *key,
 | 
					                                           EekKey      *key, guint32 timestamp,
 | 
				
			||||||
                                           gpointer     user_data);
 | 
					                                           gpointer     user_data);
 | 
				
			||||||
static void       on_key_released         (EekKeyboard *keyboard,
 | 
					static void       on_key_released         (EekKeyboard *keyboard,
 | 
				
			||||||
                                           EekKey      *key,
 | 
					                                           EekKey      *key,
 | 
				
			||||||
@ -212,7 +212,7 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget      *self,
 | 
				
			|||||||
    if (key) {
 | 
					    if (key) {
 | 
				
			||||||
        g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey pressed");
 | 
					        g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKey pressed");
 | 
				
			||||||
        g_signal_emit_by_name (key, "pressed"); // TODO: set the pressed property on the key instead
 | 
					        g_signal_emit_by_name (key, "pressed"); // TODO: set the pressed property on the key instead
 | 
				
			||||||
        eek_keyboard_press_key(priv->keyboard, key);
 | 
					        eek_keyboard_press_key(priv->keyboard, key, event->time);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // TODO: send time
 | 
					    // TODO: send time
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
@ -584,8 +584,11 @@ render_released_key (GtkWidget *widget,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_pressed (EekKeyboard *keyboard,
 | 
					on_key_pressed (EekKeyboard *keyboard,
 | 
				
			||||||
                EekKey      *key,
 | 
					                EekKey      *key,
 | 
				
			||||||
 | 
					                guint32      timestamp,
 | 
				
			||||||
                gpointer     user_data)
 | 
					                gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    (void)keyboard;
 | 
				
			||||||
 | 
					    (void)timestamp;
 | 
				
			||||||
    GtkWidget *widget = user_data;
 | 
					    GtkWidget *widget = user_data;
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -30,10 +30,6 @@
 | 
				
			|||||||
#endif  /* HAVE_CONFIG_H */
 | 
					#endif  /* HAVE_CONFIG_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#define DEBUG 0
 | 
					 | 
				
			||||||
#if DEBUG
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek-key.h"
 | 
					#include "eek-key.h"
 | 
				
			||||||
#include "eek-section.h"
 | 
					#include "eek-section.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,7 @@
 | 
				
			|||||||
#endif  /* HAVE_CONFIG_H */
 | 
					#endif  /* HAVE_CONFIG_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek-keyboard.h"
 | 
					#include "eek-keyboard.h"
 | 
				
			||||||
 | 
					#include "eek-marshalers.h"
 | 
				
			||||||
#include "eek-section.h"
 | 
					#include "eek-section.h"
 | 
				
			||||||
#include "eek-key.h"
 | 
					#include "eek-key.h"
 | 
				
			||||||
#include "eek-symbol.h"
 | 
					#include "eek-symbol.h"
 | 
				
			||||||
@ -92,9 +93,9 @@ eek_modifier_key_free (EekModifierKey *modkey)
 | 
				
			|||||||
    g_slice_free (EekModifierKey, modkey);
 | 
					    g_slice_free (EekModifierKey, modkey);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key) {
 | 
					void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp) {
 | 
				
			||||||
    g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKeyboard key-pressed");
 | 
					    g_log("squeek", G_LOG_LEVEL_DEBUG, "emit EekKeyboard key-pressed");
 | 
				
			||||||
    g_signal_emit (keyboard, signals[KEY_PRESSED], 0, key);
 | 
					    g_signal_emit (keyboard, signals[KEY_PRESSED], 0, key, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -279,7 +280,8 @@ set_modifiers_with_key (EekKeyboard    *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_keyboard_real_key_pressed (EekKeyboard *self,
 | 
					eek_keyboard_real_key_pressed (EekKeyboard *self,
 | 
				
			||||||
                               EekKey      *key)
 | 
					                               EekKey      *key,
 | 
				
			||||||
 | 
					                               guint32      timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekKeyboardPrivate *priv = EEK_KEYBOARD_GET_PRIVATE(self);
 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
@ -305,7 +307,7 @@ eek_keyboard_real_key_pressed (EekKeyboard *self,
 | 
				
			|||||||
    EekboardContext ec = {0};
 | 
					    EekboardContext ec = {0};
 | 
				
			||||||
    Client c = {&ec, 0, {0}};
 | 
					    Client c = {&ec, 0, {0}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    emit_key_activated(&ec, keycode, symbol, modifiers, &c, TRUE);
 | 
					    emit_key_activated(&ec, keycode, symbol, modifiers, &c, TRUE, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -489,10 +491,11 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
				
			|||||||
                      G_STRUCT_OFFSET(EekKeyboardClass, key_pressed),
 | 
					                      G_STRUCT_OFFSET(EekKeyboardClass, key_pressed),
 | 
				
			||||||
                      NULL,
 | 
					                      NULL,
 | 
				
			||||||
                      NULL,
 | 
					                      NULL,
 | 
				
			||||||
                      g_cclosure_marshal_VOID__OBJECT,
 | 
					                      _eek_marshal_VOID__OBJECT_UINT,
 | 
				
			||||||
                      G_TYPE_NONE,
 | 
					                      G_TYPE_NONE,
 | 
				
			||||||
                      1,
 | 
					                      2,
 | 
				
			||||||
                      EEK_TYPE_KEY);
 | 
					                      EEK_TYPE_KEY,
 | 
				
			||||||
 | 
					                      G_TYPE_UINT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * EekKeyboard::key-released:
 | 
					     * EekKeyboard::key-released:
 | 
				
			||||||
 | 
				
			|||||||
@ -86,7 +86,8 @@ struct _EekKeyboardClass
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
    void        (* key_pressed)         (EekKeyboard *self,
 | 
					    void        (* key_pressed)         (EekKeyboard *self,
 | 
				
			||||||
                                         EekKey      *key);
 | 
					                                         EekKey      *key,
 | 
				
			||||||
 | 
					                                         guint32      timestamp);
 | 
				
			||||||
    void        (* key_released)        (EekKeyboard *self,
 | 
					    void        (* key_released)        (EekKeyboard *self,
 | 
				
			||||||
                                         EekKey      *key);
 | 
					                                         EekKey      *key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -190,7 +191,7 @@ EekModifierKey     *eek_modifier_key_copy
 | 
				
			|||||||
void                eek_modifier_key_free
 | 
					void                eek_modifier_key_free
 | 
				
			||||||
                                     (EekModifierKey      *modkey);
 | 
					                                     (EekModifierKey      *modkey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key);
 | 
					void eek_keyboard_press_key(EekKeyboard *keyboard, EekKey *key, guint32 timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEK_KEYBOARD_H */
 | 
					#endif  /* EEK_KEYBOARD_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1,2 @@
 | 
				
			|||||||
VOID:INT,INT
 | 
					VOID:INT,INT
 | 
				
			||||||
 | 
					VOID:OBJECT,UINT
 | 
				
			||||||
 | 
				
			|||||||
@ -715,7 +715,7 @@ on_key_activated(EekKeyboard *keyboard,
 | 
				
			|||||||
    EekboardContext ec = {0};
 | 
					    EekboardContext ec = {0};
 | 
				
			||||||
    Client c = {&ec, 0, {0}};
 | 
					    Client c = {&ec, 0, {0}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    emit_key_activated(&ec, keycode, symbol, modifiers, &c, pressed);
 | 
					    emit_key_activated(&ec, keycode, symbol, modifiers, &c, pressed, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +0,0 @@
 | 
				
			|||||||
VOID:UINT,OBJECT,UINT
 | 
					 | 
				
			||||||
@ -119,16 +119,17 @@ int WaylandFakeKeyEvent(
 | 
				
			|||||||
    Display* dpy,
 | 
					    Display* dpy,
 | 
				
			||||||
    unsigned int keycode,
 | 
					    unsigned int keycode,
 | 
				
			||||||
    Bool is_press,
 | 
					    Bool is_press,
 | 
				
			||||||
    unsigned long delay
 | 
					    uint32_t timestamp
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    printf("Sending fake event %d press %d delay %ld\n", keycode, is_press, delay);
 | 
					    printf("%d: Sending fake event %d press %d\n", timestamp, keycode, is_press);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
send_fake_modifier_key_event (Client         *client,
 | 
					send_fake_modifier_key_event (Client         *client,
 | 
				
			||||||
                              EekModifierType modifiers,
 | 
					                              EekModifierType modifiers,
 | 
				
			||||||
                              gboolean        is_pressed)
 | 
					                              gboolean        is_pressed,
 | 
				
			||||||
 | 
					                              uint32_t        timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GdkDisplay *display = gdk_display_get_default ();
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
    Display *xdisplay = NULL; //GDK_DISPLAY_XDISPLAY (display);
 | 
					    Display *xdisplay = NULL; //GDK_DISPLAY_XDISPLAY (display);
 | 
				
			||||||
@ -141,9 +142,9 @@ send_fake_modifier_key_event (Client         *client,
 | 
				
			|||||||
            g_return_if_fail (keycode > 0);
 | 
					            g_return_if_fail (keycode > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            WaylandFakeKeyEvent (xdisplay,
 | 
					            WaylandFakeKeyEvent (xdisplay,
 | 
				
			||||||
                               keycode,
 | 
					                                 keycode,
 | 
				
			||||||
                               is_pressed,
 | 
					                                 is_pressed,
 | 
				
			||||||
                               CurrentTime);
 | 
					                                 timestamp);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -152,7 +153,8 @@ static void
 | 
				
			|||||||
send_fake_key_event (Client  *client,
 | 
					send_fake_key_event (Client  *client,
 | 
				
			||||||
                     guint    xkeysym,
 | 
					                     guint    xkeysym,
 | 
				
			||||||
                     guint    keyboard_modifiers,
 | 
					                     guint    keyboard_modifiers,
 | 
				
			||||||
                     gboolean pressed)
 | 
					                     gboolean pressed,
 | 
				
			||||||
 | 
					                     uint32_t timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GdkDisplay *display = gdk_display_get_default ();
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
    Display *xdisplay = NULL; // GDK_DISPLAY_XDISPLAY (display);
 | 
					    Display *xdisplay = NULL; // GDK_DISPLAY_XDISPLAY (display);
 | 
				
			||||||
@ -188,9 +190,9 @@ send_fake_key_event (Client  *client,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    modifiers |= keyboard_modifiers;
 | 
					    modifiers |= keyboard_modifiers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    send_fake_modifier_key_event (client, modifiers, TRUE);
 | 
					    send_fake_modifier_key_event (client, modifiers, TRUE, timestamp);
 | 
				
			||||||
    WaylandFakeKeyEvent (xdisplay, keycode, pressed, 0);
 | 
					    WaylandFakeKeyEvent (xdisplay, keycode, pressed, timestamp);
 | 
				
			||||||
    send_fake_modifier_key_event (client, modifiers, FALSE);
 | 
					    send_fake_modifier_key_event (client, modifiers, FALSE, timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (old_keysym != xkeysym)
 | 
					    if (old_keysym != xkeysym)
 | 
				
			||||||
        replace_keycode (client, keycode, &old_keysym);
 | 
					        replace_keycode (client, keycode, &old_keysym);
 | 
				
			||||||
@ -200,7 +202,8 @@ static void
 | 
				
			|||||||
send_fake_key_events (Client    *client,
 | 
					send_fake_key_events (Client    *client,
 | 
				
			||||||
                      EekSymbol *symbol,
 | 
					                      EekSymbol *symbol,
 | 
				
			||||||
                      guint      keyboard_modifiers,
 | 
					                      guint      keyboard_modifiers,
 | 
				
			||||||
                      gboolean   pressed)
 | 
					                      gboolean   pressed,
 | 
				
			||||||
 | 
					                      uint32_t   timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Ignore modifier keys */
 | 
					    /* Ignore modifier keys */
 | 
				
			||||||
    if (eek_symbol_is_modifier (symbol))
 | 
					    if (eek_symbol_is_modifier (symbol))
 | 
				
			||||||
@ -236,7 +239,7 @@ send_fake_key_events (Client    *client,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (EEK_IS_KEYSYM(symbol)) {
 | 
					    if (EEK_IS_KEYSYM(symbol)) {
 | 
				
			||||||
        guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
					        guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
				
			||||||
        send_fake_key_event (client, xkeysym, keyboard_modifiers, pressed);
 | 
					        send_fake_key_event (client, xkeysym, keyboard_modifiers, pressed, timestamp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -245,8 +248,9 @@ emit_key_activated (EekboardContext *context,
 | 
				
			|||||||
                    guint            keycode,
 | 
					                    guint            keycode,
 | 
				
			||||||
                    EekSymbol       *symbol,
 | 
					                    EekSymbol       *symbol,
 | 
				
			||||||
                    guint            modifiers,
 | 
					                    guint            modifiers,
 | 
				
			||||||
                    Client *client,
 | 
					                    Client  *client,
 | 
				
			||||||
                    gboolean pressed)
 | 
					                    gboolean pressed,
 | 
				
			||||||
 | 
					                    uint32_t timestamp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* FIXME: figure out how to deal with Client after key presses go through
 | 
					    /* FIXME: figure out how to deal with Client after key presses go through
 | 
				
			||||||
    if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) {
 | 
					    if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) {
 | 
				
			||||||
@ -275,7 +279,7 @@ emit_key_activated (EekboardContext *context,
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
    send_fake_key_events (client, symbol, modifiers, pressed);
 | 
					    send_fake_key_events (client, symbol, modifiers, pressed, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Finds the first key code for each modifier and saves it in modifier_keycodes */
 | 
					/* Finds the first key code for each modifier and saves it in modifier_keycodes */
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#ifndef KEYEMITTER_H
 | 
					#ifndef KEYEMITTER_H
 | 
				
			||||||
#define KEYEMITTER_H
 | 
					#define KEYEMITTER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
#include <glib.h>
 | 
					#include <glib.h>
 | 
				
			||||||
#include <X11/XKBlib.h>
 | 
					#include <X11/XKBlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,10 +19,10 @@ typedef struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
emit_key_activated (EekboardContext *context,
 | 
					emit_key_activated (EekboardContext *context,
 | 
				
			||||||
                  guint            keycode,
 | 
					                    guint            keycode,
 | 
				
			||||||
                  EekSymbol       *symbol,
 | 
					                    EekSymbol       *symbol,
 | 
				
			||||||
                  guint            modifiers,
 | 
					                    guint            modifiers,
 | 
				
			||||||
                  Client *client, gboolean pressed);
 | 
					                    Client *client, gboolean pressed, uint32_t timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
client_enable_xtest (Client *client);
 | 
					client_enable_xtest (Client *client);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user