pidgin/gtkconv.c

changeset 39932
1788230a5ef3
parent 39918
1c8e11f9274f
parent 39930
411f3df51bcd
child 39945
a463a1d03965
equal deleted inserted replaced
39927:691b13b22239 39932:1788230a5ef3
2233 2233
2234 static void 2234 static void
2235 custom_icon_sel_cb(const char *filename, gpointer data) 2235 custom_icon_sel_cb(const char *filename, gpointer data)
2236 { 2236 {
2237 if (filename) { 2237 if (filename) {
2238 const gchar *name; 2238 PurpleContact *contact = data;
2239 PurpleBuddy *buddy;
2240 PurpleContact *contact;
2241 PidginConversation *gtkconv = data;
2242 PurpleConversation *conv = gtkconv->active_conv;
2243 PurpleAccount *account = purple_conversation_get_account(conv);
2244
2245 name = purple_conversation_get_name(conv);
2246 buddy = purple_blist_find_buddy(account, name);
2247 if (!buddy) {
2248 purple_debug_info("custom-icon", "You can only set custom icons for people on your buddylist.\n");
2249 return;
2250 }
2251 contact = purple_buddy_get_contact(buddy);
2252 2239
2253 purple_buddy_icons_node_set_custom_icon_from_file((PurpleBlistNode*)contact, filename); 2240 purple_buddy_icons_node_set_custom_icon_from_file((PurpleBlistNode*)contact, filename);
2254 } 2241 }
2255 } 2242 g_object_set_data(G_OBJECT(data), "buddy-icon-chooser", NULL);
2256 2243 }
2257 static void 2244
2258 set_custom_icon_cb(GtkWidget *widget, PidginConversation *gtkconv) 2245 static void
2259 { 2246 set_custom_icon_cb(GtkWidget *widget, PurpleContact *contact)
2260 GtkWidget *win = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtkconv->win->window), 2247 {
2261 custom_icon_sel_cb, gtkconv); 2248 GtkFileChooserNative *win = NULL;
2262 gtk_widget_show_all(win); 2249
2250 /* Should not happen as menu item should be disabled. */
2251 g_return_if_fail(contact != NULL);
2252
2253 win = g_object_get_data(G_OBJECT(contact), "buddy-icon-chooser");
2254 if (win == NULL) {
2255 GtkMenu *menu = GTK_MENU(gtk_widget_get_parent(widget));
2256 GtkWidget *toplevel =
2257 gtk_widget_get_toplevel(gtk_menu_get_attach_widget(menu));
2258 win = pidgin_buddy_icon_chooser_new(GTK_WINDOW(toplevel),
2259 custom_icon_sel_cb, contact);
2260 g_object_set_data_full(G_OBJECT(contact), "buddy-icon-chooser", win,
2261 (GDestroyNotify)g_object_unref);
2262 }
2263 gtk_native_dialog_show(GTK_NATIVE_DIALOG(win));
2263 } 2264 }
2264 2265
2265 static void 2266 static void
2266 change_size_cb(GtkWidget *widget, PidginConversation *gtkconv) 2267 change_size_cb(GtkWidget *widget, PidginConversation *gtkconv)
2267 { 2268 {
2352 } 2353 }
2353 2354
2354 static gboolean 2355 static gboolean
2355 icon_menu(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) 2356 icon_menu(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv)
2356 { 2357 {
2357 static GtkWidget *menu = NULL; 2358 GtkWidget *menu = NULL;
2359 GList *old_menus = NULL;
2358 PurpleConversation *conv; 2360 PurpleConversation *conv;
2359 PurpleBuddy *buddy; 2361 PurpleBuddy *buddy;
2360 2362
2361 if (e->button == GDK_BUTTON_PRIMARY && e->type == GDK_BUTTON_PRESS) { 2363 if (e->button == GDK_BUTTON_PRIMARY && e->type == GDK_BUTTON_PRESS) {
2362 change_size_cb(NULL, gtkconv); 2364 change_size_cb(NULL, gtkconv);
2369 2371
2370 /* 2372 /*
2371 * If a menu already exists, destroy it before creating a new one, 2373 * If a menu already exists, destroy it before creating a new one,
2372 * thus freeing-up the memory it occupied. 2374 * thus freeing-up the memory it occupied.
2373 */ 2375 */
2374 if (menu != NULL) 2376 while ((old_menus = gtk_menu_get_for_attach_widget(widget)) != NULL) {
2377 menu = old_menus->data;
2378 gtk_menu_detach(GTK_MENU(menu));
2375 gtk_widget_destroy(menu); 2379 gtk_widget_destroy(menu);
2380 }
2376 2381
2377 menu = gtk_menu_new(); 2382 menu = gtk_menu_new();
2383 gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL);
2378 2384
2379 if (gtkconv->u.im->anim && 2385 if (gtkconv->u.im->anim &&
2380 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) 2386 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)))
2381 { 2387 {
2382 pidgin_new_check_item(menu, _("Animate"), 2388 pidgin_new_check_item(menu, _("Animate"),
2383 G_CALLBACK(toggle_icon_animate_cb), gtkconv, 2389 G_CALLBACK(toggle_icon_animate_cb), gtkconv,
2384 gtkconv->u.im->icon_timer); 2390 gtkconv->u.im->icon_timer);
2385 } 2391 }
2386 2392
2393 conv = gtkconv->active_conv;
2394 buddy = purple_blist_find_buddy(purple_conversation_get_account(conv),
2395 purple_conversation_get_name(conv));
2396
2387 pidgin_new_menu_item(menu, _("Hide Icon"), NULL, 2397 pidgin_new_menu_item(menu, _("Hide Icon"), NULL,
2388 G_CALLBACK(remove_icon), gtkconv); 2398 G_CALLBACK(remove_icon), gtkconv);
2389 2399
2390 pidgin_new_menu_item(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS, 2400 pidgin_new_menu_item(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS,
2391 G_CALLBACK(icon_menu_save_cb), gtkconv); 2401 G_CALLBACK(icon_menu_save_cb), gtkconv);
2392 2402
2393 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL, 2403 if (buddy) {
2394 G_CALLBACK(set_custom_icon_cb), gtkconv); 2404 PurpleContact *contact = purple_buddy_get_contact(buddy);
2405 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL,
2406 G_CALLBACK(set_custom_icon_cb), contact);
2407 } else {
2408 GtkWidget *item =
2409 pidgin_new_menu_item(menu, _("Set Custom Icon..."), NULL,
2410 G_CALLBACK(set_custom_icon_cb), NULL);
2411 gtk_widget_set_sensitive(item, FALSE);
2412 }
2395 2413
2396 pidgin_new_menu_item(menu, _("Change Size"), NULL, 2414 pidgin_new_menu_item(menu, _("Change Size"), NULL,
2397 G_CALLBACK(change_size_cb), gtkconv); 2415 G_CALLBACK(change_size_cb), gtkconv);
2398 2416
2399 /* Is there a custom icon for this person? */ 2417 /* Is there a custom icon for this person? */
2400 conv = gtkconv->active_conv;
2401 buddy = purple_blist_find_buddy(purple_conversation_get_account(conv),
2402 purple_conversation_get_name(conv));
2403 if (buddy) 2418 if (buddy)
2404 { 2419 {
2405 PurpleContact *contact = purple_buddy_get_contact(buddy); 2420 PurpleContact *contact = purple_buddy_get_contact(buddy);
2406 if (contact && purple_buddy_icons_node_has_custom_icon((PurpleBlistNode*)contact)) 2421 if (contact && purple_buddy_icons_node_has_custom_icon((PurpleBlistNode*)contact))
2407 { 2422 {

mercurial