diff options
author | Robert Tari <robert@tari.in> | 2025-02-20 16:39:11 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2025-02-23 18:09:56 +0100 |
commit | 35c5c0016d2409e091d021737d146861cbd14844 (patch) | |
tree | 1eeabec5a99e4f73c6dd60ac8746df245a94722b | |
parent | bbdd2b6d457de402c11cbfb128b07bd3631e6010 (diff) | |
download | ayatana-indicator-keyboard-35c5c0016d2409e091d021737d146861cbd14844.tar.gz ayatana-indicator-keyboard-35c5c0016d2409e091d021737d146861cbd14844.tar.bz2 ayatana-indicator-keyboard-35c5c0016d2409e091d021737d146861cbd14844.zip |
src/service.c: Add Always show OSK switch
fixes https://salsa.debian.org/ubports-team/lomiri-keyboard/-/issues/2
-rw-r--r-- | src/service.c | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/service.c b/src/service.c index 6d083569..9d57ddff 100644 --- a/src/service.c +++ b/src/service.c @@ -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 @@ -80,6 +80,8 @@ struct _IndicatorKeyboardServicePrivate GMenu *pLayoutSection; Keyboard *pKeyboard; GSettings *pSettings; + GSettings *pLomiriSettings; + gboolean bLomiri; }; typedef IndicatorKeyboardServicePrivate priv_t; @@ -185,6 +187,15 @@ static GMenuModel* createLayoutSection(IndicatorKeyboardService *self) static GMenuModel* createSettingsSection(IndicatorKeyboardService *self) { GMenu * pMenu = g_menu_new(); + + if (self->pPrivate->bLomiri) + { + GMenuItem *pItem = g_menu_item_new (_("Always show OSK"), "indicator.osk(true)"); + g_menu_item_set_attribute (pItem, "x-ayatana-type", "s", "org.ayatana.indicator.switch"); + g_menu_append_item (pMenu, pItem); + g_object_unref (pItem); + } + g_menu_append(pMenu, _("Keyboard Settingsā¦"), "indicator.settings"); return G_MENU_MODEL(pMenu); @@ -315,13 +326,15 @@ static void onLayoutSelected(GSimpleAction *pAction, GVariant *pVariant, gpointe m_fnKeyboardSetLayout(self->pPrivate->pKeyboard, nLayout); } -static void onSettings(GSimpleAction *pAction, GVariant *pVariant, gpointer pUserData) +static void onSettings(GSimpleAction *pAction, GVariant *pVariant, gpointer pData) { + IndicatorKeyboardService *self = INDICATOR_KEYBOARD_SERVICE (pData); + if (ayatana_common_utils_is_mate()) { ayatana_common_utils_execute_command("mate-keyboard-properties"); } - else if (ayatana_common_utils_is_lomiri()) + else if (self->pPrivate->bLomiri) { ayatana_common_utils_open_url("settings:///system/hw-keyboard-layouts"); } @@ -347,6 +360,20 @@ static void onDisplay (GSimpleAction *pAction, GVariant *pVariant, gpointer pDat g_free (sArgs); } +static gboolean valueFromVariant (GValue *pValue, GVariant *pVariant, gpointer pUserData) +{ + g_value_set_variant (pValue, pVariant); + + return TRUE; +} + +static GVariant* valueToVariant (const GValue *pValue, const GVariantType *pType, gpointer pUserData) +{ + GVariant *pVariant = g_value_dup_variant (pValue); + + return pVariant; +} + static void initActions(IndicatorKeyboardService *self) { GSimpleAction *pAction; @@ -366,6 +393,16 @@ static void initActions(IndicatorKeyboardService *self) self->pPrivate->pLayoutAction = pAction; g_signal_connect(pAction, "activate", G_CALLBACK(onLayoutSelected), self); + if (self->pPrivate->bLomiri) + { + gboolean bOsk = g_settings_get_boolean (self->pPrivate->pLomiriSettings, "always-show-osk"); + GVariant *pOsk = g_variant_new_boolean (bOsk); + pAction = g_simple_action_new_stateful ("osk", G_VARIANT_TYPE_BOOLEAN, pOsk); + g_settings_bind_with_mapping (self->pPrivate->pLomiriSettings, "always-show-osk", pAction, "state", G_SETTINGS_BIND_DEFAULT, valueFromVariant, valueToVariant, NULL, NULL); + g_action_map_add_action (G_ACTION_MAP (self->pPrivate->pActionGroup), G_ACTION (pAction)); + g_object_unref (G_OBJECT (pAction)); + } + pAction = g_simple_action_new("settings", NULL); g_action_map_add_action(G_ACTION_MAP(self->pPrivate->pActionGroup), G_ACTION(pAction)); self->pPrivate->pSettingsAction = pAction; @@ -462,6 +499,8 @@ static void onDispose(GObject *pObject) g_clear_object (&self->pPrivate->pSettings); } + g_clear_object (&self->pPrivate->pLomiriSettings); + if (self->pPrivate->pKeyboard != NULL) { g_object_unref(G_OBJECT(self->pPrivate->pKeyboard)); @@ -512,8 +551,9 @@ static void onSettingsChanged(GSettings *pSettings, gchar *sKey, gpointer pData) static void indicator_keyboard_service_init(IndicatorKeyboardService *self) { gchar *sLib = "libayatana-keyboard-x11.so.0"; + gboolean bLomiri = ayatana_common_utils_is_lomiri (); - if (ayatana_common_utils_is_lomiri()) + if (bLomiri) { sLib = "libayatana-keyboard-lomiri.so.0"; } @@ -540,9 +580,16 @@ static void indicator_keyboard_service_init(IndicatorKeyboardService *self) 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->bLomiri = bLomiri; 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); + + if (self->pPrivate->bLomiri) + { + self->pPrivate->pLomiriSettings = g_settings_new ("com.lomiri.Shell"); + } + 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); |