comparison src/gtkaccount.c @ 9308:b3bda982996b

[gaim-migrate @ 10116] Yikes. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 19 Jun 2004 04:57:43 +0000
parents 96c481da57ea
children ade6b9c0dc8a
comparison
equal deleted inserted replaced
9307:2138b3a07cb8 9308:b3bda982996b
20 * 20 *
21 * You should have received a copy of the GNU General Public License 21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software 22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */ 24 */
25
25 #include "gtkinternal.h" 26 #include "gtkinternal.h"
26 27
27 #include "account.h" 28 #include "account.h"
28 #include "accountopt.h" 29 #include "accountopt.h"
29 #include "core.h" 30 #include "core.h"
30 #include "debug.h" 31 #include "debug.h"
31 #include "notify.h" 32 #include "notify.h"
32 #include "plugin.h" 33 #include "plugin.h"
33 #include "prefs.h" 34 #include "prefs.h"
35 #include "prpl.h"
34 #include "request.h" 36 #include "request.h"
35 #include "signals.h" 37 #include "signals.h"
36 #include "util.h" 38 #include "util.h"
37 39
38 #include "gaim-disclosure.h" 40 #include "gaim-disclosure.h"
115 /* User Options */ 117 /* User Options */
116 GtkWidget *user_frame; 118 GtkWidget *user_frame;
117 GtkWidget *new_mail_check; 119 GtkWidget *new_mail_check;
118 GtkWidget *buddy_icon_hbox; 120 GtkWidget *buddy_icon_hbox;
119 GtkWidget *buddy_icon_entry; 121 GtkWidget *buddy_icon_entry;
122 char *buddy_icon_path;
120 GtkWidget *buddy_icon_filesel; 123 GtkWidget *buddy_icon_filesel;
121 GtkWidget *buddy_icon_preview; 124 GtkWidget *buddy_icon_preview;
122 GtkWidget *buddy_icon_text; 125 GtkWidget *buddy_icon_text;
123 126
124 /* Protocol Options */ 127 /* Protocol Options */
267 GTK_FILE_SELECTION(dialog->buddy_icon_filesel))) 270 GTK_FILE_SELECTION(dialog->buddy_icon_filesel)))
268 { 271 {
269 return; 272 return;
270 } 273 }
271 274
272 gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), filename); 275 if (dialog->buddy_icon_path)
276 g_free(dialog->buddy_icon_path);
277 dialog->buddy_icon_path = g_strdup(filename);
278 gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry), filename);
273 gtk_widget_destroy(dialog->buddy_icon_filesel); 279 gtk_widget_destroy(dialog->buddy_icon_filesel);
274 } 280 }
275 281
276 static void 282 static void
277 buddy_icon_preview_change_cb(GtkTreeSelection *sel, AccountPrefsDialog *dialog) 283 buddy_icon_preview_change_cb(GtkTreeSelection *sel, AccountPrefsDialog *dialog)
375 } 381 }
376 382
377 static void 383 static void
378 buddy_icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog) 384 buddy_icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog)
379 { 385 {
380 gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), ""); 386 if (dialog->buddy_icon_path)
387 g_free(dialog->buddy_icon_path);
388 dialog->buddy_icon_path = NULL;
389 gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry), "");
390 }
391
392 gboolean str_array_match(char **a, char **b)
393 {
394 int i, j;
395 for (i = 0; a[i] != NULL; i++)
396 for (j = 0; b[j] != NULL; j++)
397 if (!g_ascii_strcasecmp(a[i], b[j]))
398 return TRUE;
399 return FALSE;
400 }
401
402 static void
403 convert_and_set_buddy_icon(GaimAccount *account, const char *path)
404 {
405 int width, height;
406 GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(account->protocol_id));
407 char **prpl_formats = g_strsplit (prpl_info->icon_spec.format,",",0);
408 GdkPixbufFormat *format = gdk_pixbuf_get_file_info (path, &width, &height);
409 char **pixbuf_formats = gdk_pixbuf_format_get_extensions(format);
410
411 if (str_array_match(pixbuf_formats, prpl_formats)) {
412 gaim_account_set_buddy_icon(account, path);
413 } else {
414 int i;
415 GError *error = NULL;
416 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error);
417 GdkPixbuf *scale;
418 char *random = g_strdup_printf("%x", g_random_int());
419 const char *dirname = gaim_buddy_icons_get_cache_dir();
420 char *filename = g_build_filename(dirname, random, NULL);
421 if (prpl_info->icon_spec.width > 0 && prpl_info->icon_spec.height > 0) {
422 scale = gdk_pixbuf_scale_simple (pixbuf, prpl_info->icon_spec.width, prpl_info->icon_spec.height, GDK_INTERP_HYPER);
423 gdk_pixbuf_unref(pixbuf);
424 pixbuf = scale;
425 }
426 if (error) {
427 g_free(filename);
428 g_free(random);
429 gaim_debug_error("buddyicon", "Could not open icon for conversion: %s\n", error->message);
430 return;
431 }
432 for (i = 0; prpl_formats[i]; i++) {
433 gaim_debug_info("buddyicon", "Converting buddy icon to %s as %s\n", prpl_formats[i], filename);
434 if (gdk_pixbuf_save (pixbuf, filename, prpl_formats[i], &error, NULL) == FALSE)
435 break;
436 }
437 if (!error) {
438 gaim_account_set_buddy_icon(account, filename);
439 } else {
440 gaim_debug_error("buddyicon", "Could not convert icon to usable format: %s\n", error->message);
441 }
442 g_free(filename);
443 g_free(random);
444 g_object_unref(pixbuf);
445 }
381 } 446 }
382 447
383 static void 448 static void
384 add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent) 449 add_login_options(AccountPrefsDialog *dialog, GtkWidget *parent)
385 { 450 {
576 641
577 label = gtk_label_new(_("Buddy icon file:")); 642 label = gtk_label_new(_("Buddy icon file:"));
578 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 643 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
579 gtk_widget_show(label); 644 gtk_widget_show(label);
580 645
581 dialog->buddy_icon_entry = gtk_entry_new(); 646 dialog->buddy_icon_entry = gtk_image_new();
582 gtk_editable_set_editable(GTK_EDITABLE(dialog->buddy_icon_entry), FALSE);
583 gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_icon_entry, TRUE, TRUE, 0); 647 gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_icon_entry, TRUE, TRUE, 0);
584 gtk_widget_show(dialog->buddy_icon_entry); 648 gtk_widget_show(dialog->buddy_icon_entry);
585 gaim_set_accessible_label (dialog->buddy_icon_entry, label); 649 gaim_set_accessible_label (dialog->buddy_icon_entry, label);
586 650
587 button = gtk_button_new_with_mnemonic(_("_Browse")); 651 button = gtk_button_new_with_mnemonic(_("_Browse"));
598 662
599 if (dialog->prpl_info != NULL) { 663 if (dialog->prpl_info != NULL) {
600 if (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK)) 664 if (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK))
601 gtk_widget_hide(dialog->new_mail_check); 665 gtk_widget_hide(dialog->new_mail_check);
602 666
603 if (!(dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON)) 667 if (!(dialog->prpl_info->icon_spec.format != NULL))
604 gtk_widget_hide(dialog->buddy_icon_hbox); 668 gtk_widget_hide(dialog->buddy_icon_hbox);
605 } 669 }
606 670
607 if (dialog->account != NULL) { 671 if (dialog->account != NULL) {
608 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->new_mail_check), 672 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->new_mail_check),
609 gaim_account_get_check_mail(dialog->account)); 673 gaim_account_get_check_mail(dialog->account));
610 674
611 if (gaim_account_get_buddy_icon(dialog->account) != NULL) 675 if (gaim_account_get_buddy_icon(dialog->account) != NULL) {
612 gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), 676 dialog->buddy_icon_path = g_strdup(gaim_account_get_buddy_icon(dialog->account));
613 gaim_account_get_buddy_icon(dialog->account)); 677 gtk_image_set_from_file(GTK_IMAGE(dialog->buddy_icon_entry),dialog->buddy_icon_path);
678 }
614 } 679 }
615 680
616 if (!dialog->prpl_info || 681 if (!dialog->prpl_info ||
617 (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) && 682 (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) &&
618 !(dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON))) { 683 (dialog->prpl_info->icon_spec.format == NULL))) {
619 684
620 /* Nothing to see :( aww. */ 685 /* Nothing to see :( aww. */
621 gtk_widget_hide(dialog->user_frame); 686 gtk_widget_hide(dialog->user_frame);
622 } 687 }
623 } 688 }
1097 gaim_account_set_alias(dialog->account, value); 1162 gaim_account_set_alias(dialog->account, value);
1098 else 1163 else
1099 gaim_account_set_alias(dialog->account, NULL); 1164 gaim_account_set_alias(dialog->account, NULL);
1100 1165
1101 /* Buddy Icon */ 1166 /* Buddy Icon */
1102 value = gtk_entry_get_text(GTK_ENTRY(dialog->buddy_icon_entry)); 1167 value = dialog->buddy_icon_path;
1103 1168
1104 if (dialog->prpl_info && 1169 if (dialog->prpl_info &&
1105 (dialog->prpl_info->options & OPT_PROTO_BUDDY_ICON) && 1170 (dialog->prpl_info->icon_spec.format) &&
1106 *value != '\0') 1171 *value != '\0') {
1107 gaim_account_set_buddy_icon(dialog->account, value); 1172 convert_and_set_buddy_icon(dialog->account, value);
1108 else 1173 } else {
1109 gaim_account_set_buddy_icon(dialog->account, NULL); 1174 gaim_account_set_buddy_icon(dialog->account, NULL);
1110 1175 }
1111 /* Remember Password */ 1176 /* Remember Password */
1112 gaim_account_set_remember_password(dialog->account, 1177 gaim_account_set_remember_password(dialog->account,
1113 gtk_toggle_button_get_active( 1178 gtk_toggle_button_get_active(
1114 GTK_TOGGLE_BUTTON(dialog->remember_pass_check))); 1179 GTK_TOGGLE_BUTTON(dialog->remember_pass_check)));
1115 1180