commit 5707c950f164585003025806f4a324c3dcbffb4d Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> 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 gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2