Guest User

wfaulk / patch to xfreerdp to enable the obeyance of X key remappings

a guest
Sep 27th, 2010
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.99 KB | None | 0 0
  1. diff --git a/X11/xf_event.c b/X11/xf_event.c
  2. index 8cb0141..7b333aa 100644
  3. --- a/X11/xf_event.c
  4. +++ b/X11/xf_event.c
  5. @@ -1,4 +1,3 @@
  6. -
  7.  #include <X11/Xlib.h>
  8.  #include <X11/Xutil.h>
  9.  #include <stdio.h>
  10. @@ -9,6 +8,8 @@
  11.  #include "xf_event.h"
  12.  #include "xf_keyboard.h"
  13.  
  14. +extern RD_BOOL obey_key_remappings;
  15. +
  16.  static int
  17.  xf_handle_event_Expose(xfInfo * xfi, XEvent * xevent)
  18.  {
  19. @@ -147,14 +148,29 @@ xf_handle_event_KeyPress(xfInfo * xfi, XEvent * xevent)
  20.  {
  21.         KeySym keysym;
  22.         char str[256];
  23. +       unsigned int cooked_keycode;
  24.  
  25.         XLookupString((XKeyEvent *) xevent, str, sizeof(str), &keysym, NULL);
  26. -
  27. -       xf_kb_set_keypress(xevent->xkey.keycode, keysym);
  28. +       if (obey_key_remappings == True)
  29. +       {
  30. +               cooked_keycode = XKeysymToKeycode(((XKeyEvent *) xevent)->display, keysym);
  31. +               xf_kb_set_keypress(cooked_keycode, keysym);
  32. +       }
  33. +       else
  34. +       {
  35. +               xf_kb_set_keypress(xevent->xkey.keycode, keysym);
  36. +       }
  37.         if (xfi->fs_toggle && xf_kb_handle_special_keys(xfi, keysym))
  38.                 return 0;
  39.  
  40. -       xf_kb_send_key(xfi, RDP_KEYPRESS, xevent->xkey.keycode);
  41. +       if (obey_key_remappings == True)
  42. +       {
  43. +               xf_kb_send_key(xfi, RDP_KEYPRESS, cooked_keycode);
  44. +       }
  45. +       else
  46. +       {
  47. +               xf_kb_send_key(xfi, RDP_KEYPRESS, xevent->xkey.keycode);
  48. +       }
  49.         return 0;
  50.  }
  51.  
  52. @@ -162,6 +178,10 @@ static RD_BOOL
  53.  xf_skip_key_release(xfInfo * xfi, XEvent * xevent)
  54.  {
  55.         XEvent next_event;
  56. +       unsigned int cooked_keycode;
  57. +       unsigned int next_cooked_keycode;
  58. +       KeySym keysym;
  59. +       char str[256];
  60.  
  61.         if (XPending(xfi->display))
  62.         {
  63. @@ -169,7 +189,18 @@ xf_skip_key_release(xfInfo * xfi, XEvent * xevent)
  64.                 XPeekEvent(xfi->display, &next_event);
  65.                 if (next_event.type == KeyPress)
  66.                 {
  67. -                       if (next_event.xkey.keycode == xevent->xkey.keycode)
  68. +                       if (obey_key_remappings == True)
  69. +                       {
  70. +                               XLookupString((XKeyEvent *) xevent, str, sizeof(str), &keysym, NULL);
  71. +                               cooked_keycode = XKeysymToKeycode(((XKeyEvent *) xevent)->display, keysym);
  72. +                               XLookupString((XKeyEvent *) &next_event, str, sizeof(str), &keysym, NULL);
  73. +                               next_cooked_keycode = XKeysymToKeycode(next_event.xkey.display, keysym);
  74. +                               if (next_cooked_keycode == cooked_keycode)
  75. +                               {
  76. +                                       return True;
  77. +                               }
  78. +                       }
  79. +                       else if (next_event.xkey.keycode == xevent->xkey.keycode)
  80.                         {
  81.                                 return True;
  82.                         }
  83. @@ -181,12 +212,26 @@ xf_skip_key_release(xfInfo * xfi, XEvent * xevent)
  84.  static int
  85.  xf_handle_event_KeyRelease(xfInfo * xfi, XEvent * xevent)
  86.  {
  87. +       unsigned int cooked_keycode;
  88. +       KeySym keysym;
  89. +       char str[256];
  90. +
  91.         if (xf_skip_key_release(xfi, xevent))
  92.         {
  93.                 return 0;
  94.         }
  95. -       xf_kb_unset_keypress(xevent->xkey.keycode);
  96. -       xf_kb_send_key(xfi, RDP_KEYRELEASE, xevent->xkey.keycode);
  97. +       if (obey_key_remappings == True)
  98. +       {
  99. +               XLookupString((XKeyEvent *) xevent, str, sizeof(str), &keysym, NULL);
  100. +               cooked_keycode = XKeysymToKeycode(((XKeyEvent *) xevent)->display, keysym);
  101. +               xf_kb_unset_keypress(cooked_keycode);
  102. +               xf_kb_send_key(xfi, RDP_KEYRELEASE, cooked_keycode);
  103. +       }
  104. +       else
  105. +       {
  106. +               xf_kb_unset_keypress(xevent->xkey.keycode);
  107. +               xf_kb_send_key(xfi, RDP_KEYRELEASE, xevent->xkey.keycode);
  108. +       }
  109.         return 0;
  110.  }
  111.  
  112. diff --git a/X11/xfreerdp.c b/X11/xfreerdp.c
  113. index 2638833..27e77ad 100644
  114. --- a/X11/xfreerdp.c
  115. +++ b/X11/xfreerdp.c
  116. @@ -43,6 +43,8 @@
  117.  static volatile int g_thread_count = 0;
  118.  static sem_t g_sem;
  119.  
  120. +RD_BOOL obey_key_remappings = False;
  121. +
  122.  static int
  123.  set_default_params(xfInfo * xfi)
  124.  {
  125. @@ -99,6 +101,7 @@ out_args(void)
  126.                 "\t-f: fullscreen mode\n"
  127.                 "\t-z: enable bulk compression\n"
  128.                 "\t-x: performance flags (m, b or l for modem, broadband or lan)\n"
  129. +               "\t-m: obey X key remappings\n"
  130.  #ifndef DISABLE_TLS
  131.                 "\t--no-tls: disable TLS encryption\n"
  132.  #endif
  133. @@ -297,6 +300,10 @@ process_params(xfInfo * xfi, int argc, char ** argv, int * pindex)
  134.                 {
  135.                         settings->console_session = 1;
  136.                 }
  137. +               else if (strcmp("-m", argv[*pindex]) == 0)
  138. +               {
  139. +                       obey_key_remappings = True;
  140. +               }
  141.                 else if (strcmp("-z", argv[*pindex]) == 0)
  142.                 {
  143.                         settings->bulk_compression = 1;
Add Comment
Please, Sign In to add comment