summaryrefslogtreecommitdiff
path: root/geyes/themes.c
diff options
context:
space:
mode:
Diffstat (limited to 'geyes/themes.c')
-rw-r--r--geyes/themes.c443
1 files changed, 443 insertions, 0 deletions
diff --git a/geyes/themes.c b/geyes/themes.c
new file mode 100644
index 00000000..7c174cc8
--- /dev/null
+++ b/geyes/themes.c
@@ -0,0 +1,443 @@
+/*
+ * Copyright (C) 1999 Dave Camp <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+#include <string.h>
+#include <dirent.h>
+#include <limits.h>
+#include <ctype.h>
+#include <gtk/gtk.h>
+#include <mateconf/mateconf-client.h>
+#include <mate-panel-applet-mateconf.h>
+#include "geyes.h"
+
+#define NUM_THEME_DIRECTORIES 2
+#define HIG_IDENTATION " "
+
+static char *theme_directories[NUM_THEME_DIRECTORIES];
+
+enum {
+ COL_THEME_DIR = 0,
+ COL_THEME_NAME,
+ TOTAL_COLS
+};
+
+void
+theme_dirs_create (void)
+{
+ static gboolean themes_created = FALSE;
+
+ if (themes_created == TRUE)
+ return;
+
+ theme_directories[0] = g_strdup (GEYES_THEMES_DIR);
+ theme_directories[1] = g_strdup_printf ("%s/.mate2/geyes-themes/", g_get_home_dir());
+
+ themes_created = TRUE;
+}
+
+static void
+parse_theme_file (EyesApplet *eyes_applet, FILE *theme_file)
+{
+ gchar line_buf [512]; /* prolly overkill */
+ gchar *token;
+ fgets (line_buf, 512, theme_file);
+ while (!feof (theme_file)) {
+ token = strtok (line_buf, "=");
+ if (strncmp (token, "wall-thickness",
+ strlen ("wall-thickness")) == 0) {
+ token += strlen ("wall-thickness");
+ while (!isdigit (*token)) {
+ token++;
+ }
+ sscanf (token, "%d", &eyes_applet->wall_thickness);
+ } else if (strncmp (token, "num-eyes", strlen ("num-eyes")) == 0) {
+ token += strlen ("num-eyes");
+ while (!isdigit (*token)) {
+ token++;
+ }
+ sscanf (token, "%d", &eyes_applet->num_eyes);
+ if (eyes_applet->num_eyes > MAX_EYES)
+ eyes_applet->num_eyes = MAX_EYES;
+ } else if (strncmp (token, "eye-pixmap", strlen ("eye-pixmap")) == 0) {
+ token = strtok (NULL, "\"");
+ token = strtok (NULL, "\"");
+ if (eyes_applet->eye_filename != NULL)
+ g_free (eyes_applet->eye_filename);
+ eyes_applet->eye_filename = g_strdup_printf ("%s%s",
+ eyes_applet->theme_dir,
+ token);
+ } else if (strncmp (token, "pupil-pixmap", strlen ("pupil-pixmap")) == 0) {
+ token = strtok (NULL, "\"");
+ token = strtok (NULL, "\"");
+ if (eyes_applet->pupil_filename != NULL)
+ g_free (eyes_applet->pupil_filename);
+ eyes_applet->pupil_filename
+ = g_strdup_printf ("%s%s",
+ eyes_applet->theme_dir,
+ token);
+ }
+ fgets (line_buf, 512, theme_file);
+ }
+}
+
+int
+load_theme (EyesApplet *eyes_applet, const gchar *theme_dir)
+{
+ GtkWidget *dialog;
+
+ FILE* theme_file;
+ gchar *file_name;
+
+ eyes_applet->theme_dir = g_strdup_printf ("%s/", theme_dir);
+
+ file_name = g_strdup_printf("%s%s",theme_dir,"/config");
+ theme_file = fopen (file_name, "r");
+ if (theme_file == NULL) {
+ g_free (eyes_applet->theme_dir);
+ eyes_applet->theme_dir = g_strdup_printf (GEYES_THEMES_DIR "Default-tiny/");
+ g_free (file_name);
+ file_name = g_strdup (GEYES_THEMES_DIR "Default-tiny/config");
+ theme_file = fopen (file_name, "r");
+ }
+
+ /* if it's still NULL we've got a major problem */
+ if (theme_file == NULL) {
+ dialog = gtk_message_dialog_new_with_markup (NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ "<b>%s</b>\n\n%s",
+ _("Can not launch the eyes applet."),
+ _("There was a fatal error while trying to load the theme."));
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ gtk_widget_destroy (GTK_WIDGET (eyes_applet->applet));
+
+ return FALSE;
+ }
+
+ parse_theme_file (eyes_applet, theme_file);
+ fclose (theme_file);
+
+ eyes_applet->theme_name = g_strdup (theme_dir);
+
+ if (eyes_applet->eye_image)
+ g_object_unref (eyes_applet->eye_image);
+ eyes_applet->eye_image = gdk_pixbuf_new_from_file (eyes_applet->eye_filename, NULL);
+ if (eyes_applet->pupil_image)
+ g_object_unref (eyes_applet->pupil_image);
+ eyes_applet->pupil_image = gdk_pixbuf_new_from_file (eyes_applet->pupil_filename, NULL);
+
+ eyes_applet->eye_height = gdk_pixbuf_get_height (eyes_applet->eye_image);
+ eyes_applet->eye_width = gdk_pixbuf_get_width (eyes_applet->eye_image);
+ eyes_applet->pupil_height = gdk_pixbuf_get_height (eyes_applet->pupil_image);
+ eyes_applet->pupil_width = gdk_pixbuf_get_width (eyes_applet->pupil_image);
+
+ g_free (file_name);
+
+ return TRUE;
+}
+
+static void
+destroy_theme (EyesApplet *eyes_applet)
+{
+ /* Dunno about this - to unref or not to unref? */
+ if (eyes_applet->eye_image != NULL) {
+ g_object_unref (eyes_applet->eye_image);
+ eyes_applet->eye_image = NULL;
+ }
+ if (eyes_applet->pupil_image != NULL) {
+ g_object_unref (eyes_applet->pupil_image);
+ eyes_applet->pupil_image = NULL;
+ }
+
+ g_free (eyes_applet->theme_dir);
+ g_free (eyes_applet->theme_name);
+}
+
+static gboolean
+key_writable (MatePanelApplet *applet, const char *key)
+{
+ gboolean writable;
+ char *fullkey;
+ static MateConfClient *client = NULL;
+
+ if (client == NULL)
+ client = mateconf_client_get_default ();
+
+ fullkey = mate_panel_applet_mateconf_get_full_key (applet, key);
+
+ writable = mateconf_client_key_is_writable (client, fullkey, NULL);
+
+ g_free (fullkey);
+
+ return writable;
+}
+
+static void
+theme_selected_cb (GtkTreeSelection *selection, gpointer data)
+{
+ EyesApplet *eyes_applet = data;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *theme;
+ gchar *theme_dir;
+
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+
+ gtk_tree_model_get (model, &iter, COL_THEME_DIR, &theme, -1);
+
+ g_return_if_fail (theme);
+
+ theme_dir = g_strdup_printf ("%s/", theme);
+ if (!g_ascii_strncasecmp (theme_dir, eyes_applet->theme_dir, strlen (theme_dir))) {
+ g_free (theme_dir);
+ return;
+ }
+ g_free (theme_dir);
+
+ destroy_eyes (eyes_applet);
+ destroy_theme (eyes_applet);
+ load_theme (eyes_applet, theme);
+ setup_eyes (eyes_applet);
+
+ mate_panel_applet_mateconf_set_string (
+ eyes_applet->applet, "theme_path", theme, NULL);
+
+ g_free (theme);
+}
+
+static void
+phelp_cb (GtkDialog *dialog)
+{
+ GError *error = NULL;
+
+ gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (dialog)),
+ "ghelp:geyes?geyes-settings",
+ gtk_get_current_event_time (),
+ &error);
+
+ if (error) {
+ GtkWidget *error_dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ _("There was an error displaying help: %s"), error->message);
+ g_signal_connect (G_OBJECT (error_dialog), "response", G_CALLBACK (gtk_widget_destroy) , NULL);
+ gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE);
+ gtk_window_set_screen (GTK_WINDOW (error_dialog), gtk_widget_get_screen (GTK_WIDGET (dialog)));
+ gtk_widget_show (error_dialog);
+ g_error_free (error);
+ error = NULL;
+ }
+}
+
+static void
+presponse_cb (GtkDialog *dialog, gint id, gpointer data)
+{
+ EyesApplet *eyes_applet = data;
+ if(id == GTK_RESPONSE_HELP){
+ phelp_cb (dialog);
+ return;
+ }
+
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ eyes_applet->prop_box.pbox = NULL;
+}
+
+void
+properties_cb (GtkAction *action,
+ EyesApplet *eyes_applet)
+{
+ GtkWidget *pbox, *hbox;
+ GtkWidget *vbox, *indent;
+ GtkWidget *categories_vbox;
+ GtkWidget *category_vbox, *control_vbox;
+ GtkWidget *tree;
+ GtkWidget *scrolled;
+ GtkWidget *label;
+ GtkListStore *model;
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *cell;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ DIR *dfd;
+ struct dirent *dp;
+ int i;
+#ifdef PATH_MAX
+ gchar filename [PATH_MAX];
+#else
+ gchar *filename;
+#endif
+ gchar *title;
+
+ if (eyes_applet->prop_box.pbox) {
+ gtk_window_set_screen (
+ GTK_WINDOW (eyes_applet->prop_box.pbox),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+ gtk_window_present (GTK_WINDOW (eyes_applet->prop_box.pbox));
+ return;
+ }
+
+ pbox = gtk_dialog_new_with_buttons (_("Geyes Preferences"), NULL,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+ GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+ NULL);
+
+ gtk_window_set_screen (GTK_WINDOW (pbox),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+
+ gtk_widget_set_size_request (GTK_WIDGET (pbox), 300, 200);
+ gtk_dialog_set_default_response(GTK_DIALOG (pbox), GTK_RESPONSE_CLOSE);
+ gtk_dialog_set_has_separator (GTK_DIALOG (pbox), FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (pbox), 5);
+ gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (pbox))), 2);
+
+ g_signal_connect (pbox, "response",
+ G_CALLBACK (presponse_cb),
+ eyes_applet);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+ gtk_widget_show (vbox);
+
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (pbox))), vbox,
+ TRUE, TRUE, 0);
+
+ categories_vbox = gtk_vbox_new (FALSE, 18);
+ gtk_box_pack_start (GTK_BOX (vbox), categories_vbox, TRUE, TRUE, 0);
+ gtk_widget_show (categories_vbox);
+
+ category_vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (categories_vbox), category_vbox, TRUE, TRUE, 0);
+ gtk_widget_show (category_vbox);
+
+ title = g_strconcat ("<span weight=\"bold\">", _("Themes"), "</span>", NULL);
+ label = gtk_label_new (_(title));
+ gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_box_pack_start (GTK_BOX (category_vbox), label, FALSE, FALSE, 0);
+ g_free (title);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (category_vbox), hbox, TRUE, TRUE, 0);
+ gtk_widget_show (hbox);
+
+ indent = gtk_label_new (HIG_IDENTATION);
+ gtk_label_set_justify (GTK_LABEL (indent), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start (GTK_BOX (hbox), indent, FALSE, FALSE, 0);
+ gtk_widget_show (indent);
+
+ control_vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), control_vbox, TRUE, TRUE, 0);
+ gtk_widget_show (control_vbox);
+
+ label = gtk_label_new_with_mnemonic (_("_Select a theme:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_box_pack_start (GTK_BOX (control_vbox), label, FALSE, FALSE, 0);
+
+ scrolled = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ model = gtk_list_store_new (TOTAL_COLS, G_TYPE_STRING, G_TYPE_STRING);
+ tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree), FALSE);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), tree);
+ g_object_unref (model);
+
+ gtk_container_add (GTK_CONTAINER (scrolled), tree);
+
+ cell = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("not used", cell,
+ "text", COL_THEME_NAME, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
+ g_signal_connect (selection, "changed",
+ G_CALLBACK (theme_selected_cb),
+ eyes_applet);
+
+ if ( ! key_writable (eyes_applet->applet, "theme_path")) {
+ gtk_widget_set_sensitive (tree, FALSE);
+ gtk_widget_set_sensitive (label, FALSE);
+ }
+
+ for (i = 0; i < NUM_THEME_DIRECTORIES; i++) {
+ if ((dfd = opendir (theme_directories[i])) != NULL) {
+ while ((dp = readdir (dfd)) != NULL) {
+ if (dp->d_name[0] != '.') {
+ gchar *theme_dir;
+ gchar *theme_name;
+#ifdef PATH_MAX
+ strcpy (filename,
+ theme_directories[i]);
+ strcat (filename, dp->d_name);
+#else
+ asprintf (&filename, theme_directories[i], dp->d_name);
+#endif
+ theme_dir = g_strdup_printf ("%s/", filename);
+ theme_name = g_path_get_basename (filename);
+
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter,
+ COL_THEME_DIR, &filename,
+ COL_THEME_NAME, theme_name,
+ -1);
+
+ if (!g_ascii_strncasecmp (eyes_applet->theme_dir, theme_dir, strlen (theme_dir))) {
+ GtkTreePath *path;
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+ &iter);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree),
+ path,
+ NULL,
+ FALSE);
+ gtk_tree_path_free (path);
+ }
+ g_free (theme_name);
+ g_free (theme_dir);
+ }
+ }
+ closedir (dfd);
+ }
+ }
+#ifndef PATH_MAX
+ g_free (filename);
+#endif
+
+ gtk_box_pack_start (GTK_BOX (control_vbox), scrolled, TRUE, TRUE, 0);
+
+ gtk_widget_show_all (pbox);
+
+ eyes_applet->prop_box.pbox = pbox;
+
+ return;
+}
+
+