Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Panozzo <giovanni@panozzo.it>2014-09-15 00:42:07 +0400
committerGiovanni Panozzo <giovanni@panozzo.it>2014-09-15 00:42:07 +0400
commit073d7393f2138be1c80ffcc8ab91356ca78bd7e3 (patch)
treef04cef79b8c81e267111188317be5eeb8d548d9d /remmina-plugins/rdp/rdp_event.c
parent66c8772501bc5d19fb192a124a45a7898d3400dd (diff)
Fix missing extended keycode and 'up' action when sending release key events. Fixes #7
When a remmina RDP window lose its focus, all pressed keys are removed by sending a release event to the RDP server. This event was missing the extended keycode and the 'up' action.
Diffstat (limited to 'remmina-plugins/rdp/rdp_event.c')
-rw-r--r--remmina-plugins/rdp/rdp_event.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/remmina-plugins/rdp/rdp_event.c b/remmina-plugins/rdp/rdp_event.c
index ee8f001bb..5806f0b03 100644
--- a/remmina-plugins/rdp/rdp_event.c
+++ b/remmina-plugins/rdp/rdp_event.c
@@ -100,11 +100,12 @@ static void remmina_rdp_event_event_push(RemminaProtocolWidget* gp, const Remmin
}
}
-static void remmina_rdp_event_release_key(RemminaProtocolWidget* gp, gint scancode)
+static void remmina_rdp_event_release_key(RemminaProtocolWidget* gp, DWORD scancode)
{
gint i, k;
rfContext* rfi;
RemminaPluginRdpEvent rdp_event = { 0 };
+ DWORD pressed_scancode;
rfi = GET_DATA(gp);
rdp_event.type = REMMINA_RDP_EVENT_TYPE_SCANCODE;
@@ -116,7 +117,10 @@ static void remmina_rdp_event_release_key(RemminaProtocolWidget* gp, gint scanco
for (i = 0; i < rfi->pressed_keys->len; i++)
{
- rdp_event.key_event.key_code = g_array_index(rfi->pressed_keys, gint, i);
+ pressed_scancode = g_array_index(rfi->pressed_keys, DWORD, i);
+ rdp_event.key_event.key_code = pressed_scancode & 0xFF;
+ rdp_event.key_event.extended = pressed_scancode & 0x100;
+ rdp_event.key_event.up = 1;
remmina_rdp_event_event_push(gp, &rdp_event);
}
@@ -127,7 +131,7 @@ static void remmina_rdp_event_release_key(RemminaProtocolWidget* gp, gint scanco
/* Unregister the keycode only */
for (i = 0; i < rfi->pressed_keys->len; i++)
{
- k = g_array_index(rfi->pressed_keys, gint, i);
+ k = g_array_index(rfi->pressed_keys, DWORD, i);
if (k == scancode)
{
@@ -502,9 +506,9 @@ static gboolean remmina_rdp_event_on_key(GtkWidget* widget, GdkEventKey* event,
if (rdp_event.key_event.key_code)
{
if (event->type == GDK_KEY_PRESS)
- g_array_append_val(rfi->pressed_keys, rdp_event.key_event.key_code);
+ g_array_append_val(rfi->pressed_keys, scancode);
else
- remmina_rdp_event_release_key(gp, rdp_event.key_event.key_code);
+ remmina_rdp_event_release_key(gp, scancode);
}
return TRUE;
@@ -575,7 +579,7 @@ void remmina_rdp_event_init(RemminaProtocolWidget* gp)
rfi->clipboard_handler = g_signal_connect(clipboard, "owner-change", G_CALLBACK(remmina_rdp_event_on_clipboard), gp);
}
- rfi->pressed_keys = g_array_new(FALSE, TRUE, sizeof (gint));
+ rfi->pressed_keys = g_array_new(FALSE, TRUE, sizeof (DWORD));
rfi->event_queue = g_async_queue_new_full(g_free);
rfi->ui_queue = g_async_queue_new();