[gnome-games] aisleriot: Load KDE card back desktop files
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games] aisleriot: Load KDE card back desktop files
- Date: Sun, 26 Sep 2010 14:38:22 +0000 (UTC)
commit a8ae0f5c9ef38d285639fdde149b9061af04ccc8
Author: Christian Persch <chpe gnome org>
Date: Wed Sep 15 14:51:32 2010 +0200
aisleriot: Load KDE card back desktop files
aisleriot/lib/ar-card-theme-kde.c | 84 ++++++++++++++++++++++++++++++++++++-
1 files changed, 82 insertions(+), 2 deletions(-)
---
diff --git a/aisleriot/lib/ar-card-theme-kde.c b/aisleriot/lib/ar-card-theme-kde.c
index 0fc3515..b91dfe8 100644
--- a/aisleriot/lib/ar-card-theme-kde.c
+++ b/aisleriot/lib/ar-card-theme-kde.c
@@ -40,6 +40,8 @@
struct _ArCardThemeKDEClass {
ArCardThemePreimageClass parent_class;
+
+ GHashTable *back_names;
};
struct _ArCardThemeKDE {
@@ -65,10 +67,13 @@ enum {
#define DELTA (0.0f)
+#define KDE_CARDS_GROUP "KDE Cards"
+#define KDE_CARDS_NAME_KEY "Name"
+#define KDE_CARDS_SVG_KEY "SVG"
+
#define KDE_BACKDECK_FILENAME "index.desktop"
#define KDE_BACKDECK_GROUP "KDE Backdeck"
#define KDE_BACKDECK_BACK_KEY "Back"
-#define KDE_BACKDECK_BACKSIZE_KEY "BackSize"
#define KDE_BACKDECK_NAME_KEY "Name" /* localised */
#define KDE_BACKDECK_PYSOL_KEY "PySol"
#define KDE_BACKDECK_SVG_KEY "SVG"
@@ -107,6 +112,78 @@ get_is_blacklisted (const char *filename)
return FALSE;
}
+static gboolean
+ar_card_theme_kde_class_load_back_infos (ArCardThemeClass *theme_klass,
+ const char *base_path,
+ GHashTable *back_names)
+{
+ char *deck_path;
+ const char *filename;
+ GDir *dir;
+ GKeyFile *key_file;
+
+ deck_path = g_build_filename (base_path, "decks", NULL);
+ dir = g_dir_open (deck_path, 0, NULL);
+ if (dir == NULL)
+ goto out;
+
+ while ((filename = g_dir_read_name (dir)) != NULL) {
+ char *path = NULL, *name = NULL, *svg_filename = NULL;
+
+ if (!g_str_has_suffix (filename, ".desktop"))
+ continue;
+
+ path = g_build_filename (deck_path, filename, NULL);
+ key_file = g_key_file_new ();
+ if (!g_key_file_load_from_file (key_file, path, 0, NULL))
+ goto next;
+
+ if (!g_key_file_has_group (key_file, KDE_CARDS_GROUP))
+ goto next;
+
+ name = g_key_file_get_string (key_file, KDE_CARDS_GROUP, KDE_CARDS_NAME_KEY, NULL);
+ svg_filename = g_key_file_get_string (key_file, KDE_CARDS_GROUP, KDE_CARDS_SVG_KEY, NULL);
+ if (!name || !name[0] || !svg_filename || !svg_filename[0])
+ goto next;
+
+ g_hash_table_insert (back_names,
+ name /* adopts */,
+ g_build_filename (deck_path, svg_filename, NULL) /* adopts */);
+ name = NULL; /* adopted above */
+
+ next:
+ g_free (path);
+ g_free (name);
+ g_free (svg_filename);
+ g_key_file_free (key_file);
+
+ }
+
+ g_dir_close (dir);
+
+out:
+ g_free (deck_path);
+
+ return TRUE;
+}
+
+static void
+ar_card_theme_kde_class_ensure_back_infos (ArCardThemeKDEClass *klass)
+{
+ ArCardThemeClass *theme_class;
+
+ if (klass->back_names != NULL)
+ return;
+
+ klass->back_names = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_free);
+
+ theme_class = AR_CARD_THEME_CLASS (klass);
+ theme_class->foreach_theme_dir (theme_class,
+ (ArCardThemeForeachFunc) ar_card_theme_kde_class_load_back_infos,
+ klass->back_names);
+}
+
static cairo_rectangle_t *
ar_card_theme_kde_get_card_extents (ArCardThemeKDE *theme,
int card_id,
@@ -369,6 +446,7 @@ ar_card_theme_kde_class_get_theme_info (ArCardThemeClass *klass,
{
ArCardThemeInfo *info = NULL;
char *base_path = NULL, *key_file_path = NULL;
+ char *back_name;
GKeyFile *key_file = NULL;
char *svg_filename = NULL, *name = NULL, *display_name, *pref_name;
@@ -395,6 +473,8 @@ ar_card_theme_kde_class_get_theme_info (ArCardThemeClass *klass,
if (!name || !name[0] || !svg_filename || !svg_filename[0])
goto out;
+ back_name = g_key_file_get_string (key_file, KDE_BACKDECK_GROUP, KDE_BACKDECK_BACK_KEY, NULL);
+
display_name = g_strdup_printf ("%s (KDE)", name);
pref_name = g_strdup_printf ("kde:%s", filename);
info = _ar_card_theme_info_new (G_OBJECT_CLASS_TYPE (klass),
@@ -403,7 +483,7 @@ ar_card_theme_kde_class_get_theme_info (ArCardThemeClass *klass,
display_name /* adopts */,
pref_name /* adopts */,
TRUE /* scalable */,
- NULL, NULL);
+ back_name, g_free);
out:
g_free (base_path);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]