/* Theme's name was set so lookup pathes and initialize but do not load resources */ static void _xfdashboard_theme_set_theme_name(XfdashboardTheme *self, const gchar *inThemeName) { XfdashboardThemePrivate *priv; gchar *themePath; g_return_if_fail(XFDASHBOARD_IS_THEME(self)); g_return_if_fail(inThemeName && *inThemeName); priv=self->priv; /* The theme name must not be set already */ if(priv->themeName) { /* Show error message */ g_critical(_("Cannot change theme name to '%s' because it is already set to '%s'"), inThemeName, priv->themeName); return; } /* Lookup path of theme by lookup at all possible paths for theme file */ themePath=_xfdashboard_theme_lookup_path_for_theme(self, inThemeName); if(!themePath) { g_critical(_("Theme '%s' not found"), inThemeName); /* Return here because looking up path failed */ return; } /* Set up internal variable and notify about property changes */ priv->themeName=g_strdup(inThemeName); g_object_notify_by_pspec(G_OBJECT(self), XfdashboardThemeProperties[PROP_NAME]); priv->themePath=g_strdup(themePath); g_object_notify_by_pspec(G_OBJECT(self), XfdashboardThemeProperties[PROP_PATH]); /* Initialize theme resources */ priv->styling=xfdashboard_theme_css_new(priv->themePath); priv->layout=xfdashboard_theme_layout_new(); priv->effects=xfdashboard_theme_effects_new(); /* Release allocated resources */ if(themePath) g_free(themePath); }
/* Load theme file and all listed resources in this file */ static gboolean _xfdashboard_theme_load_resources(XfdashboardTheme *self, const gchar *inThemePath, GError **outError) { XfdashboardThemePrivate *priv; GError *error; gchar *themeFile; GKeyFile *themeKeyFile; gchar **resources, **resource; gchar *resourceFile; gint counter; g_return_val_if_fail(XFDASHBOARD_IS_THEME(self), FALSE); g_return_val_if_fail(inThemePath!=NULL && *inThemePath!=0, FALSE); g_return_val_if_fail(outError==NULL || *outError==NULL, FALSE); priv=self->priv; error=NULL; /* Load theme file */ themeFile=g_build_filename(inThemePath, XFDASHBOARD_THEME_FILE, NULL); themeKeyFile=g_key_file_new(); if(!g_key_file_load_from_file(themeKeyFile, themeFile, G_KEY_FILE_NONE, &error)) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeFile) g_free(themeFile); /* Return FALSE to indicate error */ return(FALSE); } g_free(themeFile); /* Get display name and notify about property change (regardless of success result) */ priv->themeDisplayName=g_key_file_get_locale_string(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Name", NULL, &error); g_object_notify_by_pspec(G_OBJECT(self), XfdashboardThemeProperties[PROP_DISPLAY_NAME]); if(!priv->themeDisplayName) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } /* Get comment and notify about property change (regardless of success result) */ priv->themeComment=g_key_file_get_locale_string(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Comment", NULL, &error); g_object_notify_by_pspec(G_OBJECT(self), XfdashboardThemeProperties[PROP_COMMENT]); if(!priv->themeComment) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } /* Create CSS parser and load style resources */ resources=g_key_file_get_string_list(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Style", NULL, &error); if(!resources) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } priv->styling=xfdashboard_theme_css_new(inThemePath); counter=0; resource=resources; while(*resource) { /* Get path and file for style resource */ resourceFile=g_build_filename(inThemePath, *resource, NULL); /* Try to load style resource */ if(!xfdashboard_theme_css_add_file(priv->styling, resourceFile, counter, &error)) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(resources) g_strfreev(resources); if(resourceFile) g_free(resourceFile); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } /* Release allocated resources */ if(resourceFile) g_free(resourceFile); /* Continue with next entry */ resource++; counter++; } g_strfreev(resources); /* Create XML parser and load layout resources */ resources=g_key_file_get_string_list(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Layout", NULL, &error); if(!resources) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } priv->layout=xfdashboard_theme_layout_new(); resource=resources; while(*resource) { /* Get path and file for style resource */ resourceFile=g_build_filename(inThemePath, *resource, NULL); /* Try to load style resource */ if(!xfdashboard_theme_layout_add_file(priv->layout, resourceFile, &error)) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(resources) g_strfreev(resources); if(resourceFile) g_free(resourceFile); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } /* Release allocated resources */ if(resourceFile) g_free(resourceFile); /* Continue with next entry */ resource++; counter++; } g_strfreev(resources); /* Create XML parser and load effect resources which are optional */ if(g_key_file_has_key(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Effects", NULL)) { resources=g_key_file_get_string_list(themeKeyFile, XFDASHBOARD_THEME_GROUP, "Effects", NULL, &error); if(!resources) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } priv->effects=xfdashboard_theme_effects_new(); resource=resources; while(*resource) { /* Get path and file for style resource */ resourceFile=g_build_filename(inThemePath, *resource, NULL); /* Try to load style resource */ if(!xfdashboard_theme_effects_add_file(priv->effects, resourceFile, &error)) { /* Set error */ g_propagate_error(outError, error); /* Release allocated resources */ _xfdashboard_theme_clean(self); if(resources) g_strfreev(resources); if(resourceFile) g_free(resourceFile); if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return FALSE to indicate error */ return(FALSE); } /* Release allocated resources */ if(resourceFile) g_free(resourceFile); /* Continue with next entry */ resource++; counter++; } g_strfreev(resources); } /* Release allocated resources */ if(themeKeyFile) g_key_file_free(themeKeyFile); /* Return TRUE to indicate success */ return(TRUE); }