Mercurial > pidgin.yaz
comparison pidgin/gtkaccount.c @ 16390:4fc51a87ce42
Updates for the account buddy icon stuff. This doesn't yet work fully (and maybe not even partly), but it compiles.
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 25 Apr 2007 21:48:56 +0000 |
parents | 72dc611f3257 |
children | 24bbd7e46bfe |
comparison
equal
deleted
inserted
replaced
16389:493ca924c199 | 16390:4fc51a87ce42 |
---|---|
120 GtkWidget *icon_check; | 120 GtkWidget *icon_check; |
121 GtkWidget *icon_entry; | 121 GtkWidget *icon_entry; |
122 GtkWidget *icon_filesel; | 122 GtkWidget *icon_filesel; |
123 GtkWidget *icon_preview; | 123 GtkWidget *icon_preview; |
124 GtkWidget *icon_text; | 124 GtkWidget *icon_text; |
125 char *cached_icon_path; | 125 PurpleStoredImage *icon_img; |
126 char *icon_path; | |
127 | 126 |
128 /* Protocol Options */ | 127 /* Protocol Options */ |
129 GtkWidget *protocol_frame; | 128 GtkWidget *protocol_frame; |
130 | 129 |
131 /* Proxy Options */ | 130 /* Proxy Options */ |
193 | 192 |
194 return hbox; | 193 return hbox; |
195 } | 194 } |
196 | 195 |
197 static void | 196 static void |
198 set_dialog_icon(AccountPrefsDialog *dialog, gchar *new_cached_icon_path, gchar *new_icon_path) | 197 set_dialog_icon(AccountPrefsDialog *dialog, gpointer *data, size_t len, gchar *new_icon_path) |
199 { | 198 { |
200 char *filename; | |
201 GdkPixbuf *pixbuf = NULL; | 199 GdkPixbuf *pixbuf = NULL; |
202 | 200 |
203 g_free(dialog->cached_icon_path); | 201 purple_imgstore_unref(dialog->icon_img); |
204 g_free(dialog->icon_path); | 202 if (data != NULL && len > 0) |
205 dialog->cached_icon_path = new_cached_icon_path; | 203 dialog->icon_img = purple_imgstore_add(data, len, new_icon_path); |
206 dialog->icon_path = new_icon_path; | 204 g_free(data); |
207 | 205 |
208 filename = purple_buddy_icons_get_full_path(dialog->cached_icon_path); | 206 if (dialog->icon_img != NULL) { |
209 if (filename != NULL) { | 207 GdkPixbufLoader *loader = gdk_pixbuf_loader_new(); |
210 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | 208 gdk_pixbuf_loader_write(loader, purple_imgstore_get_data(dialog->icon_img), |
211 g_free(filename); | 209 purple_imgstore_get_size(dialog->icon_img), NULL); |
210 gdk_pixbuf_loader_close(loader, NULL); | |
211 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); | |
212 } | 212 } |
213 | 213 |
214 if (pixbuf && dialog->prpl_info && | 214 if (pixbuf && dialog->prpl_info && |
215 (dialog->prpl_info->icon_spec.scale_rules & PURPLE_ICON_SCALE_DISPLAY)) | 215 (dialog->prpl_info->icon_spec.scale_rules & PURPLE_ICON_SCALE_DISPLAY)) |
216 { | 216 { |
296 } | 296 } |
297 | 297 |
298 static void | 298 static void |
299 icon_filesel_choose_cb(const char *filename, gpointer data) | 299 icon_filesel_choose_cb(const char *filename, gpointer data) |
300 { | 300 { |
301 AccountPrefsDialog *dialog; | 301 AccountPrefsDialog *dialog = data; |
302 | 302 |
303 dialog = data; | |
304 | |
305 #if 0 | |
306 if (filename != NULL) | 303 if (filename != NULL) |
307 set_dialog_icon(dialog, pidgin_convert_buddy_icon(dialog->plugin, filename), g_strdup(filename)); | 304 { |
308 #endif | 305 size_t len; |
306 gpointer data = pidgin_convert_buddy_icon(dialog->plugin, filename, &len); | |
307 set_dialog_icon(dialog, data, len, g_strdup(filename)); | |
308 } | |
309 | 309 |
310 dialog->icon_filesel = NULL; | 310 dialog->icon_filesel = NULL; |
311 } | 311 } |
312 | 312 |
313 static void | 313 static void |
318 } | 318 } |
319 | 319 |
320 static void | 320 static void |
321 icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog) | 321 icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog) |
322 { | 322 { |
323 set_dialog_icon(dialog, NULL, NULL); | 323 set_dialog_icon(dialog, NULL, 0, NULL); |
324 } | 324 } |
325 | 325 |
326 static void | 326 static void |
327 account_dnd_recv(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, | 327 account_dnd_recv(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, |
328 GtkSelectionData *sd, guint info, guint t, AccountPrefsDialog *dialog) | 328 GtkSelectionData *sd, guint info, guint t, AccountPrefsDialog *dialog) |
333 /* Well, it looks like the drag event was cool. | 333 /* Well, it looks like the drag event was cool. |
334 * Let's do something with it */ | 334 * Let's do something with it */ |
335 if (!g_ascii_strncasecmp(name, "file://", 7)) { | 335 if (!g_ascii_strncasecmp(name, "file://", 7)) { |
336 GError *converr = NULL; | 336 GError *converr = NULL; |
337 gchar *tmp, *rtmp; | 337 gchar *tmp, *rtmp; |
338 gpointer data; | |
339 size_t len; | |
340 | |
338 /* It looks like we're dealing with a local file. */ | 341 /* It looks like we're dealing with a local file. */ |
339 if(!(tmp = g_filename_from_uri(name, NULL, &converr))) { | 342 if(!(tmp = g_filename_from_uri(name, NULL, &converr))) { |
340 purple_debug(PURPLE_DEBUG_ERROR, "buddyicon", "%s\n", | 343 purple_debug(PURPLE_DEBUG_ERROR, "buddyicon", "%s\n", |
341 (converr ? converr->message : | 344 (converr ? converr->message : |
342 "g_filename_from_uri error")); | 345 "g_filename_from_uri error")); |
343 return; | 346 return; |
344 } | 347 } |
345 if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n'))) | 348 if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n'))) |
346 *rtmp = '\0'; | 349 *rtmp = '\0'; |
347 #if 0 | 350 |
348 set_dialog_icon(dialog, pidgin_convert_buddy_icon(dialog->plugin, tmp), g_strdup(tmp)); | 351 data = pidgin_convert_buddy_icon(dialog->plugin, tmp, &len); |
349 #endif | 352 /* This takes ownership of tmp */ |
350 g_free(tmp); | 353 set_dialog_icon(dialog, data, len, tmp); |
351 } | 354 } |
352 gtk_drag_finish(dc, TRUE, FALSE, t); | 355 gtk_drag_finish(dc, TRUE, FALSE, t); |
353 } | 356 } |
354 gtk_drag_finish(dc, FALSE, FALSE, t); | 357 gtk_drag_finish(dc, FALSE, FALSE, t); |
355 } | 358 } |
593 dialog->icon_entry = gtk_image_new(); | 596 dialog->icon_entry = gtk_image_new(); |
594 gtk_container_add(GTK_CONTAINER(button), dialog->icon_entry); | 597 gtk_container_add(GTK_CONTAINER(button), dialog->icon_entry); |
595 gtk_widget_show(dialog->icon_entry); | 598 gtk_widget_show(dialog->icon_entry); |
596 /* TODO: Uh, isn't this next line pretty useless? */ | 599 /* TODO: Uh, isn't this next line pretty useless? */ |
597 pidgin_set_accessible_label (dialog->icon_entry, label); | 600 pidgin_set_accessible_label (dialog->icon_entry, label); |
598 dialog->cached_icon_path = NULL; | 601 purple_imgstore_unref(dialog->icon_img); |
599 dialog->icon_path = NULL; | 602 dialog->icon_img = NULL; |
600 | 603 |
601 vbox2 = gtk_vbox_new(FALSE, 0); | 604 vbox2 = gtk_vbox_new(FALSE, 0); |
602 gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); | 605 gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); |
603 gtk_widget_show(vbox2); | 606 gtk_widget_show(vbox2); |
604 | 607 |
619 if (dialog->prpl_info->icon_spec.format == NULL) | 622 if (dialog->prpl_info->icon_spec.format == NULL) |
620 gtk_widget_hide(dialog->icon_hbox); | 623 gtk_widget_hide(dialog->icon_hbox); |
621 } | 624 } |
622 | 625 |
623 if (dialog->account != NULL) { | 626 if (dialog->account != NULL) { |
627 PurpleStoredImage *img; | |
628 gpointer data = NULL; | |
629 size_t len = 0; | |
630 | |
624 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->new_mail_check), | 631 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->new_mail_check), |
625 purple_account_get_check_mail(dialog->account)); | 632 purple_account_get_check_mail(dialog->account)); |
626 | 633 |
627 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->icon_check), | 634 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->icon_check), |
628 !purple_account_get_bool(dialog->account, "use-global-buddyicon", | 635 !purple_account_get_bool(dialog->account, "use-global-buddyicon", |
629 TRUE)); | 636 TRUE)); |
630 set_dialog_icon(dialog, | 637 |
631 g_strdup(purple_account_get_ui_string(dialog->account, | 638 img = purple_buddy_icons_find_account_icon(dialog->account); |
632 PIDGIN_UI, "non-global-buddyicon-cached-path", NULL)), | 639 if (img) |
633 g_strdup(purple_account_get_ui_string(dialog->account, | 640 { |
634 PIDGIN_UI, "non-global-buddyicon-path", NULL))); | 641 len = purple_imgstore_get_size(img); |
642 data = g_memdup(purple_imgstore_get_data(img), len); | |
643 } | |
644 set_dialog_icon(dialog, data, len, | |
645 g_strdup(purple_account_get_buddy_icon_path(dialog->account))); | |
635 } else { | 646 } else { |
636 set_dialog_icon(dialog, NULL, NULL); | 647 set_dialog_icon(dialog, NULL, 0, NULL); |
637 } | 648 } |
638 | 649 |
639 if (!dialog->prpl_info || | 650 if (!dialog->prpl_info || |
640 (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) && | 651 (!(dialog->prpl_info->options & OPT_PROTO_MAIL_CHECK) && |
641 (dialog->prpl_info->icon_spec.format == NULL))) { | 652 (dialog->prpl_info->icon_spec.format == NULL))) { |
1074 | 1085 |
1075 g_list_free(dialog->user_split_entries); | 1086 g_list_free(dialog->user_split_entries); |
1076 g_list_free(dialog->protocol_opt_entries); | 1087 g_list_free(dialog->protocol_opt_entries); |
1077 g_free(dialog->protocol_id); | 1088 g_free(dialog->protocol_id); |
1078 | 1089 |
1079 if (dialog->cached_icon_path != NULL) | 1090 purple_imgstore_unref(dialog->icon_img); |
1080 { | |
1081 const char *icon = purple_account_get_ui_string(dialog->account, PIDGIN_UI, "non-global-buddyicon-cached-path", NULL); | |
1082 if (dialog->cached_icon_path != NULL && (icon == NULL || strcmp(dialog->cached_icon_path, icon))) | |
1083 { | |
1084 /* The user set an icon, which would've been cached by convert_buddy_icon, | |
1085 * but didn't save the changes. Delete the cache file. */ | |
1086 char *filename = g_build_filename(purple_buddy_icons_get_cache_dir(), dialog->cached_icon_path, NULL); | |
1087 g_unlink(filename); | |
1088 g_free(filename); | |
1089 } | |
1090 | |
1091 g_free(dialog->cached_icon_path); | |
1092 } | |
1093 | |
1094 g_free(dialog->icon_path); | |
1095 | 1091 |
1096 if (dialog->icon_filesel) | 1092 if (dialog->icon_filesel) |
1097 gtk_widget_destroy(dialog->icon_filesel); | 1093 gtk_widget_destroy(dialog->icon_filesel); |
1098 | 1094 |
1099 purple_signals_disconnect_by_handle(dialog); | 1095 purple_signals_disconnect_by_handle(dialog); |
1145 | 1141 |
1146 /* Buddy Icon */ | 1142 /* Buddy Icon */ |
1147 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(dialog->plugin); | 1143 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(dialog->plugin); |
1148 if (prpl_info != NULL && prpl_info->icon_spec.format != NULL) | 1144 if (prpl_info != NULL && prpl_info->icon_spec.format != NULL) |
1149 { | 1145 { |
1146 const char *filename; | |
1147 | |
1150 if (new || purple_account_get_bool(account, "use-global-buddyicon", TRUE) == | 1148 if (new || purple_account_get_bool(account, "use-global-buddyicon", TRUE) == |
1151 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) | 1149 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) |
1152 { | 1150 { |
1153 icon_change = TRUE; | 1151 icon_change = TRUE; |
1154 } | 1152 } |
1155 purple_account_set_bool(account, "use-global-buddyicon", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); | 1153 purple_account_set_bool(account, "use-global-buddyicon", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))); |
1156 purple_account_set_ui_string(account, PIDGIN_UI, "non-global-buddyicon-cached-path", dialog->cached_icon_path); | 1154 |
1157 purple_account_set_ui_string(account, PIDGIN_UI, "non-global-buddyicon-path", dialog->icon_path); | |
1158 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) | 1155 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check))) |
1159 { | 1156 { |
1160 purple_account_set_buddy_icon_path(account, dialog->icon_path); | 1157 if (dialog->icon_img) |
1161 purple_account_set_buddy_icon(account, dialog->cached_icon_path); | 1158 { |
1159 size_t len = purple_imgstore_get_size(dialog->icon_img); | |
1160 purple_buddy_icons_set_account_icon(account, | |
1161 g_memdup(purple_imgstore_get_data(dialog->icon_img), len), | |
1162 len); | |
1163 purple_account_set_buddy_icon_path(account, purple_imgstore_get_filename(dialog->icon_img)); | |
1164 } | |
1165 else | |
1166 { | |
1167 purple_buddy_icons_set_account_icon(account, NULL, 0); | |
1168 purple_account_set_buddy_icon_path(account, NULL); | |
1169 } | |
1162 } | 1170 } |
1163 else if (purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon") && icon_change) | 1171 else if ((filename = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon")) && icon_change) |
1164 { | 1172 { |
1165 const char *filename = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon"); | 1173 size_t len; |
1166 #if 0 | 1174 gpointer data = pidgin_convert_buddy_icon(dialog->plugin, filename, &len); |
1167 char *icon = pidgin_convert_buddy_icon(dialog->plugin, filename); | |
1168 purple_account_set_buddy_icon_path(account, filename); | 1175 purple_account_set_buddy_icon_path(account, filename); |
1169 purple_account_set_buddy_icon(account, icon); | 1176 purple_buddy_icons_set_account_icon(account, data, len); |
1170 g_free(icon); | |
1171 #endif | |
1172 } | 1177 } |
1173 } | 1178 } |
1174 | 1179 |
1175 | 1180 |
1176 /* Remember Password */ | 1181 /* Remember Password */ |
1979 | 1984 |
1980 static void | 1985 static void |
1981 set_account(GtkListStore *store, GtkTreeIter *iter, PurpleAccount *account, GdkPixbuf *global_buddyicon) | 1986 set_account(GtkListStore *store, GtkTreeIter *iter, PurpleAccount *account, GdkPixbuf *global_buddyicon) |
1982 { | 1987 { |
1983 GdkPixbuf *pixbuf, *buddyicon = NULL; | 1988 GdkPixbuf *pixbuf, *buddyicon = NULL; |
1984 const char *path = NULL; | 1989 PurpleStoredImage *img = NULL; |
1985 | 1990 |
1986 pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); | 1991 pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_MEDIUM); |
1987 if ((pixbuf != NULL) && purple_account_is_disconnected(account)) | 1992 if ((pixbuf != NULL) && purple_account_is_disconnected(account)) |
1988 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); | 1993 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); |
1989 | 1994 |
1990 if (purple_account_get_bool(account, "use-global-buddyicon", TRUE)) { | 1995 if (purple_account_get_bool(account, "use-global-buddyicon", TRUE)) { |
1991 if (global_buddyicon != NULL) | 1996 if (global_buddyicon != NULL) |
1992 buddyicon = g_object_ref(G_OBJECT(global_buddyicon)); | 1997 buddyicon = g_object_ref(G_OBJECT(global_buddyicon)); |
1993 /* This is for when set_account() is called for a single account */ | 1998 /* This is for when set_account() is called for a single account */ |
1994 else | 1999 else |
1995 path = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/accounts/buddyicon"); | 2000 img = purple_buddy_icons_find_account_icon(account); |
1996 } else | 2001 } else { |
1997 path = purple_account_get_ui_string(account, PIDGIN_UI, "non-global-buddyicon-path", NULL); | 2002 img = purple_buddy_icons_find_account_icon(account); |
1998 | 2003 } |
1999 if (path != NULL) { | 2004 |
2000 GdkPixbuf *buddyicon_pixbuf = gdk_pixbuf_new_from_file(path, NULL); | 2005 if (img != NULL) { |
2006 GdkPixbufLoader *loader = gdk_pixbuf_loader_new(); | |
2007 GdkPixbuf *buddyicon_pixbuf; | |
2008 | |
2009 gdk_pixbuf_loader_write(loader, purple_imgstore_get_data(img), | |
2010 purple_imgstore_get_size(img), NULL); | |
2011 gdk_pixbuf_loader_close(loader, NULL); | |
2012 buddyicon_pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); | |
2013 | |
2014 purple_imgstore_unref(img); | |
2015 | |
2001 if (buddyicon_pixbuf != NULL) { | 2016 if (buddyicon_pixbuf != NULL) { |
2002 buddyicon = gdk_pixbuf_scale_simple(buddyicon_pixbuf, 22, 22, GDK_INTERP_HYPER); | 2017 buddyicon = gdk_pixbuf_scale_simple(buddyicon_pixbuf, 22, 22, GDK_INTERP_HYPER); |
2003 g_object_unref(G_OBJECT(buddyicon_pixbuf)); | 2018 g_object_unref(G_OBJECT(buddyicon_pixbuf)); |
2004 } | 2019 } |
2005 } | 2020 } |