コード例 #1
0
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 ' ';
}
コード例 #2
0
ファイル: xstring.c プロジェクト: voidptr/xneur-option
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;
	}
}
コード例 #3
0
ファイル: xstring.c プロジェクト: voidptr/xneur-option
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;
	}
}
コード例 #4
0
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;
}
コード例 #5
0
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;
}