[gtk-frdp] frdp-session: Rework keyboard input handling
- From: Felipe Borges <felipeborges src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk-frdp] frdp-session: Rework keyboard input handling
- Date: Mon, 11 Apr 2022 07:38:48 +0000 (UTC)
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]