/[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 957 by astrand, Wed Aug 3 08:25:32 2005 UTC revision 976 by astrand, Thu Aug 4 13:39:57 2005 UTC
# Line 1  Line 1 
1  /*  /* -*- c-basic-offset: 8 -*-
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    
# Line 30  Line 30 
30  #include <ctype.h>  #include <ctype.h>
31  #include <limits.h>  #include <limits.h>
32  #include <time.h>  #include <time.h>
33    #include <string.h>
34  #include "rdesktop.h"  #include "rdesktop.h"
35  #include "scancodes.h"  #include "scancodes.h"
36    
# Line 39  Line 40 
40    
41  extern Display *g_display;  extern Display *g_display;
42  extern Window g_wnd;  extern Window g_wnd;
43  extern char keymapname[16];  extern char g_keymapname[16];
44  extern int g_keylayout;  extern int g_keylayout;
45    extern int g_keyboard_type;
46    extern int g_keyboard_subtype;
47    extern int g_keyboard_functionkeys;
48  extern int g_win_button_size;  extern int g_win_button_size;
49  extern BOOL g_enable_compose;  extern BOOL g_enable_compose;
50  extern BOOL g_use_rdp5;  extern BOOL g_use_rdp5;
# Line 155  add_sequence(char *rest, char *mapname) Line 159  add_sequence(char *rest, char *mapname)
159          DEBUG_KBD(("\n"));          DEBUG_KBD(("\n"));
160  }  }
161    
162    BOOL
163    xkeymap_from_locale(const char *locale)
164    {
165            char *str, *ptr;
166            FILE *fp;
167    
168            /* Create a working copy */
169            str = xstrdup(locale);
170    
171            /* Truncate at dot and at */
172            ptr = strrchr(str, '.');
173            if (ptr)
174                    *ptr = '\0';
175            ptr = strrchr(str, '@');
176            if (ptr)
177                    *ptr = '\0';
178    
179            /* Replace _ with - */
180            ptr = strrchr(str, '_');
181            if (ptr)
182                    *ptr = '-';
183    
184            /* Convert to lowercase */
185            ptr = str;
186            while (*ptr)
187            {
188                    *ptr = tolower((int) *ptr);
189                    ptr++;
190            }
191    
192            /* Try to open this keymap (da-dk) */
193            fp = xkeymap_open(str);
194            if (fp == NULL)
195            {
196                    /* Truncate at dash */
197                    ptr = strrchr(str, '-');
198                    if (ptr)
199                            *ptr = '\0';
200    
201                    /* Try the short name (da) */
202                    fp = xkeymap_open(str);
203            }
204    
205            if (fp)
206            {
207                    fclose(fp);
208                    STRNCPY(g_keymapname, str, sizeof(g_keymapname));
209                    return True;
210            }
211    
212            return False;
213    }
214    
215    
216  /* Joins two path components. The result should be freed with  /* Joins two path components. The result should be freed with
217     xfree(). */     xfree(). */
218  static char *  static char *
# Line 184  xkeymap_open(const char *filename) Line 242  xkeymap_open(const char *filename)
242          char *home;          char *home;
243          FILE *fp;          FILE *fp;
244    
         /* Try KEYMAP_PATH */  
         path1 = pathjoin(KEYMAP_PATH, filename);  
         fp = fopen(path1, "r");  
         xfree(path1);  
         if (fp)  
                 return fp;  
   
245          /* Try ~/.rdesktop/keymaps */          /* Try ~/.rdesktop/keymaps */
246          home = getenv("HOME");          home = getenv("HOME");
247          if (home)          if (home)
# Line 204  xkeymap_open(const char *filename) Line 255  xkeymap_open(const char *filename)
255                          return fp;                          return fp;
256          }          }
257    
258            /* Try KEYMAP_PATH */
259            path1 = pathjoin(KEYMAP_PATH, filename);
260            fp = fopen(path1, "r");
261            xfree(path1);
262            if (fp)
263                    return fp;
264    
265          /* Try current directory, in case we are running from the source          /* Try current directory, in case we are running from the source
266             tree */             tree */
267          path1 = pathjoin("keymaps", filename);          path1 = pathjoin("keymaps", filename);
# Line 253  xkeymap_read(char *mapname) Line 311  xkeymap_read(char *mapname)
311                  }                  }
312    
313                  /* Include */                  /* Include */
314                  if (strncmp(line, "include ", 8) == 0)                  if (strncmp(line, "include ", sizeof("include ") - 1) == 0)
315                  {                  {
316                          if (!xkeymap_read(line + 8))                          if (!xkeymap_read(line + sizeof("include ") - 1))
317                                  return False;                                  return False;
318                          continue;                          continue;
319                  }                  }
320    
321                  /* map */                  /* map */
322                  if (strncmp(line, "map ", 4) == 0)                  if (strncmp(line, "map ", sizeof("map ") - 1) == 0)
323                  {                  {
324                          g_keylayout = strtol(line + 4, NULL, 16);                          g_keylayout = strtol(line + sizeof("map ") - 1, NULL, 16);
325                          DEBUG_KBD(("Keylayout 0x%x\n", g_keylayout));                          DEBUG_KBD(("Keylayout 0x%x\n", g_keylayout));
326                          continue;                          continue;
327                  }                  }
328    
329                  /* compose */                  /* compose */
330                  if (strncmp(line, "enable_compose", 15) == 0)                  if (strncmp(line, "enable_compose", sizeof("enable_compose") - 1) == 0)
331                  {                  {
332                          DEBUG_KBD(("Enabling compose handling\n"));                          DEBUG_KBD(("Enabling compose handling\n"));
333                          g_enable_compose = True;                          g_enable_compose = True;
# Line 277  xkeymap_read(char *mapname) Line 335  xkeymap_read(char *mapname)
335                  }                  }
336    
337                  /* sequence */                  /* sequence */
338                  if (strncmp(line, "sequence", 8) == 0)                  if (strncmp(line, "sequence", sizeof("sequence") - 1) == 0)
339                    {
340                            add_sequence(line + sizeof("sequence") - 1, mapname);
341                            continue;
342                    }
343    
344                    /* keyboard_type */
345                    if (strncmp(line, "keyboard_type ", sizeof("keyboard_type ") - 1) == 0)
346                  {                  {
347                          add_sequence(line + 8, mapname);                          g_keyboard_type = strtol(line + sizeof("keyboard_type ") - 1, NULL, 16);
348                            DEBUG_KBD(("keyboard_type 0x%x\n", g_keyboard_type));
349                            continue;
350                    }
351    
352                    /* keyboard_subtype */
353                    if (strncmp(line, "keyboard_subtype ", sizeof("keyboard_subtype ") - 1) == 0)
354                    {
355                            g_keyboard_subtype =
356                                    strtol(line + sizeof("keyboard_subtype ") - 1, NULL, 16);
357                            DEBUG_KBD(("keyboard_subtype 0x%x\n", g_keyboard_subtype));
358                            continue;
359                    }
360    
361                    /* keyboard_functionkeys */
362                    if (strncmp(line, "keyboard_functionkeys ", sizeof("keyboard_functionkeys ") - 1) ==
363                        0)
364                    {
365                            g_keyboard_functionkeys =
366                                    strtol(line + sizeof("keyboard_functionkeys ") - 1, NULL, 16);
367                            DEBUG_KBD(("keyboard_functionkeys 0x%x\n", g_keyboard_functionkeys));
368                          continue;                          continue;
369                  }                  }
370    
# Line 358  void Line 443  void
443  xkeymap_init(void)  xkeymap_init(void)
444  {  {
445          unsigned int max_keycode;          unsigned int max_keycode;
         char *mapname_ptr;  
446    
447          /* Make keymapname lowercase */          if (strcmp(g_keymapname, "none"))
         mapname_ptr = keymapname;  
         while (*mapname_ptr)  
448          {          {
449                  *mapname_ptr = tolower((int) *mapname_ptr);                  if (xkeymap_read(g_keymapname))
                 mapname_ptr++;  
         }  
   
         if (strcmp(keymapname, "none"))  
         {  
                 if (xkeymap_read(keymapname))  
450                          keymap_loaded = True;                          keymap_loaded = True;
451          }          }
452    
# Line 594  xkeymap_translate_key(uint32 keysym, uns Line 670  xkeymap_translate_key(uint32 keysym, uns
670    
671  void  void
672  xkeymap_send_keys(uint32 keysym, unsigned int keycode, unsigned int state, uint32 ev_time,  xkeymap_send_keys(uint32 keysym, unsigned int keycode, unsigned int state, uint32 ev_time,
673                    BOOL pressed)                    BOOL pressed, uint8 nesting)
674  {  {
675          key_translation tr, *ptr;          key_translation tr, *ptr;
676          tr = xkeymap_translate_key(keysym, keycode, state);          tr = xkeymap_translate_key(keysym, keycode, state);
# Line 627  xkeymap_send_keys(uint32 keysym, unsigne Line 703  xkeymap_send_keys(uint32 keysym, unsigne
703                  {                  {
704                          DEBUG_KBD(("Handling sequence element, keysym=0x%x\n",                          DEBUG_KBD(("Handling sequence element, keysym=0x%x\n",
705                                     (unsigned int) ptr->seq_keysym));                                     (unsigned int) ptr->seq_keysym));
706                          xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, True);  
707                          xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, False);                          if (nesting++ > 32)
708                            {
709                                    error("Sequence nesting too deep\n");
710                                    return;
711                            }
712    
713                            xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, True, nesting);
714                            xkeymap_send_keys(ptr->seq_keysym, keycode, state, ev_time, False, nesting);
715                          ptr = ptr->next;                          ptr = ptr->next;
716                  }                  }
717                  while (ptr);                  while (ptr);

Legend:
Removed from v.957  
changed lines
  Added in v.976

  ViewVC Help
Powered by ViewVC 1.1.26