mailer: fix the creation of new accounts
This commit is contained in:
parent
5df17d2378
commit
3b4b4ac58f
117
src/mailer.c
117
src/mailer.c
|
@ -2091,6 +2091,7 @@ typedef struct _AccountData
|
||||||
{
|
{
|
||||||
Mailer * mailer;
|
Mailer * mailer;
|
||||||
char * title;
|
char * title;
|
||||||
|
AccountConfig * config;
|
||||||
AccountIdentity identity;
|
AccountIdentity identity;
|
||||||
unsigned int available;
|
unsigned int available;
|
||||||
Account * account;
|
Account * account;
|
||||||
|
@ -2101,7 +2102,10 @@ typedef struct _AccountData
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
static GtkWidget * _assistant_account_select(AccountData * ad);
|
static GtkWidget * _assistant_account_select(AccountData * ad);
|
||||||
static GtkWidget * _assistant_account_config(AccountConfig * config);
|
static GtkWidget * _assistant_account_settings(AccountConfig * config);
|
||||||
|
static AccountConfig * _assistant_account_config_copy(
|
||||||
|
AccountConfig const * config);
|
||||||
|
static void _assistant_account_config_free(AccountConfig * config);
|
||||||
|
|
||||||
#if !GTK_CHECK_VERSION(2, 10, 0)
|
#if !GTK_CHECK_VERSION(2, 10, 0)
|
||||||
# include "gtkassistant.c"
|
# include "gtkassistant.c"
|
||||||
|
@ -2215,7 +2219,7 @@ static void _on_assistant_apply(gpointer data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* on_assistant_prepare */
|
/* on_assistant_prepare */
|
||||||
static GtkWidget * _account_display(Account * account);
|
static GtkWidget * _account_display(AccountData * ad);
|
||||||
|
|
||||||
static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
|
static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
|
@ -2246,15 +2250,20 @@ static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
|
||||||
ad->settings = _assistant_account_select(ad);
|
ad->settings = _assistant_account_select(ad);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ad->settings = _assistant_account_config(
|
{
|
||||||
|
ad->config = _assistant_account_config_copy(
|
||||||
account_get_config(ad->account));
|
account_get_config(ad->account));
|
||||||
|
/* FIXME ad->config may be NULL */
|
||||||
|
assert(ad->config != NULL);
|
||||||
|
ad->settings = _assistant_account_settings(ad->config);
|
||||||
|
}
|
||||||
gtk_container_add(GTK_CONTAINER(page), ad->settings);
|
gtk_container_add(GTK_CONTAINER(page), ad->settings);
|
||||||
gtk_widget_show_all(ad->settings);
|
gtk_widget_show_all(ad->settings);
|
||||||
}
|
}
|
||||||
else if(i == 2)
|
else if(i == 2)
|
||||||
{
|
{
|
||||||
gtk_container_remove(GTK_CONTAINER(page), ad->confirm);
|
gtk_container_remove(GTK_CONTAINER(page), ad->confirm);
|
||||||
ad->confirm = _account_display(ad->account);
|
ad->confirm = _account_display(ad);
|
||||||
gtk_container_add(GTK_CONTAINER(page), ad->confirm);
|
gtk_container_add(GTK_CONTAINER(page), ad->confirm);
|
||||||
}
|
}
|
||||||
old = i;
|
old = i;
|
||||||
|
@ -2363,7 +2372,7 @@ static void _account_add_label(GtkWidget * box, PangoFontDescription * desc,
|
||||||
gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* _assistant_account_config */
|
/* _assistant_account_settings */
|
||||||
static GtkWidget * _update_string(AccountConfig * config,
|
static GtkWidget * _update_string(AccountConfig * config,
|
||||||
PangoFontDescription * desc, GtkSizeGroup * group);
|
PangoFontDescription * desc, GtkSizeGroup * group);
|
||||||
static GtkWidget * _update_password(AccountConfig * config,
|
static GtkWidget * _update_password(AccountConfig * config,
|
||||||
|
@ -2374,7 +2383,7 @@ static GtkWidget * _update_uint16(AccountConfig * config,
|
||||||
PangoFontDescription * desc, GtkSizeGroup * group);
|
PangoFontDescription * desc, GtkSizeGroup * group);
|
||||||
static GtkWidget * _update_boolean(AccountConfig * config);
|
static GtkWidget * _update_boolean(AccountConfig * config);
|
||||||
|
|
||||||
static GtkWidget * _assistant_account_config(AccountConfig * config)
|
static GtkWidget * _assistant_account_settings(AccountConfig * config)
|
||||||
{
|
{
|
||||||
GtkWidget * vbox;
|
GtkWidget * vbox;
|
||||||
GtkSizeGroup * group;
|
GtkSizeGroup * group;
|
||||||
|
@ -2560,9 +2569,9 @@ static GtkWidget * _display_uint16(AccountConfig * config,
|
||||||
PangoFontDescription * desc, GtkSizeGroup * group);
|
PangoFontDescription * desc, GtkSizeGroup * group);
|
||||||
static GtkWidget * _display_boolean(AccountConfig * config,
|
static GtkWidget * _display_boolean(AccountConfig * config,
|
||||||
PangoFontDescription * desc, GtkSizeGroup * group);
|
PangoFontDescription * desc, GtkSizeGroup * group);
|
||||||
static GtkWidget * _account_display(Account * account)
|
static GtkWidget * _account_display(AccountData * ad)
|
||||||
{
|
{
|
||||||
AccountConfig * config;
|
Account * account = ad->account;
|
||||||
AccountConfig p;
|
AccountConfig p;
|
||||||
GtkWidget * vbox;
|
GtkWidget * vbox;
|
||||||
GtkSizeGroup * group;
|
GtkSizeGroup * group;
|
||||||
|
@ -2570,7 +2579,6 @@ static GtkWidget * _account_display(Account * account)
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
config = account_get_config(account);
|
|
||||||
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
|
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
|
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
|
||||||
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
|
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
|
||||||
|
@ -2581,27 +2589,27 @@ static GtkWidget * _account_display(Account * account)
|
||||||
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
||||||
widget = _display_string(&p, desc, group);
|
widget = _display_string(&p, desc, group);
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
|
||||||
for(i = 0; config[i].type != ACT_NONE; i++)
|
for(i = 0; ad->config[i].type != ACT_NONE; i++)
|
||||||
{
|
{
|
||||||
switch(config[i].type)
|
switch(ad->config[i].type)
|
||||||
{
|
{
|
||||||
case ACT_STRING:
|
case ACT_STRING:
|
||||||
widget = _display_string(&config[i], desc,
|
widget = _display_string(&ad->config[i], desc,
|
||||||
group);
|
group);
|
||||||
break;
|
break;
|
||||||
case ACT_PASSWORD:
|
case ACT_PASSWORD:
|
||||||
widget = _display_password(&config[i], desc,
|
widget = _display_password(&ad->config[i], desc,
|
||||||
group);
|
group);
|
||||||
break;
|
break;
|
||||||
case ACT_FILE:
|
case ACT_FILE:
|
||||||
widget = _display_file(&config[i], desc, group);
|
widget = _display_file(&ad->config[i], desc, group);
|
||||||
break;
|
break;
|
||||||
case ACT_UINT16:
|
case ACT_UINT16:
|
||||||
widget = _display_uint16(&config[i], desc,
|
widget = _display_uint16(&ad->config[i], desc,
|
||||||
group);
|
group);
|
||||||
break;
|
break;
|
||||||
case ACT_BOOLEAN:
|
case ACT_BOOLEAN:
|
||||||
widget = _display_boolean(&config[i], desc,
|
widget = _display_boolean(&ad->config[i], desc,
|
||||||
group);
|
group);
|
||||||
break;
|
break;
|
||||||
case ACT_SEPARATOR:
|
case ACT_SEPARATOR:
|
||||||
|
@ -2741,6 +2749,81 @@ static void _on_preferences_account_toggle(GtkCellRendererToggle * renderer,
|
||||||
!gtk_cell_renderer_toggle_get_active(renderer), -1);
|
!gtk_cell_renderer_toggle_get_active(renderer), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static AccountConfig * _assistant_account_config_copy(
|
||||||
|
AccountConfig const * config)
|
||||||
|
{
|
||||||
|
AccountConfig * ret = NULL;
|
||||||
|
AccountConfig * p;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if(config == NULL)
|
||||||
|
return NULL;
|
||||||
|
for(i = 0;; i++)
|
||||||
|
{
|
||||||
|
if((p = realloc(ret, sizeof(*ret) * (i + 2))) == NULL)
|
||||||
|
{
|
||||||
|
_assistant_account_config_free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret = p;
|
||||||
|
ret[i] = config[i];
|
||||||
|
ret[i + 1].type = ACT_NONE;
|
||||||
|
ret[i + 1].value = NULL;
|
||||||
|
switch(ret[i].type)
|
||||||
|
{
|
||||||
|
case ACT_BOOLEAN:
|
||||||
|
case ACT_NONE:
|
||||||
|
case ACT_SEPARATOR:
|
||||||
|
case ACT_UINT16:
|
||||||
|
break;
|
||||||
|
case ACT_STRING:
|
||||||
|
case ACT_PASSWORD:
|
||||||
|
case ACT_FILE:
|
||||||
|
if(ret[i].value != NULL)
|
||||||
|
{
|
||||||
|
ret[i].value = strdup(ret[i].value);
|
||||||
|
if(ret[i].value == NULL)
|
||||||
|
{
|
||||||
|
_assistant_account_config_free(
|
||||||
|
ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(config[i].type == ACT_NONE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _assistant_account_config_free(AccountConfig * config)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for(i = 0; config[i].type != ACT_NONE; i++)
|
||||||
|
switch(config[i].type)
|
||||||
|
{
|
||||||
|
case ACT_BOOLEAN:
|
||||||
|
case ACT_NONE:
|
||||||
|
case ACT_SEPARATOR:
|
||||||
|
case ACT_UINT16:
|
||||||
|
break;
|
||||||
|
case ACT_STRING:
|
||||||
|
case ACT_PASSWORD:
|
||||||
|
case ACT_FILE:
|
||||||
|
free(config[i].value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free(config);
|
||||||
|
}
|
||||||
|
|
||||||
/* _on_preferences_account_edit */
|
/* _on_preferences_account_edit */
|
||||||
static GtkWidget * _account_edit(Mailer * mailer, Account * account);
|
static GtkWidget * _account_edit(Mailer * mailer, Account * account);
|
||||||
static gboolean _account_edit_on_closex(GtkWidget * widget, GdkEvent * event,
|
static gboolean _account_edit_on_closex(GtkWidget * widget, GdkEvent * event,
|
||||||
|
@ -2878,7 +2961,7 @@ static GtkWidget * _account_edit(Mailer * mailer, Account * account)
|
||||||
_("Account")));
|
_("Account")));
|
||||||
/* settings tab */
|
/* settings tab */
|
||||||
/* FIXME this affects the account directly (eg cancel does not work) */
|
/* FIXME this affects the account directly (eg cancel does not work) */
|
||||||
widget = _assistant_account_config(account_get_config(account));
|
widget = _assistant_account_settings(account_get_config(account));
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), widget, gtk_label_new(
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), widget, gtk_label_new(
|
||||||
_("Settings")));
|
_("Settings")));
|
||||||
gtk_box_pack_start(GTK_BOX(content), notebook, TRUE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(content), notebook, TRUE, TRUE, 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user