/[rdesktop]/sourceforge.net/trunk/rdesktop/xkeymap.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/xkeymap.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 227 by astrand, Fri Oct 11 09:38:49 2002 UTC revision 333 by astrand, Thu Feb 20 12:14:13 2003 UTC
# Line 18  Line 18 
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */  */
20    
21    #ifdef RDP2VNC
22    #include "vnc/x11stubs.h"
23    #else
24  #include <X11/Xlib.h>  #include <X11/Xlib.h>
25  #define XK_MISCELLANY  #include <X11/keysym.h>
26  #include <X11/keysymdef.h>  #endif
27    
28  #include <ctype.h>  #include <ctype.h>
29  #include <limits.h>  #include <limits.h>
30  #include <time.h>  #include <time.h>
31  #include "rdesktop.h"  #include "rdesktop.h"
32  #include "scancodes.h"  #include "scancodes.h"
33    
34  #define KEYMAP_SIZE 4096  #define KEYMAP_SIZE 0xffff+1
35  #define KEYMAP_MASK (KEYMAP_SIZE - 1)  #define KEYMAP_MASK 0xffff
36  #define KEYMAP_MAX_LINE_LENGTH 80  #define KEYMAP_MAX_LINE_LENGTH 80
37    
38  extern Display *display;  extern Display *display;
39  extern char keymapname[16];  extern char keymapname[16];
40  extern int keylayout;  extern int keylayout;
41    extern int win_button_size;
42  extern BOOL enable_compose;  extern BOOL enable_compose;
43    
44  static BOOL keymap_loaded;  static BOOL keymap_loaded;
# Line 51  add_to_keymap(char *keyname, uint8 scanc Line 56  add_to_keymap(char *keyname, uint8 scanc
56          keysym = XStringToKeysym(keyname);          keysym = XStringToKeysym(keyname);
57          if (keysym == NoSymbol)          if (keysym == NoSymbol)
58          {          {
59                  error("Bad keysym %s in keymap %s\n", keyname, mapname);                  DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring)\n", keyname, mapname));
60                  return;                  return;
61          }          }
62    
# Line 198  xkeymap_read(char *mapname) Line 203  xkeymap_read(char *mapname)
203                          /* Automatically add uppercase key, with same modifiers                          /* Automatically add uppercase key, with same modifiers
204                             plus shift */                             plus shift */
205                          for (p = keyname; *p; p++)                          for (p = keyname; *p; p++)
206                                  *p = toupper(*p);                                  *p = toupper((int) *p);
207                          MASK_ADD_BITS(modifiers, MapLeftShiftMask);                          MASK_ADD_BITS(modifiers, MapLeftShiftMask);
208                          add_to_keymap(keyname, scancode, modifiers, mapname);                          add_to_keymap(keyname, scancode, modifiers, mapname);
209                  }                  }
# Line 220  xkeymap_init(void) Line 225  xkeymap_init(void)
225          mapname_ptr = keymapname;          mapname_ptr = keymapname;
226          while (*mapname_ptr)          while (*mapname_ptr)
227          {          {
228                  *mapname_ptr = tolower(*mapname_ptr);                  *mapname_ptr = tolower((int) *mapname_ptr);
229                  mapname_ptr++;                  mapname_ptr++;
230          }          }
231    
# Line 240  handle_special_keys(uint32 keysym, unsig Line 245  handle_special_keys(uint32 keysym, unsig
245  {  {
246          switch (keysym)          switch (keysym)
247          {          {
248                  case XK_Break:                  case XK_Return:
                 case XK_Pause:  
249                          if ((get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))                          if ((get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))
250                              && (get_key_state(state, XK_Control_L)                              && (get_key_state(state, XK_Control_L)
251                                  || get_key_state(state, XK_Control_R)))                                  || get_key_state(state, XK_Control_R)))
252                          {                          {
253                                  /* Ctrl-Alt-Break: toggle full screen */                                  /* Ctrl-Alt-Enter: toggle full screen */
254                                  if (pressed)                                  if (pressed)
255                                          xwin_toggle_fullscreen();                                          xwin_toggle_fullscreen();
256                                    return True;
257                            }
258                            break;
259    
260                    case XK_Break:
261                            /* Send Break sequence E0 46 E0 C6 */
262                            if (pressed)
263                            {
264                                    rdp_send_scancode(ev_time, RDP_KEYPRESS,
265                                                      (SCANCODE_EXTENDED | 0x46));
266                                    rdp_send_scancode(ev_time, RDP_KEYPRESS,
267                                                      (SCANCODE_EXTENDED | 0xc6));
268                          }                          }
269                          else if (keysym == XK_Break)                          /* No release sequence */
270                            return True;
271    
272                    case XK_Pause:
273                            /* According to MS Keyboard Scan Code
274                               Specification, pressing Pause should result
275                               in E1 1D 45 E1 9D C5. I'm not exactly sure
276                               of how this is supposed to be sent via
277                               RDP. The code below seems to work, but with
278                               the side effect that Left Ctrl stays
279                               down. Therefore, we release it when Pause
280                               is released. */
281                            if (pressed)
282                          {                          {
283                                  /* Send Break sequence E0 46 E0 C6 */                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0);
284                                  if (pressed)                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x1d, 0);
285                                  {                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x45, 0);
286                                          rdp_send_scancode(ev_time, RDP_KEYPRESS,                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0);
287                                                            (SCANCODE_EXTENDED | 0x46));                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x9d, 0);
288                                          rdp_send_scancode(ev_time, RDP_KEYPRESS,                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xc5, 0);
                                                           (SCANCODE_EXTENDED | 0xc6));  
                                 }  
                                 /* No break sequence */  
289                          }                          }
290                          else    /* XK_Pause */                          else
291                          {                          {
292                                  /* According to MS Keyboard Scan Code                                  /* Release Left Ctrl */
293                                     Specification, pressing Pause should result                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE,
294                                     in E1 1D 45 E1 9D C5. I'm not exactly sure                                                 0x1d, 0);
                                    of how this is supposed to be sent via  
                                    RDP. The code below seems to work, but with  
                                    the side effect that Left Ctrl stays  
                                    down. Therefore, we release it when Pause  
                                    is released. */  
                                 if (pressed)  
                                 {  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0xe1, 0);  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0x1d, 0);  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0x45, 0);  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0xe1, 0);  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0x9d, 0);  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS,  
                                                        0xc5, 0);  
                                 }  
                                 else  
                                 {  
                                         /* Release Left Ctrl */  
                                         rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE,  
                                                        0x1d, 0);  
                                 }  
295                          }                          }
296                          return True;                          return True;
297    
# Line 314  handle_special_keys(uint32 keysym, unsig Line 312  handle_special_keys(uint32 keysym, unsig
312                                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);                                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);
313                          }                          }
314                          return True;                          return True;
315    
316                    case XK_space:
317                            /* Prevent access to the Windows system menu in single app mode */
318                            if (win_button_size
319                                && (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R)))
320                                    return True;
321    
322          }          }
323          return False;          return False;
324  }  }
# Line 351  xkeymap_translate_key(uint32 keysym, uns Line 356  xkeymap_translate_key(uint32 keysym, uns
356          }          }
357    
358          if (keymap_loaded)          if (keymap_loaded)
359                  error("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym));                  warning("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym));
360    
361          /* not in keymap, try to interpret the raw scancode */          /* not in keymap, try to interpret the raw scancode */
362          if ((keycode >= min_keycode) && (keycode <= 0x60))          if ((keycode >= min_keycode) && (keycode <= 0x60))
# Line 430  ensure_remote_modifiers(uint32 ev_time, Line 435  ensure_remote_modifiers(uint32 ev_time,
435                          break;                          break;
436          }          }
437    
438            /* NumLock */
439            if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)
440                != MASK_HAS_BITS(remote_modifier_state, MapNumLockMask))
441            {
442                    /* The remote modifier state is not correct */
443                    uint16 new_remote_state;
444    
445                    if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask))
446                    {
447                            DEBUG_KBD(("Remote NumLock state is incorrect, activating NumLock.\n"));
448                            new_remote_state = KBD_FLAG_NUMLOCK;
449                            remote_modifier_state = MapNumLockMask;
450                    }
451                    else
452                    {
453                            DEBUG_KBD(("Remote NumLock state is incorrect, deactivating NumLock.\n"));
454                            new_remote_state = 0;
455                            remote_modifier_state = 0;
456                    }
457    
458                    rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, new_remote_state, 0);
459            }
460    
461          /* Shift. Left shift and right shift are treated as equal; either is fine. */          /* Shift. Left shift and right shift are treated as equal; either is fine. */
462          if (MASK_HAS_BITS(tr.modifiers, MapShiftMask)          if (MASK_HAS_BITS(tr.modifiers, MapShiftMask)
463              != MASK_HAS_BITS(remote_modifier_state, MapShiftMask))              != MASK_HAS_BITS(remote_modifier_state, MapShiftMask))
# Line 474  ensure_remote_modifiers(uint32 ev_time, Line 502  ensure_remote_modifiers(uint32 ev_time,
502                  }                  }
503          }          }
504    
         /* NumLock */  
         if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)  
             != MASK_HAS_BITS(remote_modifier_state, MapNumLockMask))  
         {  
                 /* The remote modifier state is not correct */  
                 uint16 new_remote_state = 0;  
   
                 if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask))  
                 {  
                         DEBUG_KBD(("Remote NumLock state is incorrect, activating NumLock.\n"));  
                         new_remote_state |= KBD_FLAG_NUMLOCK;  
                 }  
                 else  
                 {  
                         DEBUG_KBD(("Remote NumLock state is incorrect, deactivating NumLock.\n"));  
                 }  
505    
                 rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, new_remote_state, 0);  
                 update_modifier_state(SCANCODE_CHAR_NUMLOCK, True);  
         }  
506  }  }
507    
508    

Legend:
Removed from v.227  
changed lines
  Added in v.333

  ViewVC Help
Powered by ViewVC 1.1.26