diff options
Diffstat (limited to 'profiles/audio-profiles-edit.c')
-rw-r--r-- | profiles/audio-profiles-edit.c | 988 |
1 files changed, 988 insertions, 0 deletions
diff --git a/profiles/audio-profiles-edit.c b/profiles/audio-profiles-edit.c new file mode 100644 index 0000000..4f1cb98 --- /dev/null +++ b/profiles/audio-profiles-edit.c @@ -0,0 +1,988 @@ +/* gm_audio-profiles-edit.c: widget for a profiles edit dialog */ + +/* + * Copyright (C) 2003 Thomas Vander Stichele + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <gst/gst.h> + +#include "audio-profile.h" +#include "audio-profile-edit.h" +#include "audio-profile-private.h" +#include "gmp-util.h" +#include "audio-profiles-edit.h" + +#define MANAGE_STOCK_EDIT "manage-edit" + +struct _GMAudioProfilesEditPrivate +{ + MateConfClient *conf; + GtkWidget *new_button; + GtkWidget *new_profile_dialog; + GtkWidget *edit_button; + GtkWidget *delete_button; + GtkWindow *transient_parent; + GtkWidget *manage_profiles_list; /* FIXME: rename this one ? */ + GList *deleted_profiles_list; /* pass through to delete confirm dialog */ +}; + +static void gm_audio_profiles_edit_init (GMAudioProfilesEdit *edit); +static void gm_audio_profiles_edit_class_init (GMAudioProfilesEditClass *klass); +static void gm_audio_profiles_edit_finalize (GObject *object); + + +/* profile list column names */ +enum +{ + COLUMN_NAME, + COLUMN_PROFILE_OBJECT, + COLUMN_LAST +}; + +G_DEFINE_TYPE (GMAudioProfilesEdit, gm_audio_profiles_edit, GTK_TYPE_DIALOG); + +/* register custom edit stock icon */ +static void +gm_audio_profile_manage_register_stock (void) +{ + static gboolean registered = FALSE; + + if (!registered) + { + GtkIconFactory *factory; + GtkIconSet *icons; + + static const GtkStockItem edit_item [] = { + { MANAGE_STOCK_EDIT, N_("_Edit"), 0, 0, GETTEXT_PACKAGE }, + }; + + icons = gtk_icon_factory_lookup_default (GTK_STOCK_PREFERENCES); + factory = gtk_icon_factory_new (); + gtk_icon_factory_add (factory, MANAGE_STOCK_EDIT, icons); + gtk_icon_factory_add_default (factory); + gtk_stock_add (edit_item, 1); + registered = TRUE; + } +} + +/* widget callbacks */ + +static void +count_selected_profiles_func (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + int *count = data; + + *count += 1; +} + +static void +selection_changed_callback (GtkTreeSelection *selection, + GMAudioProfilesEditPrivate *priv) +{ + int count; + + count = 0; + gtk_tree_selection_selected_foreach (selection, + count_selected_profiles_func, + &count); + + gtk_widget_set_sensitive (priv->edit_button, + count == 1); + gtk_widget_set_sensitive (priv->delete_button, + count > 0); +} + +static void +profile_activated_callback (GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + gpointer *ptr) +{ + GMAudioProfile *profile; + GtkTreeIter iter; + GtkTreeModel *model; + GtkWidget *edit_dialog; + + model = gtk_tree_view_get_model (tree_view); + + if (!gtk_tree_model_get_iter (model, &iter, path)) + return; + + profile = NULL; + gtk_tree_model_get (model, + &iter, + COLUMN_PROFILE_OBJECT, + &profile, + -1); + if (profile) { + /* FIXME: is this the right function name ? */ + edit_dialog = gm_audio_profile_edit_new ((MateConfClient *) profile, gm_audio_profile_get_id (profile)); + g_return_if_fail (edit_dialog != NULL); + gtk_widget_show_all (GTK_WIDGET (edit_dialog)); + } else { + g_warning ("Could not retrieve profile"); + } +} + +static void +fix_button_align (GtkWidget *button) +{ + GtkWidget *child; + + child = gtk_bin_get_child (GTK_BIN (button)); + + if (GTK_IS_ALIGNMENT (child)) + g_object_set (G_OBJECT (child), "xalign", 0.0, NULL); + else if (GTK_IS_LABEL (child)) + g_object_set (G_OBJECT (child), "xalign", 0.0, NULL); +} + +static void +list_selected_profiles_func (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + GList **list = data; + GMAudioProfile *profile = NULL; + + gtk_tree_model_get (model, + iter, + COLUMN_PROFILE_OBJECT, + &profile, + -1); + + *list = g_list_prepend (*list, profile); +} + +static void +free_profiles_list (gpointer data) +{ + GList *profiles = data; + + g_list_foreach (profiles, (GFunc) g_object_unref, NULL); + g_list_free (profiles); +} + +/* refill profile treeview + * recreates the profile tree view from scratch */ +static void +refill_profile_treeview (GtkWidget *tree_view) +{ + GList *profiles; + GList *tmp; + GtkTreeSelection *selection; + GtkListStore *model; + GList *selected_profiles; + GtkTreeIter iter; + + GST_DEBUG ("refill_profile_treeview: start\n"); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); + model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view))); + + selected_profiles = NULL; + gtk_tree_selection_selected_foreach (selection, + list_selected_profiles_func, + &selected_profiles); + + gtk_list_store_clear (model); + + profiles = gm_audio_profile_get_list (); + tmp = profiles; + while (tmp != NULL) + { + GMAudioProfile *profile = tmp->data; + + GST_DEBUG ("refill: appending profile with name %s\n", + gm_audio_profile_get_name (profile)); + gtk_list_store_append (model, &iter); + + /* We are assuming the list store will hold a reference to + * the profile object, otherwise we would be in danger of disappearing + * profiles. + */ + gtk_list_store_set (model, + &iter, + COLUMN_NAME, gm_audio_profile_get_name (profile), + COLUMN_PROFILE_OBJECT, profile, + -1); + + if (g_list_find (selected_profiles, profile) != NULL) + gtk_tree_selection_select_iter (selection, &iter); + + tmp = tmp->next; + } + + if (selected_profiles == NULL) + { + /* Select first row */ + GtkTreePath *path; + + path = gtk_tree_path_new (); + gtk_tree_path_append_index (path, 0); + gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), path); + gtk_tree_path_free (path); + } + + free_profiles_list (selected_profiles); + GST_DEBUG ("refill_profile_treeview: stop\n"); +} + + +/* create a profile list widget */ +static GtkWidget* +create_profile_list (void) +{ + GtkTreeSelection *selection; + GtkCellRenderer *cell; + GtkWidget *tree_view; + GtkTreeViewColumn *column; + GtkListStore *model; + + model = gtk_list_store_new (COLUMN_LAST, + G_TYPE_STRING, + G_TYPE_OBJECT); + + tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + //terminal_util_set_atk_name_description (tree_view, _("Profile list"), NULL); + + g_object_unref (G_OBJECT (model)); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); + + gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), + GTK_SELECTION_MULTIPLE); + + refill_profile_treeview (tree_view); + + cell = gtk_cell_renderer_text_new (); + + g_object_set (G_OBJECT (cell), + "xpad", 2, + NULL); + + column = gtk_tree_view_column_new_with_attributes (NULL, + cell, + "text", COLUMN_NAME, + NULL); + + gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), + GTK_TREE_VIEW_COLUMN (column)); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE); + + return tree_view; +} + +/* profile callbacks */ +static void +on_profile_changed (GMAudioProfile *profile, + const GMAudioSettingMask *mask, + GtkWidget *tree_view) +{ + GtkListStore *list_store; + GtkTreeIter iter; + GtkTreeModel *tree_model; + gboolean valid; + + if (mask->name) + { + tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); + list_store = GTK_LIST_STORE (tree_model); + + /* Get the first iter in the list */ + valid = gtk_tree_model_get_iter_first (tree_model, &iter); + + while (valid) + { + /* Walk through the list, reading each row */ + GMAudioProfile *model_profile; + + /* Make sure you terminate calls to gtk_tree_model_get() + * with a '-1' value + */ + gtk_tree_model_get (tree_model, &iter, + COLUMN_PROFILE_OBJECT, &model_profile, + -1); + + if (profile == model_profile) + { + /* bingo ! */ + gtk_list_store_set (list_store, + &iter, + COLUMN_NAME, gm_audio_profile_get_name (profile), + -1); + } + valid = gtk_tree_model_iter_next (tree_model, &iter); + } + } +} + +/* ui callbacks */ +static void new_button_clicked(GtkWidget* button, GMAudioProfilesEdit* dialog) +{ + gm_audio_profiles_edit_new_profile(dialog, GTK_WINDOW(dialog)); +} + +static void edit_button_clicked(GtkWidget* button, GMAudioProfilesEdit* dialog) +{ + GtkTreeSelection* selection; + GList* profiles; + GMAudioProfile* profile; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->manage_profiles_list)); + + profiles = NULL; + gtk_tree_selection_selected_foreach (selection, + list_selected_profiles_func, + &profiles); + + if (profiles == NULL) + return; /* edit button was supposed to be insensitive... */ + + /* only one selection ? */ + if (profiles->next == NULL) + { + GtkWidget *edit_dialog; + profile = (GMAudioProfile *) profiles->data; + /* connect to profile changed signal so we can update the name in the list + * if it gets changed */ + g_signal_connect_object (G_OBJECT (profile), "changed", + G_CALLBACK (on_profile_changed), + dialog->priv->manage_profiles_list, 0); + + /* FIXME: is this the right function name ? */ + edit_dialog = gm_audio_profile_edit_new ((MateConfClient *)profile, gm_audio_profile_get_id (profile)); + g_return_if_fail (edit_dialog != NULL); + gtk_window_set_modal (GTK_WINDOW (edit_dialog), TRUE); + gtk_widget_show_all (GTK_WIDGET (edit_dialog)); + } + else + { + /* edit button was supposed to be insensitive due to multiple + * selection + */ + } + + g_list_foreach (profiles, (GFunc) g_object_unref, NULL); + g_list_free (profiles); +} + +/* ui callback for confirmation from delete_button_clicked */ +static void +delete_confirm_response (GtkWidget *confirm_dialog, + int response_id, + GMAudioProfilesEdit *dialog) +{ + GList *deleted_profiles; + GError *err; + + deleted_profiles = dialog->priv->deleted_profiles_list; + + err = NULL; + if (response_id == GTK_RESPONSE_ACCEPT) + { + gm_audio_profile_delete_list (dialog->priv->conf, deleted_profiles, + &err); + } + + if (err != NULL) + { + g_print ("FIXME: GError on deletion: %s\n", err->message); + g_error_free (err); + } + + dialog->priv->deleted_profiles_list = NULL; + + /* reget from MateConf and refill tree view */ + gm_audio_profile_sync_list (FALSE, NULL); + refill_profile_treeview (dialog->priv->manage_profiles_list); + + gtk_widget_destroy (confirm_dialog); +} + +static void +delete_button_clicked (GtkWidget *button, + GMAudioProfilesEdit *dialog) +{ + GtkTreeSelection *selection; + GList *deleted_profiles; + GtkWidget *confirm_dialog; + GString *str; + GList *tmp; + int count; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->manage_profiles_list)); + + deleted_profiles = NULL; + gtk_tree_selection_selected_foreach (selection, + list_selected_profiles_func, + &deleted_profiles); + + count = g_list_length (deleted_profiles); + if (count > 1) + { + str = g_string_new (NULL); + /* the first argument will never be used since we only run for count > 1 */ + g_string_printf (str, ngettext ("Delete this profile?\n", + "Delete these %d profiles?\n", count), count); + + tmp = deleted_profiles; + while (tmp != NULL) + { + g_string_append (str, " "); + g_string_append (str, + gm_audio_profile_get_name (tmp->data)); + if (tmp->next) + g_string_append (str, "\n"); + + tmp = tmp->next; + } + } + else + { + str = g_string_new (NULL); + g_string_printf (str, + _("Delete profile \"%s\"?"), + gm_audio_profile_get_name (deleted_profiles->data)); + } + + confirm_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + "%s", + str->str); + g_string_free (str, TRUE); + + gtk_dialog_add_buttons (GTK_DIALOG (confirm_dialog), + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_DELETE, + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (confirm_dialog), + GTK_RESPONSE_ACCEPT); + + gtk_window_set_title (GTK_WINDOW (confirm_dialog), _("Delete Profile")); + gtk_window_set_resizable (GTK_WINDOW (confirm_dialog), FALSE); + + /* FIXME: what's this ? */ + dialog->priv->deleted_profiles_list = deleted_profiles; + + g_signal_connect (G_OBJECT (confirm_dialog), "response", + G_CALLBACK (delete_confirm_response), + dialog); + g_return_if_fail (confirm_dialog != NULL); + gtk_widget_show_all (confirm_dialog); + gtk_dialog_run (GTK_DIALOG (confirm_dialog)); +} + +/* ui callbacks */ +static void +on_gm_audio_profiles_edit_response (GtkWidget *dialog, + int id, + void *data) +{ + if (id == GTK_RESPONSE_HELP) + { + GError *err = NULL; + + gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (dialog)), + "ghelp:mate-audio-profiles?mate-audio-profiles-profile-edit", + gtk_get_current_event_time (), + &err); + + if (err) + { + gmp_util_show_error_dialog (GTK_WINDOW (dialog), NULL, + _("There was an error displaying help: %s"), err->message); + g_error_free (err); + } + return; + } + + gtk_widget_destroy (dialog); +} + +static void +on_gm_audio_profiles_edit_destroy (GtkWidget *dialog, gpointer *user_data) +{ + GST_DEBUG ("on_destroy: destroying dialog widget\n"); + /* FIXME: set stuff to NULL here */ +} + +#if 0 +/* MateConf notification callback for profile_list */ +static void +gm_audio_profiles_list_notify (MateConfClient *client, + guint cnxn_id, + MateConfEntry *entry, + gpointer user_data) +{ + GMAudioProfilesEdit *dialog; + + dialog = (GMAudioProfilesEdit *) user_data; + GST_DEBUG ("profile_list changed, notified from mateconf, redrawing\n"); + /* refill the profile tree view */ + + refill_profile_treeview (dialog->priv->manage_profiles_list); +} +#endif + +/* create a dialog widget from scratch */ +static void +gm_audio_profiles_edit_init (GMAudioProfilesEdit *dialog) +{ + GtkDialog *gdialog = GTK_DIALOG (dialog); + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *sw; + GtkWidget *hbox; + GtkWidget *bbox; + GtkWidget *button; + GtkTreeSelection *selection; + + /* + dialog = + gtk_dialog_new_with_buttons (_("Edit Profiles"), + NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_HELP, + GTK_RESPONSE_HELP, + GTK_STOCK_CLOSE, + GTK_RESPONSE_ACCEPT, + NULL); + */ + // FIXME: GTK_DIALOG_DESTROY_WITH_PARENT, + dialog->priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog, GM_AUDIO_TYPE_PROFILES_EDIT, GMAudioProfilesEditPrivate); + + gtk_window_set_title (GTK_WINDOW (dialog), _("Edit MATE Audio Profiles")); + gtk_window_set_default_size (GTK_WINDOW (dialog), 320, 240); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_HELP, + GTK_RESPONSE_HELP, + GTK_STOCK_CLOSE, + GTK_RESPONSE_ACCEPT, + NULL); + +#if !GTK_CHECK_VERSION (2, 21, 8) + gtk_dialog_set_has_separator (gdialog, FALSE); +#endif + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (gdialog)), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_action_area (gdialog)), 5); + gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_action_area (gdialog)), 6); + + g_signal_connect (GTK_DIALOG (dialog), + "response", + G_CALLBACK (on_gm_audio_profiles_edit_response), + NULL); + + g_signal_connect (G_OBJECT (dialog), + "destroy", + G_CALLBACK (on_gm_audio_profiles_edit_destroy), + NULL); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (gdialog)), + vbox, TRUE, TRUE, 0); + + /* FIXME + hbox = gtk_hbox_new (FALSE, PADDING); + gtk_box_pack_end (GTK_BOX (vbox), + hbox, FALSE, FALSE, 0); + + app->manage_profiles_default_menu = profile_optionmenu_new (); + g_signal_connect (G_OBJECT (app->manage_profiles_default_menu), + "changed", G_CALLBACK (default_menu_changed), + app); + + gtk_box_pack_start (GTK_BOX (hbox), + label, TRUE, TRUE, 0); + + gtk_box_pack_end (GTK_BOX (hbox), + app->manage_profiles_default_menu, FALSE, FALSE, 0); + */ + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new_with_mnemonic (_("_Profiles:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), + hbox, TRUE, TRUE, 0); + + dialog->priv->manage_profiles_list = create_profile_list (); + + g_signal_connect (G_OBJECT (dialog->priv->manage_profiles_list), + "row_activated", + G_CALLBACK (profile_activated_callback), + NULL); + + sw = gtk_scrolled_window_new (NULL, NULL); + /* FIXME + terminal_util_set_labelled_by (GTK_WIDGET (dialog->priv->manage_profiles_list), + GTK_LABEL (label)); + */ + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_IN); + + gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0); + + gtk_container_add (GTK_CONTAINER (sw), dialog->priv->manage_profiles_list); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), + dialog->priv->manage_profiles_list); + + bbox = gtk_vbutton_box_new (); + gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); + gtk_box_set_spacing (GTK_BOX (bbox), 6); + gtk_box_pack_end (GTK_BOX (hbox), bbox, FALSE, FALSE, 0); + + button = gtk_button_new_from_stock (GTK_STOCK_NEW); + fix_button_align (button); + gtk_box_pack_start (GTK_BOX (bbox), + button, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (new_button_clicked), dialog); + dialog->priv->new_button = button; +/* + terminal_util_set_atk_name_description (dialog->priv->new_button, NULL, + _("Click to open new profile dialog")); +*/ + + gm_audio_profile_manage_register_stock (); + + button = gtk_button_new_from_stock (MANAGE_STOCK_EDIT); + fix_button_align (button); + gtk_box_pack_start (GTK_BOX (bbox), + button, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (edit_button_clicked), dialog); + gtk_widget_set_sensitive (button, FALSE); + dialog->priv->edit_button = button; +/* + terminal_util_set_atk_name_description (app->manage_profiles_edit_button, NULL, + _("Click to open edit profile dialog")); +*/ + + button = gtk_button_new_from_stock (GTK_STOCK_DELETE); + fix_button_align (button); + gtk_box_pack_start (GTK_BOX (bbox), + button, FALSE, FALSE, 0); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (delete_button_clicked), dialog); + gtk_widget_set_sensitive (button, FALSE); + dialog->priv->delete_button = button; +/* + terminal_util_set_atk_name_description (app->manage_profiles_delete_button, NULL, + _("Click to delete selected profile")); + */ + + gtk_widget_grab_focus (dialog->priv->manage_profiles_list); + + /* Monitor selection for sensitivity */ + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->priv->manage_profiles_list)); + + selection_changed_callback (selection, dialog->priv); + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (selection_changed_callback), + dialog->priv); +} + +static void +gm_audio_profiles_edit_class_init (GMAudioProfilesEditClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gm_audio_profiles_edit_finalize; + + g_type_class_add_private (object_class, sizeof (GMAudioProfilesEditPrivate)); +} + +static void +gm_audio_profiles_edit_finalize (GObject *object) +{ + GMAudioProfilesEdit *dialog; + + dialog = GM_AUDIO_PROFILES_EDIT (object); + G_OBJECT_CLASS (gm_audio_profiles_edit_parent_class)->finalize (object); +} + +GtkWidget* +gm_audio_profiles_edit_new (MateConfClient *conf, GtkWindow *transient_parent) +{ + GMAudioProfilesEdit *dialog; + /*GError *err;*/ + + dialog = g_object_new (GM_AUDIO_TYPE_PROFILES_EDIT, NULL); + + g_object_ref (G_OBJECT (conf)); + dialog->priv->conf = conf; + /* set transient parent to itself if NULL */ + if (transient_parent) + dialog->priv->transient_parent = transient_parent; + else + dialog->priv->transient_parent = GTK_WINDOW (dialog); + + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + /* subscribe to changes to profile list */ +/* + err = NULL; + GST_DEBUG ("gap_p_e_new: subscribing to profile_list changes\n"); + mateconf_client_notify_add (dialog->priv->conf, + CONF_GLOBAL_PREFIX"/profile_list", + gm_audio_profiles_list_notify, + dialog, + NULL, &err); + + if (err) + { + g_printerr (_("There was an error subscribing to notification of terminal profile list changes. (%s)\n"), + err->message); + g_error_free (err); + } +*/ + return GTK_WIDGET (dialog); +} + +/* + * creating a new profile from the Edit Profiles dialog + */ + +static void +new_profile_response_callback (GtkWidget *new_profile_dialog, + int response_id, + GMAudioProfilesEdit *dialog) +{ + if (response_id == GTK_RESPONSE_ACCEPT) + { + GtkWidget *name_entry; + char *name; + char *id; + /*GtkWidget *base_option_menu;*/ + GMAudioProfile *new_profile; + GList *profiles; + GList *tmp; + GtkWindow *transient_parent; + GError *error; + + name_entry = g_object_get_data (G_OBJECT (new_profile_dialog), "name_entry"); + name = gtk_editable_get_chars (GTK_EDITABLE (name_entry), 0, -1); + g_strstrip (name); /* name will be non empty after stripping */ + + profiles = gm_audio_profile_get_list (); + for (tmp = profiles; tmp != NULL; tmp = tmp->next) + { + GMAudioProfile *profile = tmp->data; + + if (strcmp (name, gm_audio_profile_get_name (profile)) == 0) + break; + } + if (tmp) + { + gmp_util_run_error_dialog (GTK_WINDOW (new_profile_dialog), + _("You already have a profile called \"%s\""), name); + goto cleanup; + } + g_list_free (profiles); + +/* + base_option_menu = g_object_get_data (G_OBJECT (new_profile_dialog), "base_option_menu"); + base_profile = profile_optionmenu_get_selected (base_option_menu); + + if (base_profile == NULL) + { + terminal_util_show_error_dialog (GTK_WINDOW (new_profile_dialog), NULL, + _("The profile you selected as a base for your new profile no longer exists")); + goto cleanup; + } +*/ + transient_parent = gtk_window_get_transient_for (GTK_WINDOW (new_profile_dialog)); + + + error = NULL; + id = gm_audio_profile_create (name, dialog->priv->conf, &error); + if (error) + { + g_print ("ERROR: %s\n", error->message); + gmp_util_run_error_dialog (GTK_WINDOW (transient_parent), + _("MateConf Error (FIXME): %s\n"), + error->message); + g_error_free (error); + goto cleanup; + } + gtk_widget_destroy (new_profile_dialog); + + /* FIXME: hm, not very proud of having to unstatic this function */ + GST_DEBUG ("new profile callback: syncing list\n"); + //FIXME: in mate-terminal, it's TRUE, &n, which then gets overruled + // by some other sync call with the new list + //audio_profile_sync_list (TRUE, &n); + gm_audio_profile_sync_list (FALSE, NULL); + refill_profile_treeview (dialog->priv->manage_profiles_list); + + new_profile = gm_audio_profile_lookup (id); + g_assert (new_profile != NULL); + + //audio_profile_edit (new_profile, transient_parent); + + cleanup: + g_free (name); + } + else + { + gtk_widget_destroy (new_profile_dialog); + } + GST_DEBUG ("done creating new profile\n"); +} + +static void +new_profile_name_entry_changed_callback (GtkEditable *editable, gpointer data) +{ + char *name, *saved_name; + GtkWidget *create_button; + + create_button = (GtkWidget*) data; + + saved_name = name = gtk_editable_get_chars (editable, 0, -1); + + /* make the create button sensitive only if something other than space has been set */ + while (*name != '\0' && g_ascii_isspace (*name)) + name++; + + gtk_widget_set_sensitive (create_button, *name != '\0' ? TRUE : FALSE); + + g_free (saved_name); +} + +void gm_audio_profiles_edit_new_profile(GMAudioProfilesEdit* dialog, GtkWindow* transient_parent) +{ + GtkWindow* old_transient_parent; + GtkWidget* create_button; + gint response; + GError* error = NULL; + + if (dialog->priv->new_profile_dialog == NULL) + { + GtkBuilder* builder; + GtkWidget* w; + GtkWidget* wl; + GtkWidget* create_button; + GtkSizeGroup* size_group; + GtkSizeGroup* size_group_labels; + + builder = gmp_util_load_builder_file("mate-audio-profile-new.ui", transient_parent, &error); + + if (error != NULL) + { + g_warning("%s", error->message); + g_error_free(error); + return; + } + + dialog->priv->new_profile_dialog = GTK_WIDGET(gtk_builder_get_object(builder, "new-profile-dialog")); + g_signal_connect(G_OBJECT (dialog->priv->new_profile_dialog), "response", G_CALLBACK(new_profile_response_callback), dialog); + + g_object_add_weak_pointer(G_OBJECT(dialog->priv->new_profile_dialog), (void**) &dialog->priv->new_profile_dialog); + + create_button = GTK_WIDGET(gtk_builder_get_object(builder, "new-profile-create-button")); + g_object_set_data(G_OBJECT(dialog->priv->new_profile_dialog), "create_button", create_button); + gtk_widget_set_sensitive(create_button, FALSE); + + size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + size_group_labels = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + + /* the name entry */ + w = GTK_WIDGET(gtk_builder_get_object(builder, "new-profile-name-entry")); + g_object_set_data (G_OBJECT(dialog->priv->new_profile_dialog), "name_entry", w); + g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(new_profile_name_entry_changed_callback), create_button); + gtk_entry_set_activates_default(GTK_ENTRY (w), TRUE); + gtk_widget_grab_focus(w); + // FIXME terminal_util_set_atk_name_description (w, _("Enter profile name"), NULL); + gtk_size_group_add_widget(size_group, w); + + wl = GTK_WIDGET(gtk_builder_get_object (builder, "new-profile-name-label")); + gtk_label_set_mnemonic_widget(GTK_LABEL(wl), w); + // FIXME terminal_util_set_labelled_by (w, GTK_LABEL (wl)); + gtk_size_group_add_widget(size_group_labels, wl); + + #ifdef BASE + /* the base profile option menu */ + w = GTK_WIDGET (gtk_builder_get_object(builder, "new-profile-base-option-menu")); + g_object_set_data(G_OBJECT(dialog->priv->new_profile_dialog), "base_option_menu", w); + // FIXME terminal_util_set_atk_name_description (w, _("Choose base profile"), NULL); + //FIXME profile_optionmenu_refill (w); + gtk_size_group_add_widget(size_group, w); + + wl = GTK_WIDGET(gtk_builder_get_object (builder, "new-profile-base-label")); + gtk_label_set_mnemonic_widget(GTK_LABEL(wl), w); + // FIXME terminal_util_set_labelled_by (w, GTK_LABEL (wl)); + gtk_size_group_add_widget(size_group_labels, wl); + #endif + + + /* gtk_dialog_set_default_response (GTK_DIALOG (dialog->priv->new_profile_dialog), GTK_RESPONSE_CREATE); */ + + g_object_unref(G_OBJECT(size_group)); + g_object_unref(G_OBJECT(size_group_labels)); + + g_object_unref(G_OBJECT(builder)); + } + + old_transient_parent = gtk_window_get_transient_for(GTK_WINDOW(dialog->priv->new_profile_dialog)); + + if (old_transient_parent != transient_parent) + { + gtk_window_set_transient_for(GTK_WINDOW(dialog->priv->new_profile_dialog), transient_parent); + gtk_widget_hide(dialog->priv->new_profile_dialog); /* re-show the window on its new parent */ + } + + create_button = g_object_get_data(G_OBJECT(dialog->priv->new_profile_dialog), "create_button"); + gtk_widget_set_sensitive(create_button, FALSE); + + gtk_window_set_modal(GTK_WINDOW(dialog->priv->new_profile_dialog), TRUE); + gtk_widget_show_all(dialog->priv->new_profile_dialog); + gtk_window_present(GTK_WINDOW(dialog->priv->new_profile_dialog)); + + //keep running the dialog until the response is GTK_RESPONSE_NONE + do { + response = gtk_dialog_run(GTK_DIALOG(dialog->priv->new_profile_dialog)); + } while(response != GTK_RESPONSE_NONE); +} |