Xkbgroup
Query and change XKB layout state
Install / Use
/learn @hcpl/XkbgroupREADME
======== 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.6shared 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— ifTruethen automatically callopen_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 onopen_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 previousgroup_*values.
-
groups_*— properties for querying info about all groups set bysetxkbmap: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 previousgroups_*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#definedefinitions by:- converting X11 C headers using
h2xmlandxml2py; - creating
ctypesreferences to functions fromlibX11.so.6usingxml2py.
- converting X11 C headers using
-
xkbgroup/xkb.py— the output of the above script, usable for Xlib development under Python.
