aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog12
-rw-r--r--addressbook/gui/component/select-names/e-select-names-popup.c276
2 files changed, 137 insertions, 151 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 5f0f82be0c..619c419486 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,15 @@
+2001-09-19 Jon Trowbridge <trow@ximian.com>
+
+ * gui/component/select-names/e-select-names-popup.c
+ (popup_menu_card): Properly handle our GnomeUIInfo labels so that
+ they won't be leaked if they are dynamic strings, so that they
+ will be i18n-correct, and so that underscores won't be interpreted
+ as key accelerators. What a PITA. Also, don't leak our
+ iterators. (Bug #10200.)
+ (popup_menu_list): The same GnomeUIInfo tweaking as in
+ popup_menu_card.
+ (popup_menu_nocard): Ditto.
+
2001-09-18 JP Rosevear <jpr@ximian.com>
* backend/ebook/e-card-simple.c (field_data): add caluri field data
diff --git a/addressbook/gui/component/select-names/e-select-names-popup.c b/addressbook/gui/component/select-names/e-select-names-popup.c
index 77ecd8f521..4b34ff2d01 100644
--- a/addressbook/gui/component/select-names/e-select-names-popup.c
+++ b/addressbook/gui/component/select-names/e-select-names-popup.c
@@ -213,38 +213,19 @@ init_html_mail (GnomeUIInfo *uiinfo, PopupInfo *info)
}
-/* Duplicate the string, mapping _ to __. This is to make sure that underscores in
- e-mail addresses don't get mistaken for keyboard accelerators. */
-static gchar *
-quote_label (const gchar *str)
+static void
+set_uiinfo_label (GnomeUIInfo *uiinfo, const gchar *str)
{
- gint len = str ? strlen (str) : -1;
- const gchar *c = str;
- gchar *d, *q;
-
- if (len < 0)
- return NULL;
-
- while (*c) {
- if (*c == '_')
- ++len;
- ++c;
- }
-
- q = g_new (gchar, len+1);
- c = str;
- d = q;
- while (*c) {
- *d = *c;
- if (*c == '_') {
- ++d;
- *d = '_';
- }
- ++c;
- ++d;
- }
- *d = '\0';
- return q;
+ GtkWidget *label;
+ gchar *label_txt;
+ GList *item_children;
+
+ label_txt = e_utf8_to_locale_string (str);
+ item_children = gtk_container_children (GTK_CONTAINER (uiinfo->widget));
+ label = item_children->data;
+ g_list_free (item_children);
+ gtk_label_set_text (GTK_LABEL (label), label_txt);
+ g_free (label_txt);
}
#define ARBITRARY_UIINFO_LIMIT 64
@@ -256,11 +237,11 @@ popup_menu_card (PopupInfo *info)
gboolean using_radio = FALSE;
ECard *card;
gint i=0;
- GtkWidget *pop, *label;
- GList *item_children;
+ GtkWidget *pop;
EIterator *iterator;
gint html_toggle;
- gchar *name_label, *quoted_name_label;
+ gint mail_label = -1;
+ const gchar *mail_label_str = NULL;
/*
* Build up our GnomeUIInfo array.
@@ -281,49 +262,43 @@ popup_menu_card (PopupInfo *info)
uiinfo[i].type = GNOME_APP_UI_SEPARATOR;
++i;
- if (e_list_length (card->email) > 1) {
- gint j = 0;
-
- using_radio = TRUE;
-
- iterator = e_list_get_iterator (card->email);
- for (e_iterator_reset (iterator); e_iterator_is_valid (iterator); e_iterator_next (iterator)) {
- gchar *label = (gchar *)e_iterator_get (iterator);
-
- if (label && *label) {
- /* Magically convert embedded XML into an address. FIXME: We shouldn't need
- this anymore, since we handle contact lists as a separate case. */
- if (!strncmp (label, "<?xml", 4)) {
- EDestination *dest = e_destination_import (label);
- radioinfo[j].label = g_strdup (e_destination_get_address (dest));
- gtk_object_unref (GTK_OBJECT (dest));
-
- }
- else {
- radioinfo[j].label = g_strdup (label);
+ if (card->email) {
+
+ if (e_list_length (card->email) > 1) {
+ gint j = 0;
+
+ using_radio = TRUE;
+
+ iterator = e_list_get_iterator (card->email);
+ for (e_iterator_reset (iterator); e_iterator_is_valid (iterator); e_iterator_next (iterator)) {
+ gchar *label = (gchar *)e_iterator_get (iterator);
+ if (label && *label) {
+ radioinfo[j].label = "";
+ radioinfo[j].type = GNOME_APP_UI_ITEM;
+ radioinfo[j].moreinfo = change_email_num_cb;
+ ++j;
}
-
- radioinfo[j].type = GNOME_APP_UI_ITEM;
- radioinfo[j].moreinfo = change_email_num_cb;
- ++j;
}
+ gtk_object_unref (GTK_OBJECT (iterator));
+
+ radioinfo[j].type = GNOME_APP_UI_ENDOFINFO;
+
+ uiinfo[i].type = GNOME_APP_UI_RADIOITEMS;
+ uiinfo[i].moreinfo = radioinfo;
+ ++i;
+
+ } else {
+ uiinfo[i].type = GNOME_APP_UI_ITEM;
+ uiinfo[i].label = "";
+ mail_label_str = e_destination_get_email (info->dest);
+ mail_label = i;
+ ++i;
}
- radioinfo[j].type = GNOME_APP_UI_ENDOFINFO;
-
- uiinfo[i].type = GNOME_APP_UI_RADIOITEMS;
- uiinfo[i].moreinfo = radioinfo;
- ++i;
-
- } else {
- uiinfo[i].type = GNOME_APP_UI_ITEM;
- uiinfo[i].label = (gchar *) e_destination_get_email (info->dest);
+ uiinfo[i].type = GNOME_APP_UI_SEPARATOR;
++i;
}
- uiinfo[i].type = GNOME_APP_UI_SEPARATOR;
- ++i;
-
add_html_mail (&(uiinfo[i]), info);
html_toggle = i;
++i;
@@ -347,29 +322,37 @@ popup_menu_card (PopupInfo *info)
pop = gnome_popup_menu_new (uiinfo);
+ init_html_mail (&(uiinfo[html_toggle]), info);
+
+ /* Properly handle the names & e-mail addresses so that they don't get leaked and so that
+ underscores are interpreted as key accelerators. This sucks. */
+
+ set_uiinfo_label (&(uiinfo[0]), e_destination_get_name (info->dest));
+
+ if (mail_label >= 0) {
+ set_uiinfo_label (&(uiinfo[mail_label]), e_destination_get_email (info->dest));
+ }
+
if (using_radio) {
gint n = e_destination_get_email_num (info->dest);
- gint j;
- for (j=0; radioinfo[j].type != GNOME_APP_UI_ENDOFINFO; ++j) {
- gtk_object_set_data (GTK_OBJECT (radioinfo[j].widget), "number", GINT_TO_POINTER (j));
- g_free (radioinfo[j].label);
- if (j == n)
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (radioinfo[n].widget), TRUE);
+ gint j = 0;
+ iterator = e_list_get_iterator (card->email);
+ for (e_iterator_reset (iterator); e_iterator_is_valid (iterator); e_iterator_next (iterator)) {
+ gchar *label = (gchar *)e_iterator_get (iterator);
+ if (label && *label) {
+ set_uiinfo_label (&(radioinfo[j]), label);
+
+ gtk_object_set_data (GTK_OBJECT (radioinfo[j].widget), "number", GINT_TO_POINTER (j));
+
+ if (j == n)
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (radioinfo[n].widget), TRUE);
+
+ ++j;
+ }
}
+ gtk_object_unref (GTK_OBJECT (iterator));
}
- init_html_mail (&(uiinfo[html_toggle]), info);
-
- /* Now set label of the first item to contact name */
- name_label = e_utf8_to_locale_string (e_destination_get_name (info->dest));
- quoted_name_label = quote_label (name_label);
- item_children = gtk_container_children (GTK_CONTAINER (uiinfo[0].widget));
- label = item_children->data;
- g_list_free (item_children);
- gtk_label_set_text (GTK_LABEL (label), quoted_name_label);
- g_free (name_label);
- g_free (quoted_name_label);
-
return pop;
}
@@ -377,16 +360,13 @@ static GtkWidget *
popup_menu_list (PopupInfo *info)
{
GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT];
- GtkWidget *pop, *label;
- GList *item_children;
+ GtkWidget *pop;
const gchar *str;
- gchar *name_label, *quoted_name_label, *gs;
+ gchar *gs;
gint i = 0, subcount = 0, max_subcount = 10;
ECard *card;
EIterator *iterator;
- GList *garbage = NULL;
-
memset (uiinfo, 0, sizeof (uiinfo));
uiinfo[i].type = GNOME_APP_UI_ITEM;
@@ -397,36 +377,30 @@ popup_menu_list (PopupInfo *info)
++i;
card = e_destination_get_card (info->dest);
- iterator = e_list_get_iterator (card->email);
- for (e_iterator_reset (iterator); e_iterator_is_valid (iterator) && subcount < max_subcount; e_iterator_next (iterator)) {
- gchar *label = (gchar *) e_iterator_get (iterator);
- if (label && *label) {
- EDestination *subdest = e_destination_import (label);
+
+ if (card->email) {
+
+ iterator = e_list_get_iterator (card->email);
+ for (e_iterator_reset (iterator); e_iterator_is_valid (iterator) && subcount < max_subcount; e_iterator_next (iterator)) {
+ gchar *label = (gchar *) e_iterator_get (iterator);
+ if (label && *label) {
+ uiinfo[i].type = GNOME_APP_UI_ITEM;
+ uiinfo[i].label = "";
+ ++i;
+ ++subcount;
+ }
+ }
+ if (e_iterator_is_valid (iterator)) {
uiinfo[i].type = GNOME_APP_UI_ITEM;
- name_label = e_utf8_to_locale_string (e_destination_get_address (subdest));
- quoted_name_label = quote_label (name_label);
- uiinfo[i].label = quoted_name_label;
- g_free (name_label);
- garbage = g_list_prepend (garbage, quoted_name_label);
+ uiinfo[i].label = "";
++i;
- ++subcount;
- gtk_object_unref (GTK_OBJECT (subdest));
}
- }
- if (e_iterator_is_valid (iterator)) {
- uiinfo[i].type = GNOME_APP_UI_ITEM;
- gs = g_strdup_printf (N_("(%d not shown)"), e_list_length (card->email) - max_subcount);
- name_label = e_utf8_to_locale_string (gs);
- quoted_name_label = quote_label (name_label);
- uiinfo[i].label = quoted_name_label;
- garbage = g_list_prepend (garbage, quoted_name_label);
- g_free (gs);
- g_free (name_label);
+
+ uiinfo[i].type = GNOME_APP_UI_SEPARATOR;
++i;
- }
- uiinfo[i].type = GNOME_APP_UI_SEPARATOR;
- ++i;
+ gtk_object_unref (GTK_OBJECT (iterator));
+ }
uiinfo[i].type = GNOME_APP_UI_ITEM;
uiinfo[i].label = N_("Edit Contact List");
@@ -443,26 +417,36 @@ popup_menu_list (PopupInfo *info)
pop = gnome_popup_menu_new (uiinfo);
- /* Now set label of the first item to contact name */
+ /* Now set labels properly. */
+
str = e_destination_get_name (info->dest);
- if (str == NULL)
- str = e_destination_get_email (info->dest);
- if (str != NULL) {
- name_label = e_utf8_to_locale_string (str);
- } else {
- name_label = g_strdup (_("Unnamed Contact List"));
+ if (!(str && *str))
+ str = _("Unnamed Contact List");
+ set_uiinfo_label (&(uiinfo[0]), str);
+
+ if (card->email) {
+
+ iterator = e_list_get_iterator (card->email);
+ i = 2;
+ for (e_iterator_reset (iterator); e_iterator_is_valid (iterator) && subcount < max_subcount; e_iterator_next (iterator)) {
+ gchar *label = (gchar *) e_iterator_get (iterator);
+ if (label && *label) {
+ EDestination *subdest = e_destination_import (label);
+ set_uiinfo_label (&(uiinfo[i]), e_destination_get_address (subdest));
+ ++i;
+ gtk_object_unref (GTK_OBJECT (subdest));
+ }
+ }
+ if (e_iterator_is_valid (iterator)) {
+ gs = g_strdup_printf (N_("(%d not shown)"), e_list_length (card->email) - max_subcount);
+ set_uiinfo_label (&(uiinfo[i]), gs);
+ g_free (gs);
+ }
+
+ gtk_object_unref (GTK_OBJECT (iterator));
}
- quoted_name_label = quote_label (name_label);
- item_children = gtk_container_children (GTK_CONTAINER (uiinfo[0].widget));
- label = item_children->data;
- g_list_free (item_children);
- gtk_label_set_text (GTK_LABEL (label), quoted_name_label);
- g_free (name_label);
- g_free (quoted_name_label);
- g_list_foreach (garbage, (GFunc) g_free, NULL);
- g_list_free (garbage);
-
+
return pop;
}
@@ -478,10 +462,8 @@ popup_menu_nocard (PopupInfo *info)
{
GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT];
gint i=0;
- GtkWidget *pop, *label;
- GList *item_children;
+ GtkWidget *pop;
const gchar *str;
- gchar *name_label, *quoted_name_label;
gint html_toggle;
memset (uiinfo, 0, sizeof (uiinfo));
@@ -519,20 +501,12 @@ popup_menu_nocard (PopupInfo *info)
/* Now set label of the first item to contact name */
str = e_destination_get_name (info->dest);
- if (str == NULL)
+ if (! (str && *str))
str = e_destination_get_email (info->dest);
- if (str != NULL) {
- name_label = e_utf8_to_locale_string (str);
- } else {
- name_label = g_strdup (_("Unnamed Contact"));
- }
- quoted_name_label = quote_label (name_label);
- item_children = gtk_container_children (GTK_CONTAINER (uiinfo[0].widget));
- label = item_children->data;
- g_list_free (item_children);
- gtk_label_set_text (GTK_LABEL (label), quoted_name_label);
- g_free (name_label);
- g_free (quoted_name_label);
+ if (! (str && *str))
+ str = _("Unnamed Contact");
+
+ set_uiinfo_label (&(uiinfo[0]), str);
return pop;
}