diff options
| author | Stefano Karapetsas <[email protected]> | 2012-12-03 05:17:38 -0800 | 
|---|---|---|
| committer | Stefano Karapetsas <[email protected]> | 2012-12-03 05:17:38 -0800 | 
| commit | 8f50ed47fdbb5b0b63425b5dc653c5ad4d8bba05 (patch) | |
| tree | 7ae6a6687d06c21dd5258b72b26c492ffeecbe7e /plugins/background | |
| parent | 0472d457c1f252835a35dea5aed7921e1b210b19 (diff) | |
| parent | eff871eb46d1b0b7578f8fd9f5e31c932437cb3b (diff) | |
| download | mate-settings-daemon-8f50ed47fdbb5b0b63425b5dc653c5ad4d8bba05.tar.bz2 mate-settings-daemon-8f50ed47fdbb5b0b63425b5dc653c5ad4d8bba05.tar.xz  | |
Merge pull request #24 from jasmineaura/develop
background revamped
Diffstat (limited to 'plugins/background')
| -rw-r--r-- | plugins/background/msd-background-manager.c | 985 | 
1 files changed, 514 insertions, 471 deletions
diff --git a/plugins/background/msd-background-manager.c b/plugins/background/msd-background-manager.c index 5353c94..033f8a3 100644 --- a/plugins/background/msd-background-manager.c +++ b/plugins/background/msd-background-manager.c @@ -32,8 +32,6 @@  #include <locale.h> -#include <dbus/dbus.h> -  #include <glib.h>  #include <glib/gi18n.h>  #include <gdk/gdk.h> @@ -47,568 +45,613 @@  #include "mate-settings-profile.h"  #include "msd-background-manager.h" -#define CAJA_SCHEMA "org.mate.caja.preferences" -#define CAJA_SHOW_DESKTOP_KEY "show-desktop" - -#define MSD_BACKGROUND_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_BACKGROUND_MANAGER, MsdBackgroundManagerPrivate)) - -//class MsdBackgroundManager -//{ -	struct MsdBackgroundManagerPrivate { -		GSettings*      bg_settings; -		GSettings*      caja_settings; -		MateBG*         bg; -		guint           timeout_id; - -		DBusConnection* dbus_connection; -	}; +#if !GTK_CHECK_VERSION(3, 0, 0) +#define cairo_surface_t		GdkPixmap +#define cairo_surface_destroy	g_object_unref +#define mate_bg_create_surface				mate_bg_create_pixmap +#define mate_bg_set_surface_as_root			mate_bg_set_pixmap_as_root +#define mate_bg_set_surface_as_root_with_crossfade	mate_bg_set_pixmap_as_root_with_crossfade +#endif -	static void -	msd_background_manager_class_init (MsdBackgroundManagerClass* klass); +#define MATE_BG_SHOW_DESKTOP_ICONS "show-desktop-icons" +#define MATE_BG_DRAW_BACKGROUND "draw-background" -	static void +#define MATE_SESSION_MANAGER_DBUS_NAME "org.mate.SessionManager" +#define MATE_SESSION_MANAGER_DBUS_PATH "/org/mate/SessionManager" -	msd_background_manager_init (MsdBackgroundManager* background_manager); +#define MSD_BACKGROUND_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MSD_TYPE_BACKGROUND_MANAGER, MsdBackgroundManagerPrivate)) -	static void -	msd_background_manager_finalize (GObject* object); +struct MsdBackgroundManagerPrivate { +	GSettings      *settings; +	MateBG         *bg; +	guint           timeout_id; -	G_DEFINE_TYPE(MsdBackgroundManager, msd_background_manager, G_TYPE_OBJECT) +	MateBGCrossfade *fade; -	static gpointer manager_object = NULL; +	GDBusProxy     *proxy; +	guint           proxy_signal_id; +}; -	static gboolean -	caja_is_running (void) -	{ -		Atom           window_id_atom; -		Window         caja_xid; -		Atom           actual_type; -		int            actual_format; -		unsigned long  nitems; -		unsigned long  bytes_after; -		unsigned char* data; -		int            retval; -		Atom           wmclass_atom; -		gboolean       running; -		gint           error; - -		window_id_atom = XInternAtom(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), -		                             "CAJA_DESKTOP_WINDOW_ID", True); - -		if (window_id_atom == None) -		{ -			return FALSE; -		} - -		retval = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), -		                            GDK_ROOT_WINDOW(), -		                            window_id_atom, -		                            0, -		                            1, -		                            False, -		                            XA_WINDOW, -		                            &actual_type, -		                            &actual_format, -		                            &nitems, -		                            &bytes_after, -		                            &data); - -		if (data != NULL) -		{ -			caja_xid = *(Window*) data; -			XFree(data); -		} -		else -		{ -			return FALSE; -		} - -		if (actual_type != XA_WINDOW) -		{ -			return FALSE; -		} +static void +msd_background_manager_class_init (MsdBackgroundManagerClass* klass); -		if (actual_format != 32) -		{ -			return FALSE; -		} +static void -		wmclass_atom = XInternAtom(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), "WM_CLASS", False); +msd_background_manager_init (MsdBackgroundManager* background_manager); -		gdk_error_trap_push(); +static void +msd_background_manager_finalize (GObject* object); -		retval = XGetWindowProperty(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), -		                            caja_xid, -		                            wmclass_atom, -		                            0, -		                            24, -		                            False, -		                            XA_STRING, -		                            &actual_type, -		                            &actual_format, -		                            &nitems, -		                            &bytes_after, -		                            &data); +static void setup_bg (MsdBackgroundManager *manager); +static void connect_screen_signals (MsdBackgroundManager *manager); -		error = gdk_error_trap_pop(); +G_DEFINE_TYPE(MsdBackgroundManager, msd_background_manager, G_TYPE_OBJECT) -		if (error == BadWindow) -		{ -			return FALSE; -		} +static gpointer manager_object = NULL; -		if (actual_type == XA_STRING && -			nitems == 24 && -			bytes_after == 0 && -			actual_format == 8 && -			data != NULL && -			!strcmp((char*) data, "desktop_window") && -			!strcmp((char*) data + strlen((char*) data) + 1, "Caja")) -		{ -			running = TRUE; -		} -		else -		{ -			running = FALSE; -		} +static gboolean +dont_draw_background (MsdBackgroundManager *manager) +{ +	return !g_settings_get_boolean (manager->priv->settings, +					MATE_BG_DRAW_BACKGROUND); +} -		if (data != NULL) -		{ -			XFree(data); -		} +static gboolean +caja_is_drawing_background (MsdBackgroundManager *manager) +{ +	Atom           window_id_atom; +	Window         caja_xid; +	Atom           actual_type; +	int            actual_format; +	unsigned long  nitems; +	unsigned long  bytes_after; +	unsigned char* data; +	Atom           wmclass_atom; +	gboolean       running; +	gint           error; +	gboolean       show_desktop_icons; -		return running; +	show_desktop_icons = g_settings_get_boolean (manager->priv->settings, +						     MATE_BG_SHOW_DESKTOP_ICONS); +	if (!show_desktop_icons) { +	       return FALSE;  	} -	static void -	draw_background (MsdBackgroundManager* manager, -	                 gboolean              use_crossfade) -	{ -		GdkDisplay* display; -		int         n_screens; -		int         i; - -		if (caja_is_running()) -		{ -				return; -		} - -		mate_settings_profile_start(NULL); +	window_id_atom = XInternAtom(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), +	                             "CAJA_DESKTOP_WINDOW_ID", True); -		display = gdk_display_get_default(); -		n_screens = gdk_display_get_n_screens(display); - -		for (i = 0; i < n_screens; ++i) -		{ -			GdkScreen* screen; -			GdkWindow* root_window; -			GdkPixmap* pixmap; - -			screen = gdk_display_get_screen(display, i); - -			root_window = gdk_screen_get_root_window(screen); - -			pixmap = mate_bg_create_pixmap(manager->priv->bg, -			                               root_window, -			                               gdk_screen_get_width(screen), -			                               gdk_screen_get_height(screen), -			                               TRUE); - -			if (use_crossfade) -			{ -				MateBGCrossfade* fade; - -				fade = mate_bg_set_pixmap_as_root_with_crossfade(screen, pixmap); -				g_signal_connect(fade, -				                 "finished", -				                 G_CALLBACK (g_object_unref), NULL); -			} -			else -			{ -				mate_bg_set_pixmap_as_root(screen, pixmap); -			} - -			g_object_unref(pixmap); -		} - -		mate_settings_profile_end(NULL); +	if (window_id_atom == None) { +		return FALSE;  	} -	static void -	on_bg_changed (MateBG*               bg, -	               MsdBackgroundManager* manager) +	XGetWindowProperty (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), +			    GDK_ROOT_WINDOW(), +			    window_id_atom, +			    0, +			    1, +			    False, +			    XA_WINDOW, +			    &actual_type, +			    &actual_format, +			    &nitems, +			    &bytes_after, +			    &data); + +	if (data != NULL)  	{ -		draw_background(manager, TRUE); +		caja_xid = *(Window*) data; +		XFree(data);  	} - -	static void -	on_bg_transitioned (MateBG*               bg, -	                    MsdBackgroundManager* manager) +	else  	{ -		draw_background(manager, FALSE); +		return FALSE;  	} -	static void -	settings_changed_callback (GSettings*               settings, -	                           gchar*                   key, -	                           MsdBackgroundManager*    manager) +	if (actual_type != XA_WINDOW)  	{ -		mate_bg_load_from_preferences(manager->priv->bg); +		return FALSE;  	} -	static void -	watch_bg_preferences (MsdBackgroundManager* manager) +	if (actual_format != 32)  	{ -		g_signal_connect (manager->priv->bg_settings, -		                  "changed", -		                  G_CALLBACK (settings_changed_callback), -		                  manager); +		return FALSE;  	} -	static void -	setup_bg (MsdBackgroundManager* manager) -	{ -		g_return_if_fail(manager->priv->bg == NULL); +	wmclass_atom = XInternAtom(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), "WM_CLASS", False); -		manager->priv->bg = mate_bg_new(); +	gdk_error_trap_push(); -		/*g_signal_connect(manager->priv->bg, -		                 "changed", -		                 G_CALLBACK(on_bg_changed), -		                 manager);*/ +	XGetWindowProperty (GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), +			    caja_xid, +			    wmclass_atom, +			    0, +			    20, +			    False, +			    XA_STRING, +			    &actual_type, +			    &actual_format, +			    &nitems, +			    &bytes_after, +			    &data); -		/*g_signal_connect(manager->priv->bg, -		                 "transitioned", -		                 G_CALLBACK(on_bg_transitioned), -		                 manager);*/ +	error = gdk_error_trap_pop(); -		watch_bg_preferences(manager); -		mate_bg_load_from_preferences(manager->priv->bg); +	if (error == BadWindow) +	{ +		return FALSE;  	} -	static gboolean -	queue_draw_background (MsdBackgroundManager* manager) +	if (actual_type == XA_STRING && +		nitems == 20 && +		bytes_after == 0 && +		actual_format == 8 && +		data != NULL && +		!strcmp((char*) data, "desktop_window") && +		!strcmp((char*) data + strlen((char*) data) + 1, "Caja"))  	{ -		manager->priv->timeout_id = 0; - -		if (caja_is_running()) -		{ -			return FALSE; -		} - -		setup_bg(manager); -		draw_background(manager, FALSE); +		running = TRUE; +	} +	else +	{ +		running = FALSE; +	} -		return FALSE; +	if (data != NULL) +	{ +		XFree(data);  	} -	static DBusHandlerResult -	on_bus_message (DBusConnection* connection, -	                DBusMessage*        message, -	                void*               user_data) +	return running; +} + +static void +on_crossfade_finished (MsdBackgroundManager *manager) +{ +	g_object_unref (manager->priv->fade); +	manager->priv->fade = NULL; +} + +static void +draw_background (MsdBackgroundManager *manager, +                 gboolean              use_crossfade) +{ +	GdkDisplay *display; +	int         n_screens; +	int         i; + +	if (caja_is_drawing_background (manager) || dont_draw_background (manager))  	{ -		MsdBackgroundManager* manager = user_data; +		return; +	} -		if (dbus_message_is_signal(message, "org.mate.SessionManager", "SessionRunning")) -		{ -			/* If the session finishes then check if caja is -			 * running and if not, set the background. -			 * -			 * We wait a few seconds after the session is up -			 * because caja tells the session manager that its -			 * ready before it sets the background. -			 */ -			manager->priv->timeout_id = g_timeout_add_seconds(8, -			                                                  (GSourceFunc) queue_draw_background, -			                                                  manager); -			dbus_connection_remove_filter(connection, -			                              on_bus_message, -			                              manager); - -			manager->priv->dbus_connection = NULL; -		} +	mate_settings_profile_start(NULL); -		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -	} +	display = gdk_display_get_default(); +	n_screens = gdk_display_get_n_screens(display); -	static void -	draw_background_after_session_loads (MsdBackgroundManager* manager) +	for (i = 0; i < n_screens; ++i)  	{ -		DBusConnection* connection; +		GdkScreen *screen; +		cairo_surface_t *surface; -		connection = dbus_bus_get(DBUS_BUS_SESSION, NULL); +		screen = gdk_display_get_screen(display, i); -		if (connection == NULL) -		{ -			return; -		} +		surface = mate_bg_create_surface (manager->priv->bg, +						  gdk_screen_get_root_window (screen), +						  gdk_screen_get_width (screen), +						  gdk_screen_get_height (screen), +						  TRUE); -		if (!dbus_connection_add_filter(connection, on_bus_message, manager, NULL)) +		if (use_crossfade)  		{ -			return; +			if (manager->priv->fade != NULL) +				g_object_unref (manager->priv->fade); + +			manager->priv->fade = mate_bg_set_surface_as_root_with_crossfade (screen, +											  surface); +			g_signal_connect_swapped (manager->priv->fade, "finished", +						  G_CALLBACK (on_crossfade_finished), +						  manager); +		} else { +			mate_bg_set_surface_as_root (screen, surface);  		} -		manager->priv->dbus_connection = connection; +		cairo_surface_destroy (surface);  	} -	static void -	on_screen_size_changed (GdkScreen*            screen, -	                        MsdBackgroundManager* manager) -	{ -		gboolean caja_show_desktop; +	mate_settings_profile_end(NULL); +} + +static void +on_bg_transitioned (MateBG               *bg, +                    MsdBackgroundManager *manager) +{ +	draw_background (manager, FALSE); +} + +static gboolean +settings_change_event_idle_cb (MsdBackgroundManager *manager) +{ +	mate_bg_load_from_gsettings (manager->priv->bg, +	                             manager->priv->settings); + +	return FALSE;   /* remove from the list of event sources */ +} + +static gboolean +settings_change_event_cb (GSettings            *settings, +                          gpointer              keys, +                          gint                  n_keys, +                          MsdBackgroundManager *manager) +{ +	/* Defer signal processing to avoid making the dconf backend deadlock */ +	g_idle_add ((GSourceFunc) settings_change_event_idle_cb, manager); + +	return FALSE;   /* let the event propagate further */ +} + +static void +on_screen_size_changed (GdkScreen            *screen, +                        MsdBackgroundManager *manager) +{ +	draw_background (manager, FALSE); +} + +static void +on_bg_changed (MateBG               *bg, +               MsdBackgroundManager *manager) +{ +	draw_background (manager, TRUE); +} + +static void +setup_bg (MsdBackgroundManager *manager) +{ +	g_return_if_fail (manager->priv->bg == NULL); + +	manager->priv->bg = mate_bg_new(); + +	g_signal_connect(manager->priv->bg, +			 "changed", +			 G_CALLBACK (on_bg_changed), +			 manager); + +	g_signal_connect(manager->priv->bg, +			 "transitioned", +			 G_CALLBACK (on_bg_transitioned), +			 manager); + +	connect_screen_signals (manager); + +	mate_bg_load_from_gsettings (manager->priv->bg, +	                             manager->priv->settings); + +    /* Connect to "change-event" signal to receive *groups of changes* before +     * they are split out into multiple emissions of the "changed" signal. +     */ +	g_signal_connect (manager->priv->settings, +			  "change-event", +			  G_CALLBACK (settings_change_event_cb), +			  manager); +} + +static gboolean +queue_draw_background (MsdBackgroundManager *manager) +{ +	manager->priv->timeout_id = 0; + +        if (manager->priv->bg == NULL) +	        setup_bg (manager); + +	draw_background (manager, FALSE); + +	return FALSE; +} + +static void +queue_timeout (MsdBackgroundManager *manager) +{ +	if (manager->priv->timeout_id > 0) +		return; + +	/* If the session finishes then check if caja is +	 * running and if not, set the background. +	 * +	 * We wait a few seconds after the session is up +	 * because caja tells the session manager that its +	 * ready before it sets the background. +	 */ +	manager->priv->timeout_id = g_timeout_add_seconds(8, +	                                                  (GSourceFunc) queue_draw_background, +	                                                  manager); +} + +static void +disconnect_session_manager_listener (MsdBackgroundManager* manager) +{ +	if (manager->priv->proxy && manager->priv->proxy_signal_id) { +		g_signal_handler_disconnect (manager->priv->proxy, +					     manager->priv->proxy_signal_id); +		manager->priv->proxy_signal_id = 0; +	} +} + +static void +on_session_manager_signal (GDBusProxy   *proxy, +			   const gchar  *sender_name, +			   const gchar  *signal_name, +			   GVariant     *parameters, +			   gpointer      user_data) +{ +	MsdBackgroundManager *manager = MSD_BACKGROUND_MANAGER (user_data); + +	if (g_strcmp0 (signal_name, "SessionRunning") == 0) { +		queue_timeout (manager); +		disconnect_session_manager_listener (manager); +	} +} + +static void +draw_background_after_session_loads (MsdBackgroundManager *manager) +{ +	GError *error = NULL; +	GDBusProxyFlags flags; + +	flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | +		G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; +	manager->priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, +							      flags, +							      NULL, /* GDBusInterfaceInfo */ +							      MATE_SESSION_MANAGER_DBUS_NAME, +							      MATE_SESSION_MANAGER_DBUS_PATH, +							      MATE_SESSION_MANAGER_DBUS_NAME, +							      NULL, /* GCancellable */ +							      &error); +	if (manager->priv->proxy == NULL) { +		g_warning ("Could not listen to session manager: %s", +			   error->message); +		g_error_free (error); +		return; +	} -		caja_show_desktop = g_settings_get_boolean (manager->priv->caja_settings, -		                                            CAJA_SHOW_DESKTOP_KEY); +	manager->priv->proxy_signal_id = g_signal_connect (manager->priv->proxy, +							   "g-signal", +							   G_CALLBACK (on_session_manager_signal), +							   manager); +} -		if (!caja_is_running() || !caja_show_desktop) -		{ -			if (manager->priv->bg == NULL) -			{ -				setup_bg(manager); -			} +static void +disconnect_screen_signals (MsdBackgroundManager* manager) +{ +	GdkDisplay* display; +	int         i; +	int         n_screens; -			draw_background(manager, FALSE); -		} -	} +	display = gdk_display_get_default(); +	n_screens = gdk_display_get_n_screens(display); -	static void -	disconnect_screen_signals (MsdBackgroundManager* manager) +	for (i = 0; i < n_screens; ++i)  	{ -		GdkDisplay* display; -		int         i; -		int         n_screens; +		GdkScreen *screen; -		display = gdk_display_get_default(); -		n_screens = gdk_display_get_n_screens(display); +		screen = gdk_display_get_screen(display, i); -		for (i = 0; i < n_screens; ++i) -		{ -			GdkScreen *screen; - -			screen = gdk_display_get_screen(display, i); - -			g_signal_handlers_disconnect_by_func(screen, -			                                     G_CALLBACK(on_screen_size_changed), -			                                     manager); -		} +		g_signal_handlers_disconnect_by_func(screen, +		                                     G_CALLBACK(on_screen_size_changed), +		                                     manager);  	} +} -	static void -	connect_screen_signals (MsdBackgroundManager* manager) -	{ -		GdkDisplay* display; -		int         i; -		int         n_screens; +static void +connect_screen_signals (MsdBackgroundManager* manager) +{ +	GdkDisplay* display; +	int         i; +	int         n_screens; -		display = gdk_display_get_default(); -		n_screens = gdk_display_get_n_screens(display); +	display = gdk_display_get_default(); +	n_screens = gdk_display_get_n_screens(display); -		for (i = 0; i < n_screens; ++i) -		{ -			GdkScreen* screen; -			screen = gdk_display_get_screen(display, i); -			g_signal_connect(screen, -			                 "monitors-changed", -			                 G_CALLBACK(on_screen_size_changed), -			                 manager); - -			g_signal_connect(screen, -			                 "size-changed", -			                 G_CALLBACK(on_screen_size_changed), -			                 manager); -		} +	for (i = 0; i < n_screens; ++i) +	{ +		GdkScreen* screen; +		screen = gdk_display_get_screen(display, i); +		g_signal_connect(screen, +		                 "monitors-changed", +		                 G_CALLBACK(on_screen_size_changed), +		                 manager); + +		g_signal_connect(screen, +		                 "size-changed", +		                 G_CALLBACK(on_screen_size_changed), +		                 manager);  	} - -	gboolean -	msd_background_manager_start (MsdBackgroundManager* manager, -	                              GError**              error) +} + +static void +background_handling_changed (GSettings            *settings, +			     const char           *key, +			     MsdBackgroundManager *manager) +{ +	if (!dont_draw_background (manager) && +	    !caja_is_drawing_background (manager))  	{ -		gboolean caja_show_desktop; - -		g_debug("Starting background manager"); -		mate_settings_profile_start(NULL); - -		manager->priv->bg_settings = g_settings_new (MATE_BG_SCHEMA); -		manager->priv->caja_settings = g_settings_new (CAJA_SCHEMA); - -		/* If this is set, caja will draw the background and is -		 * almost definitely in our session.  however, it may not be -		 * running yet (so is_caja_running() will fail).  so, on -		 * startup, just don't do anything if this key is set so we -		 * don't waste time setting the background only to have -		 * caja overwrite it. -		 */ -		caja_show_desktop = g_settings_get_boolean (manager->priv->caja_settings, -	                                                CAJA_SHOW_DESKTOP_KEY); - -		if (!caja_show_desktop) -		{ -			setup_bg(manager); -		} -		else -		{ -			draw_background_after_session_loads(manager); -		} - -		connect_screen_signals(manager); - -		mate_settings_profile_end(NULL); - -		return TRUE; +		queue_timeout (manager);  	} - -	void -	msd_background_manager_stop (MsdBackgroundManager*  manager) +} + +gboolean +msd_background_manager_start (MsdBackgroundManager  *manager, +                              GError               **error) +{ +	gboolean show_desktop_icons; + +	g_debug("Starting background manager"); +	mate_settings_profile_start(NULL); + +	manager->priv->settings = g_settings_new (MATE_BG_SCHEMA); +	g_signal_connect (manager->priv->settings, "changed::" MATE_BG_DRAW_BACKGROUND, +			  G_CALLBACK (background_handling_changed), manager); +	g_signal_connect (manager->priv->settings, "changed::" MATE_BG_SHOW_DESKTOP_ICONS, +			  G_CALLBACK (background_handling_changed), manager); + +	/* If this is set, caja will draw the background and is +	 * almost definitely in our session.  however, it may not be +	 * running yet (so is_caja_running() will fail).  so, on +	 * startup, just don't do anything if this key is set so we +	 * don't waste time setting the background only to have +	 * caja overwrite it. +	 */ +	show_desktop_icons = g_settings_get_boolean (manager->priv->settings, +						     MATE_BG_SHOW_DESKTOP_ICONS); + +	if (!show_desktop_icons)  	{ -		MsdBackgroundManagerPrivate* p = manager->priv; +		setup_bg(manager); +	} +	else +	{ +		draw_background_after_session_loads(manager); +	} -		g_debug("Stopping background manager"); +	mate_settings_profile_end(NULL); -		disconnect_screen_signals(manager); +	return TRUE; +} -		if (manager->priv->dbus_connection != NULL) -		{ -			dbus_connection_remove_filter(manager->priv->dbus_connection, -			                              on_bus_message, -			                              manager); -		} - -		if (p->bg_settings != NULL) -		{ -			g_object_unref(p->bg_settings); -			p->bg_settings = NULL; -		} +void +msd_background_manager_stop (MsdBackgroundManager *manager) +{ +	MsdBackgroundManagerPrivate* p = manager->priv; -		if (p->caja_settings != NULL) -		{ -			g_object_unref(p->caja_settings); -			p->caja_settings = NULL; -		} +	g_debug("Stopping background manager"); -		if (p->timeout_id != 0) -		{ -			g_source_remove(p->timeout_id); -			p->timeout_id = 0; -		} +	disconnect_screen_signals(manager); -		if (p->bg != NULL) -		{ -			g_object_unref(p->bg); -			p->bg = NULL; -		} -	} - -	static void -	msd_background_manager_set_property (GObject*        object, -	                                     guint           prop_id, -	                                     const GValue*   value, -	                                     GParamSpec*     pspec) +	if (manager->priv->proxy)  	{ -		MsdBackgroundManager* self; - -		self = MSD_BACKGROUND_MANAGER(object); - -		switch (prop_id) -		{ -			default: -				G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); -				break; -		} +		disconnect_session_manager_listener (manager); +		g_object_unref (manager->priv->proxy);  	} -	static void -	msd_background_manager_get_property (GObject*        object, -	                                     guint           prop_id, -	                                     GValue*         value, -	                                     GParamSpec*     pspec) -	{ -		MsdBackgroundManager* self; +	g_signal_handlers_disconnect_by_func (manager->priv->settings, +					      settings_change_event_cb, +					      manager); -		self = MSD_BACKGROUND_MANAGER(object); - -		switch (prop_id) -		{ -			default: -				G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); -				break; -		} +	if (p->settings != NULL) +	{ +		g_object_unref(p->settings); +		p->settings = NULL;  	} -	static GObject* -	msd_background_manager_constructor (GType                  type, -	                                    guint                  n_construct_properties, -	                                    GObjectConstructParam* construct_properties) +	if (p->timeout_id != 0)  	{ -		MsdBackgroundManager*      background_manager; -		MsdBackgroundManagerClass* klass; - -		klass = MSD_BACKGROUND_MANAGER_CLASS(g_type_class_peek(MSD_TYPE_BACKGROUND_MANAGER)); - -		background_manager = MSD_BACKGROUND_MANAGER(G_OBJECT_CLASS(msd_background_manager_parent_class)->constructor(type, -		                                                                                                             n_construct_properties, -		                                                                                                             construct_properties)); -		return G_OBJECT(background_manager); +		g_source_remove(p->timeout_id); +		p->timeout_id = 0;  	} -	static void -	msd_background_manager_dispose (GObject* object) +	if (p->bg != NULL)  	{ -		MsdBackgroundManager* background_manager; - -		background_manager = MSD_BACKGROUND_MANAGER(object); - -		G_OBJECT_CLASS(msd_background_manager_parent_class)->dispose(object); +		g_object_unref(p->bg); +		p->bg = NULL;  	} - -	static void -	msd_background_manager_class_init (MsdBackgroundManagerClass* klass) +} + +static void +msd_background_manager_set_property (GObject*        object, +                                     guint           prop_id, +                                     const GValue*   value, +                                     GParamSpec*     pspec) +{ +	switch (prop_id)  	{ -		GObjectClass* object_class = G_OBJECT_CLASS(klass); - -		object_class->get_property = msd_background_manager_get_property; -		object_class->set_property = msd_background_manager_set_property; -		object_class->constructor = msd_background_manager_constructor; -		object_class->dispose = msd_background_manager_dispose; -		object_class->finalize = msd_background_manager_finalize; - -		g_type_class_add_private(klass, sizeof(MsdBackgroundManagerPrivate)); +		default: +			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); +			break;  	} - -	static void -	msd_background_manager_init (MsdBackgroundManager* manager) +} + +static void +msd_background_manager_get_property (GObject*        object, +                                     guint           prop_id, +                                     GValue*         value, +                                     GParamSpec*     pspec) +{ +	switch (prop_id)  	{ -		manager->priv = MSD_BACKGROUND_MANAGER_GET_PRIVATE(manager); +		default: +			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); +			break;  	} - -	static void -	msd_background_manager_finalize (GObject* object) +} + +static GObject* +msd_background_manager_constructor (GType                  type, +                                    guint                  n_construct_properties, +                                    GObjectConstructParam* construct_properties) +{ +	MsdBackgroundManager*      background_manager; + +	background_manager = MSD_BACKGROUND_MANAGER(G_OBJECT_CLASS(msd_background_manager_parent_class)->constructor(type, +	                                                                                                             n_construct_properties, +	                                                                                                             construct_properties)); +	return G_OBJECT(background_manager); +} + +static void +msd_background_manager_dispose (GObject* object) +{ +	G_OBJECT_CLASS(msd_background_manager_parent_class)->dispose(object); +} + +static void +msd_background_manager_class_init (MsdBackgroundManagerClass* klass) +{ +	GObjectClass* object_class = G_OBJECT_CLASS(klass); + +	object_class->get_property = msd_background_manager_get_property; +	object_class->set_property = msd_background_manager_set_property; +	object_class->constructor = msd_background_manager_constructor; +	object_class->dispose = msd_background_manager_dispose; +	object_class->finalize = msd_background_manager_finalize; + +	g_type_class_add_private(klass, sizeof(MsdBackgroundManagerPrivate)); +} + +static void +msd_background_manager_init (MsdBackgroundManager* manager) +{ +	manager->priv = MSD_BACKGROUND_MANAGER_GET_PRIVATE(manager); +} + +static void +msd_background_manager_finalize (GObject* object) +{ +	MsdBackgroundManager* background_manager; + +	g_return_if_fail(object != NULL); +	g_return_if_fail(MSD_IS_BACKGROUND_MANAGER(object)); + +	background_manager = MSD_BACKGROUND_MANAGER(object); + +	g_return_if_fail(background_manager->priv != NULL); + +	G_OBJECT_CLASS(msd_background_manager_parent_class)->finalize(object); +} + +MsdBackgroundManager* +msd_background_manager_new (void) +{ +	if (manager_object != NULL)  	{ -		MsdBackgroundManager* background_manager; - -		g_return_if_fail(object != NULL); -		g_return_if_fail(MSD_IS_BACKGROUND_MANAGER(object)); - -		background_manager = MSD_BACKGROUND_MANAGER(object); - -		g_return_if_fail(background_manager->priv != NULL); - -		G_OBJECT_CLASS(msd_background_manager_parent_class)->finalize(object); +		g_object_ref(manager_object);  	} - -	MsdBackgroundManager* -	msd_background_manager_new (void) +	else  	{ -		if (manager_object != NULL) -		{ -			g_object_ref(manager_object); -		} -		else -		{ -			manager_object = g_object_new(MSD_TYPE_BACKGROUND_MANAGER, NULL); - -			g_object_add_weak_pointer(manager_object, (gpointer*) &manager_object); -		} +		manager_object = g_object_new(MSD_TYPE_BACKGROUND_MANAGER, NULL); -		return MSD_BACKGROUND_MANAGER(manager_object); +		g_object_add_weak_pointer(manager_object, (gpointer*) &manager_object);  	} -//} + +	return MSD_BACKGROUND_MANAGER(manager_object); +}  | 
