From 17394a6f684b46e9f4bc2ed039515b09971b39d9 Mon Sep 17 00:00:00 2001
From: Robert Tari <robert@tari.in>
Date: Wed, 14 May 2025 16:22:42 +0200
Subject: [PATCH 1/2] Fix showing current layout on Lomiri

Just like GNOME did, we are switching to tecla here, since gkbd-keyboard-display does not work under Wayland.

fixes https://github.com/AyatanaIndicators/ayatana-indicator-keyboard/issues/76
---
 src/keyboard-lomiri.c |  9 +++++++--
 src/keyboard-x11.c    | 13 ++++++++++---
 src/keyboard.h        |  4 ++--
 src/service.c         | 20 +++++++++++++++-----
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/src/keyboard-lomiri.c b/src/keyboard-lomiri.c
index c00bc55a1..bc6b3f93a 100644
--- a/src/keyboard-lomiri.c
+++ b/src/keyboard-lomiri.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2024 Robert Tari <robert@tari.in>
+ * Copyright 2021-2025 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
@@ -179,7 +179,7 @@ guint keyboard_GetLayoutIndex (Keyboard *pKeyboard)
     return pKeyboard->pPrivate->nLayout;
 }
 
-void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription)
+void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription, gchar **pId)
 {
     if (nLayout == -1)
     {
@@ -199,6 +199,11 @@ void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gc
     {
         *pDescription = g_strdup(pLayout->sDescription);
     }
+
+    if (pId != NULL)
+    {
+        *pId = g_strdup (sLayout);
+    }
 }
 
 void keyboard_SetLayout(Keyboard *pKeyboard, gint nLayout)
diff --git a/src/keyboard-x11.c b/src/keyboard-x11.c
index d7d482f5c..27dfb97cd 100644
--- a/src/keyboard-x11.c
+++ b/src/keyboard-x11.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2024 Robert Tari <robert@tari.in>
+ * Copyright 2021-2025 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
@@ -390,7 +390,7 @@ guint keyboard_GetLayoutIndex (Keyboard *pKeyboard)
     return pKeyboard->pPrivate->nLayout;
 }
 
-void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription)
+void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription, gchar **pId)
 {
     if (nLayout == -1)
     {
@@ -432,7 +432,14 @@ void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gc
         *pDescription = g_strdup(pLayout->sDescription);
     }
 
-    g_free(sId);
+    if (pId != NULL)
+    {
+        *pId = sId;
+    }
+    else
+    {
+        g_free(sId);
+    }
 }
 
 void keyboard_SetLayout(Keyboard *pKeyboard, gint nLayout)
diff --git a/src/keyboard.h b/src/keyboard.h
index 39f822cdf..49c210561 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021-2023 Robert Tari <robert@tari.in>
+ * Copyright 2021-2025 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
@@ -48,7 +48,7 @@ Keyboard* keyboard_new();
 void keyboard_AddSource(Keyboard *pKeyboard);
 guint keyboard_GetNumLayouts(Keyboard *pKeyboard);
 guint keyboard_GetLayoutIndex (Keyboard *pKeyboard);
-void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription);
+void keyboard_GetLayout(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription, gchar **pId);
 void keyboard_SetLayout(Keyboard *pKeyboard, gint nLayout);
 
 G_END_DECLS
diff --git a/src/service.c b/src/service.c
index 31f6ca3b1..f4b086cc0 100644
--- a/src/service.c
+++ b/src/service.c
@@ -31,7 +31,7 @@ static Keyboard* (*m_fnKeyboardNew)();
 static void (*m_fnKeyboardAddSource)(Keyboard *pKeyboard);
 static guint (*m_fnKeyboardGetNumLayouts)(Keyboard *pKeyboard);
 static guint (*m_fnKeyboardGetLayoutIndex)(Keyboard *pKeyboard);
-static void (*m_fnKeyboardGetLayout)(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription);
+static void (*m_fnKeyboardGetLayout)(Keyboard *pKeyboard, gint nLayout, gchar **pLanguage, gchar **pDescription, gchar **pId);
 static void (*m_fnKeyboardSetLayout)(Keyboard *pKeyboard, gint nLayout);
 
 enum
@@ -121,7 +121,7 @@ static GVariant* createHeaderState(IndicatorKeyboardService *self, int nProfile)
     else
     {
         gchar *sLanguage;
-        m_fnKeyboardGetLayout(self->pPrivate->pKeyboard, -1, &sLanguage, NULL);
+        m_fnKeyboardGetLayout(self->pPrivate->pKeyboard, -1, &sLanguage, NULL, NULL);
 
         gchar *sIcon = g_strconcat("ayatana-indicator-keyboard-", sLanguage, NULL);
         g_free(sLanguage);
@@ -158,7 +158,7 @@ static GMenuModel* createLayoutSection(IndicatorKeyboardService *self)
     {
         gchar *sLanguage;
         gchar *sDescription;
-        m_fnKeyboardGetLayout(self->pPrivate->pKeyboard, nLayout, &sLanguage, &sDescription);
+        m_fnKeyboardGetLayout(self->pPrivate->pKeyboard, nLayout, &sLanguage, &sDescription, NULL);
         GMenuItem *pItem = g_menu_item_new(sDescription, NULL);
         g_free(sDescription);
         g_menu_item_set_action_and_target_value(pItem, "indicator.layout", g_variant_new_byte(nLayout));
@@ -345,17 +345,27 @@ static void onDisplay (GSimpleAction *pAction, GVariant *pVariant, gpointer pDat
     IndicatorKeyboardService *self = INDICATOR_KEYBOARD_SERVICE (pData);
     guint nLayout = m_fnKeyboardGetLayoutIndex (self->pPrivate->pKeyboard);
     gchar *sProgram = NULL;
+    gchar *sArgs = NULL;
+    gboolean bMate = ayatana_common_utils_is_mate ();
+    gboolean bLomiri = ayatana_common_utils_is_lomiri ();
 
-    if (ayatana_common_utils_is_mate ())
+    if (bMate)
     {
         sProgram = "matekbd-keyboard-display";
+        sArgs = g_strdup_printf ("-g %i", nLayout + 1);
+    }
+    else if (bLomiri)
+    {
+
+        sProgram = "tecla";
+        m_fnKeyboardGetLayout (self->pPrivate->pKeyboard, -1, NULL, NULL, &sArgs);
     }
     else
     {
         sProgram = "gkbd-keyboard-display";
+        sArgs = g_strdup_printf ("-g %i", nLayout + 1);
     }
 
-    gchar *sArgs = g_strdup_printf ("-g %i", nLayout + 1);
     ayatana_common_utils_execute_command_warn (sProgram, sArgs);
     g_free (sArgs);
 }
