[gtk-frdp] frdp-session: Rework keyboard input handling



commit d7f408fb23adc01db14c708b35b74a317418de4b
Author: Felipe Borges <felipeborges gnome org>
Date:   Fri Apr 8 13:00:00 2022 +0200

    frdp-session: Rework keyboard input handling
    
    We weren't handling non-char keys.
    
    Related #83

 src/frdp-display.c | 13 +------------
 src/frdp-session.c | 50 +++++++++++++++++++-------------------------------
 src/frdp-session.h |  3 +--
 3 files changed, 21 insertions(+), 45 deletions(-)
---
diff --git a/src/frdp-display.c b/src/frdp-display.c
index d66f685..314fad7 100644
--- a/src/frdp-display.c
+++ b/src/frdp-display.c
@@ -61,22 +61,11 @@ frdp_display_key_press_event (GtkWidget   *widget,
 {
   FrdpDisplay *self = FRDP_DISPLAY (widget);
   FrdpDisplayPrivate *priv = frdp_display_get_instance_private (self);
-  guint16 keycode = key->hardware_keycode;
 
   if (!frdp_display_is_initialized (self))
     return TRUE;
 
-  switch (key->type) {
-    case GDK_KEY_PRESS:
-      frdp_session_send_key (priv->session, FRDP_KEY_EVENT_PRESS, keycode);
-      break;
-    case GDK_KEY_RELEASE:
-      frdp_session_send_key (priv->session, FRDP_KEY_EVENT_RELEASE, keycode);
-      break;
-    default:
-      g_warn_if_reached ();
-      break;
-  }
+  frdp_session_send_key (priv->session, key);
 
   return TRUE;
 }
diff --git a/src/frdp-session.c b/src/frdp-session.c
index d0d975f..97faa23 100644
--- a/src/frdp-session.c
+++ b/src/frdp-session.c
@@ -17,6 +17,8 @@
  */
 
 #include <errno.h>
+#include <freerdp/input.h>
+#include <freerdp/locale/keyboard.h>
 #include <freerdp/freerdp.h>
 #include <freerdp/gdi/gdi.h>
 #include <gdk/gdk.h>
@@ -511,6 +513,8 @@ frdp_session_init_freerdp (FrdpSession *self)
   settings->DynamicResolutionUpdate = TRUE;
   settings->SupportDisplayControl = TRUE;
   settings->RedirectClipboard = FALSE;
+
+  settings->KeyboardLayout = freerdp_keyboard_init (0);
 }
 
 static void
@@ -875,43 +879,27 @@ frdp_session_mouse_pointer  (FrdpSession          *self,
   frdp_session_update_mouse_pointer (self);
 }
 
-static unsigned char keycode_scancodes[] = {
-   0,  0,  0,  0,  0,  0,  0, 28,
-  29, 53, 55, 56,  0, 71, 72, 73,
-  75, 77, 79, 80, 81, 82, 83,  0,
-   0,  0,  0,  0,  0,  0, 69,  0,
-   0,  0,  0,  0, 91, 92, 93,
-};
-
-static guint16
-frdp_session_get_scancode_by_keycode (guint16 keycode)
-{
-  if (keycode < 8)
-    return 0;
-  else if (keycode < 97)
-    return keycode - 8;
-  else if (keycode < 97 + sizeof (keycode_scancodes))
-    return keycode_scancodes[keycode - 97];
-  else
-    return 0;
-}
-
 void
 frdp_session_send_key (FrdpSession  *self,
-                       FrdpKeyEvent  event,
-                       guint16       keycode)
+                       GdkEventKey  *key)
 {
   rdpInput *input = self->priv->freerdp_session->input;
-  guint16 flags = 0;
-  guint16 scancode =
-      frdp_session_get_scancode_by_keycode (keycode);
+  DWORD scancode = 0;
+  guint8 keycode;
+  guint16 flags;
+  gboolean extended = FALSE;
+
+  scancode =
+    freerdp_keyboard_get_rdp_scancode_from_x11_keycode (key->hardware_keycode);
+
+  keycode = scancode & 0xFF;
+  extended = scancode & 0x100;
 
-  if (event == FRDP_KEY_EVENT_PRESS)
-    flags |= KBD_FLAGS_DOWN;
-  else
-    flags |= KBD_FLAGS_RELEASE;
+  flags = extended ? KBD_FLAGS_EXTENDED : 0;
+  flags |= key->type == GDK_KEY_PRESS ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE;
 
-  input->KeyboardEvent (input, flags, scancode);
+  if (keycode)
+    input->KeyboardEvent (input, flags, keycode);
 }
 
 GdkPixbuf *
diff --git a/src/frdp-session.h b/src/frdp-session.h
index 829bf43..4539168 100644
--- a/src/frdp-session.h
+++ b/src/frdp-session.h
@@ -84,8 +84,7 @@ void         frdp_session_mouse_pointer  (FrdpSession          *self,
                                           gboolean              enter);
 
 void         frdp_session_send_key       (FrdpSession          *self,
-                                          FrdpKeyEvent          event,
-                                          guint16               keycode);
+                                          GdkEventKey          *key);
 
 GdkPixbuf   *frdp_session_get_pixbuf     (FrdpSession          *self);
 /*FreeRDP fatal error codes*/


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]