summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnome-settings-daemon/ChangeLog21
-rw-r--r--gnome-settings-daemon/gnome-settings-daemon.c65
-rw-r--r--gnome-settings-daemon/gnome-settings-xsettings.c60
3 files changed, 114 insertions, 32 deletions
diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog
index ecccc8f6e..c408e6b51 100644
--- a/gnome-settings-daemon/ChangeLog
+++ b/gnome-settings-daemon/ChangeLog
@@ -1,3 +1,24 @@
+2002-11-08 Mark McLoughlin <mark@skynet.ie>
+
+ Create a XSettingsManager for every available
+ screen and apply settings changes to each.
+
+ * gnome-settings-daemon.c:
+ (manager_event_filter): make this a per-window filter
+ and ask the appropriate xsettings manager to filter
+ the event.
+ (finalize): dispose of every manager.
+ (gnome_settings_daemon_new): create a settings manager
+ for each screen.
+
+ * gnome-settings-xsettings.c:
+ (translate_bool_int), (translate_int_int),
+ (translate_string_string), (process_value),
+ (xsettings_callback), (xft_callback),
+ (gnome_xft_settings_set_xsettings),
+ (gnome_settings_xsettings_load): apply settings to
+ every available settings manager.
+
2002-11-02 Jody Goldberg <jody@gnome.org>
* Release 2.1.2
diff --git a/gnome-settings-daemon/gnome-settings-daemon.c b/gnome-settings-daemon/gnome-settings-daemon.c
index d3c3fe9a0..e486b1bb7 100644
--- a/gnome-settings-daemon/gnome-settings-daemon.c
+++ b/gnome-settings-daemon/gnome-settings-daemon.c
@@ -56,7 +56,7 @@ struct _GnomeSettingsDaemonPrivate {
};
static GSList *directories = NULL;
-XSettingsManager *manager;
+XSettingsManager **managers = NULL;
typedef struct DirElement
{
@@ -128,6 +128,9 @@ static void
terminate_cb (void *data)
{
gboolean *terminated = data;
+
+ if (*terminated)
+ return;
*terminated = TRUE;
gtk_main_quit ();
@@ -138,7 +141,11 @@ manager_event_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
- if (xsettings_manager_process_event (manager, (XEvent *)xevent))
+ int screen_num = GPOINTER_TO_INT (data);
+
+ g_return_val_if_fail (managers != NULL, GDK_FILTER_CONTINUE);
+
+ if (xsettings_manager_process_event (managers [screen_num], (XEvent *)xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
@@ -160,13 +167,15 @@ static void
finalize (GObject *object)
{
GnomeSettingsDaemon *daemon;
+ int i;
daemon = GNOME_SETTINGS_DAEMON (object);
if (daemon->private == NULL) {
return;
}
- xsettings_manager_destroy (manager);
+ for (i = 0; managers && managers [i]; i++)
+ xsettings_manager_destroy (managers [i]);
g_free (daemon->private);
daemon->private = NULL;
@@ -204,10 +213,18 @@ gnome_settings_daemon_new (void)
GConfClient *client;
GSList *list;
GnomeSettingsDaemon *daemon;
+ GdkDisplay *display;
+ int i;
+ int n_screens;
+
+ display = gdk_display_get_default ();
+ n_screens = gdk_display_get_n_screens (display);
daemon = g_object_new (gnome_settings_daemon_get_type (), NULL);
- if (xsettings_manager_check_running (gdk_display, DefaultScreen (gdk_display)))
+ if (xsettings_manager_check_running (
+ gdk_x11_display_get_xdisplay (display),
+ gdk_screen_get_number (gdk_screen_get_default ())))
{
fprintf (stderr, "You can only run one xsettings manager at a time; exiting\n");
exit (1);
@@ -215,13 +232,27 @@ gnome_settings_daemon_new (void)
if (!terminated)
{
- manager = xsettings_manager_new (gdk_display, DefaultScreen (gdk_display),
- terminate_cb, &terminated);
- if (!manager)
- {
- fprintf (stderr, "Could not create xsettings manager!\n");
- exit (1);
- }
+ managers = g_new (XSettingsManager *, n_screens + 1);
+
+ for (i = 0; i < n_screens; i++)
+ {
+ GdkScreen *screen;
+
+ screen = gdk_display_get_screen (display, i);
+
+ managers [i] = xsettings_manager_new (
+ gdk_x11_display_get_xdisplay (display),
+ gdk_screen_get_number (screen),
+ terminate_cb, &terminated);
+ if (!managers [i])
+ {
+ fprintf (stderr, "Could not create xsettings manager for screen %d!\n", i);
+ exit (1);
+ }
+ }
+
+ g_assert (i == n_screens);
+ managers [i] = NULL;
}
/* We use GConfClient not GConfClient because a cache isn't useful
@@ -266,8 +297,16 @@ gnome_settings_daemon_new (void)
g_error_free (error);
}
}
-
- gdk_window_add_filter (NULL, manager_event_filter, NULL);
+
+ for (i = 0; i < n_screens; i++)
+ {
+ GdkScreen *screen;
+
+ screen = gdk_display_get_screen (display, i);
+ gdk_window_add_filter (
+ gdk_screen_get_root_window (screen),
+ manager_event_filter, GINT_TO_POINTER (i));
+ }
/* gnome_settings_disk_load (client);*/
gnome_settings_font_load (client);
diff --git a/gnome-settings-daemon/gnome-settings-xsettings.c b/gnome-settings-daemon/gnome-settings-xsettings.c
index ebc18369c..17b971c5d 100644
--- a/gnome-settings-daemon/gnome-settings-xsettings.c
+++ b/gnome-settings-daemon/gnome-settings-xsettings.c
@@ -13,7 +13,7 @@
#include "gnome-settings-xsettings.h"
#include "xsettings-manager.h"
-extern XSettingsManager *manager;
+extern XSettingsManager **managers;
#ifdef HAVE_XFT2
#define FONT_RENDER_DIR "/desktop/gnome/font_rendering"
@@ -44,31 +44,40 @@ static void
translate_bool_int (TranslationEntry *trans,
GConfValue *value)
{
+ int i;
+
g_assert (value->type == trans->gconf_type);
- xsettings_manager_set_int (manager, trans->xsetting_name,
- gconf_value_get_bool (value));
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_set_int (managers [i], trans->xsetting_name,
+ gconf_value_get_bool (value));
}
static void
translate_int_int (TranslationEntry *trans,
GConfValue *value)
{
+ int i;
+
g_assert (value->type == trans->gconf_type);
-
- xsettings_manager_set_int (manager, trans->xsetting_name,
- gconf_value_get_int (value));
+
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_set_int (managers [i], trans->xsetting_name,
+ gconf_value_get_int (value));
}
static void
translate_string_string (TranslationEntry *trans,
GConfValue *value)
{
+ int i;
+
g_assert (value->type == trans->gconf_type);
- xsettings_manager_set_string (manager,
- trans->xsetting_name,
- gconf_value_get_string (value));
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_set_string (managers [i],
+ trans->xsetting_name,
+ gconf_value_get_string (value));
}
static TranslationEntry translations [] = {
@@ -159,7 +168,10 @@ process_value (TranslationEntry *trans,
{
if (val == NULL)
{
- xsettings_manager_delete_setting (manager, trans->xsetting_name);
+ int i;
+
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_delete_setting (managers [i], trans->xsetting_name);
}
else
{
@@ -181,14 +193,16 @@ static void
xsettings_callback (GConfEntry *entry)
{
TranslationEntry *trans;
- trans = find_translation_entry (entry->key);
+ int i;
+ trans = find_translation_entry (entry->key);
if (trans == NULL)
return;
process_value (trans, entry->value);
- xsettings_manager_notify (manager);
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_notify (managers [i]);
}
void
@@ -208,11 +222,14 @@ static void
xft_callback (GConfEntry *entry)
{
GConfClient *client;
+ int i;
client = gconf_client_get_default ();
gnome_settings_update_xft (client);
- xsettings_manager_notify (manager);
+
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_notify (managers [i]);
}
typedef struct
@@ -320,11 +337,15 @@ gnome_xft_settings_get (GConfClient *client,
static void
gnome_xft_settings_set_xsettings (GnomeXftSettings *settings)
{
- xsettings_manager_set_int (manager, "Xft/Antialias", settings->antialias);
- xsettings_manager_set_int (manager, "Xft/Hinting", settings->hinting);
- xsettings_manager_set_string (manager, "Xft/HintStyle", settings->hintstyle);
- xsettings_manager_set_int (manager, "Xft/DPI", settings->dpi);
- xsettings_manager_set_string (manager, "Xft/RGBA", settings->rgba);
+ int i;
+ for (i = 0; managers [i]; i++)
+ {
+ xsettings_manager_set_int (managers [i], "Xft/Antialias", settings->antialias);
+ xsettings_manager_set_int (managers [i], "Xft/Hinting", settings->hinting);
+ xsettings_manager_set_string (managers [i], "Xft/HintStyle", settings->hintstyle);
+ xsettings_manager_set_int (managers [i], "Xft/DPI", settings->dpi);
+ xsettings_manager_set_string (managers [i], "Xft/RGBA", settings->rgba);
+ }
}
/*
@@ -509,5 +530,6 @@ gnome_settings_xsettings_load (GConfClient *client)
gnome_settings_update_xft (client);
#endif /* HAVE_XFT */
- xsettings_manager_notify (manager);
+ for (i = 0; managers [i]; i++)
+ xsettings_manager_notify (managers [i]);
}