Thank you. This time, I have insert an entry in ChangLog. And modified some places in file mail-account-editor.c mail-account-gui.c and mail-account-gui.h. The whole thing looks better now, but I have to alter some exist function declaration and defination to use this simplest way I can found. Please see and tell me if there is anything wrong. Best Regards Charles Zhang Not Zed wrote: first, this should include a ChangeLog entry. second, there are a few places that already hook onto some form of changed event, you should just call a function from there rather than hooking a signal onto every possible widget. last, i'm not sure if this breaks abstraction somewhat - you're poking about the internals of the dialog->editor directly (i.e. by changing the button sensitivity), perhaps you should have a 'changed' method on it instead. On Mon, 2003-10-13 at 00:44, Charles Zhang wrote:Dear all I posted a patch for bug 48998 here. It fixes a bug of "apply button always leave active". Because this happens in a dialog, and all the button and optionmenu are all in this dialog, so I connect all their "changed" signal to a function. Please review. Thank you all. Best Regards Charles Zhang ______________________________________________________________________ Index: mail/mail-account-editor.c =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-account-editor.c,v retrieving revision 1.57 diff -u -p -r1.57 mail-account-editor.c --- mail/mail-account-editor.c 25 Mar 2003 15:49:19 -0000 1.57 +++ mail/mail-account-editor.c 12 Oct 2003 14:33:11 -0000 @@ -109,6 +109,9 @@ apply_changes (MailAccountEditor *editor /* save any changes we may have */ mail_config_write (); + gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), + GTK_RESPONSE_APPLY, FALSE); + /* FIXME: #1549: if the account was a remote store, delete it from the folder-tree and re-add it */ /* FIXME: preferably, we'd only do this if there were changes... oh well */ @@ -159,6 +162,9 @@ construct (MailAccountEditor *editor, EA mail_account_gui_build_extra_conf (editor->gui, source->url); gtk_widget_grab_focus (GTK_WIDGET (editor->gui->account_name)); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), + GTK_RESPONSE_APPLY, FALSE); } MailAccountEditor * Index: mail/mail-account-gui.c =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v retrieving revision 1.133.4.3 diff -u -p -r1.133.4.3 mail-account-gui.c --- mail/mail-account-gui.c 29 Sep 2003 15:43:30 -0000 1.133.4.3 +++ mail/mail-account-gui.c 12 Oct 2003 14:33:19 -0000 @@ -730,6 +730,15 @@ setup_toggle (GtkWidget *widget, const c toggle_sensitivity (toggle, widget); } +static void +mail_config_changed (GtkWidget *widget, gpointer user_data) +{ + MailAccountsTab *dialog = (MailAccountsTab *) user_data; + + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog->editor), + GTK_RESPONSE_APPLY, TRUE); +} + void mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) { @@ -742,6 +751,7 @@ mail_account_gui_build_extra_conf (MailA GList *children, *child; char *name; int i, rows; + MailAccountsTab *dialog = (MailAccountsTab *) gui->dialog; if (url_string) url = "" (url_string, NULL); @@ -874,6 +884,9 @@ mail_account_gui_build_extra_conf (MailA GTK_EXPAND | GTK_FILL, 0, 0, 0); rows++; g_hash_table_insert (gui->extra_config, entries[i].name, checkbox); + + g_signal_connect (checkbox, "toggled", G_CALLBACK (mail_config_changed), dialog); + if (entries[i].depname) setup_toggle (checkbox, entries[i].depname, gui); break; @@ -923,7 +936,9 @@ mail_account_gui_build_extra_conf (MailA } g_hash_table_insert (gui->extra_config, entries[i].name, entry); - + + g_signal_connect (entry, "changed", G_CALLBACK (mail_config_changed), dialog); + break; } @@ -1395,6 +1410,8 @@ prepare_signatures (MailAccountGui *gui) g_signal_connect (gtk_option_menu_get_menu (GTK_OPTION_MENU (gui->sig_option_menu)), "selection-done", G_CALLBACK(sig_changed), gui); + g_signal_connect (gui->sig_option_menu, "changed", G_CALLBACK (mail_config_changed), gui->dialog); + glade_xml_signal_connect_data (gui->xml, "sigAddNewClicked", G_CALLBACK (sig_add_new_signature), gui); @@ -1430,6 +1447,9 @@ mail_account_gui_new (EAccount *account, || (account == mail_config_get_default_account ())) gtk_toggle_button_set_active (gui->default_account, TRUE); + g_signal_connect (gui->account_name, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->default_account, "toggled", G_CALLBACK (mail_config_changed), dialog); + /* Identity */ gui->full_name = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_full_name")); gui->email_address = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_address")); @@ -1437,7 +1457,7 @@ mail_account_gui_new (EAccount *account, gui->organization = GTK_ENTRY (glade_xml_get_widget (gui->xml, "identity_organization")); prepare_signatures (gui); - + if (account->id->name) gtk_entry_set_text (gui->full_name, account->id->name); if (account->id->address) @@ -1449,6 +1469,11 @@ mail_account_gui_new (EAccount *account, setup_signatures (gui); + g_signal_connect (gui->full_name, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->email_address, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->reply_to, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->organization, "changed", G_CALLBACK (mail_config_changed), dialog); + /* Source */ gui->source.provider_type = CAMEL_PROVIDER_STORE; gui->source.type = GTK_OPTION_MENU (glade_xml_get_widget (gui->xml, "source_type_omenu")); @@ -1471,9 +1496,21 @@ mail_account_gui_new (EAccount *account, gui->source.check_supported = GTK_BUTTON (glade_xml_get_widget (gui->xml, "source_check_supported")); g_signal_connect (gui->source.check_supported, "clicked", G_CALLBACK (service_check_supported), &gui->source); + + g_signal_connect (gui->source.type, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.hostname, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.username, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.path, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.use_ssl, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.authtype, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source.remember, "toggled", G_CALLBACK (mail_config_changed), dialog); + gui->source_auto_check = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "extra_auto_check")); gui->source_auto_check_min = GTK_SPIN_BUTTON (glade_xml_get_widget (gui->xml, "extra_auto_check_min")); + g_signal_connect (gui->source_auto_check, "toggled", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->source_auto_check_min, "value-changed", G_CALLBACK (mail_config_changed), dialog); + /* Transport */ gui->transport.provider_type = CAMEL_PROVIDER_TRANSPORT; gui->transport.type = GTK_OPTION_MENU (glade_xml_get_widget (gui->xml, "transport_type_omenu")); @@ -1497,6 +1534,14 @@ mail_account_gui_new (EAccount *account, g_signal_connect (gui->transport.check_supported, "clicked", G_CALLBACK (service_check_supported), &gui->transport); + g_signal_connect (gui->transport.type, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport.hostname, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport.username, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport_needs_auth, "toggled", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport.use_ssl, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport.authtype, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->transport.remember, "toggled", G_CALLBACK (mail_config_changed), dialog); + /* Drafts folder */ gui->drafts_folder_button = GTK_BUTTON (glade_xml_get_widget (gui->xml, "drafts_button")); g_signal_connect (gui->drafts_folder_button, "selected", @@ -1510,6 +1555,8 @@ mail_account_gui_new (EAccount *account, _("Select Folder"), gui->drafts_folder_uri, allowed_types); + + g_signal_connect (gui->drafts_folder_button, "clicked", G_CALLBACK (mail_config_changed), dialog); /* Sent folder */ gui->sent_folder_button = GTK_BUTTON (glade_xml_get_widget (gui->xml, "sent_button")); @@ -1525,10 +1572,14 @@ mail_account_gui_new (EAccount *account, gui->sent_folder_uri, allowed_types); + g_signal_connect (gui->sent_folder_button, "clicked", G_CALLBACK (mail_config_changed), dialog); + /* Special Folders "Reset Defaults" button */ button = glade_xml_get_widget (gui->xml, "default_folders_button"); g_signal_connect (button, "clicked", G_CALLBACK (default_folders_clicked), gui); + g_signal_connect (button, "clicked", G_CALLBACK (mail_config_changed), dialog); + /* Always Cc */ gui->always_cc = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "always_cc")); gtk_toggle_button_set_active (gui->always_cc, account->always_cc); @@ -1536,6 +1587,9 @@ mail_account_gui_new (EAccount *account, if (account->cc_addrs) gtk_entry_set_text (gui->cc_addrs, account->cc_addrs); + g_signal_connect (gui->always_cc, "toggled", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->cc_addrs, "changed", G_CALLBACK (mail_config_changed), dialog); + /* Always Bcc */ gui->always_bcc = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "always_bcc")); gtk_toggle_button_set_active (gui->always_bcc, account->always_bcc); @@ -1543,6 +1597,9 @@ mail_account_gui_new (EAccount *account, if (account->bcc_addrs) gtk_entry_set_text (gui->bcc_addrs, account->bcc_addrs); + g_signal_connect (gui->always_bcc, "toggled", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->bcc_addrs, "changed", G_CALLBACK (mail_config_changed), dialog); + /* Security */ gui->pgp_key = GTK_ENTRY (glade_xml_get_widget (gui->xml, "pgp_key")); if (account->pgp_key) @@ -1555,7 +1612,13 @@ mail_account_gui_new (EAccount *account, gtk_toggle_button_set_active (gui->pgp_no_imip_sign, account->pgp_no_imip_sign); gui->pgp_always_trust = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui->xml, "pgp_always_trust")); gtk_toggle_button_set_active (gui->pgp_always_trust, account->pgp_always_trust); - + + g_signal_connect (gui->pgp_key, "changed", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->pgp_encrypt_to_self, "clicked", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->pgp_always_sign, "clicked", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->pgp_no_imip_sign, "clicked", G_CALLBACK (mail_config_changed), dialog); + g_signal_connect (gui->pgp_always_trust, "clicked", G_CALLBACK (mail_config_changed), dialog); + #if defined (HAVE_NSS) && defined (SMIME_SUPPORTED) gui->smime_key = GTK_ENTRY (glade_xml_get_widget (gui->xml, "smime_key")); if (account->smime_key) |
Index: mail/ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/mail/ChangeLog,v retrieving revision 1.2761.2.32 diff -u -p -r1.2761.2.32 ChangeLog --- mail/ChangeLog 8 Oct 2003 16:06:08 -0000 1.2761.2.32 +++ mail/ChangeLog 13 Oct 2003 14:56:06 -0000 @@ 0,0 +,16 @@ +2003-10-13 Charles Zhang <charles zhang sun com> + + * mail-account-gui.h: alter the declaration of function mail_ + account_gui_build_extra_conf to add necessary argument. + + * mail-account-gui.c (mail_config_change): enable apply button. + (mail_account_gui_connect_change_signal): connect change signal. + (mail_account_gui_setup): call function mail_account_gui_connect_ + change_signal. + (mail_account_gui_build_extra_conf): connect "changed" signal. + (source_type_changed): transfer neccesary argument to function + (default_folders_clicked): call function mail_config_change + + * mail-account-editor.c (apply_changes): disable apply button + (construct): disable apply button + 2003-10-08 Frederic Crozat <fcrozat mandrakesoft com> * mail-display.c: (pixbuf_gen_idle): Index: mail/mail-account-editor.c =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-account-editor.c,v retrieving revision 1.57 diff -u -p -r1.57 mail-account-editor.c --- mail/mail-account-editor.c 25 Mar 2003 15:49:19 -0000 1.57 +++ mail/mail-account-editor.c 13 Oct 2003 14:56:07 -0000 @@ -109,6 +109,9 @@ apply_changes (MailAccountEditor *editor /* save any changes we may have */ mail_config_write (); + gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), + GTK_RESPONSE_APPLY, FALSE); + /* FIXME: #1549: if the account was a remote store, delete it from the folder-tree and re-add it */ /* FIXME: preferably, we'd only do this if there were changes... oh well */ @@ -156,9 +159,12 @@ construct (MailAccountEditor *editor, EA mail_account_gui_setup (editor->gui, GTK_WIDGET (editor)); - mail_account_gui_build_extra_conf (editor->gui, source->url); + mail_account_gui_build_extra_conf (editor->gui, GTK_WIDGET (editor), source->url); gtk_widget_grab_focus (GTK_WIDGET (editor->gui->account_name)); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), + GTK_RESPONSE_APPLY, FALSE); } MailAccountEditor * Index: mail/mail-account-gui.c =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v retrieving revision 1.133.4.3 diff -u -p -r1.133.4.3 mail-account-gui.c --- mail/mail-account-gui.c 29 Sep 2003 15:43:30 -0000 1.133.4.3 +++ mail/mail-account-gui.c 13 Oct 2003 14:56:17 -0000 @@ -475,7 +475,9 @@ transport_provider_set_available (MailAc static void source_type_changed (GtkWidget *widget, gpointer user_data) { - MailAccountGui *gui = user_data; + MailAccountEditor *editor = (MailAccountEditor *) user_data; + GtkWidget *top = GTK_WIDGET (editor); + MailAccountGui *gui = (MailAccountGui *) editor->gui; GtkWidget *file_entry, *label, *frame, *dwidget = NULL; CamelProvider *provider; @@ -570,7 +572,7 @@ source_type_changed (GtkWidget *widget, if (dwidget) gtk_widget_grab_focus (dwidget); - mail_account_gui_build_extra_conf (gui, gui && gui->account && gui->account->source ? gui->account->source->url : NULL); + mail_account_gui_build_extra_conf (gui, top, gui && gui->account && gui->account->source ? gui->account->source->url : NULL); if (provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) transport_provider_set_available (gui, provider, TRUE); @@ -730,8 +732,14 @@ setup_toggle (GtkWidget *widget, const c toggle_sensitivity (toggle, widget); } +static void +mail_config_changed (GtkWidget *widget, gpointer user_data) +{ + gtk_dialog_set_response_sensitive (GTK_DIALOG (user_data), GTK_RESPONSE_APPLY, TRUE); +} + void -mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url_string) +mail_account_gui_build_extra_conf (MailAccountGui *gui, GtkWidget *top, const char *url_string) { CamelURL *url; GtkWidget *mailcheck_frame, *mailcheck_hbox; @@ -874,6 +882,9 @@ mail_account_gui_build_extra_conf (MailA GTK_EXPAND | GTK_FILL, 0, 0, 0); rows++; g_hash_table_insert (gui->extra_config, entries[i].name, checkbox); + + g_signal_connect (checkbox, "toggled", G_CALLBACK (mail_config_changed), top); + if (entries[i].depname) setup_toggle (checkbox, entries[i].depname, gui); break; @@ -923,7 +934,9 @@ mail_account_gui_build_extra_conf (MailA } g_hash_table_insert (gui->extra_config, entries[i].name, entry); - + + g_signal_connect (entry, "changed", G_CALLBACK (mail_config_changed), top); + break; } @@ -1076,6 +1089,7 @@ static void default_folders_clicked (GtkButton *button, gpointer user_data) { MailAccountGui *gui = user_data; + MailAccountsTab *dialog = (MailAccountsTab *) gui->dialog; /* Drafts folder */ g_free (gui->drafts_folder_uri); @@ -1088,6 +1102,8 @@ default_folders_clicked (GtkButton *butt gui->sent_folder_uri = g_strdup (default_sent_folder_uri); evolution_folder_selector_button_set_uri (EVOLUTION_FOLDER_SELECTOR_BUTTON (gui->sent_folder_button), gui->sent_folder_uri); + + mail_config_changed (GTK_WIDGET (button), dialog->editor); } GtkWidget *mail_account_gui_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2); @@ -1578,6 +1594,50 @@ mail_account_gui_new (EAccount *account, } void +mail_account_gui_connect_change_signal (MailAccountGui *gui, GtkWidget *top) +{ + g_signal_connect (gui->account_name, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->default_account, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->full_name, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->email_address, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->reply_to, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->organization, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->sig_option_menu, "changed", G_CALLBACK (mail_config_changed), top); + + g_signal_connect (gui->source.type, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.hostname, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.username, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.path, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.use_ssl, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.authtype, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source.remember, "toggled", G_CALLBACK (mail_config_changed), top); + + g_signal_connect (gui->source_auto_check, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->source_auto_check_min, "value-changed", G_CALLBACK (mail_config_changed), top); + + g_signal_connect (gui->transport.type, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport.hostname, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport.username, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport_needs_auth, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport.use_ssl, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport.authtype, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->transport.remember, "toggled", G_CALLBACK (mail_config_changed), top); + + g_signal_connect (gui->drafts_folder_button, "clicked", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->sent_folder_button, "clicked", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->always_cc, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->cc_addrs, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->always_bcc, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->bcc_addrs, "changed", G_CALLBACK (mail_config_changed), top); + + g_signal_connect (gui->pgp_key, "changed", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->pgp_encrypt_to_self, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->pgp_always_sign, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->pgp_no_imip_sign, "toggled", G_CALLBACK (mail_config_changed), top); + g_signal_connect (gui->pgp_always_trust, "toggled", G_CALLBACK (mail_config_changed), top); +} + +void mail_account_gui_setup (MailAccountGui *gui, GtkWidget *top) { GtkWidget *stores, *transports, *item; @@ -1620,7 +1680,7 @@ mail_account_gui_setup (MailAccountGui * g_object_set_data ((GObject *) gui->source.type, provider->protocol, item); g_object_set_data ((GObject *) item, "provider", provider); g_object_set_data ((GObject *) item, "number", GUINT_TO_POINTER (si)); - g_signal_connect (item, "activate", G_CALLBACK (source_type_changed), gui); + g_signal_connect (item, "activate", G_CALLBACK (source_type_changed), top); gtk_menu_shell_append(GTK_MENU_SHELL(stores), item); @@ -1691,7 +1751,7 @@ mail_account_gui_setup (MailAccountGui * /* add a "None" option to the stores menu */ item = gtk_menu_item_new_with_label (_("None")); g_object_set_data ((GObject *) item, "provider", NULL); - g_signal_connect (item, "activate", G_CALLBACK (source_type_changed), gui); + g_signal_connect (item, "activate", G_CALLBACK (source_type_changed), top); gtk_menu_shell_append(GTK_MENU_SHELL(stores), item); @@ -1760,6 +1820,8 @@ mail_account_gui_setup (MailAccountGui * gui->transport.provider_type = CAMEL_PROVIDER_TRANSPORT; g_free (transport_proto); } + + mail_account_gui_connect_change_signal (gui, top); } static void Index: mail/mail-account-gui.h =================================================================== RCS file: /cvs/gnome/evolution/mail/mail-account-gui.h,v retrieving revision 1.24 diff -u -p -r1.24 mail-account-gui.h --- mail/mail-account-gui.h 25 Mar 2003 15:49:19 -0000 1.24 +++ mail/mail-account-gui.h 13 Oct 2003 14:56:17 -0000 @@ -124,7 +124,7 @@ gboolean mail_account_gui_source_complet gboolean mail_account_gui_transport_complete (MailAccountGui *gui, GtkWidget **incomplete); gboolean mail_account_gui_management_complete (MailAccountGui *gui, GtkWidget **incomplete); -void mail_account_gui_build_extra_conf (MailAccountGui *gui, const char *url); +void mail_account_gui_build_extra_conf (MailAccountGui *gui, GtkWidget *top, const char *url); void mail_account_gui_auto_detect_extra_conf (MailAccountGui *gui);