changed to use the new GnomeSettingsModule class for loadable modules.

2007-05-08  Rodrigo Moya <rodrigo@gnome-db.org>

	* gnome-settings-background.c: changed to use the new GnomeSettingsModule
	class for loadable modules.

	* gnome-settings-daemon.c (initialize_modules, start_modules,
	stop_modules): new functions to call modules's methods.
	(gnome_settings_daemon_init): get all module types and create objects
	from each of them.
	(gnome_settings_daemon_new): added code to call loadable modules's
	methods where appropriate.

svn path=/trunk/; revision=7580
This commit is contained in:
Rodrigo Moya 2007-05-08 10:51:22 +00:00 committed by Rodrigo Moya
parent 1cf628cbef
commit 55b39ed23a
5 changed files with 292 additions and 81 deletions

View file

@ -1,3 +1,19 @@
2007-05-08 Rodrigo Moya <rodrigo@gnome-db.org>
* gnome-settings-background.c: changed to use the new GnomeSettingsModule
class for loadable modules.
* gnome-settings-daemon.c (initialize_modules, start_modules,
stop_modules): new functions to call modules's methods.
(gnome_settings_daemon_init): get all module types and create objects
from each of them.
(gnome_settings_daemon_new): added code to call loadable modules's
methods where appropriate.
2007-04-24 Rodrigo Moya <rodrigo@gnome-db.org>
* gnome-settings-module.h: added missing prototype.
2007-04-23 Rodrigo Moya <rodrigo@gnome-db.org>
* gnome-settings-module.[ch] (gnome_settings_module_get_runlevel):

View file

@ -31,72 +31,160 @@
#include <gdk/gdkx.h>
#include <gconf/gconf.h>
#include "gnome-settings-background.h"
#include "gnome-settings-keyboard.h"
#include "gnome-settings-module.h"
#include "gnome-settings-daemon.h"
#include "preferences.h"
#include "applier.h"
static BGApplier **bg_appliers;
static BGPreferences *prefs;
G_BEGIN_DECLS
static guint applier_idle_id = 0;
typedef struct _GnomeSettingsModuleBackground GnomeSettingsModuleBackground;
typedef struct _GnomeSettingsModuleBackgroundClass GnomeSettingsModuleBackgroundClass;
struct _GnomeSettingsModuleBackground {
GnomeSettingsModule parent;
BGApplier **bg_appliers;
BGPreferences *prefs;
guint applier_idle_id;
};
struct _GnomeSettingsModuleBackgroundClass {
GnomeSettingsModuleClass parent_class;
};
static void gnome_settings_module_background_class_init (GnomeSettingsModuleBackgroundClass *klass);
static void gnome_settings_module_background_init (GnomeSettingsModuleBackground *module);
static gboolean gnome_settings_module_background_initialize (GnomeSettingsModule *module, GConfClient *client);
static gboolean gnome_settings_module_background_start (GnomeSettingsModule *module);
static GnomeSettingsModuleRunlevel gnome_settings_module_background_get_runlevel (GnomeSettingsModule *module);
G_END_DECLS
static gboolean
applier_idle (gpointer data)
{
GnomeSettingsModuleBackground *module;
int i;
for (i = 0; bg_appliers [i]; i++)
bg_applier_apply_prefs (bg_appliers [i], prefs);
applier_idle_id = 0;
module = (GnomeSettingsModuleBackground *) data;
for (i = 0; module->bg_appliers [i]; i++)
bg_applier_apply_prefs (module->bg_appliers [i], module->prefs);
module->applier_idle_id = 0;
return FALSE;
}
static void
background_callback (GConfEntry *entry)
background_callback (GConfClient *client,
guint cnxn_id,
GConfEntry *entry,
gpointer user_data)
{
bg_preferences_merge_entry (prefs, entry);
GnomeSettingsModuleBackground *module_bg;
module_bg = (GnomeSettingsModuleBackground *) user_data;
bg_preferences_merge_entry (module_bg->prefs, entry);
if (applier_idle_id != 0) {
g_source_remove (applier_idle_id);
if (module_bg->applier_idle_id != 0) {
g_source_remove (module_bg->applier_idle_id);
}
applier_idle_id = g_timeout_add (100, applier_idle, NULL);
module_bg->applier_idle_id = g_timeout_add (100, applier_idle, NULL);
}
void
gnome_settings_background_init (GConfClient *client)
static void
gnome_settings_module_background_class_init (GnomeSettingsModuleBackgroundClass *klass)
{
GnomeSettingsModuleClass *module_class;
module_class = (GnomeSettingsModuleClass *) klass;
module_class->initialize = gnome_settings_module_background_initialize;
module_class->start = gnome_settings_module_background_start;
module_class->get_runlevel = gnome_settings_module_background_get_runlevel;
}
static void
gnome_settings_module_background_init (GnomeSettingsModuleBackground *module)
{
module->applier_idle_id = 0;
}
GType
gnome_settings_module_background_get_type (void)
{
static GType module_type = 0;
if (!module_type) {
static const GTypeInfo module_info = {
sizeof (GnomeSettingsModuleBackgroundClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gnome_settings_module_background_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GnomeSettingsModuleBackground),
0, /* n_preallocs */
(GInstanceInitFunc) gnome_settings_module_background_init,
};
module_type = g_type_register_static (G_TYPE_OBJECT,
"GnomeSettingsModuleBackground",
&module_info, 0);
}
return module_type;
}
static gboolean
gnome_settings_module_background_initialize (GnomeSettingsModule *module,
GConfClient *client)
{
GnomeSettingsModuleBackground *module_bg;
GdkDisplay *display;
int n_screens;
int i;
module_bg = (GnomeSettingsModuleBackground *) module;
display = gdk_display_get_default ();
n_screens = gdk_display_get_n_screens (display);
bg_appliers = g_new (BGApplier *, n_screens + 1);
module_bg->bg_appliers = g_new (BGApplier *, n_screens + 1);
for (i = 0; i < n_screens; i++) {
GdkScreen *screen;
screen = gdk_display_get_screen (display, i);
bg_appliers [i] = BG_APPLIER (bg_applier_new_for_screen (BG_APPLIER_ROOT, screen));
module_bg->bg_appliers [i] = BG_APPLIER (bg_applier_new_for_screen (BG_APPLIER_ROOT, screen));
}
bg_appliers [i] = NULL;
module_bg->bg_appliers [i] = NULL;
prefs = BG_PREFERENCES (bg_preferences_new ());
bg_preferences_load (prefs);
module_bg->prefs = BG_PREFERENCES (bg_preferences_new ());
bg_preferences_load (module_bg->prefs);
gnome_settings_register_config_callback ("/desktop/gnome/background", background_callback);
gconf_client_notify_add (client,
"/desktop/gnome/background",
background_callback,
module,
NULL,
NULL);
return TRUE;
}
void
gnome_settings_background_load (GConfClient *client)
static gboolean
gnome_settings_module_background_start (GnomeSettingsModule *module)
{
GnomeSettingsModuleBackground *module_bg;
GConfClient *client;
int i;
module_bg = (GnomeSettingsModuleBackground *) module;
client = gnome_settings_module_get_config_client (module);
/* If this is set, nautilus will draw the background and is
* almost definitely in our session. however, it may not be
* running yet (so is_nautilus_running() will fail). so, on
@ -106,8 +194,16 @@ gnome_settings_background_load (GConfClient *client)
*/
if (gconf_client_get_bool (client, "/apps/nautilus/preferences/show_desktop", NULL))
return;
return FALSE;
for (i = 0; bg_appliers [i]; i++)
bg_applier_apply_prefs (bg_appliers [i], prefs);
for (i = 0; module_bg->bg_appliers [i]; i++)
bg_applier_apply_prefs (module_bg->bg_appliers [i], module_bg->prefs);
return TRUE;
}
static GnomeSettingsModuleRunlevel
gnome_settings_module_background_get_runlevel (GnomeSettingsModule *module)
{
return GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS;
}

View file

@ -32,6 +32,7 @@
#include "xsettings-manager.h"
#include "gnome-settings-daemon.h"
#include "gnome-settings-module.h"
#include "gnome-settings-xmodmap.h"
/*#include "gnome-settings-disk.h"*/
@ -56,7 +57,7 @@
static GObjectClass *parent_class = NULL;
struct _GnomeSettingsDaemonPrivate {
int dummy;
GHashTable *loaded_modules;
};
XSettingsManager **managers = NULL;
@ -65,7 +66,7 @@ static ClipboardManager *clipboard_manager;
static void
clipboard_manager_terminate_cb (void *data)
{
/* Do nothing */
/* Do nothing */
}
static GdkFilterReturn
@ -73,11 +74,11 @@ clipboard_manager_event_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
if (clipboard_manager_process_event (clipboard_manager,
(XEvent *)xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
if (clipboard_manager_process_event (clipboard_manager,
(XEvent *)xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
}
static void
@ -86,40 +87,37 @@ clipboard_manager_watch_cb (Window window,
long mask,
void *cb_data)
{
GdkWindow *gdkwin;
GdkDisplay *display;
GdkWindow *gdkwin;
GdkDisplay *display;
display = gdk_display_get_default ();
gdkwin = gdk_window_lookup_for_display (display, window);
display = gdk_display_get_default ();
gdkwin = gdk_window_lookup_for_display (display, window);
if (is_start)
{
if (!gdkwin)
gdkwin = gdk_window_foreign_new_for_display (display, window);
else
g_object_ref (gdkwin);
if (is_start) {
if (!gdkwin)
gdkwin = gdk_window_foreign_new_for_display (display, window);
else
g_object_ref (gdkwin);
gdk_window_add_filter (gdkwin, clipboard_manager_event_filter, NULL);
}
else
{
if (!gdkwin)
return;
gdk_window_remove_filter (gdkwin, clipboard_manager_event_filter, NULL);
g_object_unref (gdkwin);
}
gdk_window_add_filter (gdkwin, clipboard_manager_event_filter, NULL);
} else {
if (!gdkwin)
return;
gdk_window_remove_filter (gdkwin, clipboard_manager_event_filter, NULL);
g_object_unref (gdkwin);
}
}
static void
terminate_cb (void *data)
{
gboolean *terminated = data;
gboolean *terminated = data;
if (*terminated)
return;
if (*terminated)
return;
*terminated = TRUE;
gtk_main_quit ();
*terminated = TRUE;
gtk_main_quit ();
}
static GdkFilterReturn
@ -127,34 +125,89 @@ manager_event_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
int screen_num = GPOINTER_TO_INT (data);
int screen_num = GPOINTER_TO_INT (data);
g_return_val_if_fail (managers != NULL, GDK_FILTER_CONTINUE);
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;
if (xsettings_manager_process_event (managers [screen_num], (XEvent *)xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
}
static void
free_modules_list (gpointer data)
{
GList *l = (GList *) data;
while (l) {
g_object_unref (G_OBJECT (l->data));
l = g_list_remove (l, l);
}
}
static void
initialize_modules (GnomeSettingsDaemon *daemon, GnomeSettingsModuleRunlevel runlevel)
{
GList *l, *module_list;
GConfClient *client;
client = gnome_settings_get_config_client ();
module_list = g_hash_table_lookup (daemon->priv->loaded_modules, &runlevel);
for (l = module_list; l != NULL; l = l->next) {
gnome_settings_module_initialize (GNOME_SETTINGS_MODULE (l->data), client);
}
}
static void
start_modules (GnomeSettingsDaemon *daemon, GnomeSettingsModuleRunlevel runlevel)
{
GList *l, *module_list;
module_list = g_hash_table_lookup (daemon->priv->loaded_modules, &runlevel);
for (l = module_list; l != NULL; l = l->next)
gnome_settings_module_start (GNOME_SETTINGS_MODULE (l->data));
}
static void
stop_modules (GnomeSettingsDaemon *daemon, GnomeSettingsModuleRunlevel runlevel)
{
GList *l, *module_list;
module_list = g_hash_table_lookup (daemon->priv->loaded_modules, &runlevel);
for (l = module_list; l != NULL; l = l->next)
gnome_settings_module_stop (GNOME_SETTINGS_MODULE (l->data));
}
static void
finalize (GObject *object)
{
GnomeSettingsDaemon *daemon;
int i;
int i;
daemon = GNOME_SETTINGS_DAEMON (object);
if (daemon->private == NULL) {
return;
}
if (daemon->priv == NULL)
return;
for (i = 0; managers && managers [i]; i++)
xsettings_manager_destroy (managers [i]);
clipboard_manager_destroy (clipboard_manager);
g_free (daemon->private);
daemon->private = NULL;
if (daemon->priv->loaded_modules) {
/* call _stop method on modules, in runlevel-descending order */
stop_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_SERVICES);
stop_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_CORE_SERVICES);
stop_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS);
stop_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS);
g_hash_table_destroy (daemon->priv->loaded_modules);
daemon->priv->loaded_modules = NULL;
}
g_free (daemon->priv);
daemon->priv = NULL;
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -162,30 +215,64 @@ finalize (GObject *object)
static void
gnome_settings_daemon_class_init (GnomeSettingsDaemonClass *klass)
{
GObjectClass *object_class;
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class = G_OBJECT_CLASS (klass);
object_class->finalize = finalize;
object_class->finalize = finalize;
parent_class = g_type_class_peek_parent (klass);
parent_class = g_type_class_peek_parent (klass);
}
static void
gnome_settings_daemon_init (GnomeSettingsDaemon *settings)
{
settings->private = g_new (GnomeSettingsDaemonPrivate, 1);
GType *module_types;
guint n_children;
settings->priv = g_new (GnomeSettingsDaemonPrivate, 1);
/* register all internal modules types */
if (!gnome_settings_module_background_get_type ())
return;
/* create hash table for loaded modules */
settings->priv->loaded_modules = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, free_modules_list);
module_types = g_type_children (GNOME_SETTINGS_TYPE_MODULE, &n_children);
if (module_types) {
guint i;
for (i = 0; i < n_children; i++) {
GObject *module;
GnomeSettingsModuleRunlevel runlevel;
GList *module_list;
module = g_object_new (module_types[i], NULL);
if (!module)
continue;
runlevel = gnome_settings_module_get_runlevel (GNOME_SETTINGS_MODULE (module));
module_list = g_hash_table_lookup (settings->priv->loaded_modules, &runlevel);
if (module_list)
module_list = g_list_append (module_list, module);
else {
module_list = g_list_append (NULL, module);
g_hash_table_insert (settings->priv->loaded_modules, &runlevel, module_list);
}
}
g_free (module_types);
}
}
G_DEFINE_TYPE (GnomeSettingsDaemon, gnome_settings_daemon,
G_TYPE_OBJECT)
G_DEFINE_TYPE (GnomeSettingsDaemon, gnome_settings_daemon, G_TYPE_OBJECT)
GObject *
gnome_settings_daemon_new (void)
{
gboolean terminated = FALSE;
GConfClient *client;
GSList *list;
GnomeSettingsDaemon *daemon;
GdkDisplay *display;
GObject *dbusServer;
@ -252,12 +339,17 @@ gnome_settings_daemon_new (void)
gnome_settings_accessibility_keyboard_init (client);
gnome_settings_screensaver_init (client);
gnome_settings_default_editor_init (client);
gnome_settings_background_init (client);
gnome_settings_keybindings_init (client);
gnome_settings_gtk1_theme_init (client);
gnome_settings_xrdb_init (client);
gnome_settings_typing_break_init (client);
/* load all modules */
initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS);
initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS);
initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_CORE_SERVICES);
initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_SERVICES);
for (i = 0; i < n_screens; i++) {
GdkScreen *screen;
@ -280,12 +372,18 @@ gnome_settings_daemon_new (void)
gnome_settings_accessibility_keyboard_load (client);
gnome_settings_screensaver_load (client);
gnome_settings_default_editor_load (client);
gnome_settings_background_load (client);
gnome_settings_keybindings_load (client);
gnome_settings_gtk1_theme_load (client);
gnome_settings_xrdb_load (client);
gnome_settings_typing_break_load (client);
/* start all modules */
start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS);
start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS);
start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_CORE_SERVICES);
start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_SERVICES);
/* create DBus server */
dbusServer = g_object_new (gnome_settings_server_get_type (), NULL);
return G_OBJECT (daemon);

View file

@ -43,7 +43,7 @@ typedef struct _GnomeSettingsDaemonPrivate GnomeSettingsDaemonPrivate;
struct _GnomeSettingsDaemon {
GObject parent_instance;
GnomeSettingsDaemonPrivate *private;
GnomeSettingsDaemonPrivate *priv;
};
struct _GnomeSettingsDaemonClass {

View file

@ -76,8 +76,9 @@ gboolean gnome_settings_module_start (GnomeSettingsModule *module);
gboolean gnome_settings_module_stop (GnomeSettingsModule *module);
gboolean gnome_settings_module_reload_settings (GnomeSettingsModule *module);
GConfClient *gnome_settings_module_get_config_client (GnomeSettingsModule *module);
GnomeSettingsModuleStatus gnome_settings_module_get_status (GnomeSettingsModule *module);
GnomeSettingsModuleRunlevel gnome_settings_module_get_runlevel (GnomeSettingsModule *module);
GConfClient *gnome_settings_module_get_config_client (GnomeSettingsModule *module);
GnomeSettingsModuleStatus gnome_settings_module_get_status (GnomeSettingsModule *module);
G_END_DECLS