mutter/clutter/clutter/clutter-keysyms-update.py
Sebastian Wick 1fdebedd94 build: Fix argument type in clutter-keysyms-update.py
It's not a single-element-tuple but something we can iterate and
produces strings.

Also ignore typing for the requests module because we'd have to install
more things for it to be available.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4267>
2025-02-14 16:29:47 +00:00

139 lines
4.7 KiB
Python
Executable File

#!/usr/bin/env python3
# Author : Simos Xenitellis <simos at gnome dot org>.
# Author : Bastien Nocera <hadess@hadess.net>
# Author : Alberto Ruiz <aruiz@gnome.org>
# Version : 1.2
#
# Notes : It downloads keysymdef.h from the Internet,
# Notes : and creates an updated clutter-keysyms.h
import os
import sys
import re
from typing import TextIO, Iterable
import requests # type: ignore[import-untyped]
KEYSYMDEF_URL = "https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/raw/master/include/X11/keysymdef.h"
XF86KEYSYM_URL = "https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/raw/master/include/X11/XF86keysym.h"
LICENSE_HEADER = f"""/* Clutter
*
* Copyright (C) 2006, 2007, 2008 OpenedHand Ltd
* Copyright (C) 2009, 2010 Intel Corp
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses>.
*/
/*
* File auto-generated from script at:
* https://gitlab.gnome.org/GNOME/mutter/-/raw/main/clutter/clutter/clutter-keysyms-update.py?ref_type=heads&inline=false
*
* using the input files:
* {KEYSYMDEF_URL}
* and
* {XF86KEYSYM_URL}
*/
#pragma once
"""
CLUTTER_KEYSYMS_H = "clutter-keysyms.h"
def get_and_filter_header(
url: str,
prefix: str,
output_file: TextIO,
filter_out: Iterable[str] | None = None,
replaces: dict[str, str] | None = None,
):
"""
Fetches and processes a header file containing macro definitions, filtering
and transforming entries based on the specified prefix, exclusions, and
replacements.
Args:
url: The URL to fetch the file content from.
prefix: The prefix to filter the macro definitions in the file.
output_file: The file object where the filtered and transformed
definitions will be written.
filter_out: An iterable producing macro names to exclude from
processing. Defaults to None.
replaces: A dictionary mapping macro names to their replacements.
Defaults to None.
"""
for line in requests.get(url, timeout=5).text.splitlines():
if not line.startswith("#define " + prefix):
continue
keysymelements = line.split()
if len(keysymelements) < 3:
sys.exit(
f"Internal error, no properly defined keysym entry: {line}",
)
if keysymelements[2].startswith("_EVDEVK("):
value = int(keysymelements[2][8:-1], 0)
value += 0x10081000 # _EVDEVK macro does this
keysymelements[2] = hex(value)
elif not keysymelements[2].startswith("0x"):
sys.exit(
f'Internal error, was expecting "0x*", found: {keysymelements[2]}',
)
if filter_out and keysymelements[1] in filter_out:
continue
if replaces and keysymelements[1] in replaces.keys():
keysymelements[1] = replaces[keysymelements[1]]
binding = re.sub(f"^{prefix}", "CLUTTER_KEY_", keysymelements[1])
print(
f"#define {binding} 0x{int(keysymelements[2], 0):03x}",
file=output_file,
)
if __name__ == "__main__":
if os.path.exists(CLUTTER_KEYSYMS_H):
sys.exit(
f"""There is already a {CLUTTER_KEYSYMS_H} file in this directory. We are not overwriting it.
Please move it somewhere else in order to run this script.
Exiting...""",
)
with open(CLUTTER_KEYSYMS_H, "x", encoding="utf8") as output_file:
print(LICENSE_HEADER, file=output_file)
get_and_filter_header(KEYSYMDEF_URL, "XK_", output_file)
# Work-around https://bugs.freedesktop.org/show_bug.cgi?id=11193
# XF86XK_Clear could end up a dupe of XK_Clear
# XF86XK_Select could end up a dupe of XK_Select
# Ignore XF86XK_Qu, XF86XK_Calculater is misspelled, and a dupe
get_and_filter_header(
XF86KEYSYM_URL,
"XF86XK_",
output_file,
("XF86XK_Q", "XF86XK_Calculater", "XF86XK_Break"),
{
"XF86XK_XF86BackForward": "XF86XK_AudioForward",
"XF86XK_Clear": "XF86XK_WindowClear",
"XF86XK_Select": "XF86XK_SelectButton",
},
)