/* $Id: callbacks.c,v 1.8 2006/10/27 17:40:09 khorben Exp $ */ /* Copyright (c) 2006 The DeforaOS Project */ #include #include #include #include #include "compose.h" #include "mailer.h" #include "callbacks.h" #include "../config.h" /* constants */ static char const * _authors[] = { "Pierre 'khorben' Pronchery", NULL }; /* FIXME */ static char const _license[] = "GPLv2"; /* callbacks */ /* window */ gboolean on_closex(GtkWidget * widget, GdkEvent * event, gpointer data) { gtk_widget_hide(widget); /* FIXME may be composing */ gtk_main_quit(); return FALSE; } /* file menu */ void on_file_new_mail(GtkWidget * widget, gpointer data) { Mailer * mailer = data; compose_new(mailer); } void on_file_quit(GtkWidget * widget, gpointer data) { /* FIXME may be composing */ gtk_main_quit(); } /* edit menu */ static void _preferences_set(Mailer * mailer); static void _preferences_on_ok(GtkWidget * widget, gpointer data); static void _preferences_on_cancel(GtkWidget * widget, gpointer data); void on_edit_preferences(GtkWidget * widget, gpointer data) { Mailer * mailer = data; GtkWidget * notebook; GtkWidget * vbox; GtkWidget * hbox; GtkWidget * vbox2; GtkWidget * vbox3; GtkSizeGroup * group; if(mailer->pr_window != NULL) { gtk_widget_show(mailer->pr_window); return; } mailer->pr_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable(GTK_WINDOW(mailer->pr_window), FALSE); gtk_window_set_title(GTK_WINDOW(mailer->pr_window), "Mailer preferences"); gtk_window_set_transient_for(GTK_WINDOW(mailer->pr_window), GTK_WINDOW( mailer->window)); vbox = gtk_vbox_new(FALSE, 0); notebook = gtk_notebook_new(); /* accounts */ vbox2 = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); widget = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); mailer->pr_accounts = gtk_tree_view_new(); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget), mailer->pr_accounts); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); vbox3 = gtk_vbox_new(FALSE, 0); widget = gtk_button_new_from_stock(GTK_STOCK_NEW); gtk_box_pack_start(GTK_BOX(vbox3), widget, FALSE, TRUE, 0); widget = gtk_button_new_from_stock(GTK_STOCK_EDIT); gtk_box_pack_start(GTK_BOX(vbox3), widget, FALSE, TRUE, 4); widget = gtk_button_new_from_stock(GTK_STOCK_DELETE); gtk_box_pack_start(GTK_BOX(vbox3), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox3, FALSE, TRUE, 4); gtk_box_pack_start(GTK_BOX(vbox2), hbox, TRUE, TRUE, 4); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new( "Accounts")); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 4); /* dialog */ hbox = gtk_hbox_new(FALSE, 0); group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); widget = gtk_button_new_from_stock(GTK_STOCK_OK); gtk_size_group_add_widget(group, widget); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK( _preferences_on_ok), mailer); gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 4); widget = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_size_group_add_widget(group, widget); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK( _preferences_on_cancel), mailer); gtk_box_pack_end(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 4); gtk_container_add(GTK_CONTAINER(mailer->pr_window), vbox); _preferences_set(mailer); gtk_widget_show_all(mailer->pr_window); } static void _preferences_set(Mailer * mailer) { /* FIXME */ } static void _preferences_on_ok(GtkWidget * widget, gpointer data) { Mailer * mailer = data; /* FIXME */ gtk_widget_hide(mailer->pr_window); } static void _preferences_on_cancel(GtkWidget * widget, gpointer data) { Mailer * mailer = data; gtk_widget_hide(mailer->pr_window); _preferences_set(mailer); } /* help menu */ void on_help_about(GtkWidget * widget, gpointer data) { Mailer * mailer = data; static GtkWidget * window = NULL; char const copyright[] = "Copyright (c) 2006 khorben"; #if GTK_CHECK_VERSION(2, 6, 0) gsize cnt = 65536; gchar * buf; if(window != NULL) { gtk_widget_show(window); return; } if((buf = malloc(sizeof(*buf) * cnt)) == NULL) { mailer_error(mailer, "malloc", 0); return; } window = gtk_about_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW( mailer->window)); gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(window), PACKAGE); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window), VERSION); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(window), copyright); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(window), _authors); if(g_file_get_contents("/usr/share/common-licenses/GPL-2", &buf, &cnt, NULL) == TRUE) gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(window), buf); else gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(window), _license); free(buf); gtk_widget_show(window); } #else /* !GTK_CHECK_VERSION(2, 6, 0) */ /* FIXME */ } #endif /* !GTK_CHECK_VERSION(2, 6, 0) */ /* toolbar */ void on_new_mail(GtkWidget * widget, gpointer data) { Mailer * mailer = data; compose_new(mailer); } /* compose window */ gboolean on_compose_closex(GtkWidget * widget, GdkEvent * event, gpointer data) { Compose * c = data; compose_delete(c); return TRUE; } void on_compose_save(GtkWidget * widget, gpointer data) { Compose * c = data; compose_save(c); } void on_compose_send(GtkWidget * widget, gpointer data) { Compose * c = data; compose_send(c); } /* compose file menu */ void on_compose_file_close(GtkWidget * widget, gpointer data) { Compose * c = data; compose_delete(c); } /* compose view menu */ void on_compose_view_cc(GtkWidget * widget, gpointer data) { Compose * c = data; gtk_widget_show(c->tb_cc); } void on_compose_view_bcc(GtkWidget * widget, gpointer data) { Compose * c = data; gtk_widget_show(c->tb_bcc); } void on_compose_help_about(GtkWidget * widget, gpointer data) { Compose * c = data; on_help_about(widget, c->mailer); } /* send mail */ gboolean on_send_closex(GtkWidget * widget, GdkEvent * event, gpointer data) { Compose * c = data; on_send_cancel(widget, c); return FALSE; } void on_send_cancel(GtkWidget * widget, gpointer data) { Compose * c = data; g_io_channel_shutdown(c->channel, TRUE, NULL); gtk_widget_destroy(c->snd_window); free(c->buf); } gboolean on_send_write(GIOChannel * source, GIOCondition condition, gpointer data) { Compose * c = data; gsize i; if((i = (c->buf_len - c->buf_pos) % 512) == 0) i = 512; if(g_io_channel_write_chars(source, &c->buf[c->buf_pos], i, &i, NULL) != G_IO_STATUS_NORMAL) { mailer_error(c->mailer, strerror(errno), FALSE); on_send_cancel(c->snd_window, c); return FALSE; } c->buf_pos+=i; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(c->snd_progress), c->buf_pos / c->buf_len); if(c->buf_pos >= c->buf_len) { on_send_cancel(c->snd_window, c); compose_delete(c); return FALSE; } return TRUE; }