aboutsummaryrefslogtreecommitdiff
path: root/src/system-layouts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/system-layouts.h')
-rw-r--r--src/system-layouts.h186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/system-layouts.h b/src/system-layouts.h
new file mode 100644
index 00000000..af9b2b5c
--- /dev/null
+++ b/src/system-layouts.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2024 Robert Tari <robert@tari.in>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3, as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranties of
+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __SYSTEM_LAYOUTS__
+#define __SYSTEM_LAYOUTS__
+
+G_BEGIN_DECLS
+
+static void getSystemLayouts (gchar *sLocation, GSList **lLayoutRec, GStrv *lSystemLayouts, gboolean bSystemLayouts)
+{
+ gboolean bExists = g_file_test (sLocation, G_FILE_TEST_EXISTS);
+
+ if (!bExists)
+ {
+ return;
+ }
+
+ gchar *sFile = NULL;
+ GError *pError = NULL;
+ g_file_get_contents (sLocation, &sFile, NULL, &pError);
+
+ if (pError)
+ {
+ g_error_free (pError);
+
+ return;
+ }
+
+ GRegex *pRegex = NULL;
+ gboolean bDefaultLocation = g_str_equal (sLocation, "/etc/default/keyboard");
+
+ if (bDefaultLocation)
+ {
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ pRegex = g_regex_new (" *XKBLAYOUT *= *\"*([,a-zA-Z0-9]*)\"*", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, &pError);
+ #else
+ pRegex = g_regex_new (" *XKBLAYOUT *= *\"*([,a-zA-Z0-9]*)\"*", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, &pError);
+ #endif
+ }
+ else
+ {
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ pRegex = g_regex_new (" *Option +\"*XkbLayout\"* +\"*([,a-zA-Z0-9]*)\"*", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, &pError);
+ #else
+ pRegex = g_regex_new (" *Option +\"*XkbLayout\"* +\"*([,a-zA-Z0-9]*)\"*", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, &pError);
+ #endif
+ }
+
+ if (pError)
+ {
+ g_warning ("Panic: Failed to compile regex: %s", pError->message);
+ g_error_free (pError);
+ g_free(sFile);
+
+ return;
+ }
+
+ GMatchInfo *pMatchInfo = NULL;
+
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ gboolean bMatch = g_regex_match (pRegex, sFile, G_REGEX_MATCH_DEFAULT, &pMatchInfo);
+ #else
+ gboolean bMatch = g_regex_match (pRegex, sFile, (GRegexMatchFlags) 0, &pMatchInfo);
+ #endif
+
+ if (!bMatch)
+ {
+ g_regex_unref (pRegex);
+ g_free(sFile);
+
+ return;
+ }
+
+ gchar *sLayouts = g_match_info_fetch (pMatchInfo, 1);
+ GStrv lLayouts = g_strsplit (sLayouts, ",", -1);
+ g_free (sLayouts);
+ g_match_info_free (pMatchInfo);
+ g_regex_unref (pRegex);
+
+ if (bDefaultLocation)
+ {
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ pRegex = g_regex_new (" *XKBVARIANT *= *\"*([,a-zA-Z0-9]*)\"*", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, &pError);
+ #else
+ pRegex = g_regex_new (" *XKBVARIANT *= *\"*([,a-zA-Z0-9]*)\"*", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, &pError);
+ #endif
+ }
+ else
+ {
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ pRegex = g_regex_new (" *Option +\"*XkbVariant\"* +\"*([,a-zA-Z0-9]*)\"*", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, &pError);
+ #else
+ pRegex = g_regex_new (" *Option +\"*XkbVariant\"* +\"*([,a-zA-Z0-9]*)\"*", (GRegexCompileFlags) 0, (GRegexMatchFlags) 0, &pError);
+ #endif
+ }
+
+ if (pError)
+ {
+ g_warning ("Panic: Failed to compile regex: %s", pError->message);
+ g_error_free (pError);
+ g_free(sFile);
+
+ return;
+ }
+
+ #if GLIB_CHECK_VERSION(2, 73, 0)
+ bMatch = g_regex_match (pRegex, sFile, G_REGEX_MATCH_DEFAULT, &pMatchInfo);
+ #else
+ bMatch = g_regex_match (pRegex, sFile, (GRegexMatchFlags) 0, &pMatchInfo);
+ #endif
+
+ if (!bMatch)
+ {
+ g_regex_unref (pRegex);
+ g_free(sFile);
+
+ return;
+ }
+
+ gchar *sVariants = g_match_info_fetch (pMatchInfo, 1);
+ GStrv lVariants = g_strsplit (sVariants, ",", -1);
+ g_free (sVariants);
+ g_match_info_free (pMatchInfo);
+ g_regex_unref (pRegex);
+ g_free(sFile);
+ guint nLayouts = g_strv_length (lLayouts);
+ GStrvBuilder *pBuilder = NULL;
+
+ if (bSystemLayouts)
+ {
+ pBuilder = g_strv_builder_new ();
+ }
+
+ for (guint nLayout = 0; nLayout < nLayouts; nLayout++)
+ {
+ gchar *sId = NULL;
+ guint nVariantLength = 0;
+
+ if (lVariants && lVariants[nLayout])
+ {
+ nVariantLength = strlen (lVariants[nLayout]);
+ }
+
+ if (nVariantLength)
+ {
+ sId = g_strconcat (lLayouts[nLayout], "+", lVariants[nLayout], NULL);
+ }
+ else
+ {
+ sId = g_strdup (lLayouts[nLayout]);
+ }
+
+ *lLayoutRec = g_slist_append (*lLayoutRec, sId);
+
+ if (bSystemLayouts)
+ {
+ g_strv_builder_add (pBuilder, sId);
+ }
+ }
+
+ if (bSystemLayouts)
+ {
+ *lSystemLayouts = g_strv_builder_end (pBuilder);
+ g_strv_builder_unref (pBuilder);
+ }
+
+ g_strfreev (lLayouts);
+ g_strfreev (lVariants);
+}
+
+G_END_DECLS
+
+#endif