Mercurial > pidgin
diff src/away.c @ 9730:c9ac1976ef01
[gaim-migrate @ 10591]
I shuffled lots of stuff around again.
See plugins/ChangeLog.API for the list of renamed functions.
I'm trying to clean up gtkdialogs.c/.h, so I moved the away stuff
into away.c/.h
I also reduced the minimum buddy list height from 200 pixels to
100 pixels. I just realized that that's also the default height
used when you don't have a prefs.xml, which is bad. I think I'm
going to set the default height to around 300 pixels.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Mon, 09 Aug 2004 03:49:46 +0000 |
| parents | 4d05b6e9e9cd |
| children | 4a15962c344a |
line wrap: on
line diff
--- a/src/away.c Sun Aug 08 19:01:42 2004 +0000 +++ b/src/away.c Mon Aug 09 03:49:46 2004 +0000 @@ -21,9 +21,11 @@ * */ #include "internal.h" +#include "gtkinternal.h" #include "conversation.h" #include "debug.h" +#include "notify.h" #include "plugin.h" #include "prefs.h" #include "prpl.h" @@ -32,11 +34,12 @@ #include "request.h" /* XXX CORE/UI: Until we can get rid of the message queue stuff... */ +#include "away.h" #include "gaim.h" -#include "gtkinternal.h" #include "gtkblist.h" #include "gtkdialogs.h" #include "gtkimhtml.h" +#include "gtkimhtmltoolbar.h" #include "gtkprefs.h" #include "gtkutils.h" @@ -668,3 +671,242 @@ gtk_widget_show(prefs_away_menu); } } + +/*------------------------------------------------------------------------*/ +/* The dialog for new away messages (from dialogs.c) */ +/*------------------------------------------------------------------------*/ +struct create_away { + GtkWidget *window; + GtkWidget *toolbar; + GtkWidget *entry; + GtkWidget *text; + struct away_message *mess; +}; + +static void +away_mess_destroy(GtkWidget *widget, struct create_away *ca) +{ + gtk_widget_destroy(ca->window); + g_free(ca); +} + +static void +away_mess_destroy_ca(GtkWidget *widget, GdkEvent *event, struct create_away *ca) +{ + away_mess_destroy(NULL, ca); +} + +static gint +sort_awaymsg_list(gconstpointer a, gconstpointer b) +{ + struct away_message *msg_a; + struct away_message *msg_b; + + msg_a = (struct away_message *)a; + msg_b = (struct away_message *)b; + + return (strcmp(msg_a->name, msg_b->name)); +} + +static struct +away_message *save_away_message(struct create_away *ca) +{ + struct away_message *am; + gchar *away_message; + + if (!ca->mess) + am = g_new0(struct away_message, 1); + else { + am = ca->mess; + } + + g_snprintf(am->name, sizeof(am->name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); + away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text)); + + g_snprintf(am->message, sizeof(am->message), "%s", away_message); + g_free(away_message); + + if (!ca->mess) + away_messages = g_slist_insert_sorted(away_messages, am, sort_awaymsg_list); + + do_away_menu(NULL); + gaim_status_sync(); + + return am; +} + +int +check_away_mess(struct create_away *ca, int type) +{ + gchar *msg; + if ((strlen(gtk_entry_get_text(GTK_ENTRY(ca->entry))) == 0) && (type == 1)) { + /* We shouldn't allow a blank title */ + gaim_notify_error(NULL, NULL, + _("You cannot save an away message with a " + "blank title"), + _("Please give the message a title, or choose " + "\"Use\" to use without saving.")); + return 0; + } + + msg = gtk_imhtml_get_text(GTK_IMHTML(ca->text), NULL, NULL); + + if ((type <= 1) && ((msg == NULL) || (*msg == '\0'))) { + /* We shouldn't allow a blank message */ + gaim_notify_error(NULL, NULL, + _("You cannot create an empty away message"), NULL); + return 0; + } + + g_free(msg); + + return 1; +} + +void +save_away_mess(GtkWidget *widget, struct create_away *ca) +{ + if (!check_away_mess(ca, 1)) + return; + + save_away_message(ca); + + away_mess_destroy(NULL, ca); +} + +void +use_away_mess(GtkWidget *widget, struct create_away *ca) +{ + static struct away_message am; + gchar *away_message; + + if (!check_away_mess(ca, 0)) + return; + + g_snprintf(am.name, sizeof(am.name), "%s", gtk_entry_get_text(GTK_ENTRY(ca->entry))); + away_message = gtk_imhtml_get_markup(GTK_IMHTML(ca->text)); + + g_snprintf(am.message, sizeof(am.message), "%s", away_message); + g_free(away_message); + + do_away_message(NULL, &am); + + away_mess_destroy(NULL, ca); +} + +void +su_away_mess(GtkWidget *widget, struct create_away *ca) +{ + if (!check_away_mess(ca, 1)) + return; + + do_away_message(NULL, save_away_message(ca)); + + away_mess_destroy(NULL, ca); +} + +void +create_away_mess(GtkWidget *widget, void *dummy) +{ + GtkWidget *vbox, *hbox; + GtkWidget *label; + GtkWidget *sw; + GtkWidget *button; + GList *focus_chain = NULL; + struct create_away *ca = g_new0(struct create_away, 1); + + /* Set up window */ + GAIM_DIALOG(ca->window); + gtk_widget_set_size_request(ca->window, -1, 250); + gtk_window_set_role(GTK_WINDOW(ca->window), "away_mess"); + gtk_window_set_title(GTK_WINDOW(ca->window), _("New away message")); + g_signal_connect(G_OBJECT(ca->window), "delete_event", + G_CALLBACK(away_mess_destroy_ca), ca); + + hbox = gtk_hbox_new(FALSE, 12); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 12); + gtk_container_add(GTK_CONTAINER(ca->window), hbox); + + vbox = gtk_vbox_new(FALSE, 12); + gtk_container_add(GTK_CONTAINER(hbox), vbox); + + /* Away message title */ + hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(_("Away title: ")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + ca->entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), ca->entry, TRUE, TRUE, 0); + gaim_set_accessible_label (ca->entry, label); + focus_chain = g_list_append(focus_chain, hbox); + + /* Toolbar */ + ca->toolbar = gtk_imhtmltoolbar_new(); + gtk_box_pack_start(GTK_BOX(vbox), ca->toolbar, FALSE, FALSE, 0); + + /* Away message text */ + sw = gtk_scrolled_window_new(NULL, NULL); + 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(vbox), sw, TRUE, TRUE, 0); + + ca->text = gtk_imhtml_new(NULL, NULL); + gtk_imhtml_set_editable(GTK_IMHTML(ca->text), TRUE); + gtk_imhtml_set_format_functions(GTK_IMHTML(ca->text), GTK_IMHTML_ALL ^ GTK_IMHTML_IMAGE); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(ca->text), GTK_WRAP_WORD_CHAR); + + gtk_imhtml_smiley_shortcuts(GTK_IMHTML(ca->text), + gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")); + gtk_imhtml_html_shortcuts(GTK_IMHTML(ca->text), + gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")); + if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) + gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(ca->text)); + gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(ca->toolbar), ca->text); + gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(ca->toolbar), "default"); + gaim_setup_imhtml(ca->text); + + gtk_container_add(GTK_CONTAINER(sw), ca->text); + focus_chain = g_list_append(focus_chain, sw); + + if (dummy) { + struct away_message *amt; + GtkTreeIter iter; + GtkListStore *ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dummy))); + GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(dummy)); + GValue val = { 0, }; + + if (! gtk_tree_selection_get_selected (sel, (GtkTreeModel**)&ls, &iter)) + return; + gtk_tree_model_get_value (GTK_TREE_MODEL(ls), &iter, 1, &val); + amt = g_value_get_pointer (&val); + gtk_entry_set_text(GTK_ENTRY(ca->entry), amt->name); + gtk_imhtml_append_text_with_images(GTK_IMHTML(ca->text), amt->message, 0, NULL); + ca->mess = amt; + } + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + button = gaim_pixbuf_button_from_stock(_("_Save"), GTK_STOCK_SAVE, GAIM_BUTTON_HORIZONTAL); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(save_away_mess), ca); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + button = gaim_pixbuf_button_from_stock(_("Sa_ve & Use"), GTK_STOCK_OK, GAIM_BUTTON_HORIZONTAL); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(su_away_mess), ca); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + button = gaim_pixbuf_button_from_stock(_("_Use"), GTK_STOCK_EXECUTE, GAIM_BUTTON_HORIZONTAL); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(use_away_mess), ca); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + + button = gaim_pixbuf_button_from_stock(_("_Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(away_mess_destroy), ca); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + focus_chain = g_list_prepend(focus_chain, hbox); + + gtk_widget_show_all(ca->window); + gtk_container_set_focus_chain(GTK_CONTAINER(vbox), focus_chain); +}
