static char keymap_get_cur_ascii_char(struct _keymap *p, XEvent *e) { XKeyEvent *ke = (XKeyEvent *)e; int mod = 0; if (ke->state & ShiftMask) mod = ShiftMask; if (ke->state & NumlockMask) mod |= NumlockMask; char *symbol = (char *) malloc((256 + 1) * sizeof(char)); ke->state = get_keycode_mod(p->latin_group); ke->state |= mod; int nbytes = XLookupString(ke, symbol, 256, NULL, NULL); if (nbytes > 0) { char sym = symbol[0]; free(symbol); return sym; } free(symbol); return ' '; }
void xstring_set_key_code(struct _xstring *p, int lang) { int keycode_mod = get_keycode_mod(xconfig->get_lang_group(xconfig, lang)); int languages_mask = get_languages_mask(); // Set new language bit for (int i = 0; i < p->cur_pos; i++) { p->keycode_modifiers[i] = p->keycode_modifiers[i] & (~languages_mask); p->keycode_modifiers[i] = p->keycode_modifiers[i] | keycode_mod; } }
void xstring_set_key_code(struct _xstring *p, int lang) { int keycode_mod = get_keycode_mod(xconfig->xkb_groups[lang]); int i; for (i = 0; i < p->cur_pos; i++) { char sym = p->content[i]; KeySym ks = char_to_keysym(sym); int shift_mod = None; if (is_upper_non_alpha_cyr(sym) || isupper(sym)) shift_mod = ShiftMask; p->keycode[i] = XKeysymToKeycode(main_window->display, ks); p->keycode_modifiers[i] = (keycode_mod | shift_mod); // Xlib (error '<') patch >> if (ks == XK_less && p->keycode[i] == 94) p->keycode[i] = 59; } }
static char* keymap_lower_by_keymaps(struct _keymap *p, int gr, char *text) { if (text == NULL) return NULL; char *symbol_old = (char *) malloc((256 + 1) * sizeof(char)); char *symbol_new = (char *) malloc((256 + 1) * sizeof(char)); char *prev_symbols = (char *) malloc((256 + 1) * sizeof(char)); char *newtext = strdup(text); KeySym *keymap = p->keymap; for (int i = p->min_keycode; i <= p->max_keycode; i++) { int max = p->keysyms_per_keycode - 1; while (max >= 0 && keymap[max] == NoSymbol) max--; prev_symbols[0] = NULLSYM; for (int j = 1; j <= max; j += 2) { if (keymap[j] == NoSymbol) continue; for (int m = 0; m < 4; m++) // Modifiers { for (int n = 0; n < 4; n++) { if (n == m) continue; // Get BIG symbol from keymap XEvent event; event.type = KeyPress; event.xkey.type = KeyPress; event.xkey.root = RootWindow(p->display, DefaultScreen(p->display)); event.xkey.subwindow = None; event.xkey.same_screen = True; event.xkey.display = p->display; event.xkey.keycode = i; event.xkey.state = get_keycode_mod(gr); event.xkey.state |= state_masks[m]; event.xkey.state |= state_masks[n]; event.xkey.time = CurrentTime; int nbytes = XLookupString((XKeyEvent *) &event, symbol_old, 256, NULL, NULL); if (nbytes <= 0) continue; symbol_old[nbytes] = NULLSYM; if (strstr(prev_symbols, symbol_old) != NULL) continue; // Get small symbol event.xkey.state = 0; event.xkey.state |= state_masks[m]; event.xkey.state |= state_masks[n]; event.xkey.state &= ~ShiftMask; nbytes = XLookupString((XKeyEvent *) &event, symbol_new, 256, NULL, NULL); if (nbytes <= 0) continue; symbol_new[nbytes] = NULLSYM; char *replaced = str_replace(newtext, symbol_old, symbol_new); free(newtext); newtext = replaced; } } } keymap += p->keysyms_per_keycode; } free(prev_symbols); free(symbol_new); free(symbol_old); return newtext; }
static char keymap_get_ascii_real(struct _keymap *p, const char *sym, int* preferred_lang, KeyCode *kc, int *modifier, size_t* symbol_len) { if (*sym == 10 || *sym == 13) { *kc = XKeysymToKeycode(p->display, XK_Return); *modifier = 0; if (symbol_len) *symbol_len = 1; return *sym; } XEvent event; event.type = KeyPress; event.xkey.type = KeyPress; event.xkey.root = RootWindow(p->display, DefaultScreen(p->display)); event.xkey.subwindow = None; event.xkey.same_screen = True; event.xkey.display = p->display; event.xkey.state = 0; event.xkey.keycode = XKeysymToKeycode(p->display, XK_space); event.xkey.time = CurrentTime; char *symbol = (char *) malloc((256 + 1) * sizeof(char)); char *prev_symbols = (char *) malloc((256 + 1) * sizeof(char)); int _preferred_lang = 0; if (preferred_lang) _preferred_lang = *preferred_lang; for (int _lang = 0; _lang < p->handle->total_languages; _lang++) { int lang = _lang; if (lang == 0) lang = _preferred_lang; else if (lang <= _preferred_lang) lang--; KeySym *keymap = p->keymap; for (int i = p->min_keycode; i <= p->max_keycode; i++) { int max = p->keysyms_per_keycode - 1; while (max >= 0 && keymap[max] == NoSymbol) max--; prev_symbols[0] = NULLSYM; for (int j = 0; j <= max; j++) { if (keymap[j] == NoSymbol) continue; for (int n = 0; n < 3; n++) { for (int m = 0; m < 3; m++) // Modifiers { event.xkey.keycode = i; event.xkey.state = get_keycode_mod(lang); event.xkey.state |= state_masks[m]; event.xkey.state |= state_masks[n]; int nbytes = XLookupString((XKeyEvent *) &event, symbol, 256, NULL, NULL); if (nbytes <= 0) continue; symbol[nbytes] = NULLSYM; if (strstr(prev_symbols, symbol) != NULL) continue; strcat(prev_symbols, symbol); if (strncmp(sym, symbol, strlen(symbol)) != 0) continue; size_t _symbol_len = strlen(symbol); event.xkey.state = get_keycode_mod(p->latin_group); event.xkey.state |= state_masks[m]; event.xkey.state |= state_masks[n]; nbytes = XLookupString((XKeyEvent *) &event, symbol, 256, NULL, NULL); if (nbytes <= 0) continue; char sym = symbol[0]; free(prev_symbols); free(symbol); *kc = event.xkey.keycode; event.xkey.state = 0; event.xkey.state |= state_masks[m]; event.xkey.state |= state_masks[n]; *modifier = get_keycode_mod(lang) | event.xkey.state; if (symbol_len) *symbol_len = _symbol_len; if (preferred_lang) *preferred_lang = lang; return sym; } } } keymap += p->keysyms_per_keycode; } } free(prev_symbols); free(symbol); return NULLSYM; }