Hiroyuki Ikezoe
ikezo****@users*****
Mon Jan 1 21:17:52 JST 2007
Index: kazehakase/src/bookmarks/kz-session.c diff -u kazehakase/src/bookmarks/kz-session.c:1.2 kazehakase/src/bookmarks/kz-session.c:1.3 --- kazehakase/src/bookmarks/kz-session.c:1.2 Mon Jan 1 19:35:14 2007 +++ kazehakase/src/bookmarks/kz-session.c Mon Jan 1 21:17:52 2007 @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: kz-session.c,v 1.2 2007/01/01 10:35:14 ikezoe Exp $ + * $Id: kz-session.c,v 1.3 2007/01/01 12:17:52 ikezoe Exp $ */ #include "kz-session.h" @@ -31,6 +31,7 @@ struct _KzSessionPrivate { gboolean auto_save; + gboolean frozen; }; #define KZ_SESSION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), KZ_TYPE_SESSION, KzSessionPrivate)) @@ -45,19 +46,35 @@ GValue *value, GParamSpec *pspec); +static void kz_bookmark_insert_child (KzBookmark *bookmark, + KzBookmark *child, + KzBookmark *sibling); +static void kz_bookmark_remove_child (KzBookmark *bookmark, + KzBookmark *child); + +static void cb_profile_changed (KzProfile *profile, + const gchar *section, const gchar *key, + const gchar *old_value, + KzSession *session); + G_DEFINE_TYPE(KzSession, kz_session, KZ_TYPE_BOOKMARK_FILE) static void kz_session_class_init (KzSessionClass *klass) { GObjectClass *object_class; + KzBookmarkClass *bookmark_class; object_class = (GObjectClass *) klass; + bookmark_class = (KzBookmarkClass *) klass; object_class->dispose = dispose; object_class->set_property = set_property; object_class->get_property = get_property; + bookmark_class->insert_child = kz_bookmark_insert_child; + bookmark_class->remove_child = kz_bookmark_remove_child; + g_type_class_add_private(object_class, sizeof(KzSessionPrivate)); } @@ -68,6 +85,7 @@ KzSessionPrivate *priv = KZ_SESSION_GET_PRIVATE(session); priv->auto_save = FALSE; + priv->frozen = FALSE; } @@ -132,3 +150,112 @@ priv->auto_save = auto_save; } +void +kz_session_set_profile (KzSession *session, KzProfile *profile) +{ + gboolean save_session; + KzSessionPrivate *priv = KZ_SESSION_GET_PRIVATE(session); + + kz_profile_get_value(profile, "Session", "save", + &save_session, sizeof(gboolean), KZ_PROFILE_VALUE_TYPE_BOOL); + priv->auto_save = save_session; + g_signal_connect(profile, + "changed::Session", + G_CALLBACK(cb_profile_changed), session); +} + +static void +cb_profile_changed (KzProfile *profile, + const gchar *section, const gchar *key, + const gchar *old_value, + KzSession *session) +{ + KzSessionPrivate *priv = KZ_SESSION_GET_PRIVATE(session); + + if (key && strcmp(key, "save")) + { + gboolean save_session; + kz_profile_get_value(profile, "Session", "save", + &save_session, sizeof(gboolean), KZ_PROFILE_VALUE_TYPE_BOOL); + priv->auto_save = save_session; + } +} + +static void +cb_bookmark_notify (GObject *object, GParamSpec *spec, KzBookmark *session) +{ + KzSessionPrivate *priv = KZ_SESSION_GET_PRIVATE(session); + + if (priv->frozen) + return; + + if (priv->auto_save) + kz_bookmark_file_save(KZ_BOOKMARK_FILE(session)); +} + +static void +cb_insert_child (KzBookmark *folder, KzBookmark *child, KzBookmark *sibling, KzBookmark *session) +{ + g_signal_connect_after(child, "notify", + G_CALLBACK(cb_bookmark_notify), + session); +} + +static void +cb_remove_child (KzBookmark *folder, KzBookmark *child, KzBookmark *session) +{ + g_signal_handlers_disconnect_by_func + (child, + G_CALLBACK(cb_bookmark_notify), session); +} + +static void +cb_tab_created (KzBookmark *folder, KzBookmark *child, KzBookmark *sibling, KzBookmark *session) +{ + g_signal_connect(child, "insert-child", + G_CALLBACK(cb_insert_child), + session); + g_signal_connect(child, "remove-child", + G_CALLBACK(cb_remove_child), + session); +} + +static void +cb_tab_removed (KzBookmark *folder, KzBookmark *child, KzBookmark *session) +{ + g_signal_handlers_disconnect_by_func + (child, + G_CALLBACK(cb_insert_child), session); + g_signal_handlers_disconnect_by_func + (child, + G_CALLBACK(cb_remove_child), session); +} + +static void +kz_bookmark_insert_child (KzBookmark *bookmark, + KzBookmark *child, + KzBookmark *sibling) +{ + /* + * This session folder contains each tab. + * We have to watch each folder. + */ + g_signal_connect(child, "insert-child", + G_CALLBACK(cb_tab_created), + bookmark); + g_signal_connect(child, "remove-child", + G_CALLBACK(cb_tab_removed), + bookmark); +} + +static void +kz_bookmark_remove_child (KzBookmark *bookmark, KzBookmark *child) +{ + g_signal_handlers_disconnect_by_func + (child, + G_CALLBACK(cb_tab_created), bookmark); + g_signal_handlers_disconnect_by_func + (child, + G_CALLBACK(cb_tab_removed), bookmark); +} + Index: kazehakase/src/bookmarks/kz-session.h diff -u kazehakase/src/bookmarks/kz-session.h:1.2 kazehakase/src/bookmarks/kz-session.h:1.3 --- kazehakase/src/bookmarks/kz-session.h:1.2 Mon Jan 1 19:35:14 2007 +++ kazehakase/src/bookmarks/kz-session.h Mon Jan 1 21:17:52 2007 @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: kz-session.h,v 1.2 2007/01/01 10:35:14 ikezoe Exp $ + * $Id: kz-session.h,v 1.3 2007/01/01 12:17:52 ikezoe Exp $ */ #ifndef __KZ_SESSION_H__ @@ -26,6 +26,7 @@ #include <glib-object.h> #include "kz-bookmark-file.h" +#include "kz-profile.h" G_BEGIN_DECLS @@ -53,10 +54,13 @@ /* GType */ GType kz_session_get_type (void) G_GNUC_CONST; -/* boomark item creating functions */ KzBookmark *kz_session_new (const gchar *location, const gchar *title); void kz_session_set_auto_save (KzSession *session, gboolean auto_save); +void kz_session_set_profile (KzSession *session, KzProfile *profile); + +void kz_session_freeze (KzSession *session); +void kz_session_thaw (KzSession *session); G_END_DECLS