commit 5707c950f164585003025806f4a324c3dcbffb4d
Author: phantomjinx <[email protected]>
Date: Fri Apr 29 17:01:24 2011 +0000
Realignment of anjuta-app in line with new version
* Taken the code from the anjuta-app in version 2.91 and updated the
gtkpod version acccordingly
* New issues include anjuta;s use of g_settings and introduction of a
supporting gschema. A gtkpod version has been created accordingly
* Change in gtkpod_app_iface api to support new anjuta docking functions
* anjuta ui manager and preferences are not gtkwidgets but gobjects hence
unref them rather than destroy them
.gitignore | 1 +
libgtkpod/gtkpod_app_iface.c | 2 +-
libgtkpod/gtkpod_app_iface.h | 2 +-
src/Makefile.am | 19 +++-
src/anjuta-about.c | 5 +-
src/anjuta-about.h | 2 +-
src/anjuta-action-callbacks.c | 13 +-
src/anjuta-action-callbacks.h | 2 +-
src/anjuta-app.c | 301 ++++++++++++++++++++++++++++-------------
src/anjuta-app.h | 2 +
src/gtkpod.c | 109 +++++++++++----
src/main.c | 1 +
src/org.gtkpod.gschema.xml | 37 +++++
src/org.gtkpod.gschema.xml.in | 36 +++++
14 files changed, 402 insertions(+), 130 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 4696193..1e85c59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,6 +67,7 @@ version
/src/date_parser2.c
/src/gtkpod
/src/itdb
+/src/org.gtkpod.gschema.valid
# /plugins/
/plugins/*.plugin
diff --git a/libgtkpod/gtkpod_app_iface.c b/libgtkpod/gtkpod_app_iface.c
index 612d367..85057c1 100644
--- a/libgtkpod/gtkpod_app_iface.c
+++ b/libgtkpod/gtkpod_app_iface.c
@@ -458,7 +458,7 @@ Exporter *gtkpod_get_exporter() {
void gtkpod_display_widget(GtkWidget *widget) {
g_return_if_fail(widget);
g_return_if_fail(GTKPOD_IS_APP(gtkpod_app));
- GTKPOD_APP_GET_INTERFACE(gtkpod_app)->display_widget(widget);
+ GTKPOD_APP_GET_INTERFACE(gtkpod_app)->display_widget(gtkpod_app, widget);
}
void gtkpod_register_repository_editor(RepositoryEditor *editor) {
diff --git a/libgtkpod/gtkpod_app_iface.h b/libgtkpod/gtkpod_app_iface.h
index 8ada948..fb4906f 100644
--- a/libgtkpod/gtkpod_app_iface.h
+++ b/libgtkpod/gtkpod_app_iface.h
@@ -157,7 +157,7 @@ struct _GtkPodAppInterface {
void (*statusbar_busy_pop)(GtkPodApp *obj);
GList * (*export_tracks_as_gchar)(iTunesDB *source_db, iTunesDB *dest_db,
gchar *tracks);
GList * (*export_tracks_as_glist)(iTunesDB *source_db, iTunesDB *dest_db,
GList *tracks);
- void (*display_widget)(GtkWidget *widget);
+ void (*display_widget)(GtkPodApp *obj, GtkWidget *widget);
};
GType gtkpod_app_get_type(void);
diff --git a/src/Makefile.am b/src/Makefile.am
index 64984de..3582db8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -35,4 +35,21 @@ gtkpod_SOURCES = \
gtkpod.c gtkpod.h \
main.c
-gtkpod_LDADD = $(GTKPOD_LIBS) $(INTLLIBS) -ldl
\ No newline at end of file
+gtkpod_LDADD = $(GTKPOD_LIBS) $(INTLLIBS) -ldl
+
+### gschema settings in line with anjuta architecture ###
+
+prefs_name = org.gtkpod
+
+# gsettings_SCHEMAS is a list of all the schemas you want to install
+schema_in_files = $(prefs_name).gschema.xml.in
+gsettings_SCHEMAS = $(schema_in_files:.gschema.xml.in=.gschema.xml)
+
+# include the appropriate makefile rules for schema handling
+@INTLTOOL_XML_NOMERGE_RULE@
+@GSETTINGS_RULES@
+
+EXTRA_DIST = \
+ $(schema_in_files)
+
+
diff --git a/src/anjuta-about.c b/src/anjuta-about.c
index 55e4683..112bbd5 100644
--- a/src/anjuta-about.c
+++ b/src/anjuta-about.c
@@ -144,7 +144,7 @@ static void about_free_credit(void) {
g_free(translators);
}
-GtkWidget *about_box_new() {
+GtkWidget *about_box_new(GtkWindow *parent) {
GtkWidget *dialog;
GdkPixbuf *pix;
gchar* license = NULL;
@@ -167,6 +167,9 @@ GtkWidget *about_box_new() {
}
dialog = gtk_about_dialog_new();
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), parent);
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+
gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), "gtkpod");
gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), VERSION);
gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), _("Copyright (c)
Jorg Schuler et al."));
diff --git a/src/anjuta-about.h b/src/anjuta-about.h
index 1d70c9d..8a425b5 100644
--- a/src/anjuta-about.h
+++ b/src/anjuta-about.h
@@ -23,7 +23,7 @@
#include <libanjuta/anjuta-shell.h>
-GtkWidget *about_box_new (void);
+GtkWidget *about_box_new (GtkWindow *parent);
void about_create_plugins_submenu (AnjutaShell *shell, GtkWidget *menuitem);
#endif
diff --git a/src/anjuta-action-callbacks.c b/src/anjuta-action-callbacks.c
index 0ddc639..034785b 100644
--- a/src/anjuta-action-callbacks.c
+++ b/src/anjuta-action-callbacks.c
@@ -38,6 +38,8 @@
#include "anjuta-action-callbacks.h"
#include "../libgtkpod/directories.h"
+#define TOOLBAR_VISIBLE "toolbar-visible"
+
void
on_exit1_activate (GtkAction * action, AnjutaApp *app)
{
@@ -86,9 +88,9 @@ on_toolbar_view_toggled (GtkAction *action, AnjutaApp *app)
{
gtk_widget_hide (app->toolbar);
}
- anjuta_preferences_set_bool (app->preferences,
-
"anjuta.toolbar.visible",
- status);
+ g_settings_set_boolean (app->settings,
+ TOOLBAR_VISIBLE,
+ status);
}
void
@@ -145,13 +147,12 @@ on_url_faqs_activate (GtkAction * action, gpointer
user_data)
}
void
-on_about_activate (GtkAction * action, gpointer user_data)
+on_about_activate (GtkAction * action, AnjutaApp *app)
{
- GtkWidget *about_dlg = about_box_new ();
+ GtkWidget *about_dlg = about_box_new (GTK_WINDOW(app));
g_signal_connect_swapped(about_dlg, "response",
G_CALLBACK(gtk_widget_destroy), about_dlg);
- gtk_window_set_transient_for(GTK_WINDOW (about_dlg), GTK_WINDOW
(gtkpod_app));
gtk_widget_show (about_dlg);
}
diff --git a/src/anjuta-action-callbacks.h b/src/anjuta-action-callbacks.h
index e10729b..1957f00 100644
--- a/src/anjuta-action-callbacks.h
+++ b/src/anjuta-action-callbacks.h
@@ -36,6 +36,6 @@ void on_url_home_activate (GtkAction * action, gpointer
user_data);
void on_url_bugs_activate (GtkAction * action, gpointer user_data);
void on_url_faqs_activate (GtkAction * action, gpointer user_data);
void on_url_activate (GtkAction * action, gpointer url);
-void on_about_activate (GtkAction * action, gpointer user_data);
+void on_about_activate (GtkAction * action, AnjutaApp *app);
#endif
diff --git a/src/anjuta-app.c b/src/anjuta-app.c
index b4be4c6..6940d67 100644
--- a/src/anjuta-app.c
+++ b/src/anjuta-app.c
@@ -30,6 +30,7 @@
#include <gtk/gtk.h>
#include <gdl/gdl.h>
+#include <glib-2.0/gio/gio.h>
#include <libanjuta/anjuta-shell.h>
#include <libanjuta/anjuta-ui.h>
@@ -49,6 +50,10 @@
#include "libgtkpod/misc.h"
#define ICON_FILE "anjuta-preferences-general-48.png"
+#define PREF_SCHEMA "org.gtkpod"
+#define GDL_STYLE "gdl-style"
+#define TOOLBAR_VISIBLE "toolbar-visible"
+#define TOOLBAR_STYLE "toolbar-style"
static void anjuta_app_layout_load(AnjutaApp *app, const gchar
*layout_filename, const gchar *name);
static void anjuta_app_layout_save(AnjutaApp *app, const gchar
*layout_filename, const gchar *name);
@@ -110,72 +115,170 @@ static void disconnect_proxy_cb(GtkUIManager *manager,
GtkAction *action, GtkWid
}
}
-static void on_gdl_style_changed(AnjutaPreferences* prefs, const gchar* key,
const gchar* pr_style, gpointer user_data) {
- AnjutaApp* app = ANJUTA_APP (user_data);
- GdlSwitcherStyle style = GDL_SWITCHER_STYLE_BOTH;
+static void anjuta_app_iconify_dockable_widget(AnjutaShell *shell, GtkWidget
*widget, GError **error) {
+ AnjutaApp *app = NULL;
+ GtkWidget *dock_item = NULL;
- if (pr_style) {
- if (strcasecmp(pr_style, "Text") == 0)
- style = GDL_SWITCHER_STYLE_TEXT;
- else if (strcasecmp(pr_style, "Icon") == 0)
- style = GDL_SWITCHER_STYLE_ICON;
- else if (strcasecmp(pr_style, "Both") == 0)
- style = GDL_SWITCHER_STYLE_BOTH;
- else if (strcasecmp(pr_style, "Toolbar") == 0)
- style = GDL_SWITCHER_STYLE_TOOLBAR;
- else if (strcasecmp(pr_style, "Tabs") == 0)
- style = GDL_SWITCHER_STYLE_TABS;
-
- DEBUG_PRINT ("Switcher style: %s", pr_style);
- }
- g_object_set(G_OBJECT(app->layout_manager->master), "switcher-style",
style, NULL);
+ /* Argumments assertions */
+ g_return_if_fail(ANJUTA_IS_APP (shell));
+ g_return_if_fail(GTK_IS_WIDGET(widget));
+
+ app = ANJUTA_APP (shell);
+ g_return_if_fail(app->widgets != NULL);
+
+ dock_item = g_object_get_data(G_OBJECT(widget), "dockitem");
+ g_return_if_fail(dock_item != NULL);
+
+ /* Iconify the dockable item */
+ gdl_dock_item_iconify_item(GDL_DOCK_ITEM(dock_item));
}
-static void anjuta_gtkpod_app_display_widget(GtkWidget *widget) {
- g_return_if_fail(widget);
+static void anjuta_app_hide_dockable_widget(AnjutaShell *shell, GtkWidget
*widget, GError **error) {
+ AnjutaApp *app = NULL;
+ GtkWidget *dock_item = NULL;
- GtkWidget *w;
- if (GDL_IS_DOCK_ITEM(widget))
- w = widget;
- else {
- w = g_object_get_data(G_OBJECT (widget), "dockitem");
- }
+ /* Arguments assertions */
+ g_return_if_fail(ANJUTA_IS_APP (shell));
+ g_return_if_fail(GTK_IS_WIDGET(widget));
+
+ app = ANJUTA_APP (shell);
+ g_return_if_fail(app->widgets != NULL);
+
+ dock_item = g_object_get_data(G_OBJECT(widget), "dockitem");
+ g_return_if_fail(dock_item != NULL);
+
+ /* Hide the dockable item */
+ gdl_dock_item_hide_item(GDL_DOCK_ITEM(dock_item));
+}
+
+static void anjuta_app_show_dockable_widget(AnjutaShell *shell, GtkWidget*
widget, GError **error) {
+ AnjutaApp *app = NULL;
+ GtkWidget *dock_item = NULL;
+
+ /* Argumments assertions */
+ g_return_if_fail(ANJUTA_IS_APP (shell));
+ g_return_if_fail(GTK_IS_WIDGET(widget));
+
+ app = ANJUTA_APP (shell);
+ g_return_if_fail(app->widgets != NULL);
+
+ dock_item = g_object_get_data(G_OBJECT(widget), "dockitem");
+ g_return_if_fail(dock_item != NULL);
+
+ /* Show the dockable item */
+ gdl_dock_item_show_item(GDL_DOCK_ITEM(dock_item));
+}
+
+static void anjuta_app_maximize_widget(AnjutaShell *shell, const char
*widget_name, GError **error) {
+ AnjutaApp *app = NULL;
+ GtkWidget *dock_item = NULL;
+ gpointer value, key;
+ GtkWidget *widget = NULL;
+ GHashTableIter iter;
+
+ /* AnjutaApp assertions */
+ g_return_if_fail(ANJUTA_IS_APP (shell));
+ app = ANJUTA_APP (shell);
+
+ /* If app->maximized is TRUE then another widget is already maximized.
+ Restoring the UI for a new maximization. */
+ if (app->maximized)
+ gdl_dock_layout_load_layout(app->layout_manager, "back-up");
+
+ /* Back-up the layout so it can be restored */
+ gdl_dock_layout_save_layout(app->layout_manager, "back-up");
+
+ /* Mark the app as maximized (the other widgets except center are hidden)
*/
+ app->maximized = TRUE;
+
+ /* Hide all DockItem's except the ones positioned in the center */
+ g_hash_table_iter_init(&iter, app->widgets);
+ while (g_hash_table_iter_next(&iter, &key, &value)) {
+ if (value == NULL)
+ continue;
- if (w) {
- // Only show docked widget if really sure it is no longer
- // in the dock layout, ie. widget is not visible
- gdl_dock_item_show_item(GDL_DOCK_ITEM (w));
+ /* If it's the widget requesting maximization then continue */
+ if (!g_strcmp0((gchar*) key, widget_name))
+ continue;
+
+ /* Widget assertions */
+ widget = GTK_WIDGET(value);
+ if (!GTK_IS_WIDGET(widget))
+ continue;
+
+ /* DockItem assertions */
+ dock_item = g_object_get_data(G_OBJECT(widget), "dockitem");
+ if (dock_item == NULL || !GDL_IS_DOCK_ITEM(dock_item))
+ continue;
+
+ /* Hide the item */
+ gdl_dock_item_hide_item(GDL_DOCK_ITEM(dock_item));
}
}
+static void anjuta_app_unmaximize(AnjutaShell *shell, GError **error) {
+ AnjutaApp *app = NULL;
+
+ /* AnjutaApp assertions */
+ g_return_if_fail(ANJUTA_IS_APP (shell));
+ app = ANJUTA_APP (shell);
+
+ /* If not maximized then the operation doesn't make sence. */
+ g_return_if_fail(app->maximized);
+
+ /* Load the backed-up layout */
+ gdl_dock_layout_load_layout(app->layout_manager, "back-up");
+ gdl_dock_layout_delete_layout(app->layout_manager, "back-up");
+
+ /* Un-mark maximized */
+ app->maximized = FALSE;
+}
+
+static void on_gdl_style_changed(GSettings* settings, const gchar* key,
gpointer user_data) {
+ AnjutaApp* app = ANJUTA_APP (user_data);
+ GdlSwitcherStyle style = GDL_SWITCHER_STYLE_BOTH;
+
+ gchar* pr_style = g_settings_get_string(settings, key);
+
+ if (strcasecmp(pr_style, "Text") == 0)
+ style = GDL_SWITCHER_STYLE_TEXT;
+ else if (strcasecmp(pr_style, "Icon") == 0)
+ style = GDL_SWITCHER_STYLE_ICON;
+ else if (strcasecmp(pr_style, "Both") == 0)
+ style = GDL_SWITCHER_STYLE_BOTH;
+ else if (strcasecmp(pr_style, "Toolbar") == 0)
+ style = GDL_SWITCHER_STYLE_TOOLBAR;
+ else if (strcasecmp(pr_style, "Tabs") == 0)
+ style = GDL_SWITCHER_STYLE_TABS;
+
+ g_object_set(G_OBJECT(app->layout_manager->master), "switcher-style",
style, NULL);
+ g_free(pr_style);
+}
+
static void on_toggle_widget_view(GtkCheckMenuItem *menuitem, GtkWidget
*dockitem) {
gboolean state;
state = gtk_check_menu_item_get_active(menuitem);
if (state)
- anjuta_gtkpod_app_display_widget(dockitem);
+ gdl_dock_item_show_item(GDL_DOCK_ITEM(dockitem));
else
- gdl_dock_item_hide_item(GDL_DOCK_ITEM (dockitem));
+ gdl_dock_item_hide_item(GDL_DOCK_ITEM(dockitem));
}
static void on_update_widget_view_menuitem(gpointer key, gpointer wid,
gpointer data) {
GtkCheckMenuItem *menuitem;
GdlDockItem *dockitem;
- dockitem = g_object_get_data(G_OBJECT (wid), "dockitem");
- menuitem = g_object_get_data(G_OBJECT (wid), "menuitem");
+ dockitem = g_object_get_data(G_OBJECT(wid), "dockitem");
+ menuitem = g_object_get_data(G_OBJECT(wid), "menuitem");
- g_signal_handlers_block_by_func (menuitem,
- G_CALLBACK (on_toggle_widget_view),
- dockitem);
+ g_signal_handlers_block_by_func(menuitem,
G_CALLBACK(on_toggle_widget_view), dockitem);
- if (GDL_DOCK_OBJECT_ATTACHED (dockitem))
+ if (GDL_DOCK_OBJECT_ATTACHED(dockitem))
gtk_check_menu_item_set_active(menuitem, TRUE);
else
gtk_check_menu_item_set_active(menuitem, FALSE);
- g_signal_handlers_unblock_by_func (menuitem,
- G_CALLBACK (on_toggle_widget_view),
- dockitem);
+ g_signal_handlers_unblock_by_func(menuitem,
G_CALLBACK(on_toggle_widget_view), dockitem);
}
static void on_layout_dirty_notify(GObject *object, GParamSpec *pspec,
gpointer user_data) {
@@ -209,7 +312,7 @@ static void on_session_save(AnjutaShell *shell,
AnjutaSessionPhase phase, Anjuta
return;
/* Save geometry */
- state = gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET (app)));
+ state = gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(app)));
if (state & GDK_WINDOW_STATE_MAXIMIZED) {
anjuta_session_set_int(session, "Anjuta", "Maximized", 1);
}
@@ -310,34 +413,37 @@ static void anjuta_app_dispose(GObject *widget) {
app->status = NULL;
}
+ if (app->settings) {
+ g_object_unref(app->settings);
+ app->settings = NULL;
+ }
+
G_OBJECT_CLASS (parent_class)->dispose(widget);
}
static void anjuta_app_finalize(GObject *widget) {
AnjutaApp *app;
- g_return_if_fail (ANJUTA_IS_APP (widget));
+ g_return_if_fail(ANJUTA_IS_APP (widget));
app = ANJUTA_APP (widget);
- g_object_unref(G_OBJECT(app->ui));
- g_object_unref(G_OBJECT (app->preferences));
+ g_object_unref(app->ui);
+ g_object_unref(app->preferences);
- G_OBJECT_CLASS (parent_class)->finalize(widget);
+ G_OBJECT_CLASS(parent_class)->finalize(widget);
}
static void anjuta_app_instance_init(AnjutaApp *app) {
- gint merge_id;
- GtkWidget *about_menu;
+ GtkWidget *menubar, *about_menu;
GtkWidget *view_menu, *hbox;
GtkWidget *main_box;
GtkWidget *dockbar;
GList *plugins_dirs = NULL;
- gchar * style;
GdkGeometry size_hints =
{ 100, 100, 0, 0, 100, 100, 1, 1, 0.0, 0.0, GDK_GRAVITY_NORTH_WEST };
- DEBUG_PRINT ("%s", "Initializing gtkpod...");
+ DEBUG_PRINT("%s", "Initializing gtkpod...");
gtk_window_set_geometry_hints(GTK_WINDOW (app), GTK_WIDGET (app),
&size_hints, GDK_HINT_RESIZE_INC);
gtk_window_set_resizable(GTK_WINDOW (app), TRUE);
@@ -351,9 +457,13 @@ static void anjuta_app_instance_init(AnjutaApp *app) {
app->values = NULL;
app->widgets = NULL;
+ app->maximized = FALSE;
+
+ /* Settings */
+ app->settings = g_settings_new (PREF_SCHEMA);
/* Status bar */
- app->status = ANJUTA_STATUS (anjuta_status_new ());
+ app->status = ANJUTA_STATUS(anjuta_status_new());
anjuta_status_set_title_window(app->status, GTK_WIDGET (app));
gtk_widget_show(GTK_WIDGET (app->status));
gtk_box_pack_end(GTK_BOX (main_box), GTK_WIDGET (app->status), FALSE,
TRUE, 0);
@@ -379,13 +489,12 @@ static void anjuta_app_instance_init(AnjutaApp *app) {
/* UI engine */
app->ui = anjuta_ui_new();
- g_object_add_weak_pointer(G_OBJECT(app->ui), (gpointer) & app->ui);
+ g_object_add_weak_pointer(G_OBJECT(app->ui), (gpointer) &app->ui);
/* show tooltips in the statusbar */
g_signal_connect(app->ui, "connect_proxy", G_CALLBACK(connect_proxy_cb),
app);
g_signal_connect(app->ui, "disconnect_proxy",
G_CALLBACK(disconnect_proxy_cb), app);
/* Plugin Manager */
- g_printf("Prepending %s to plugin directories\n", get_plugin_dir());
plugins_dirs = g_list_prepend(plugins_dirs, get_plugin_dir());
app->plugin_manager = anjuta_plugin_manager_new(G_OBJECT (app),
app->status, plugins_dirs);
app->profile_manager = anjuta_profile_manager_new(app->plugin_manager);
@@ -395,11 +504,8 @@ static void anjuta_app_instance_init(AnjutaApp *app) {
app->preferences = anjuta_preferences_new(app->plugin_manager);
g_object_add_weak_pointer(G_OBJECT (app->preferences), (gpointer)
&app->preferences);
- anjuta_preferences_notify_add_string(app->preferences, "anjuta.gdl.style",
on_gdl_style_changed, app, NULL);
- style = anjuta_preferences_get(app->preferences, "anjuta.gdl.style");
-
- on_gdl_style_changed(app->preferences, NULL, style, app);
- g_free(style);
+ g_signal_connect(app->settings, "changed::" GDL_STYLE,
G_CALLBACK(on_gdl_style_changed), app);
+ on_gdl_style_changed(app->settings, GDL_STYLE, app);
/* Register actions */
anjuta_ui_add_action_group_entries(app->ui, "ActionGroupMusic",
_("Music"), menu_entries_music, G_N_ELEMENTS (menu_entries_music),
GETTEXT_PACKAGE, TRUE, app);
@@ -410,15 +516,15 @@ static void anjuta_app_instance_init(AnjutaApp *app) {
anjuta_ui_add_action_group_entries(app->ui, "ActionGroupHelp", _("Help"),
menu_entries_help, G_N_ELEMENTS (menu_entries_help), GETTEXT_PACKAGE, TRUE,
app);
/* Merge UI */
- merge_id = anjuta_ui_merge(app->ui, uifile);
+ anjuta_ui_merge(app->ui, uifile);
/* Adding accels group */
gtk_window_add_accel_group(GTK_WINDOW (app),
gtk_ui_manager_get_accel_group(GTK_UI_MANAGER (app->ui)));
/* create main menu */
- app->menubar = gtk_ui_manager_get_widget(GTK_UI_MANAGER (app->ui),
"/MenuMain");
- gtk_box_pack_start(GTK_BOX (main_box), app->menubar, FALSE, FALSE, 0);
- gtk_widget_show(app->menubar);
+ menubar = gtk_ui_manager_get_widget(GTK_UI_MANAGER (app->ui), "/MenuMain");
+ gtk_box_pack_start(GTK_BOX (main_box), menubar, FALSE, FALSE, 0);
+ gtk_widget_show(menubar);
/* Create widgets menu */
view_menu = gtk_ui_manager_get_widget(GTK_UI_MANAGER(app->ui),
"/MenuMain/MenuView");
@@ -427,7 +533,7 @@ static void anjuta_app_instance_init(AnjutaApp *app) {
/* Create about plugins menu */
about_menu = gtk_ui_manager_get_widget(GTK_UI_MANAGER(app->ui),
"/MenuMain/PlaceHolderHelpMenus/MenuHelp/"
"PlaceHolderHelpAbout/AboutPlugins");
- about_create_plugins_submenu(ANJUTA_SHELL (app), about_menu);
+ about_create_plugins_submenu(ANJUTA_SHELL(app), about_menu);
/* Add main view */
gtk_box_pack_start(GTK_BOX (main_box), hbox, TRUE, TRUE, 0);
@@ -522,7 +628,7 @@ void anjuta_app_set_geometry(AnjutaApp *app, const gchar
*geometry) {
gboolean geometry_set = FALSE;
if (geometry && strlen(geometry) > 0) {
- DEBUG_PRINT ("Setting geometry: %s", geometry);
+ DEBUG_PRINT("Setting geometry: %s", geometry);
if (sscanf(geometry, "%dx%d+%d+%d", &width, &height, &posx, &posy) ==
4) {
if (gtk_widget_get_realized (GTK_WIDGET (app))) {
@@ -556,6 +662,11 @@ static void anjuta_app_layout_save(AnjutaApp *app, const
gchar *filename, const
g_return_if_fail (ANJUTA_IS_APP (app));
g_return_if_fail (filename != NULL);
+ /* If maximized, the layout should be loaded from the back-up first */
+ if (app->maximized)
+ gdl_dock_layout_load_layout(app->layout_manager, "back-up");
+
+ /* Continue with the saving */
gdl_dock_layout_save_layout(app->layout_manager, name);
if (!gdl_dock_layout_save_to_file(app->layout_manager, filename))
g_warning ("Saving dock layout to '%s' failed!", filename);
@@ -571,7 +682,7 @@ static void anjuta_app_layout_load(AnjutaApp *app, const
gchar *layout_filename,
gchar *filename;
filename = g_build_filename(get_data_dir(), "dock-layout.xml", NULL);
- DEBUG_PRINT ("Layout = %s", filename);
+ DEBUG_PRINT("Layout = %s", filename);
if (!gdl_dock_layout_load_from_file(app->layout_manager, filename))
g_warning ("Loading layout from '%s' failed!!", filename);
g_free(filename);
@@ -591,15 +702,10 @@ void anjuta_app_install_preferences(AnjutaApp *app) {
GtkWidget *notebook, *shortcuts, *plugins, *remember_plugins;
notebook = gtk_notebook_new();
- img_path = anjuta_res_get_pixmap_file (ICON_FILE);
- pixbuf = gdk_pixbuf_new_from_file (img_path, NULL);
- anjuta_preferences_dialog_add_page (
- ANJUTA_PREFERENCES_DIALOG (anjuta_preferences_get_dialog
(app->preferences)),
- "plugins",
- _(" Plugins"),
- pixbuf,
- notebook);
- shortcuts = anjuta_ui_get_accel_editor(ANJUTA_UI (app->ui));
+ img_path = anjuta_res_get_pixmap_file(ICON_FILE);
+ pixbuf = gdk_pixbuf_new_from_file(img_path, NULL);
+
anjuta_preferences_dialog_add_page(ANJUTA_PREFERENCES_DIALOG(anjuta_preferences_get_dialog(app->preferences)),
"plugins", _(" Plugins"), pixbuf, notebook);
+ shortcuts = anjuta_ui_get_accel_editor(ANJUTA_UI(app->ui));
plugins = anjuta_plugin_manager_get_plugins_page(app->plugin_manager);
remember_plugins =
anjuta_plugin_manager_get_remembered_plugins_page(app->plugin_manager);
@@ -611,9 +717,9 @@ void anjuta_app_install_preferences(AnjutaApp *app) {
gtk_notebook_append_page(GTK_NOTEBOOK (notebook), remember_plugins,
gtk_label_new(_("Preferred plugins")));
gtk_notebook_append_page(GTK_NOTEBOOK (notebook), shortcuts,
gtk_label_new(_("Shortcuts")));
- g_object_unref (notebook);
- g_free (img_path);
- g_object_unref (pixbuf);
+ g_object_unref(notebook);
+ g_free(img_path);
+ g_object_unref(pixbuf);
}
/* AnjutaShell Implementation */
@@ -718,7 +824,7 @@ static gboolean remove_from_widgets_hash(gpointer name,
gpointer hash_widget, gp
}
static void on_widget_destroy(GtkWidget *widget, AnjutaApp *app) {
- DEBUG_PRINT ("%s", "Widget about to be destroyed");
+ DEBUG_PRINT("%s", "Widget about to be destroyed");
g_hash_table_foreach_remove(app->widgets, remove_from_widgets_hash,
widget);
}
@@ -734,7 +840,7 @@ static void on_widget_remove(GtkWidget *container,
GtkWidget *widget, AnjutaApp
gdl_dock_item_unbind(GDL_DOCK_ITEM(dock_item));
}
if (g_hash_table_foreach_remove(app->widgets, remove_from_widgets_hash,
widget)) {
- DEBUG_PRINT ("%s", "Widget removed from container");
+ DEBUG_PRINT("%s", "Widget removed from container");
}
}
@@ -743,7 +849,7 @@ static void on_widget_removed_from_hash(gpointer widget) {
GtkWidget *menuitem;
GdlDockItem *dockitem;
- DEBUG_PRINT ("%s", "Removing widget from hash");
+ DEBUG_PRINT("%s", "Removing widget from hash");
app = g_object_get_data(G_OBJECT (widget), "app-object");
dockitem = g_object_get_data(G_OBJECT (widget), "dockitem");
@@ -954,6 +1060,11 @@ static void anjuta_shell_iface_init(AnjutaShellIface
*iface) {
iface->add_widget_custom = anjuta_app_add_widget_custom;
iface->remove_widget = anjuta_app_remove_widget;
iface->present_widget = anjuta_app_present_widget;
+ iface->iconify_dockable_widget = anjuta_app_iconify_dockable_widget;
+ iface->hide_dockable_widget = anjuta_app_hide_dockable_widget;
+ iface->show_dockable_widget = anjuta_app_show_dockable_widget;
+ iface->maximize_widget = anjuta_app_maximize_widget;
+ iface->unmaximize = anjuta_app_unmaximize;
iface->add_value = anjuta_app_add_value;
iface->get_value = anjuta_app_get_value;
iface->remove_value = anjuta_app_remove_value;
@@ -976,8 +1087,8 @@ static void anjuta_shell_iface_init(AnjutaShellIface
*iface) {
static void anjuta_gtkpod_statusbar_reset_progress(GtkPodApp *obj, gint total)
{
g_return_if_fail(ANJUTA_IS_APP(gtkpod_app));
AnjutaStatus *status = anjuta_shell_get_status(ANJUTA_SHELL(gtkpod_app),
NULL);
- anjuta_status_progress_reset (status);
- anjuta_status_progress_add_ticks (status, total);
+ anjuta_status_progress_reset(status);
+ anjuta_status_progress_add_ticks(status, total);
}
static void anjuta_gtkpod_statusbar_increment_progress_ticks(GtkPodApp *obj,
gint ticks, gchar* text) {
@@ -1207,7 +1318,8 @@ static void confirm_append_text(GtkBuilder *builder,
const gchar *text) {
w = gtkpod_builder_xml_get_widget(builder, "scroller");
adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW (w));
- gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment)
- gtk_adjustment_get_page_size(adjustment));
+ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment)
+ - gtk_adjustment_get_page_size(adjustment));
g_strfreev(strings);
}
@@ -1393,7 +1505,7 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
ENTER in the window (usually OK)*/
/* Hide or default CANCEL button */
if ((w = gtkpod_builder_xml_get_widget(confirm_builder, "cancel"))) {
- gtk_widget_set_can_default (w, TRUE);
+ gtk_widget_set_can_default(w, TRUE);
gtk_widget_grab_default(w);
if (!cancel_handler)
@@ -1402,7 +1514,7 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
/* Hide or default APPLY button */
if ((w = gtkpod_builder_xml_get_widget(confirm_builder, "apply"))) {
- gtk_widget_set_can_default (w, TRUE);
+ gtk_widget_set_can_default(w, TRUE);
gtk_widget_grab_default(w);
if (!apply_handler)
@@ -1411,7 +1523,7 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
/* Hide or default OK button */
if ((w = gtkpod_builder_xml_get_widget(confirm_builder, "ok"))) {
- gtk_widget_set_can_default (w, TRUE);
+ gtk_widget_set_can_default(w, TRUE);
gtk_widget_grab_default(w);
if (!ok_handler)
@@ -1419,7 +1531,7 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
}
/* Connect Close window */
- g_signal_connect (GTK_OBJECT (window),
+ g_signal_connect (G_OBJECT (window),
"delete_event",
G_CALLBACK (on_cancel_clicked),
GINT_TO_POINTER(id));
@@ -1443,7 +1555,7 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
}
else {
/* Make sure we catch the response */
- g_signal_connect (GTK_OBJECT (window),
+ g_signal_connect (G_OBJECT (window),
"response",
G_CALLBACK (on_response),
GINT_TO_POINTER(id));
@@ -1453,6 +1565,13 @@ static GtkResponseType
anjuta_gtkpod_app_confirmation(GtkPodApp *obj, gint id, g
}
}
+static void anjuta_gtkpod_app_display_widget(GtkPodApp *obj, GtkWidget
*widget) {
+ g_return_if_fail(widget);
+ g_return_if_fail(ANJUTA_IS_APP(gtkpod_app));
+
+ anjuta_app_show_dockable_widget(ANJUTA_SHELL(gtkpod_app), widget, NULL);
+}
+
static void gtkpod_app_iface_init(GtkPodAppInterface *iface) {
iface->statusbar_reset_progress = anjuta_gtkpod_statusbar_reset_progress;
iface->statusbar_increment_progress_ticks =
anjuta_gtkpod_statusbar_increment_progress_ticks;
@@ -1476,6 +1595,6 @@ G_MODULE_EXPORT void
on_confirm_tree_size_allocate(GtkWidget *sender, GtkAllocat
}
ANJUTA_TYPE_BEGIN(AnjutaApp, anjuta_app, GTK_TYPE_WINDOW);
- ANJUTA_TYPE_ADD_INTERFACE(anjuta_shell, ANJUTA_TYPE_SHELL);
- ANJUTA_TYPE_ADD_INTERFACE(gtkpod_app,
GTKPOD_APP_TYPE);ANJUTA_TYPE_END
-;
+ANJUTA_TYPE_ADD_INTERFACE( anjuta_shell, ANJUTA_TYPE_SHELL);
+ANJUTA_TYPE_ADD_INTERFACE( gtkpod_app, GTKPOD_APP_TYPE);
+ANJUTA_TYPE_END;
diff --git a/src/anjuta-app.h b/src/anjuta-app.h
index 6b6eec5..6cdbdeb 100644
--- a/src/anjuta-app.h
+++ b/src/anjuta-app.h
@@ -52,12 +52,14 @@ struct _AnjutaApp
GHashTable *values;
GHashTable *widgets;
+ gboolean maximized;
GtkAccelGroup *accel_group;
AnjutaStatus *status;
AnjutaUI *ui;
AnjutaPreferences *preferences;
+ GSettings* settings;
AnjutaPluginManager *plugin_manager;
AnjutaProfileManager *profile_manager;
diff --git a/src/gtkpod.c b/src/gtkpod.c
index 4b1c52f..ab4d381 100644
--- a/src/gtkpod.c
+++ b/src/gtkpod.c
@@ -37,10 +37,26 @@
#include "libgtkpod/stock_icons.h"
#include "anjuta-app.h"
-#define GTKPOD_REMEMBERED_PLUGINS "gtkpod.remembered.plugins"
+#define GTKPOD_REMEMBERED_PLUGINS "remembered-plugins"
+
+static gchar *system_restore_session = NULL;
static gboolean on_gtkpod_delete_event(GtkWidget *widget, GdkEvent *event,
gpointer user_data);
static void on_gtkpod_destroy(GtkWidget * w, gpointer data);
+static void on_profile_descoped(AnjutaProfileManager *profile_manager,
AnjutaProfile *profile, AnjutaApp *app);
+static void on_profile_scoped(AnjutaProfileManager *profile_manager,
AnjutaProfile *profile, AnjutaApp *app);
+
+static gchar *get_user_session_dir() {
+ return g_build_filename(g_get_home_dir(), ".gtkpod", "session", NULL);
+}
+
+static gchar* get_user_profile_path() {
+ return g_build_filename(g_get_home_dir(), ".gtkpod", "gtkpod.profile",
NULL);
+}
+
+static gchar* get_default_profile_path() {
+ return g_build_filename(get_data_dir(), "default.profile", NULL);
+}
void gtkpod_init(int argc, char *argv[]) {
AnjutaPluginManager *plugin_manager;
@@ -80,11 +96,9 @@ void gtkpod_init(int argc, char *argv[]) {
anjuta_status_progress_add_ticks(status, 1);
splash = g_build_filename(get_icon_dir(), "gtkpod-splash.png", NULL);
-
if (g_file_test(splash, G_FILE_TEST_IS_REGULAR))
- anjuta_status_set_splash (status, splash, 100);
+ anjuta_status_set_splash(status, splash, 100);
else {
- g_warning("Cannot find splash file %s", splash);
anjuta_status_disable_splash(status, TRUE);
}
@@ -94,7 +108,6 @@ void gtkpod_init(int argc, char *argv[]) {
* initialise gtkpod library items. Needs to be safety threaded due
* to splash screen.
*/
-
gdk_threads_enter();
gp_init(argc, argv);
gdk_threads_leave();
@@ -113,15 +126,13 @@ void gtkpod_init(int argc, char *argv[]) {
profile_manager = anjuta_shell_get_profile_manager(ANJUTA_SHELL(app),
NULL);
/* Restore remembered plugins */
- remembered_plugins = anjuta_preferences_get(app->preferences,
GTKPOD_REMEMBERED_PLUGINS);
- g_message("REMEMBERED PLUGINS %s", remembered_plugins);
+ remembered_plugins = g_settings_get_string(app->settings,
GTKPOD_REMEMBERED_PLUGINS);
if (remembered_plugins)
anjuta_plugin_manager_set_remembered_plugins(plugin_manager,
remembered_plugins);
g_free(remembered_plugins);
/* Load default profile */
- default_profile_file = g_build_filename(get_data_dir(), "default.profile",
NULL);
- g_message("DEFAULT PROFILE %s", default_profile_file);
+ default_profile_file = get_default_profile_path();
profile = anjuta_profile_new(USER_PROFILE_NAME, plugin_manager);
session_profile = g_file_new_for_path(default_profile_file);
anjuta_profile_add_plugins_from_xml(profile, session_profile, TRUE,
&error);
@@ -134,11 +145,9 @@ void gtkpod_init(int argc, char *argv[]) {
g_free(default_profile_file);
/* Load user session profile */
- user_profile_file = g_build_filename(g_get_home_dir(), ".gtkpod",
"gtkpod.profile", NULL);
- g_message("User profile %s", user_profile_file);
+ user_profile_file = get_user_profile_path();
session_profile = g_file_new_for_path(user_profile_file);
if (g_file_query_exists(session_profile, NULL)) {
- g_message("user session profile exists so adding plugins from it");
anjuta_profile_add_plugins_from_xml(profile, session_profile, FALSE,
&error);
if (error) {
anjuta_util_dialog_error(GTK_WINDOW(app), "%s", error->message);
@@ -159,6 +168,10 @@ void gtkpod_init(int argc, char *argv[]) {
error = NULL;
}
+ /* Prepare for session save and load on profile change */
+ g_signal_connect (profile_manager, "profile-scoped",
+ G_CALLBACK (on_profile_scoped), app);
+
anjuta_profile_manager_thaw(profile_manager, &error);
if (error) {
@@ -167,17 +180,20 @@ void gtkpod_init(int argc, char *argv[]) {
error = NULL;
}
+ g_signal_connect (profile_manager, "profile-descoped",
+ G_CALLBACK (on_profile_descoped), app);
+
gdk_threads_enter();
gp_init_itdbs();
gdk_threads_leave();
/* Load layout.*/
- session_dir = g_build_filename(g_get_home_dir(), ".gtkpod", "session",
NULL);
- if (! g_file_test(session_dir, G_FILE_TEST_IS_DIR))
+ session_dir = get_user_session_dir();
+ if (!g_file_test(session_dir, G_FILE_TEST_IS_DIR))
session_dir = g_strdup(get_data_dir());
/* Restore session */
- anjuta_shell_session_load(ANJUTA_SHELL (app), session_dir, NULL);
+ anjuta_shell_session_load(ANJUTA_SHELL(app), session_dir, NULL);
g_free(session_dir);
anjuta_status_progress_tick(status, NULL, _("Loaded Session..."));
@@ -188,38 +204,32 @@ void gtkpod_init(int argc, char *argv[]) {
gtk_window_set_role(GTK_WINDOW(app), "gtkpod-app");
gtk_widget_show(GTK_WIDGET(app));
-
- GList *plugins = anjuta_plugin_manager_get_active_plugins(plugin_manager);
- g_printf("Number of active plugins: %d\n", g_list_length(plugins));
}
/* callback for gtkpod window's close button */
static gboolean on_gtkpod_delete_event(GtkWidget *widget, GdkEvent *event,
gpointer user_data) {
- if (! ok_to_close_gtkpod())
+ if (!ok_to_close_gtkpod())
return TRUE;
AnjutaPluginManager *plugin_manager;
- AnjutaProfileManager *profile_manager;
AnjutaApp *app;
gchar *remembered_plugins;
gchar *session_dir;
app = ANJUTA_APP(widget);
- plugin_manager = anjuta_shell_get_plugin_manager(ANJUTA_SHELL (app), NULL);
- profile_manager = anjuta_shell_get_profile_manager(ANJUTA_SHELL (app),
NULL);
+ plugin_manager = anjuta_shell_get_plugin_manager(ANJUTA_SHELL(app), NULL);
/* Save remembered plugins */
remembered_plugins =
anjuta_plugin_manager_get_remembered_plugins(plugin_manager);
- anjuta_preferences_set(app->preferences, GTKPOD_REMEMBERED_PLUGINS,
remembered_plugins);
+ g_settings_set_string(app->settings, GTKPOD_REMEMBERED_PLUGINS,
remembered_plugins);
g_free(remembered_plugins);
-
- session_dir = g_build_filename(g_get_home_dir(), ".gtkpod", "session",
NULL);
- anjuta_shell_session_save(ANJUTA_SHELL (app), session_dir, NULL);
+ session_dir = get_user_session_dir();
+ anjuta_shell_session_save(ANJUTA_SHELL(app), session_dir, NULL);
g_free(session_dir);
- anjuta_shell_notify_exit(ANJUTA_SHELL (app), NULL);
+ anjuta_shell_notify_exit(ANJUTA_SHELL(app), NULL);
if (!gtkpod_cleanup_quit()) {
// Dont want to quit so avoid signalling any destroy event
@@ -235,3 +245,48 @@ static void on_gtkpod_destroy(GtkWidget * w, gpointer
data) {
gtk_widget_hide(w);
gtk_main_quit();
}
+
+static void on_profile_scoped(AnjutaProfileManager *profile_manager,
AnjutaProfile *profile, AnjutaApp *app) {
+ gchar *session_dir;
+ static gboolean first_time = TRUE;
+
+ if (strcmp(anjuta_profile_get_name(profile), USER_PROFILE_NAME) != 0)
+ return;
+
+ /* If profile scoped to "user", restore user session */
+ if (system_restore_session) {
+ session_dir = system_restore_session;
+ system_restore_session = NULL;
+ }
+ else {
+ session_dir = get_user_session_dir();
+ }
+
+ if (first_time) {
+ first_time = FALSE;
+ }
+ else {
+ AnjutaSession *session;
+ session = anjuta_session_new(session_dir);
+ anjuta_session_sync(session);
+ g_object_unref(session);
+ }
+
+ /* Restore session */
+ anjuta_shell_session_load(ANJUTA_SHELL (app), session_dir, NULL);
+ g_free(session_dir);
+}
+
+static void on_profile_descoped(AnjutaProfileManager *profile_manager,
AnjutaProfile *profile, AnjutaApp *app) {
+ gchar *session_dir;
+
+ if (strcmp(anjuta_profile_get_name(profile), USER_PROFILE_NAME) != 0)
+ return;
+
+ /* If profile descoped from is "user", save user session */
+ session_dir = get_user_session_dir();
+
+ /* Save current session */
+ anjuta_shell_session_save(ANJUTA_SHELL (app), session_dir, NULL);
+ g_free(session_dir);
+}
diff --git a/src/main.c b/src/main.c
index ad3c373..04020bc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <time.h>
#include <libintl.h>
+#include <gtk/gtk.h>
#include "gtkpod.h"
#include <glib/gi18n-lib.h>
diff --git a/src/org.gtkpod.gschema.xml b/src/org.gtkpod.gschema.xml
new file mode 100644
index 0000000..3236a64
--- /dev/null
+++ b/src/org.gtkpod.gschema.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schemalist>
+ <schema path="/org/gtkpod/" id="org.gtkpod">
+ <key type="b" name="toolbar-visible">
+ <default>false</default>
+ </key>
+ <key type="s" name="remembered-plugins">
+ <default>""</default>
+ </key>
+ <key type="b" name="session-skip-last">
+ <default>false</default>
+ </key>
+ <key type="b" name="session-skip-last-files">
+ <default>false</default>
+ </key>
+ <key type="s" name="gdl-style">
+ <choices>
+ <choice value="Text"/>
+ <choice value="Icon"/>
+ <choice value="Both"/>
+ <choice value="Toolbar"/>
+ <choice value="Tabs"/>
+ </choices>
+ <default>"Both"</default>
+ </key>
+ <key type="s" name="toolbar-style">
+ <choices>
+ <choice value="Default"/>
+ <choice value="Both"/>
+ <choice value="Horiz"/>
+ <choice value="Icons"/>
+ <choice value="Text"/>
+ </choices>
+ <default>"Default"</default>
+ </key>
+ </schema>
+</schemalist>
\ No newline at end of file
diff --git a/src/org.gtkpod.gschema.xml.in b/src/org.gtkpod.gschema.xml.in
new file mode 100644
index 0000000..1a3f7b9
--- /dev/null
+++ b/src/org.gtkpod.gschema.xml.in
@@ -0,0 +1,36 @@
+<schemalist>
+ <schema id="org.gtkpod" path="/org/gtkpod/">
+ <key name="toolbar-visible" type="b">
+ <default>false</default>
+ </key>
+ <key name="remembered-plugins" type="s">
+ <default>""</default>
+ </key>
+ <key name="session-skip-last" type="b">
+ <default>false</default>
+ </key>
+ <key name="session-skip-last-files" type="b">
+ <default>false</default>
+ </key>
+ <key name="gdl-style" type="s">
+ <choices>
+ <choice value="Text" />
+ <choice value="Icon" />
+ <choice value="Both" />
+ <choice value="Toolbar" />
+ <choice value="Tabs" />
+ </choices>
+ <default>"Both"</default>
+ </key>
+ <key name="toolbar-style" type="s">
+ <choices>
+ <choice value="Default" />
+ <choice value="Both" />
+ <choice value="Horiz" />
+ <choice value="Icons" />
+ <choice value="Text" />
+ </choices>
+ <default>"Default"</default>
+ </key>
+ </schema>
+</schemalist>
\ No newline at end of file
------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network
management toolset available today. Delivers lowest initial
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2