SkillAgentSearch skills...

Xkbgroup

Query and change XKB layout state

Install / Use

/learn @hcpl/Xkbgroup
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

======== xkbgroup

.. image:: https://img.shields.io/badge/python-3.2+-blue.svg

.. image:: https://img.shields.io/pypi/v/xkbgroup.svg :target: https://pypi.python.org/pypi/xkbgroup

.. image:: https://img.shields.io/badge/license-MIT-blue.svg :target: https://github.com/hcpl/xkbgroup/blob/master/LICENSE

Use this library to change the keyboard layout through XKB extension (subsystem) of the X server system. Both library and command line script included.

.. contents:: Table of Contents

Dependencies

  • Python 3.2+
  • libX11.so.6 shared library which you must have by default if you use X server

Installation

From PyPI package xkbgroup__ ++++++++++++++++++++++++++++

__ https://pypi.python.org/pypi/xkbgroup

.. code-block:: sh

pip install xkbgroup

Library usage

.. code-block:: sh

Assume we have the following configuration

$ setxkbmap -layout us,ru,ua,fr

Change layout once before calling python

$ python

.. code-block:: python

from xkbgroup import XKeyboard xkb = XKeyboard() xkb.groups_count 4 xkb.group_num 1 xkb.group_num = 2 xkb.group_num 2 xkb.group_num -= 2 xkb.group_num 0 xkb.groups_names ['English (US)', 'Russian', 'Ukrainian', 'French'] xkb.group_name 'English (US)' xkb.group_name = 'Ukrainian' xkb.group_name 'Ukrainian' xkb.group_num 2 xkb.groups_symbols ['us', 'ru', 'ua', 'fr'] xkb.group_symbol 'ua' xkb.group_symbol = 'fr' xkb.group_symbol 'fr' xkb.groups_variants ['', '', '', ''] xkb.group_variant '' xkb.group_num -= 3 xkb.group_variant '' xkb.group_num 0 xkb.group_data GroupData(num=0, name='English (US)', symbol='us', variant='') xkb.groups_data [GroupData(num=0, name='English (US)', symbol='us', variant=''), GroupData(num=1, name= 'Russian', symbol='ru', variant=''), GroupData(num=2, name='Ukrainian', symbol='ua', va riant=''), GroupData(num=3, name='French', symbol='fr', variant='')] xkb.format('{num} => {symbol}') '0 => us' xkb.group_num = 1 xkb.format('{num} => {symbol}') '1 => ru' xkb.group_num = 3 xkb.format('{num}: {symbol} - {name} "{variant}"') '3: fr - French ""' xkb.format('{count}') '4' xkb.format('{names}') "['English (US)', 'Russian', 'Ukrainian', 'French']" xkb.format('{names::}') 'English (US)RussianUkrainianFrench' xkb.format('{names:: - }') 'English (US) - Russian - Ukrainian - French' xkb.format('{symbols:: - }') 'us - ru - ua - fr' xkb.format('{symbols:s: - }') 'us - ru - ua - fr' xkb.format('{all_data}') "[GroupData(num=0, name='English (US)', symbol='us', variant=''), GroupData(num=1, name ='Russian', symbol='ru', variant=''), GroupData(num=2, name='Ukrainian', symbol='ua', v ariant=''), GroupData(num=3, name='French', symbol='fr', variant='')]" xkb.format('{all_data:{{num}}}') "['0', '1', '2', '3']" xkb.format('{all_data:/* {{name}} /}') "['/ English (US) /', '/ Russian /', '/ Ukrainian /', '/ French */']" xkb.format('{all_data:{{symbol}}:\n}') 'us\nru\nua\nfr' print(xkb.format('{all_data:{{symbol}}:\n}')) us ru ua fr print(xkb.format('{all_data:{{num}}\: {{symbol}} - {{name}} - "{{variant}}":\n}')) 0: us - English (US) - "" 1: ru - Russian - "" 2: ua - Ukrainian - "" 3: fr - French - ""

Command line features mapping

+----------+-------------------------------------+--------------------------------------+ | Category | Library | Command line | +==========+=====================================+======================================+ | Get | xkb.group_num | xkbgroup get num | | +-------------------------------------+--------------------------------------+ | | xkb.group_name | xkbgroup get name | | +-------------------------------------+--------------------------------------+ | | xkb.group_symbol | xkbgroup get symbol | | +-------------------------------------+--------------------------------------+ | | xkb.group_variant | xkbgroup get variant | | +-------------------------------------+--------------------------------------+ | | xkb.group_data | xkbgroup get current_data | | +-------------------------------------+--------------------------------------+ | | xkb.groups_count | xkbgroup get count | | +-------------------------------------+--------------------------------------+ | | xkb.groups_names | xkbgroup get names | | +-------------------------------------+--------------------------------------+ | | xkb.groups_symbols | xkbgroup get symbols | | +-------------------------------------+--------------------------------------+ | | xkb.groups_variants | xkbgroup get variants | | +-------------------------------------+--------------------------------------+ | | xkb.groups_data | xkbgroup get all_data | +----------+-------------------------------------+--------------------------------------+ | Set | xkb.group_num = 2 | xkbgroup set num 2 | | +-------------------------------------+--------------------------------------+ | | xkb.group_name = 'English (US)' | xkbgroup set name 'English (US)' | | +-------------------------------------+--------------------------------------+ | | xkb.group_symbol = 'fr' | xkbgroup set symbol fr | +----------+-------------------------------------+--------------------------------------+ | Format | xkb.format('{format_str}') | xkbgroup format '{format_str}' | +----------+-------------------------------------+--------------------------------------+

Naming convention

Throughout the whole XKB subsystem the so-called groups represent actual keyboard layouts__. This library follows the same convention and names of the API methods start with group_ or groups_.

__ https://wiki.archlinux.org/index.php/X_KeyBoard_extension#Keycode_translation

Classes

These all reside in xkbgroup/core.py:

  • XKeyboard — the main class:

    • __init__(self, auto_open=True, non_symbols=None):

      • auto_open — if True then automatically call open_display() on initialization.
      • non_symbols — either iterable of string non-symbol names or None to use the default set of non-symbol names.
    • open_display() — establishes connection with X server and prepares objects necessary to retrieve and send data.

    • close_display() — closes connection with X server and cleans up objects created on open_display().

    • group_* — properties for accessing current group data:

      • group_num — get/set current group number (e.g. 0, 2, 3).
      • group_name — get/set current group full name (e.g. English (US), Russian, French).
      • group_symbol — get/set current group symbol (e.g. us, ru, fr).
      • group_variant — get (only) current group variant (e.g. , dos, latin9).
      • group_data — get (only) all data about the current group. In fact, assembles all previous group_* values.
    • groups_* — properties for querying info about all groups set by setxkbmap:

      • groups_count — get number of all groups.
      • groups_names — get names of all groups.
      • groups_symbols — get symbols of all groups.
      • groups_variants — get variants of all groups.
      • groups_data — get all data about all groups by assembling all previous groups_* values.
    • format() — obtain a formatted output, see <docs/formatting.rst>_ for details.

  • X11Error — an exception class, raised for errors on X server issues.

Helper files

There are also complementary files:

  • generate_bindings.sh — a shell script which generates Python bindings to X server structures, functions and #define definitions by:

    • converting X11 C headers using h2xml and xml2py;
    • creating ctypes references to functions from libX11.so.6 using xml2py.
  • xkbgroup/xkb.py — the output of the above script, usable for Xlib development under Python.

View on GitHub
GitHub Stars11
CategoryDevelopment
Updated12mo ago
Forks5

Languages

Python

Security Score

82/100

Audited on Apr 9, 2025

No findings