gnome-settings-daemon r370 - in trunk: . plugins/xsettings



Author: behdad
Date: Sat Jun  7 18:17:27 2008
New Revision: 370
URL: http://svn.gnome.org/viewvc/gnome-settings-daemon?rev=370&view=rev

Log:
2008-06-07  Behdad Esfahbod  <behdad gnome org>

        (Commit this again)

        * configure.ac: Check for fontconfig instead of xft2.

        * plugins/xsettings/Makefile.am:
        * plugins/xsettings/gsd-xsettings-manager.c (fontconfig_callback),
        (gnome_xsettings_manager_start), (gnome_xsettings_manager_stop):
        Send a Fontconfig/Timestamp xsettings notification whenever
        fontconfig configurations change. (bug #490374)

        * plugins/xsettings/fontconfig-monitor.c:
        * plugins/xsettings/fontconfig-monitor.h:
        Monitor fontconfig configuration files using gio.



Added:
   trunk/plugins/xsettings/fontconfig-monitor.c
   trunk/plugins/xsettings/fontconfig-monitor.h
Modified:
   trunk/ChangeLog
   trunk/configure.ac
   trunk/plugins/xsettings/Makefile.am
   trunk/plugins/xsettings/gsd-xsettings-manager.c

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Sat Jun  7 18:17:27 2008
@@ -175,12 +175,15 @@
 AC_SUBST(RANDR_LIBS)
 
 dnl ---------------------------------------------------------------------------
-dnl - XFT2
+dnl - Fontconfig
 dnl ---------------------------------------------------------------------------
 
-if $PKG_CONFIG --exists xft; then
-  AC_DEFINE(HAVE_XFT2, 1, [Define if Xft functionality is available])
-fi
+have_fontconfig=no
+PKG_CHECK_MODULES(FONTCONFIG, fontconfig,
+		  [AC_DEFINE(HAVE_FONTCONFIG, 1, [Define if Fontconfig functionality is available])
+		   have_fontconfig=yes],
+		  AC_MSG_RESULT([no]))
+AM_CONDITIONAL(HAVE_FONTCONFIG, test x"$have_fontconfig" = "xyes")
 
 dnl ---------------------------------------------------------------------------
 dnl - Keyboard plugin stuff

Modified: trunk/plugins/xsettings/Makefile.am
==============================================================================
--- trunk/plugins/xsettings/Makefile.am	(original)
+++ trunk/plugins/xsettings/Makefile.am	Sat Jun  7 18:17:27 2008
@@ -32,6 +32,18 @@
 	$(SETTINGS_PLUGIN_LIBS)	\
 	$(NULL)
 
+if HAVE_FONTCONFIG
+libxsettings_la_SOURCES += 	\
+	fontconfig-monitor.h	\
+	fontconfig-monitor.c	\
+	$(NULL)
+libxsettings_la_CFLAGS +=	\
+	$(FONTCONFIG_CFLAGS)
+libxsettings_la_LIBADD += 	\
+	$(FONTCONFIG_LIBS)
+endif
+
+
 plugin_in_files = 		\
 	xsettings.gnome-settings-plugin.in	\
 	$(NULL)

Added: trunk/plugins/xsettings/fontconfig-monitor.c
==============================================================================
--- (empty file)
+++ trunk/plugins/xsettings/fontconfig-monitor.c	Sat Jun  7 18:17:27 2008
@@ -0,0 +1,183 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * 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.
+ *
+ * Author:  Behdad Esfahbod, Red Hat, Inc.
+ */
+
+#include "fontconfig-monitor.h"
+
+#include <gio/gio.h>
+#include <fontconfig/fontconfig.h>
+
+#define TIMEOUT_SECONDS 2
+
+static void
+stuff_changed (GFileMonitor *monitor,
+               GFile *file,
+               GFile *other_file,
+               GFileMonitorEvent event_type,
+               gpointer handle);
+
+static void
+monitor_files (GPtrArray *monitors,
+               FcStrList *list,
+               gpointer   data)
+{
+        const char *str;
+
+        while ((str = (const char *) FcStrListNext (list))) {
+                GFile *file;
+                GFileMonitor *monitor;
+
+                file = g_file_new_for_path (str);
+
+                if (g_file_test (str, G_FILE_TEST_IS_DIR))
+                        monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL);
+                else
+                        monitor = g_file_monitor_file      (file, G_FILE_MONITOR_NONE, NULL, NULL);
+
+                g_object_unref (file);
+
+                if (!monitor)
+                        continue;
+
+                g_signal_connect (monitor, "changed", G_CALLBACK (stuff_changed), data);
+
+                g_ptr_array_add (monitors, monitor);
+        }
+
+        FcStrListDone (list);
+}
+
+
+struct _fontconfig_monitor_handle {
+        GPtrArray *monitors;
+
+        guint timeout;
+
+        GFunc    notify_callback;
+        gpointer notify_data;
+};
+
+static GPtrArray *
+monitors_create (gpointer data)
+{
+        GPtrArray *monitors = g_ptr_array_new ();
+
+        monitor_files (monitors, FcConfigGetConfigFiles (NULL), data);
+        monitor_files (monitors, FcConfigGetFontDirs (NULL)   , data);
+
+        return monitors;
+}
+
+static void
+monitors_free (GPtrArray *monitors)
+{
+        if (!monitors)
+                return;
+
+        g_ptr_array_foreach (monitors, (GFunc) g_object_unref, NULL);
+        g_ptr_array_free (monitors, TRUE);
+}
+
+static gboolean
+update (gpointer data)
+{
+        fontconfig_monitor_handle_t *handle = data;
+        gboolean notify = FALSE;
+
+        handle->timeout = 0;
+
+        if (!FcConfigUptoDate (NULL) && FcInitReinitialize ()) {
+                notify = TRUE;
+                monitors_free (handle->monitors);
+                handle->monitors = monitors_create (data);
+        }
+
+        /* we finish modifying handle before calling the notify callback,
+         * allowing the callback to free the monitor if it decides to. */
+
+        if (notify && handle->notify_callback)
+                handle->notify_callback (data, handle->notify_data);
+
+        return FALSE;
+}
+
+static void
+stuff_changed (GFileMonitor *monitor G_GNUC_UNUSED,
+               GFile *file G_GNUC_UNUSED,
+               GFile *other_file G_GNUC_UNUSED,
+               GFileMonitorEvent event_type G_GNUC_UNUSED,
+               gpointer data)
+{
+        fontconfig_monitor_handle_t *handle = data;
+
+        /* wait for quiescence */
+        if (handle->timeout)
+                g_source_remove (handle->timeout);
+        
+        handle->timeout = g_timeout_add_seconds (TIMEOUT_SECONDS, update, data);
+}
+
+
+fontconfig_monitor_handle_t *
+fontconfig_monitor_start (GFunc    notify_callback,
+                          gpointer notify_data)
+{
+        fontconfig_monitor_handle_t *handle = g_slice_new0 (fontconfig_monitor_handle_t);
+
+        handle->notify_callback = notify_callback;
+        handle->notify_data = notify_data;
+        handle->monitors = monitors_create (handle);
+
+        return handle;
+}
+
+void
+fontconfig_monitor_stop  (fontconfig_monitor_handle_t *handle)
+{
+        if (handle->timeout)
+          g_source_remove (handle->timeout);
+        handle->timeout = 0;
+
+        monitors_free (handle->monitors);
+        handle->monitors = NULL;
+}
+
+#ifdef FONTCONFIG_MONITOR_TEST
+static void
+yay (void)
+{
+        g_message ("yay");
+}
+
+int
+main (void)
+{
+        GMainLoop *loop;
+
+        g_type_init ();
+
+        fontconfig_monitor_start ((GFunc) yay, NULL);
+
+        loop = g_main_loop_new (NULL, TRUE);
+        g_main_loop_run (loop);
+
+        return 0;
+}
+#endif

Added: trunk/plugins/xsettings/fontconfig-monitor.h
==============================================================================
--- (empty file)
+++ trunk/plugins/xsettings/fontconfig-monitor.h	Sat Jun  7 18:17:27 2008
@@ -0,0 +1,37 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * 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.
+ *
+ * Author:  Behdad Esfahbod, Red Hat, Inc.
+ */
+#ifndef __FONTCONFIG_MONITOR_H
+#define __FONTCONFIG_MONITOR_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct _fontconfig_monitor_handle fontconfig_monitor_handle_t;
+
+fontconfig_monitor_handle_t *
+fontconfig_monitor_start (GFunc    notify_callback,
+                          gpointer notify_data);
+void fontconfig_monitor_stop  (fontconfig_monitor_handle_t *handle);
+
+G_END_DECLS
+
+#endif /* __FONTCONFIG_MONITOR_H */

Modified: trunk/plugins/xsettings/gsd-xsettings-manager.c
==============================================================================
--- trunk/plugins/xsettings/gsd-xsettings-manager.c	(original)
+++ trunk/plugins/xsettings/gsd-xsettings-manager.c	Sat Jun  7 18:17:27 2008
@@ -28,6 +28,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
+#include <time.h>
 
 #include <glib.h>
 #include <glib/gi18n.h>
@@ -40,6 +41,9 @@
 #include "gnome-settings-profile.h"
 #include "gsd-xsettings-manager.h"
 #include "xsettings-manager.h"
+#ifdef HAVE_FONTCONFIG
+#include "fontconfig-monitor.h"
+#endif /* HAVE_FONTCONFIG */
 
 #define GNOME_XSETTINGS_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNOME_TYPE_XSETTINGS_MANAGER, GnomeXSettingsManagerPrivate))
 
@@ -47,7 +51,7 @@
 #define GTK_SETTINGS_DIR       "/desktop/gtk"
 #define INTERFACE_SETTINGS_DIR "/desktop/gnome/interface"
 
-#ifdef HAVE_XFT2
+#ifdef HAVE_FONTCONFIG
 #define FONT_RENDER_DIR "/desktop/gnome/font_rendering"
 #define FONT_ANTIALIASING_KEY FONT_RENDER_DIR "/antialiasing"
 #define FONT_HINTING_KEY      FONT_RENDER_DIR "/hinting"
@@ -68,7 +72,7 @@
 #define DPI_LOW_REASONABLE_VALUE 50
 #define DPI_HIGH_REASONABLE_VALUE 500
 
-#endif /* HAVE_XFT2 */
+#endif /* HAVE_FONTCONFIG */
 
 typedef struct _TranslationEntry TranslationEntry;
 typedef void (* TranslationFunc) (GnomeXSettingsManager *manager,
@@ -87,6 +91,9 @@
 {
         XSettingsManager **managers;
         guint              notify[4];
+#ifdef HAVE_FONTCONFIG
+        fontconfig_monitor_handle_t *fontconfig_handle;
+#endif /* HAVE_FONTCONFIG */
 };
 
 #define GSD_XSETTINGS_ERROR gsd_xsettings_error_quark ()
@@ -207,7 +214,7 @@
         { "/desktop/gnome/interface/show_unicode_menu",      "Gtk/ShowUnicodeMenu",     GCONF_VALUE_BOOL,     translate_bool_int },
 };
 
-#ifdef HAVE_XFT2
+#ifdef HAVE_FONTCONFIG
 static double
 dpi_from_pixels_and_mm (int pixels,
                         int mm)
@@ -536,7 +543,23 @@
         }
 }
 
-#endif /* HAVE_XFT2 */
+static void
+fontconfig_callback (fontconfig_monitor_handle_t *handle,
+                     GnomeXSettingsManager       *manager)
+{
+        int i;
+        int timestamp = time (NULL);
+
+        gnome_settings_profile_start (NULL);
+
+        for (i = 0; manager->priv->managers [i]; i++) {
+                xsettings_manager_set_int (manager->priv->managers [i], "Fontconfig/Timestamp", timestamp);
+                xsettings_manager_notify (manager->priv->managers [i]);
+        }
+        gnome_settings_profile_end (NULL);
+}
+
+#endif /* HAVE_FONTCONFIG */
 
 static const char *
 type_to_string (GConfValueType type)
@@ -746,13 +769,15 @@
                                           INTERFACE_SETTINGS_DIR,
                                           (GConfClientNotifyFunc) xsettings_callback);
 
-#ifdef HAVE_XFT2
+#ifdef HAVE_FONTCONFIG
         manager->priv->notify[3] =
                 register_config_callback (manager, client,
                                           FONT_RENDER_DIR,
                                           (GConfClientNotifyFunc) xft_callback);
         update_xft_settings (manager, client);
-#endif /* HAVE_XFT */
+
+        manager->priv->fontconfig_handle = fontconfig_monitor_start ((GFunc) fontconfig_callback, manager);
+#endif /* HAVE_FONTCONFIG */
 
         g_object_unref (client);
 
@@ -793,9 +818,12 @@
         gconf_client_remove_dir (client, MOUSE_SETTINGS_DIR, NULL);
         gconf_client_remove_dir (client, GTK_SETTINGS_DIR, NULL);
         gconf_client_remove_dir (client, INTERFACE_SETTINGS_DIR, NULL);
-#ifdef HAVE_XFT2
+#ifdef HAVE_FONTCONFIG
         gconf_client_remove_dir (client, FONT_RENDER_DIR, NULL);
-#endif
+
+        fontconfig_monitor_stop (manager->priv->fontconfig_handle);
+        manager->priv->fontconfig_handle = NULL;
+#endif /* HAVE_FONTCONFIG */
 
         for (i = 0; i < G_N_ELEMENTS (p->notify); ++i) {
                 if (p->notify[i] != 0) {



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