/*****************************************************************************/ struct xrdp_key_info *
get_key_info_from_scan_code(int device_flags, int scan_code, int *keys, int caps_lock, int num_lock, int scroll_lock, struct xrdp_keymap *keymap)
{ struct xrdp_key_info *rv; int shift; int altgr; int ext; int index;
/* keymap file is created with numlock off so we have to do this */ if ((index >= 79) && (index <= 91))
{ if (num_lock)
{
rv = &(keymap->keys_shift[index]);
} else
{
rv = &(keymap->keys_noshift[index]);
}
} elseif (shift && caps_lock && altgr)
{
rv = &(keymap->keys_shiftcapslockaltgr[index]);
} elseif (shift && caps_lock)
{
rv = &(keymap->keys_shiftcapslock[index]);
} elseif (shift && altgr)
{
rv = &(keymap->keys_shiftaltgr[index]);
} elseif (shift)
{
rv = &(keymap->keys_shift[index]);
} elseif (caps_lock && altgr)
{
rv = &(keymap->keys_capslockaltgr[index]);
} elseif (caps_lock)
{
rv = &(keymap->keys_capslock[index]);
} elseif (altgr)
{
rv = &(keymap->keys_altgr[index]);
} else
{
rv = &(keymap->keys_noshift[index]);
}
return rv;
}
/*****************************************************************************/ int
get_keysym_from_scan_code(int device_flags, int scan_code, int *keys, int caps_lock, int num_lock, int scroll_lock, struct xrdp_keymap *keymap)
{ struct xrdp_key_info *ki;
ki = get_key_info_from_scan_code(device_flags, scan_code, keys,
caps_lock, num_lock, scroll_lock,
keymap);
if (ki == 0)
{ return0;
}
return ki->sym;
}
/*****************************************************************************/
char32_t
get_char_from_scan_code(int device_flags, int scan_code, int *keys, int caps_lock, int num_lock, int scroll_lock, struct xrdp_keymap *keymap)
{ struct xrdp_key_info *ki;
ki = get_key_info_from_scan_code(device_flags, scan_code, keys,
caps_lock, num_lock, scroll_lock,
keymap);
if (ki == 0)
{ return0;
}
return ki->chr;
}
/*****************************************************************************/ staticint
km_read_section(int fd, constchar *section_name, struct xrdp_key_info *keymap)
{ struct list *names; struct list *values; int index; int code; int pos1; char *name; char *value;
/*****************************************************************************/ int
get_keymaps(int keylayout, struct xrdp_keymap *keymap)
{ int basic_key_layout = keylayout & 0x0000ffff; char *filename; struct xrdp_keymap *lkeymap;
filename = (char *)g_malloc(256, 0);
/* check if there is a keymap file e.g. km-e00100411.ini */
g_snprintf(filename, 255, "%s/km-%08x.ini", XRDP_CFG_PATH, keylayout);
/* if the file does not exist, use only lower 16 bits instead */ if (!g_file_exist(filename))
{
LOG(LOG_LEVEL_WARNING, "Cannot find keymap file %s", filename); /* e.g. km-00000411.ini */
g_snprintf(filename, 255, "%s/km-%08x.ini", XRDP_CFG_PATH, basic_key_layout);
}
/* finally, use 'en-us' */ if (!g_file_exist(filename))
{
LOG(LOG_LEVEL_WARNING, "Cannot find keymap file %s", filename);
g_snprintf(filename, 255, "%s/km-00000409.ini", XRDP_CFG_PATH);
}
if (g_file_exist(filename))
{
lkeymap = (struct xrdp_keymap *)g_malloc(sizeof(struct xrdp_keymap), 0); /* make a copy of the built-in keymap */
g_memcpy(lkeymap, keymap, sizeof(struct xrdp_keymap));
km_load_file(filename, keymap);
if (g_memcmp(lkeymap, keymap, sizeof(struct xrdp_keymap)) != 0)
{
LOG(LOG_LEVEL_WARNING, "local keymap file for 0x%08x found and doesn't match " "built in keymap, using local keymap file", keylayout);
}
g_free(lkeymap);
} else
{
LOG(LOG_LEVEL_WARNING, "File does not exist: %s", filename);
}
g_free(filename); return0;
}
/*****************************************************************************/ int km_load_file(constchar *filename, struct xrdp_keymap *keymap)
{ int fd;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.