--- /dev/null
+#!/usr/bin/python3
+# coding: utf-8
+import cairo
+import subprocess
+import math
+
+
+FONT_SIZE = 30
+MARGIN = int(FONT_SIZE / 3)
+
+def get_keymaps():
+ keymaps = subprocess.check_output(["localectl", "list-keymaps"]).decode("utf-8").strip().split()
+
+ # Note when changing this you MUST keep ply_keymap_normalize_keymap()
+ # from src/libply-splash-graphics/ply-keymap-icon.c in sync
+ def normalize_keymaps(keymap):
+ parts = keymap.replace("_", "-").replace(".", "-").split("-")
+
+ # Special case for dvorak, E.g. when mixing "us" and "us-dvorak"
+ # on machines returning "us" for both is not useful.
+ # Presumably users using dvorak now which variant they use
+ # so we just describe all dvorak layouts as "dvorak".
+ if "dvorak" in keymap:
+ return "dvorak"
+
+ # mac / sun keymaps are prefixes with mac / sun / sun[4-6]t
+ for prefix in ["mac", "sun" ]:
+ if keymap.startswith(prefix) and len(parts) > 1:
+ return parts[1]
+
+ return parts[0]
+
+ keymaps = list(map(normalize_keymaps ,keymaps))
+
+ #Remove duplicates
+ ret = []
+ for k in keymaps:
+ if k not in ret:
+ ret.append(k)
+ return ret
+
+
+# Calculate size
+sf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
+ct = cairo.Context(sf)
+ct.select_font_face("Cantarell", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
+ct.set_font_size(FONT_SIZE)
+
+max_height = 0.0
+total_width = 0.0
+for i in get_keymaps():
+ extents = ct.text_extents(i)
+ h = extents.height
+ if h > max_height:
+ max_height = h
+ total_width += extents.width
+ total_width += MARGIN * 2
+ascent, descent, _h, _max_x, max_y = ct.font_extents()
+
+# Create image
+sf = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(total_width), int(max_height + MARGIN * 2))
+ct = cairo.Context(sf)
+ct.save()
+ct.set_source_rgba(0, 0, 0, 0)
+ct.set_operator (cairo.OPERATOR_SOURCE)
+ct.paint()
+ct.restore()
+ct.select_font_face("Cantarell", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
+ct.set_font_size(FONT_SIZE)
+ct.set_source_rgba(0.9, 0.9, 0.9, 1.0)
+
+ct.move_to(MARGIN, MARGIN + max_height - descent)
+current_x, current_y = (MARGIN, MARGIN + max_height - descent)
+metadata = []
+for km in get_keymaps():
+ extents = ct.text_extents(km)
+ ct.show_text(km)
+ metadata.append((km, current_x, extents.width + MARGIN * 2))
+ current_x += extents.width + (MARGIN * 2)
+ ct.move_to(current_x, current_y)
+
+sf.write_to_png("keymap-render.png")
+
+print("/* This file is autogenerated by running:")
+print(" * scripts/keymap-render.py > src/libply-splash-graphics/ply-keymap-metadata.h")
+print(" */")
+print("struct ply_keymap_metadata {")
+print(" const char *name;")
+print(" int offset;")
+print(" int width;")
+print("};")
+print("")
+print("static struct ply_keymap_metadata ply_keymap_metadata[] = {")
+
+for i in metadata:
+ print((" { \"%s\", %d, %d }," % (i[0],i[1],i[2])))
+
+print(" { NULL, } /* End of array marker */ ")
+print("};")
--- /dev/null
+/* This file is autogenerated by running:
+ * scripts/keymap-render.py > src/libply-splash-graphics/ply-keymap-metadata.h
+ */
+struct ply_keymap_metadata {
+ const char *name;
+ int offset;
+ int width;
+};
+
+static struct ply_keymap_metadata ply_keymap_metadata[] = {
+ { "dvorak", 10, 113 },
+ { "al", 123, 44 },
+ { "amiga", 167, 101 },
+ { "applkey", 268, 126 },
+ { "at", 394, 46 },
+ { "atari", 440, 81 },
+ { "az", 521, 49 },
+ { "azerty", 570, 104 },
+ { "ba", 674, 49 },
+ { "backspace", 723, 157 },
+ { "bashkir", 880, 119 },
+ { "be", 999, 50 },
+ { "bg", 1049, 51 },
+ { "br", 1100, 48 },
+ { "by", 1148, 51 },
+ { "bywin", 1199, 98 },
+ { "ca", 1297, 47 },
+ { "carpalx", 1344, 118 },
+ { "cf", 1462, 45 },
+ { "ch", 1507, 49 },
+ { "cm", 1556, 59 },
+ { "cn", 1615, 49 },
+ { "croat", 1664, 89 },
+ { "ctrl", 1753, 65 },
+ { "cz", 1818, 47 },
+ { "de", 1865, 51 },
+ { "defkeymap", 1916, 170 },
+ { "dk", 2086, 53 },
+ { "dz", 2139, 50 },
+ { "ee", 2189, 50 },
+ { "emacs", 2239, 106 },
+ { "emacs2", 2345, 122 },
+ { "en", 2467, 51 },
+ { "epo", 2518, 68 },
+ { "es", 2586, 49 },
+ { "et", 2635, 46 },
+ { "euro", 2681, 80 },
+ { "euro1", 2761, 95 },
+ { "euro2", 2856, 97 },
+ { "fi", 2953, 38 },
+ { "fo", 2991, 47 },
+ { "fr", 3038, 44 },
+ { "gb", 3082, 53 },
+ { "ge", 3135, 51 },
+ { "gh", 3186, 52 },
+ { "gr", 3238, 49 },
+ { "hr", 3287, 48 },
+ { "hu", 3335, 50 },
+ { "hu101", 3385, 99 },
+ { "ie", 3484, 42 },
+ { "il", 3526, 36 },
+ { "in", 3562, 43 },
+ { "iq", 3605, 43 },
+ { "ir", 3648, 40 },
+ { "is", 3688, 41 },
+ { "it", 3729, 38 },
+ { "it2", 3767, 54 },
+ { "jp", 3821, 46 },
+ { "jp106", 3867, 96 },
+ { "kazakh", 3963, 112 },
+ { "ke", 4075, 49 },
+ { "keypad", 4124, 114 },
+ { "kr", 4238, 47 },
+ { "ky", 4285, 50 },
+ { "kyrgyz", 4335, 107 },
+ { "kz", 4442, 48 },
+ { "la", 4490, 42 },
+ { "latam", 4532, 97 },
+ { "lk", 4629, 45 },
+ { "lt", 4674, 39 },
+ { "lv", 4713, 44 },
+ { "ma", 4757, 59 },
+ { "pl", 4816, 44 },
+ { "pt", 4860, 46 },
+ { "se", 4906, 48 },
+ { "template", 4954, 142 },
+ { "uk", 5096, 53 },
+ { "us", 5149, 50 },
+ { "md", 5199, 61 },
+ { "me", 5260, 60 },
+ { "mk", 5320, 62 },
+ { "mk0", 5382, 79 },
+ { "ml", 5461, 54 },
+ { "mm", 5515, 71 },
+ { "mt", 5586, 56 },
+ { "ng", 5642, 51 },
+ { "nl", 5693, 44 },
+ { "nl2", 5737, 60 },
+ { "no", 5797, 51 },
+ { "pc110", 5848, 95 },
+ { "ph", 5943, 51 },
+ { "pl1", 5994, 58 },
+ { "pl2", 6052, 60 },
+ { "pl3", 6112, 60 },
+ { "pl4", 6172, 62 },
+ { "ro", 6234, 46 },
+ { "rs", 6280, 44 },
+ { "ru", 6324, 45 },
+ { "ru1", 6369, 61 },
+ { "ru2", 6430, 63 },
+ { "ru3", 6493, 63 },
+ { "ru4", 6556, 65 },
+ { "ruwin", 6621, 95 },
+ { "sg", 6716, 49 },
+ { "si", 6765, 40 },
+ { "sk", 6805, 50 },
+ { "slovene", 6855, 122 },
+ { "sr", 6977, 46 },
+ { "sunkeymap", 7023, 174 },
+ { "sv", 7197, 49 },
+ { "sy", 7246, 49 },
+ { "tj", 7295, 38 },
+ { "tm", 7333, 57 },
+ { "tr", 7390, 44 },
+ { "tralt", 7434, 79 },
+ { "trf", 7513, 55 },
+ { "trq", 7568, 59 },
+ { "ttwin", 7627, 90 },
+ { "tw", 7717, 56 },
+ { "ua", 7773, 50 },
+ { "unicode", 7823, 124 },
+ { "uz", 7947, 50 },
+ { "vn", 7997, 51 },
+ { "wangbe", 8048, 126 },
+ { "wangbe2", 8174, 143 },
+ { "windowkeys", 8317, 188 },
+ { NULL, } /* End of array marker */
+};