gnome-utils r8222 - trunk/logview



Author: cosimoc
Date: Tue Dec 23 13:25:12 2008
New Revision: 8222
URL: http://svn.gnome.org/viewvc/gnome-utils?rev=8222&view=rev

Log:
Rewritten preferences handling.

Added:
   trunk/logview/logview-prefs.c
   trunk/logview/logview-prefs.h
Removed:
   trunk/logview/userprefs.c
   trunk/logview/userprefs.h
Modified:
   trunk/logview/logview-main.c

Modified: trunk/logview/logview-main.c
==============================================================================
--- trunk/logview/logview-main.c	(original)
+++ trunk/logview/logview-main.c	Tue Dec 23 13:25:12 2008
@@ -29,7 +29,6 @@
 
 #include "logview.h"
 #include "misc.h"
-#include "userprefs.h"
 
 static gboolean show_version = FALSE;
 
@@ -83,7 +82,6 @@
   error_dialog_queue (TRUE);
 
   gnome_vfs_init ();
-  prefs_init ();
   context = create_option_context ();
 
   g_option_context_parse (context, &argc, &argv, &error);
@@ -120,9 +118,6 @@
 
   gtk_widget_show (GTK_WIDGET (logview));
 
-  while (gtk_events_pending ())
-    gtk_main_iteration ();
-
   if (argc == 1) {
     logview_add_logs_from_names (logview,
                                  prefs_get_logs (),

Added: trunk/logview/logview-prefs.c
==============================================================================
--- (empty file)
+++ trunk/logview/logview-prefs.c	Tue Dec 23 13:25:12 2008
@@ -0,0 +1,475 @@
+/* logview-prefs.c - logview user preferences handling
+ *
+ * Copyright (C) 1998  Cesar Miquel  <miquel df uba ar>
+ * Copyright (C) 2004  Vincent Noel
+ * Copyright (C) 2006  Emmanuele Bassi
+ * Copyright (C) 2008  Cosimo Cecchi <cosimoc gnome org>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/stat.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include <gconf/gconf-client.h>
+
+#include "logview-prefs.h"
+
+#define LOGVIEW_DEFAULT_HEIGHT 400
+#define LOGVIEW_DEFAULT_WIDTH 600
+
+/* logview settings */
+#define GCONF_DIR 		"/apps/gnome-system-log"
+#define GCONF_WIDTH_KEY 	GCONF_DIR "/width"
+#define GCONF_HEIGHT_KEY 	GCONF_DIR "/height"
+#define GCONF_LOGFILE 		GCONF_DIR "/logfile"
+#define GCONF_LOGFILES 		GCONF_DIR "/logfiles"
+#define GCONF_FONTSIZE_KEY 	GCONF_DIR "/fontsize"
+
+/* desktop-wide settings */
+#define GCONF_MONOSPACE_FONT_NAME "/desktop/gnome/interface/monospace_font_name"
+#define GCONF_MENUS_HAVE_TEAROFF  "/desktop/gnome/interface/menus_have_tearoff"
+
+static LogviewPrefs *singleton = NULL;
+
+enum {
+  SYSTEM_FONT_CHANGED,
+  HAVE_TEAROFF_CHANGED,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static char *logfiles[] = {
+  "/var/log/sys.log",
+#ifndef ON_SUN_OS
+  "/var/log/messages",
+  "/var/log/secure",
+  "/var/log/maillog",
+  "/var/log/cron",
+  "/var/log/Xorg.0.log",
+  "/var/log/XFree86.0.log",
+  "/var/log/auth.log",
+  "/var/log/cups/error_log",
+#else
+  "/var/adm/messages",
+  "/var/adm/sulog",
+  "/var/log/authlog",
+  "/var/log/brlog",
+  "/var/log/postrun.log",
+  "/var/log/scrollkeeper.log",
+  "/var/log/snmpd.log",
+  "/var/log/sysidconfig.log",
+  "/var/log/swupas/swupas.log",
+  "/var/log/swupas/swupas.error.log",
+#endif
+  NULL
+};
+
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_PREFS, LogviewPrefsPrivate))
+
+struct _LogviewPrefsPrivate {
+  GConfClient *client;
+
+  guint size_store_timeout;
+};
+
+typedef struct {
+  int width;
+  int height;
+} WindowSize;
+
+G_DEFINE_TYPE (LogviewPrefs, logview_prefs, G_TYPE_OBJECT);
+
+static void
+do_finalize (GObject *obj)
+{
+  LogviewPrefs *prefs = LOGVIEW_PREFS (obj);
+
+  g_object_unref (prefs->client);
+
+  G_OBJECT_CLASS (logview_prefs_parent_class)->finalize (obj);
+}
+
+static void
+logview_prefs_class_init (LogviewPrefsClass *klass)
+{
+  GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+  oclass->finalize = do_finalize;
+
+  signals[SYSTEM_FONT_CHANGED] = g_signal_new ("system-font-changed",
+                                               G_OBJECT_CLASS_TYPE (object_class),
+                                               G_SIGNAL_RUN_LAST,
+                                               G_STRUCT_OFFSET (LogviewPrefsClass, system_font_changed),
+                                               NULL, NULL,
+                                               g_cclosure_marshal_VOID__STRING,
+                                               G_TYPE_NONE, 1,
+                                               G_TYPE_STRING);
+  signals[HAVE_TEAROFF_CHANGED] = g_signal_new ("have-tearoff-changed",
+                                                G_OBJECT_CLASS_TYPE (object_class),
+                                                G_SIGNAL_RUN_LAST,
+                                                G_STRUCT_OFFSET (LogviewPrefsClass, have_tearoff_changed),
+                                                NULL, NULL,
+                                                g_cclosure_marshal_VOID__BOOLEAN,
+                                                G_TYPE_NONE, 1,
+                                                G_TYPE_BOOLEAN);
+
+  g_type_class_add_private (klass, sizeof (LogviewPrefsPrivate));
+}
+
+static void
+have_tearoff_changed_cb (GConfClient *client,
+                         guint id,
+                         GConfEntry *entry,
+                         gpointer data)
+{
+  LogviewPrefs *prefs = data;
+
+  if (entry->value && (entry->value->type == GCONF_VALUE_BOOL)) {
+    gboolean add_tearoffs;
+
+    add_tearoffs = gconf_value_get_bool (entry->value);
+    g_signal_emit (prefs, signals[HAVE_TEAROFF_CHANGED], 0, add_tearoffs, NULL);
+  }
+}
+
+static void
+monospace_font_changed_cb (GConfClient *client,
+                           guint id,
+                           GConfEntry *entry,
+                           gpointer data)
+{
+  LogviewPrefs *prefs = data;
+
+  if (entry->value && (entry->value->type == GCONF_VALUE_STRING)) {
+    const gchar *monospace_font_name;
+
+    monospace_font_name = gconf_value_get_string (entry->value);
+    g_signal_emit (prefs, signals[SYSTEM_FONT_CHANGED], 0, monospace_font_name, NULL);
+  }
+}
+
+static gboolean
+size_store_timeout_cb (gpointer data)
+{
+  WindowSize *size = data;
+  LogviewPrefs *prefs = logview_prefs_get ();
+
+  if (size->width > 0 && size->height > 0) {
+    if (gconf_client_key_is_writable (prefs->priv->client, GCONF_WIDTH_KEY, NULL))
+      gconf_client_set_int (prefs->priv->client,
+                            GCONF_WIDTH_KEY,
+                            size->width,
+                            NULL);
+
+    if (gconf_client_key_is_writable (prefs->priv->client, GCONF_HEIGHT_KEY, NULL))
+      gconf_client_set_int (prefs->priv->client,
+                            GCONF_HEIGHT_KEY,
+                            size->height,
+                            NULL);
+  }
+
+  /* reset the source id */
+  prefs->priv->size_store_timeout = 0;
+
+  g_slice_free (WindowSize, data);
+
+  return FALSE;
+}
+
+static gboolean
+check_stored_logfiles (LogviewPrefs *prefs)
+{
+  GConfValue *val;
+  gboolean retval = FALSE;
+
+  val = gconf_client_get (prefs->priv->client,
+                          GCONF_LOGFILES,
+                          NULL);
+  if (val) {
+    gconf_value_free (val);
+    retval = TRUE;
+  }
+
+  return retval;
+}
+
+/* adapted from sysklogd sources */
+static GSList*
+parse_syslog ()
+{
+  char *logfile = NULL;
+  char cbuf[BUFSIZ];
+  char *cline, *p;
+  FILE *cf;
+  GSList *logfiles = NULL;
+
+  if ((cf = fopen ("/etc/syslog.conf", "r")) == NULL) {
+    return NULL;
+  }
+
+  cline = cbuf;
+  while (fgets (cline, sizeof (cbuf) - (cline - cbuf), cf) != NULL) {
+    gchar **list;
+    gint i;
+
+    for (p = cline; g_ascii_isspace (*p); ++p);
+    if (*p == '\0' || *p == '#' || *p == '\n')
+      continue;
+
+    list = g_strsplit_set (p, ", -\t()\n", 0);
+
+    for (i = 0; list[i]; ++i) {
+      if (*list[i] == '/' &&
+          g_slist_find_custom (logfiles, list[i],
+                               (GCompareFunc) g_ascii_strcasecmp) == NULL)
+      {
+        logfiles = g_slist_insert (logfiles,
+                                   g_strdup (list[i]), 0);
+      }
+    }
+
+    g_strfreev (list);
+  }
+
+  fclose (cf);
+
+  return logfiles;
+}
+
+static void
+logview_prefs_fill_defaults (LogviewPrefs *prefs)
+{
+  GSList *logs;
+
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  /* insert in the registry both the default items and the files
+   * specified in syslog.conf.
+   */
+
+  logs = parse_syslog ();
+
+  for (i = 0; default_logfiles[i]; i++) {
+    if (g_slist_find_custom (logs, default_logfiles[i], (GCompareFunc) g_ascii_strcasecmp) == NULL)
+      logs = g_slist_insert (logs, g_strdup (default_logfiles[i]), 0);
+  }
+
+  gconf_client_set_list (prefs->priv->client,
+                         GCONF_LOGFILES,
+                         GCONF_VALUE_STRING,
+                         logs, NULL);
+
+  /* the string list is copied */
+  g_slist_foreach (logs, (GFunc) g_free, NULL);
+  g_slist_free (logs);
+}
+
+static void
+logview_prefs_init (LogviewPrefs *self)
+{
+  gboolean stored_logs;
+
+  self->priv = GET_PRIVATE (self);
+
+  priv->client = gconf_client_get_default ();
+  priv->size_store_timeout = 0;
+
+  stored_logs = check_stored_logfiles (self);
+  if (!stored_logs) {
+    /* if there's no stored logs, either it's the first start or GConf has
+     * been corrupted. re-fill the registry with sensible defaults anyway.
+     */
+    logview_prefs_fill_defaults (prefs);
+  }
+
+  gconf_client_notify_add (priv->client,
+                           GCONF_MONOSPACE_FONT_NAME,
+                           (GConfClientNotifyFunc) monospace_font_changed_cb,
+                           self, NULL, NULL);
+  gconf_client_notify_add (priv->client,
+                           GCONF_MENUS_HAVE_TEAROFF,
+                           (GConfClientNotifyFunc) have_tearoff_changed_cb,
+                           self, NULL, NULL);
+}
+
+/* public methods */
+
+LogviewPrefs *
+logview_prefs_get ()
+{
+  if (!singleton)
+    singleton = g_object_new (LOGVIEW_TYPE_PREFS, NULL);
+
+  return singleton;
+}
+
+void
+logview_prefs_store_window_size (LogviewPrefs *prefs,
+                                 int width, int height)
+{
+  /* we want to be smart here: since we will get a lot of configure events
+   * while resizing, we schedule the real GConf storage in a timeout.
+   */
+  WindowSize *size;
+
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  size = g_slice_new0 (WindowSize);
+  size->width = width;
+  size->height = height;
+
+  if (prefs->priv->size_store_timeout != 0) {
+    /* reschedule the timeout */
+    g_source_remove (prefs->priv->size_store_timeout);
+    prefs->priv->size_store_timeout = 0;
+  }
+
+  prefs->priv->size_store_timeout = g_timeout_add (200,
+                                                   size_store_timeout_cb,
+                                                   size);
+}
+
+void
+logview_prefs_get_stored_window_size (LogviewPrefs *prefs,
+                                      int *width, int *height)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  *width = gconf_client_get_int (prefs->priv->client,
+                                 GCONF_WIDTH_KEY,
+                                 NULL);
+
+  *height = gconf_client_get_int (prefs->priv->client,
+                                  GCONF_WIDTH_KEY,
+                                  &error);
+
+  if ((*width == 0) ^ (*height == 0)) {
+    /* if one of the two failed, return default for both */
+    *width = LOGVIEW_DEFAULT_WIDTH;
+    *height = LOGVIEW_DEFAULT_HEIGHT;
+  }
+}
+
+char *
+logview_prefs_get_monospace_font_name (LogviewPrefs *prefs)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  return (gconf_client_get_string (prefs->priv->client, GCONF_MONOSPACE_FONT_NAME, NULL));
+}
+
+gboolean
+logview_prefs_get_have_tearoff (LogviewPrefs *prefs)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+	return (gconf_client_get_bool (prefs->priv->client, GCONF_MENUS_HAVE_TEAROFF, NULL));
+}
+
+/* the elements should be freed with g_free () */
+
+GSList *
+logview_prefs_get_stored_logfiles (LogviewPrefs *prefs)
+{
+  GSList *retval;
+  GError *err = NULL;
+
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  retval = gconf_client_get_list (prefs->priv->client,
+                                  GCONF_LOGFILES,
+                                  GCONF_VALUE_STRING,
+                                  NULL);
+  return retval;
+}
+
+void
+logview_prefs_store_log (LogviewPrefs *prefs, const char *filename)
+{
+  GSList *stored_logs;
+
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+  g_assert (filename != NULL && filename[0] != '\0');
+
+  stored_logs = logview_prefs_get_stored_logfiles (prefs);
+
+  if (g_slist_find_custom (stored_logs, filename, (GCompareFunc) g_ascii_strcasecmp) == NULL)
+  {
+    stored_logs = g_slist_prepend (stored_logs, g_strdup (filename));
+    gconf_client_set_list (prefs->priv->client,
+                           GCONF_LOGFILES,
+                           GCONF_VALUE_STRING,
+                           stored_logs,
+                           NULL);
+  }
+
+  /* the string list is copied */
+  g_slist_foreach (stored_logs, (GFunc) g_free, NULL);
+  g_slist_free (stored_logs);
+}
+
+void
+logview_prefs_store_fontsize (LogviewPrefs *prefs, int fontsize)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+  g_assert (fontsize > 0);
+
+  if (gconf_client_key_is_writable (prefs->priv->client, GCONF_FONTSIZE_KEY, NULL)) {
+    gconf_client_set_int (prefs->priv->client,
+                          GCONF_FONTSIZE_KEY,
+                          fontsize, NULL);
+  }
+}
+
+int
+logview_prefs_get_stored_fontsize (LogviewPrefs *prefs)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+	return gconf_client_get_int (prefs->priv->client, GCONF_FONTSIZE_KEY, NULL);
+}
+
+void
+logview_prefs_store_active_logfile (LogviewPrefs *prefs,
+                                    const char *filename)
+{
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  if (gconf_client_key_is_writable (prefs->priv->client, GCONF_LOGFILE, NULL)) {
+    gconf_client_set_string (prefs->priv->client,
+                             GCONF_LOGFILE,
+                             filename,
+                             NULL);
+  }
+}
+
+char *
+logview_prefs_get_active_logfile (LogviewPrefs *prefs)
+{
+  char *filename;
+
+  g_assert (LOGVIEW_IS_PREFS (prefs));
+
+  filename = gconf_client_get_string (gconf_client, GCONF_LOGFILE, NULL);
+
+  return filename;
+}
\ No newline at end of file

Added: trunk/logview/logview-prefs.h
==============================================================================
--- (empty file)
+++ trunk/logview/logview-prefs.h	Tue Dec 23 13:25:12 2008
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2004 Vincent Noel <vnoel cox net>
+ * Copyright (C) 2008 Cosimo Cecchi <cosimoc gnome org>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __LOGVIEW_PREFS_H__
+#define __LOGVIEW_PREFS_H__
+
+#define LOGVIEW_TYPE_PREFS logview_prefs_get_type()
+#define LOGVIEW_PREFS(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGVIEW_TYPE_PREFS, LogviewPrefs))
+#define LOGVIEW_PREFS_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), LOGVIEW_TYPE_PREFS, LogviewPrefsClass))
+#define LOGVIEW_IS_PREFS(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGVIEW_TYPE_PREFS))
+#define LOGVIEW_IS_PREFS_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGVIEW_TYPE_PREFS))
+#define LOGVIEW_PREFS_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGVIEW_TYPE_PREFS, LogviewPrefsClass))
+
+typedef struct _LogviewPrefs LogviewPrefs;
+typedef struct _LogviewPrefsClass LogviewPrefsClass;
+typedef struct _LogviewPrefsPrivate LogviewPrefsPrivate;
+
+struct _LogviewPrefs {
+  GObject parent;
+  LogviewPrefsPrivate *priv;
+};
+
+struct _LogviewPrefsClass {
+  GObjectClass parent_class;
+
+  /* signals */
+  void (* system_font_changed)  (LogviewPrefs *prefs,
+                                 const char *font_name);
+  void (* have_tearoff_changed) (LogviewPrefs *prefs,
+                                 gboolean have_tearoff);
+};
+
+GType          logview_prefs_get_type (void);
+
+/* public methods */
+
+LogviewPrefs * logview_prefs_get (void);
+void           logview_prefs_store_window_size       (LogviewPrefs *prefs,
+                                                      int width, int height);
+void           logview_prefs_get_stored_window_size  (LogviewPrefs *prefs,
+                                                      int *width, int *height);
+char *         logview_prefs_get_monospace_font_name (LogviewPrefs *prefs);
+gboolean       logview_prefs_get_have_tearoff        (LogviewPrefs *prefs);
+void           logview_prefs_store_log               (LogviewPrefs *prefs,
+                                                      const char *filename);
+GSList *       logview_prefs_get_stored_logfiles     (LogviewPrefs *prefs);
+void           logview_prefs_store_fontsize          (LogviewPrefs *prefs,
+                                                      int fontsize);
+int            logview_prefs_get_stored_fontsize     (LogviewPrefs *prefs);
+void           logview_prefs_store_active_logfile    (LogviewPrefs *prefs,
+                                                      const char *filename);
+char *         logview_prefs_get_active_logfile      (LogviewPrefs *prefs);
+
+#endif /* __LOG_PREFS_H__ */
\ No newline at end of file



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]