ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexey Gladkov <legion@altlinux.ru>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: Re: [devel] looking for xkbcommon experts
Date: Wed, 29 Dec 2021 17:18:09 +0100
Message-ID: <20211229161809.j4af7i7zosyeegxe@example.org> (raw)
In-Reply-To: <919251640787589@mail.yandex.ru>

[-- Attachment #1: Type: text/plain, Size: 1363 bytes --]

On Wed, Dec 29, 2021 at 06:23:14PM +0400, Igor Chudov wrote:
>    Добрый день.
>     
>    А можно ли получить больше информации о том, какую задачу планируется решать? Это позволит понять, корректно ли
>    задан вопрос и чем можно помочь.

Oк.

Я исследую возможность дампа keymap при заданной конфигурации. Например, у
меня есть конфигурация:

struct xkb_rule_names names = {
	.rules = "evdev",
	.model = "pc105",
	.layout = "us,ru",
	.variant = NULL,
	.options = "grp:lctrl_toggle"
};

Я могу сделать дамп (см. аттач), но я не могу понять как получить какой
модификатор используется для переключения layout. Переключатель есть
только в options и там много чего ещё есть. Более того, как-то странно
парсить руками эти опции.

Возможно я слаб в этой библиотеке и не нашёл как получить
XKB_KEY_Control_L для указанной конфигруации. Поэтому и решил спросить
тут.

-- 
Rgrds, legion


[-- Attachment #2: xkbcommon-dump-test.c --]
[-- Type: text/plain, Size: 2577 bytes --]

#include <stdlib.h>
#include <string.h>
#include <err.h>

#include <xkbcommon/xkbcommon.h>

#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))

/* Offset between evdev keycodes (where KEY_ESCAPE is 1), and the evdev XKB
 * keycode set (where ESC is 9). */
#define EVDEV_OFFSET 8

int main(int argc, char **argv)
{
	struct xkb_context *ctx;

	ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
	if (!ctx)
		errx(EXIT_FAILURE, "xkb_context_new failed");

	struct xkb_rule_names names = {
		.rules = "evdev",
		.model = "pc105",
		.layout = "us,ru",
		.variant = NULL,
		.options = "grp:lctrl_toggle"
	};

	struct xkb_keymap *keymap;

	keymap = xkb_keymap_new_from_names(ctx, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
	if (!keymap)
		errx(EXIT_FAILURE, "xkb_keymap_new_from_names failed");

	xkb_mod_index_t num_mods = xkb_keymap_num_mods(keymap);

	for (xkb_keycode_t keycode = 1; keycode < 255; keycode++) {
		xkb_keycode_t evdev_keycode = keycode + EVDEV_OFFSET;
		xkb_layout_index_t num_layouts = xkb_keymap_num_layouts_for_key(keymap, evdev_keycode);

		printf("keycode %3d =", keycode);

		for (xkb_layout_index_t layout = 0; layout < num_layouts; layout++) {
			xkb_level_index_t num_levels = xkb_keymap_num_levels_for_key(keymap, evdev_keycode, layout);

			printf(" | {%s}", xkb_keymap_layout_get_name(keymap, layout));

			for (xkb_level_index_t level = 0; level < num_levels; level++) {
				xkb_mod_mask_t masks[100];
				size_t num_masks;
				const xkb_keysym_t *syms;
				int num_syms;

				memset(masks, 0, sizeof(masks));

				num_masks = xkb_keymap_key_get_mods_for_level(keymap, evdev_keycode, layout, level, masks, ARRAY_SIZE(masks));
				num_syms  = xkb_keymap_key_get_syms_by_level(keymap, evdev_keycode, layout, level, &syms);

				for (int i = 0; i < num_syms; i++) {
					xkb_keysym_t sym = syms[i];

					for (size_t m = 0; m < num_masks; m++) {
						xkb_mod_mask_t mask = masks[m];

						char s[255];
						int ret;

						ret = xkb_keysym_get_name(sym, s, sizeof(s));

						if (ret < 0 || (size_t) ret >= sizeof(s))
							errx(EXIT_FAILURE, "Failed to get name of keysym");

						xkb_mod_index_t num_mods = xkb_keymap_num_mods(keymap);

						printf(" (");

						if (!mask)
							printf("Plain");

						int delim = 0;
						for (xkb_mod_index_t mod = 0; mod < num_mods; mod++) {
							if ((mask & (1 << mod)) == 0)
								continue;

							printf("%s%s",
									(delim ? " " : ""),
									xkb_keymap_mod_get_name(keymap, mod));

							delim = 1;
						}

						printf(") %s,", s);
					}
				}
			}
		}
		printf("\n");
	}

	return EXIT_SUCCESS;
}

  parent reply	other threads:[~2021-12-29 16:18 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-29 14:03 Alexey Gladkov
2021-12-29 16:18   ` Alexey Gladkov [this message]
2021-12-29 23:52     ` Vladislav Zavjalov
2021-12-30  0:07       ` Vladislav Zavjalov
2021-12-30  0:12         ` Alexey Gladkov
2021-12-30  0:28       ` Alexey Gladkov
2021-12-30 10:25         ` Vladislav Zavjalov
2021-12-30 11:43           ` Alexey Gladkov
2021-12-30 13:25             ` Vladislav Zavjalov
2022-02-12 23:06               ` Alexey Gladkov
2021-12-29 23:16 ` Leonid Krivoshein
2021-12-29 23:31   ` Alexey Gladkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211229161809.j4af7i7zosyeegxe@example.org \
    --to=legion@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git