aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/CMakeLists.txt8
-rw-r--r--data/org.ayatana.indicator.keyboard.gschema.xml.in19
-rw-r--r--src/service.c91
3 files changed, 97 insertions, 21 deletions
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index 39bd0458..35bbfd54 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -53,3 +53,11 @@ install(FILES org.ayatana.indicator.keyboard.AccountsService.policy DESTINATION
# 50-org.ayatana.indicator.keyboard.AccountsService.pkla
install(FILES 50-org.ayatana.indicator.keyboard.AccountsService.pkla DESTINATION "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/polkit-1/localauthority/10-vendor.d")
+
+# org.ayatana.indicator.keyboard.gschema.xml
+
+find_package (Intltool REQUIRED)
+set (ENV{LC_ALL} "C")
+intltool_merge_translations ("${CMAKE_CURRENT_SOURCE_DIR}/org.ayatana.indicator.keyboard.gschema.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/org.ayatana.indicator.keyboard.gschema.xml" ALL UTF8 STYLE "xml" NO_TRANSLATIONS)
+find_package (GSettings REQUIRED)
+add_schema ("org.ayatana.indicator.keyboard.gschema.xml")
diff --git a/data/org.ayatana.indicator.keyboard.gschema.xml.in b/data/org.ayatana.indicator.keyboard.gschema.xml.in
new file mode 100644
index 00000000..e80a89e9
--- /dev/null
+++ b/data/org.ayatana.indicator.keyboard.gschema.xml.in
@@ -0,0 +1,19 @@
+<schemalist>
+ <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.ayatana.indicator.keyboard" path="/org/ayatana/indicator/keyboard/">
+ <key name="language-icon-desktop" type="b">
+ <default>true</default>
+ <_summary>Show the language icon in desktop mode.</_summary>
+ <_description>If enabled, the indicator shows the current layout icon. Otherwise, it displays a generic keyboard icon.</_description>
+ </key>
+ <key name="language-icon-phone" type="b">
+ <default>false</default>
+ <_summary>Show the language icon in phone mode.</_summary>
+ <_description>If enabled, the indicator shows the current layout icon. Otherwise, it displays a generic keyboard icon.</_description>
+ </key>
+ <key name="language-icon-greeter" type="b">
+ <default>false</default>
+ <_summary>Show the language icon in the greeter.</_summary>
+ <_description>If enabled, the indicator shows the current layout icon. Otherwise, it displays a generic keyboard icon.</_description>
+ </key>
+ </schema>
+</schemalist>
diff --git a/src/service.c b/src/service.c
index fec90d85..3dabf5c9 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2021 Robert Tari <robert@tari.in>
+ * Copyright 2021-2022 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
@@ -60,6 +60,7 @@ struct ProfileMenuInfo
GMenu *pMenu;
GMenu *pSubmenu;
guint nExportId;
+ GSimpleAction *pHeaderAction;
};
struct _IndicatorKeyboardServicePrivate
@@ -71,18 +72,18 @@ struct _IndicatorKeyboardServicePrivate
gboolean bMenusBuilt;
struct ProfileMenuInfo lMenus[N_PROFILES];
GSimpleActionGroup *pActionGroup;
- GSimpleAction *pHeaderAction;
GSimpleAction *pSettingsAction;
GSimpleAction *pLayoutAction;
GMenu *pLayoutSection;
Keyboard *pKeyboard;
+ GSettings *pSettings;
};
typedef IndicatorKeyboardServicePrivate priv_t;
G_DEFINE_TYPE_WITH_PRIVATE(IndicatorKeyboardService, indicator_keyboard_service, G_TYPE_OBJECT)
-static GVariant* createHeaderState(IndicatorKeyboardService *self)
+static GVariant* createHeaderState(IndicatorKeyboardService *self, int nProfile)
{
GVariantBuilder cBuilder;
g_variant_builder_init(&cBuilder, G_VARIANT_TYPE("a{sv}"));
@@ -90,8 +91,26 @@ static GVariant* createHeaderState(IndicatorKeyboardService *self)
g_variant_builder_add(&cBuilder, "{sv}", "tooltip", g_variant_new_string(_("Keyboard layout switcher and settings")));
g_variant_builder_add(&cBuilder, "{sv}", "visible", g_variant_new_boolean(TRUE));
+ gchar *sKey = NULL;
+
+ if (nProfile == PROFILE_DESKTOP)
+ {
+ sKey = "language-icon-desktop";
+ }
+ else if (nProfile == PROFILE_PHONE)
+ {
+ sKey = "language-icon-phone";
+ }
+ else if (nProfile == PROFILE_GREETER)
+ {
+ sKey = "language-icon-greeter";
+ }
+
+ gboolean bLayout = g_settings_get_boolean (self->pPrivate->pSettings, sKey);
GIcon *pIcon = NULL;
- if (ayatana_common_utils_is_lomiri()) {
+
+ if (bLayout == FALSE)
+ {
pIcon = g_themed_icon_new_with_default_fallbacks(ICON_DEFAULT);
}
else
@@ -124,7 +143,7 @@ static GVariant* createHeaderState(IndicatorKeyboardService *self)
return g_variant_builder_end(&cBuilder);
}
-static GMenuModel* createDesktopLayoutSection(IndicatorKeyboardService *self, int nProfile)
+static GMenuModel* createLayoutSection(IndicatorKeyboardService *self)
{
self->pPrivate->pLayoutSection = g_menu_new();
@@ -160,7 +179,7 @@ static GMenuModel* createDesktopLayoutSection(IndicatorKeyboardService *self, in
return G_MENU_MODEL(self->pPrivate->pLayoutSection);
}
-static GMenuModel* createDesktopSettingsSection(IndicatorKeyboardService *self)
+static GMenuModel* createSettingsSection(IndicatorKeyboardService *self)
{
GMenu * pMenu = g_menu_new();
g_menu_append(pMenu, _("Keyboard Settingsā€¦"), "indicator.settings");
@@ -178,11 +197,14 @@ static void rebuildSection(GMenu *pMenu, int nPos, GMenuModel *pModel)
static void rebuildNow(IndicatorKeyboardService *self, guint nSections)
{
struct ProfileMenuInfo *pInfoDesktop = &self->pPrivate->lMenus[PROFILE_DESKTOP];
+ struct ProfileMenuInfo *pInfoPhone = &self->pPrivate->lMenus[PROFILE_PHONE];
struct ProfileMenuInfo *pInfoGreeter = &self->pPrivate->lMenus[PROFILE_GREETER];
if (nSections & SECTION_HEADER)
{
- g_simple_action_set_state(self->pPrivate->pHeaderAction, createHeaderState(self));
+ g_simple_action_set_state(pInfoDesktop->pHeaderAction, createHeaderState(self, PROFILE_DESKTOP));
+ g_simple_action_set_state(pInfoPhone->pHeaderAction, createHeaderState(self, PROFILE_PHONE));
+ g_simple_action_set_state(pInfoGreeter->pHeaderAction, createHeaderState(self, PROFILE_GREETER));
}
if (!self->pPrivate->bMenusBuilt)
@@ -192,13 +214,15 @@ static void rebuildNow(IndicatorKeyboardService *self, guint nSections)
if (nSections & SECTION_LAYOUTS)
{
- rebuildSection(pInfoDesktop->pSubmenu, 0, createDesktopLayoutSection(self, PROFILE_DESKTOP));
- rebuildSection(pInfoGreeter->pSubmenu, 0, createDesktopLayoutSection(self, PROFILE_GREETER));
+ rebuildSection(pInfoDesktop->pSubmenu, 0, createLayoutSection(self));
+ rebuildSection(pInfoPhone->pSubmenu, 0, createLayoutSection(self));
+ rebuildSection(pInfoGreeter->pSubmenu, 0, createLayoutSection(self));
}
if (nSections & SECTION_SETTINGS)
{
- rebuildSection(pInfoDesktop->pSubmenu, 1, createDesktopSettingsSection(self));
+ rebuildSection(pInfoDesktop->pSubmenu, 1, createSettingsSection(self));
+ rebuildSection(pInfoPhone->pSubmenu, 1, createSettingsSection(self));
}
}
@@ -216,17 +240,17 @@ static void createMenu(IndicatorKeyboardService *self, int nProfile)
// Build the sections
if (nProfile == PROFILE_PHONE)
{
- lSections[nSection++] = createDesktopLayoutSection(self, nProfile);
- lSections[nSection++] = createDesktopSettingsSection(self);
+ lSections[nSection++] = createLayoutSection(self);
+ lSections[nSection++] = createSettingsSection(self);
}
else if (nProfile == PROFILE_DESKTOP)
{
- lSections[nSection++] = createDesktopLayoutSection(self, nProfile);
- lSections[nSection++] = createDesktopSettingsSection(self);
+ lSections[nSection++] = createLayoutSection(self);
+ lSections[nSection++] = createSettingsSection(self);
}
else if (nProfile == PROFILE_GREETER)
{
- lSections[nSection++] = createDesktopLayoutSection(self, nProfile);
+ lSections[nSection++] = createLayoutSection(self);
}
// Add sections to the submenu
@@ -239,7 +263,9 @@ static void createMenu(IndicatorKeyboardService *self, int nProfile)
}
// Add submenu to the header
- pItem = g_menu_item_new(NULL, "indicator._header");
+ gchar *sName = g_strdup_printf ("indicator._header-%s", m_lMenuNames[nProfile]);
+ pItem = g_menu_item_new(NULL, sName);
+ g_free (sName);
g_menu_item_set_attribute(pItem, "x-ayatana-type", "s", "org.ayatana.indicator.root");
g_menu_item_set_submenu(pItem, G_MENU_MODEL(pSubmenu));
g_object_unref(pSubmenu);
@@ -289,9 +315,14 @@ static void initActions(IndicatorKeyboardService *self)
GSimpleAction *pAction;
self->pPrivate->pActionGroup = g_simple_action_group_new();
- pAction = g_simple_action_new_stateful("_header", NULL, createHeaderState(self));
- g_action_map_add_action(G_ACTION_MAP(self->pPrivate->pActionGroup), G_ACTION(pAction));
- self->pPrivate->pHeaderAction = pAction;
+ for (int nProfile = 0; nProfile < N_PROFILES; ++nProfile)
+ {
+ gchar *sName = g_strdup_printf ("_header-%s", m_lMenuNames[nProfile]);
+ pAction = g_simple_action_new_stateful(sName, NULL, createHeaderState(self, nProfile));
+ g_free (sName);
+ g_action_map_add_action(G_ACTION_MAP(self->pPrivate->pActionGroup), G_ACTION(pAction));
+ self->pPrivate->lMenus[nProfile].pHeaderAction = pAction;
+ }
pAction = g_simple_action_new("layout", G_VARIANT_TYPE_BYTE);
g_action_map_add_action(G_ACTION_MAP(self->pPrivate->pActionGroup), G_ACTION(pAction));
@@ -383,6 +414,12 @@ static void onDispose(GObject *pObject)
{
IndicatorKeyboardService *self = INDICATOR_KEYBOARD_SERVICE(pObject);
+ if (self->pPrivate->pSettings != NULL)
+ {
+ g_signal_handlers_disconnect_by_data (self->pPrivate->pSettings, self);
+ g_clear_object (&self->pPrivate->pSettings);
+ }
+
if (self->pPrivate->pKeyboard != NULL)
{
g_object_unref(G_OBJECT(self->pPrivate->pKeyboard));
@@ -405,7 +442,12 @@ static void onDispose(GObject *pObject)
g_clear_object (&self->pPrivate->pSettingsAction);
g_clear_object (&self->pPrivate->pLayoutAction);
- g_clear_object (&self->pPrivate->pHeaderAction);
+
+ for (int nProfile = 0; nProfile < N_PROFILES; ++nProfile)
+ {
+ g_clear_object (&self->pPrivate->lMenus[nProfile].pHeaderAction);
+ }
+
g_clear_object (&self->pPrivate->pActionGroup);
g_clear_object (&self->pPrivate->pConnection);
@@ -418,6 +460,12 @@ static void onDispose(GObject *pObject)
G_OBJECT_CLASS(indicator_keyboard_service_parent_class)->dispose(pObject);
}
+static void onSettingsChanged(GSettings *pSettings, gchar *sKey, gpointer pData)
+{
+ IndicatorKeyboardService *self = INDICATOR_KEYBOARD_SERVICE(pData);
+ rebuildNow(self, SECTION_HEADER);
+}
+
static void indicator_keyboard_service_init(IndicatorKeyboardService *self)
{
gchar *sLib = "libayatana-keyboard-x11.so.0";
@@ -447,9 +495,10 @@ static void indicator_keyboard_service_init(IndicatorKeyboardService *self)
m_fnKeyboardGetNumLayouts = dlsym(m_pLibHandle, "keyboard_GetNumLayouts");
m_fnKeyboardGetLayout = dlsym(m_pLibHandle, "keyboard_GetLayout");
m_fnKeyboardSetLayout = dlsym(m_pLibHandle, "keyboard_SetLayout");
-
self->pPrivate = indicator_keyboard_service_get_instance_private(self);
self->pPrivate->pCancellable = g_cancellable_new();
+ self->pPrivate->pSettings = g_settings_new ("org.ayatana.indicator.keyboard");
+ g_signal_connect(self->pPrivate->pSettings, "changed", G_CALLBACK(onSettingsChanged), self);
self->pPrivate->pKeyboard = m_fnKeyboardNew();
g_signal_connect(self->pPrivate->pKeyboard, KEYBOARD_LAYOUT_CHANGED, G_CALLBACK(onLayoutChanged), self);
g_signal_connect(self->pPrivate->pKeyboard, KEYBOARD_CONFIG_CHANGED, G_CALLBACK(onConfigChanged), self);