/[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 197 by astrand, Wed Sep 25 11:07:57 2002 UTC revision 207 by matthewc, Thu Sep 26 14:26:46 2002 UTC
# Line 1  Line 1 
1  /*  /*
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     User interface services - X keyboard mapping     User interface services - X keyboard mapping
4     Copyright (C) Matthew Chapman 1999-2001     Copyright (C) Matthew Chapman 1999-2002
5        
6     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
# Line 36  extern char keymapname[16]; Line 36  extern char keymapname[16];
36  extern int keylayout;  extern int keylayout;
37  extern BOOL enable_compose;  extern BOOL enable_compose;
38    
39    static BOOL keymap_loaded;
40  static key_translation keymap[KEYMAP_SIZE];  static key_translation keymap[KEYMAP_SIZE];
41  static int min_keycode;  static int min_keycode;
42  static uint16 remote_modifier_state = 0;  static uint16 remote_modifier_state = 0;
43    
44  static void update_modifier_state(uint16 modifiers, BOOL pressed);  static void update_modifier_state(uint8 scancode, BOOL pressed);
45    
46  static void  static void
47  add_to_keymap(char *keyname, uint8 scancode, uint16 modifiers, char *mapname)  add_to_keymap(char *keyname, uint8 scancode, uint16 modifiers, char *mapname)
# Line 206  xkeymap_init(void) Line 207  xkeymap_init(void)
207          unsigned int max_keycode;          unsigned int max_keycode;
208    
209          if (strcmp(keymapname, "none"))          if (strcmp(keymapname, "none"))
210                  xkeymap_read(keymapname);          {
211                    if (xkeymap_read(keymapname))
212                            keymap_loaded = True;
213            }
214    
215          XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode);          XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode);
216  }  }
# Line 214  xkeymap_init(void) Line 218  xkeymap_init(void)
218  /* Handles, for example, multi-scancode keypresses (which is not  /* Handles, for example, multi-scancode keypresses (which is not
219     possible via keymap-files) */     possible via keymap-files) */
220  BOOL  BOOL
221  handle_special_keys(uint32 keysym, uint32 ev_time, BOOL pressed)  handle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, BOOL pressed)
222  {  {
223          switch (keysym)          switch (keysym)
224          {          {
225                  case XK_Break:  /* toggle full screen */                  case XK_Break:
226                          if (get_key_state(XK_Alt_L) || get_key_state(XK_Alt_R))                          if (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))
227                          {                          {
228                                    /* toggle full screen */
229                                  if (pressed)                                  if (pressed)
230                                          xwin_toggle_fullscreen();                                          xwin_toggle_fullscreen();
231                                  return True;  
232                          }                          }
233                            else
234                            {
235                                    /* Send Break sequence E0 46 E0 C6 */
236                                    if (pressed)
237                                    {
238                                            rdp_send_scancode(ev_time, RDP_KEYPRESS,
239                                                              (SCANCODE_EXTENDED | 0x46));
240                                            rdp_send_scancode(ev_time, RDP_KEYPRESS,
241                                                              (SCANCODE_EXTENDED | 0xc6));
242                                    }
243                                    /* No break sequence */
244                            }
245    
246                            return True;
247                          break;                          break;
248    
249                  case XK_Pause:                  case XK_Pause:
# Line 247  handle_special_keys(uint32 keysym, uint3 Line 266  handle_special_keys(uint32 keysym, uint3
266                          }                          }
267                          else                          else
268                          {                          {
269                                  // Release Left Ctrl                                  /* Release Left Ctrl */
270                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d,                                  rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d,
271                                                 0);                                                 0);
272                          }                          }
# Line 309  xkeymap_translate_key(uint32 keysym, uns Line 328  xkeymap_translate_key(uint32 keysym, uns
328                  return tr;                  return tr;
329          }          }
330    
331          DEBUG_KBD(("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym)));          if (keymap_loaded)
332                    error("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym));
333    
334          /* not in keymap, try to interpret the raw scancode */          /* not in keymap, try to interpret the raw scancode */
335          if ((keycode >= min_keycode) && (keycode <= 0x60))          if ((keycode >= min_keycode) && (keycode <= 0x60))
# Line 456  ensure_remote_modifiers(uint32 ev_time, Line 476  ensure_remote_modifiers(uint32 ev_time,
476    
477    
478  void  void
479  reset_modifier_keys(void)  reset_modifier_keys(unsigned int state)
480  {  {
481          /* reset keys */          /* reset keys */
482          uint32 ev_time;          uint32 ev_time;
483          ev_time = time(NULL);          ev_time = time(NULL);
484    
485          if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask) && !get_key_state(XK_Shift_L))          if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask) && !get_key_state(state, XK_Shift_L))
486                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT);
487    
488          if (MASK_HAS_BITS(remote_modifier_state, MapRightShiftMask) && !get_key_state(XK_Shift_R))          if (MASK_HAS_BITS(remote_modifier_state, MapRightShiftMask) && !get_key_state(state, XK_Shift_R))
489                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT);
490    
491          if (MASK_HAS_BITS(remote_modifier_state, MapLeftCtrlMask) && !get_key_state(XK_Control_L))          if (MASK_HAS_BITS(remote_modifier_state, MapLeftCtrlMask) && !get_key_state(state, XK_Control_L))
492                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);
493    
494          if (MASK_HAS_BITS(remote_modifier_state, MapRightCtrlMask) && !get_key_state(XK_Control_R))          if (MASK_HAS_BITS(remote_modifier_state, MapRightCtrlMask) && !get_key_state(state, XK_Control_R))
495                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RCTRL);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RCTRL);
496    
497          if (MASK_HAS_BITS(remote_modifier_state, MapLeftAltMask) && !get_key_state(XK_Alt_L))          if (MASK_HAS_BITS(remote_modifier_state, MapLeftAltMask) && !get_key_state(state, XK_Alt_L))
498                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT);
499    
500          if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) &&          if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) &&
501              !get_key_state(XK_Alt_R) && !get_key_state(XK_Mode_switch))              !get_key_state(state, XK_Alt_R) && !get_key_state(state, XK_Mode_switch))
502                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT);                  rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT);
503  }  }
504    
505    
506  static void  static void
507  update_modifier_state(uint16 modifiers, BOOL pressed)  update_modifier_state(uint8 scancode, BOOL pressed)
508  {  {
509  #ifdef WITH_DEBUG_KBD  #ifdef WITH_DEBUG_KBD
510          uint16 old_modifier_state;          uint16 old_modifier_state;
# Line 492  update_modifier_state(uint16 modifiers, Line 512  update_modifier_state(uint16 modifiers,
512          old_modifier_state = remote_modifier_state;          old_modifier_state = remote_modifier_state;
513  #endif  #endif
514    
515          switch (modifiers)          switch (scancode)
516          {          {
517                  case SCANCODE_CHAR_LSHIFT:                  case SCANCODE_CHAR_LSHIFT:
518                          MASK_CHANGE_BIT(remote_modifier_state, MapLeftShiftMask, pressed);                          MASK_CHANGE_BIT(remote_modifier_state, MapLeftShiftMask, pressed);
# Line 546  update_modifier_state(uint16 modifiers, Line 566  update_modifier_state(uint16 modifiers,
566    
567  /* Send keyboard input */  /* Send keyboard input */
568  void  void
569  rdp_send_scancode(uint32 time, uint16 flags, uint16 scancode)  rdp_send_scancode(uint32 time, uint16 flags, uint8 scancode)
570  {  {
571          update_modifier_state(scancode, !(flags & RDP_KEYRELEASE));          update_modifier_state(scancode, !(flags & RDP_KEYRELEASE));
572    

Legend:
Removed from v.197  
changed lines
  Added in v.207

  ViewVC Help
Powered by ViewVC 1.1.26