diff options
-rw-r--r-- | src/service.cpp | 269 |
1 files changed, 140 insertions, 129 deletions
diff --git a/src/service.cpp b/src/service.cpp index 82afe51..43bf9d6 100644 --- a/src/service.cpp +++ b/src/service.cpp @@ -77,72 +77,77 @@ public: if (!this->bTest) { - Display *pDisplay = XOpenDisplay (NULL); + // Check if we are on Wayland + const gchar *sWayland = g_getenv ("WAYLAND_DISPLAY"); + this->bXsctUnsupported = (sWayland != NULL); + //~Check if we are on Wayland - if (!pDisplay) + // Check if we are in a virtual environment + if (!this->bXsctUnsupported) { - g_error ("Panic: Failed to open X display"); + Display *pDisplay = XOpenDisplay (NULL); - return; - } + if (!pDisplay) + { + g_warning ("Panic: Failed to open X display while checking for virtual environment"); + } + else + { + guint nScreen = DefaultScreen (pDisplay); + Window pWindow = RootWindow (pDisplay, nScreen); + XRRScreenResources *pResources = XRRGetScreenResources (pDisplay, pWindow); - guint nScreen = DefaultScreen (pDisplay); - Window pWindow = RootWindow (pDisplay, nScreen); - XRRScreenResources *pResources = XRRGetScreenResources (pDisplay, pWindow); + if (!pResources) + { + g_warning ("Panic: Failed to get screen resources while checking for virtual environment"); + XCloseDisplay (pDisplay); + } + else + { + RROutput nOutputPrimary = XRRGetOutputPrimary (pDisplay, pWindow); + XRROutputInfo *pOutputInfo = XRRGetOutputInfo (pDisplay, pResources, nOutputPrimary); + GRegex *pRegex = NULL; + GError *pError = NULL; - if (!pResources) - { - g_error ("Panic: Failed to get screen resources"); - XCloseDisplay (pDisplay); + #if GLIB_CHECK_VERSION(2, 73, 0) + pRegex = g_regex_new (".*virtual.*", G_REGEX_CASELESS, G_REGEX_MATCH_DEFAULT, &pError); + #else + pRegex = g_regex_new (".*virtual.*", G_REGEX_CASELESS, (GRegexMatchFlags) 0, &pError); + #endif - return; - } + if (!pError) + { + #if GLIB_CHECK_VERSION(2, 73, 0) + gboolean bMatch = g_regex_match (pRegex, pOutputInfo->name, G_REGEX_MATCH_DEFAULT, NULL); + #else + gboolean bMatch = g_regex_match (pRegex, pOutputInfo->name, (GRegexMatchFlags) 0, NULL); + #endif - RROutput nOutputPrimary = XRRGetOutputPrimary (pDisplay, pWindow); - XRROutputInfo *pOutputInfo = XRRGetOutputInfo (pDisplay, pResources, nOutputPrimary); - GRegex *pRegex = NULL; - GError *pError = NULL; + if (bMatch) + { + this->bXsctUnsupported = TRUE; + } - #if GLIB_CHECK_VERSION(2, 73, 0) - pRegex = g_regex_new (".*virtual.*", G_REGEX_CASELESS, G_REGEX_MATCH_DEFAULT, &pError); - #else - pRegex = g_regex_new (".*virtual.*", G_REGEX_CASELESS, (GRegexMatchFlags) 0, &pError); - #endif + g_regex_unref (pRegex); + } + else + { + g_warning ("PANIC: Failed to compile regex: %s", pError->message); + g_error_free (pError); + } - if (!pError) - { - #if GLIB_CHECK_VERSION(2, 73, 0) - gboolean bMatch = g_regex_match (pRegex, pOutputInfo->name, G_REGEX_MATCH_DEFAULT, NULL); - #else - gboolean bMatch = g_regex_match (pRegex, pOutputInfo->name, (GRegexMatchFlags) 0, NULL); - #endif + XRRFreeOutputInfo (pOutputInfo); + XRRFreeScreenResources (pResources); + XCloseDisplay (pDisplay); - if (bMatch) - { - this->bVirtualX = TRUE; + #ifdef RDA_ENABLED + gboolean bRemote = rda_session_is_remote (); + this->bXsctUnsupported = this->bXsctUnsupported || bRemote; + #endif + } } - - g_regex_unref (pRegex); } - else - { - g_error ("PANIC: Failed to compile regex: %s", pError->message); - g_error_free (pError); - XRRFreeOutputInfo (pOutputInfo); - XRRFreeScreenResources (pResources); - XCloseDisplay (pDisplay); - - return; - } - - XRRFreeOutputInfo (pOutputInfo); - XRRFreeScreenResources (pResources); - XCloseDisplay (pDisplay); - - #ifdef RDA_ENABLED - gboolean bRemote = rda_session_is_remote (); - this->bVirtualX = this->bVirtualX || bRemote; - #endif + //~Check if we are in a virtual environment } #endif const char *sUserName = g_get_user_name(); @@ -162,9 +167,8 @@ public: } else { - g_error("No schema could be found"); + g_error ("Panic: No com.lomiri.touch.system schema could be found"); } - } else { @@ -177,7 +181,7 @@ public: } else { - g_error("No schema could be found"); + g_error ("Panic: No org.ayatana.indicator.display schema could be found"); } #ifdef COLOR_TEMP_ENABLED @@ -216,11 +220,11 @@ public: if (pSchema != NULL) { g_settings_schema_unref (pSchema); - pThemeSettings = g_settings_new (sSchema); + this->pThemeSettings = g_settings_new (sSchema); } else { - g_error("No %s schema could be found", sSchema); + g_warning ("Panic: No %s schema could be found", sSchema); } pSchema = g_settings_schema_source_lookup (pSource, sCursorSchema, TRUE); @@ -228,11 +232,11 @@ public: if (pSchema != NULL) { g_settings_schema_unref (pSchema); - pCursorSettings = g_settings_new (sCursorSchema); + this->pCursorSettings = g_settings_new (sCursorSchema); } else { - g_error("No %s schema could be found", sCursorSchema); + g_warning ("Panic: No %s schema could be found", sCursorSchema); } pSchema = g_settings_schema_source_lookup (pSource, sMetacitySchema, TRUE); @@ -240,11 +244,11 @@ public: if (pSchema != NULL) { g_settings_schema_unref (pSchema); - pMetacitySettings = g_settings_new (sMetacitySchema); + this->pMetacitySettings = g_settings_new (sMetacitySchema); } else { - g_error("No %s schema could be found", sMetacitySchema); + g_warning ("Panic: No %s schema could be found", sMetacitySchema); } if (this->bTest) @@ -265,7 +269,7 @@ public: if (bColorScheme) { - pColorSchemeSettings = g_settings_new (sSchema); + this->pColorSchemeSettings = g_settings_new (sSchema); } else { @@ -274,7 +278,7 @@ public: } else { - g_error("No %s schema could be found", sSchema); + g_warning ("Panic: No %s schema could be found", sSchema); } } else @@ -320,7 +324,7 @@ public: gboolean bVisible = !this->bGreeter; #ifdef COLOR_TEMP_ENABLED - bVisible = bVisible || !this->bVirtualX; + bVisible = bVisible || !this->bXsctUnsupported; #endif update_desktop_header(bVisible); @@ -368,25 +372,10 @@ public: g_free (sLastTheme); } - if (pThemeSettings) - { - g_clear_object (&pThemeSettings); - } - - if (pCursorSettings) - { - g_clear_object (&pCursorSettings); - } - - if (pMetacitySettings) - { - g_clear_object (&pMetacitySettings); - } - - if (pColorSchemeSettings) - { - g_clear_object (&pColorSchemeSettings); - } + g_clear_object (&pThemeSettings); + g_clear_object (&pCursorSettings); + g_clear_object (&pMetacitySettings); + g_clear_object (&pColorSchemeSettings); if (this->pAccountsServiceConnection) { @@ -424,7 +413,7 @@ private: static void getAccountsService (DisplayIndicator::Impl *pImpl, gint nUid) { - if (!pImpl->bVirtualX) + if (!pImpl->bXsctUnsupported) { pImpl->bReadingAccountsService = TRUE; gchar *sPath = g_strdup_printf ("/org/freedesktop/Accounts/User%i", nUid); @@ -545,7 +534,7 @@ private: guint nProfile = 0; gdouble fBrightness = 0.0; - if (!pImpl->bVirtualX) + if (!pImpl->bXsctUnsupported) { g_settings_get (pImpl->m_settings, "color-temp-profile", "q", &nProfile); fBrightness = g_settings_get_double (pImpl->m_settings, "brightness"); @@ -566,7 +555,7 @@ private: gint64 nNow = g_get_real_time (); gdouble fElevation = solar_elevation((gdouble) nNow / 1000000.0, pImpl->fLatitude, pImpl->fLongitude); - if (!pImpl->bVirtualX) + if (!pImpl->bXsctUnsupported) { if (nProfile == 0) { @@ -624,7 +613,7 @@ private: } } - if (!pImpl->bVirtualX) + if (!pImpl->bXsctUnsupported) { if (pImpl->fLastBrightness != fBrightness || pImpl->nLasColorTemp != nTemperature) { @@ -640,44 +629,47 @@ private: if (!bSuccess) { - g_error ("The call to '%s' failed: %s", sCommand, pError->message); + g_warning ("Panic: The call to '%s' failed: %s", sCommand, pError->message); g_error_free (pError); } + else + { + pImpl->fLastBrightness = fBrightness; + pImpl->nLasColorTemp = nTemperature; + gint nUid = 0; - pImpl->fLastBrightness = fBrightness; - pImpl->nLasColorTemp = nTemperature; - g_free (sCommand); - gint nUid = 0; + if (!pImpl->bGreeter) + { + nUid = geteuid (); + } + else if (pImpl->sUser) + { + const struct passwd *pPasswd = getpwnam (pImpl->sUser); - if (!pImpl->bGreeter) - { - nUid = geteuid (); - } - else if (pImpl->sUser) - { - const struct passwd *pPasswd = getpwnam (pImpl->sUser); + if (pPasswd) + { + nUid = pPasswd->pw_uid; + } + } - if (pPasswd) + if (nUid) { - nUid = pPasswd->pw_uid; + gchar *sPath = g_strdup_printf ("/org/freedesktop/Accounts/User%i", nUid); + GDBusProxy *pProxy = g_dbus_proxy_new_sync (pImpl->pAccountsServiceConnection, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.freedesktop.Accounts", sPath, "org.freedesktop.DBus.Properties", NULL, NULL); + g_free (sPath); + GVariant *pBrightnessValue = g_variant_new ("d", pImpl->fLastBrightness); + GVariant *pBrightnessParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "brightness", pBrightnessValue); + g_dbus_proxy_call (pProxy, "Set", pBrightnessParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + GVariant *pColorTempValue = g_variant_new ("q", pImpl->nLasColorTemp); + GVariant *pColorTempParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "color-temp", pColorTempValue); + g_dbus_proxy_call (pProxy, "Set", pColorTempParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + GVariant *pProfileValue = g_variant_new ("q", nProfile); + GVariant *pProfileParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "color-temp-profile", pProfileValue); + g_dbus_proxy_call (pProxy, "Set", pProfileParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); } } - if (nUid) - { - gchar *sPath = g_strdup_printf ("/org/freedesktop/Accounts/User%i", nUid); - GDBusProxy *pProxy = g_dbus_proxy_new_sync (pImpl->pAccountsServiceConnection, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.freedesktop.Accounts", sPath, "org.freedesktop.DBus.Properties", NULL, NULL); - g_free (sPath); - GVariant *pBrightnessValue = g_variant_new ("d", pImpl->fLastBrightness); - GVariant *pBrightnessParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "brightness", pBrightnessValue); - g_dbus_proxy_call (pProxy, "Set", pBrightnessParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); - GVariant *pColorTempValue = g_variant_new ("q", pImpl->nLasColorTemp); - GVariant *pColorTempParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "color-temp", pColorTempValue); - g_dbus_proxy_call (pProxy, "Set", pColorTempParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); - GVariant *pProfileValue = g_variant_new ("q", nProfile); - GVariant *pProfileParams = g_variant_new ("(ssv)", "org.ayatana.indicator.display.AccountsService", "color-temp-profile", pProfileValue); - g_dbus_proxy_call (pProxy, "Set", pProfileParams, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); - } + g_free (sCommand); } } @@ -706,7 +698,11 @@ private: { g_debug ("Changing theme to %s", sTheme); - g_settings_set_string (pImpl->pThemeSettings, "gtk-theme", sTheme); + if (pImpl->pThemeSettings) + { + g_settings_set_string (pImpl->pThemeSettings, "gtk-theme", sTheme); + } + gchar *sThemePath = g_strdup_printf ("/usr/share/themes/%s/index.theme", sTheme); gboolean bThemePath = g_file_test (sThemePath, G_FILE_TEST_EXISTS); @@ -737,7 +733,12 @@ private: if (bMatch) { gchar *sIconTheme = g_match_info_fetch (pMatchInfo, 1); - g_settings_set_string (pImpl->pThemeSettings, "icon-theme", sIconTheme); + + if (pImpl->pThemeSettings) + { + g_settings_set_string (pImpl->pThemeSettings, "icon-theme", sIconTheme); + } + g_free (sIconTheme); } else @@ -750,7 +751,7 @@ private: } else { - g_error ("PANIC: Failed to compile regex: %s", pError->message); + g_warning ("Panic: Failed to compile regex: %s", pError->message); g_error_free (pError); } @@ -773,7 +774,12 @@ private: if (bMatch) { gchar *sMetacityTheme = g_match_info_fetch (pMatchInfo, 1); - g_settings_set_string (pImpl->pMetacitySettings, "theme", sMetacityTheme); + + if (pImpl->pMetacitySettings) + { + g_settings_set_string (pImpl->pMetacitySettings, "theme", sMetacityTheme); + } + g_free (sMetacityTheme); } else @@ -786,7 +792,7 @@ private: } else { - g_error ("PANIC: Failed to compile regex: %s", pError->message); + g_warning ("Panic: Failed to compile regex: %s", pError->message); g_error_free (pError); } @@ -809,7 +815,12 @@ private: if (bMatch) { gchar *sCursorTheme = g_match_info_fetch (pMatchInfo, 1); - g_settings_set_string (pImpl->pCursorSettings, "cursor-theme", sTheme); + + if (pImpl->pCursorSettings) + { + g_settings_set_string (pImpl->pCursorSettings, "cursor-theme", sTheme); + } + g_free (sCursorTheme); } else @@ -822,7 +833,7 @@ private: } else { - g_error ("PANIC: Failed to compile regex: %s", pError->message); + g_warning ("Panic: Failed to compile regex: %s", pError->message); g_error_free (pError); } @@ -830,7 +841,7 @@ private: } else { - g_error ("PANIC: Failed to get index.theme contents: %s", pError->message); + g_warning ("Panic: Failed to get index.theme contents: %s", pError->message); g_error_free (pError); } } @@ -978,7 +989,7 @@ private: #ifdef COLOR_TEMP_ENABLED if (ayatana_common_utils_is_lomiri() == FALSE) { - if (!this->bVirtualX) + if (!this->bXsctUnsupported) { pVariantType = g_variant_type_new ("d"); guint nTemperature = 0; @@ -1104,7 +1115,7 @@ private: #ifdef COLOR_TEMP_ENABLED section = g_menu_new (); - if (!this->bVirtualX) + if (!this->bXsctUnsupported) { GIcon *pIconMin = g_themed_icon_new_with_default_fallbacks ("ayatana-indicator-display-brightness-low"); GIcon *pIconMax = g_themed_icon_new_with_default_fallbacks ("ayatana-indicator-display-brightness-high"); @@ -1253,7 +1264,7 @@ private: GSList *lUsers = NULL; gboolean bReadingAccountsService = FALSE; GDBusConnection *pAccountsServiceConnection = NULL; - gboolean bVirtualX = FALSE; + gboolean bXsctUnsupported = FALSE; #endif }; |