# HG changeset patch # User Eric Warmenhoven # Date 1003031680 0 # Node ID 933e139fd0d3449cc53702d8759428eceb934aa9 # Parent bd66482296f9372cad864d7dc08ede715ca643c1 [gaim-migrate @ 2512] buddy icons are very leaky committer: Tailor Script diff -r bd66482296f9 -r 933e139fd0d3 ChangeLog --- a/ChangeLog Sat Oct 13 19:00:48 2001 +0000 +++ b/ChangeLog Sun Oct 14 03:54:40 2001 +0000 @@ -7,6 +7,9 @@ * Better applet icon drawing (thanks to Ari Pollak) * An extraordinary number of bug fixes * Updated Korean translation + * Ability to stop animation on buddy icons, hide certain + buddy icons, and save people's buddy icons, all through + a right-click menu version 0.45 (10/04/2001): * New plugin event: event_chat_send_invite diff -r bd66482296f9 -r 933e139fd0d3 src/conversation.c --- a/src/conversation.c Sat Oct 13 19:00:48 2001 +0000 +++ b/src/conversation.c Sun Oct 14 03:54:40 2001 +0000 @@ -251,6 +251,8 @@ gtk_widget_destroy(c->link_dialog); if (c->log_dialog) gtk_widget_destroy(c->log_dialog); + if (c->save_icon) + gtk_widget_destroy(c->save_icon); g_string_free(c->history, TRUE); g_free(c); } @@ -2658,13 +2660,113 @@ return FALSE; } + +static void stop_anim(GtkObject *obj, struct conversation *c) +{ + if (c->icon_timer) + gtk_timeout_remove(c->icon_timer); + c->icon_timer = 0; +} + +static int des_save_icon(GtkObject *obj, GdkEvent *e, struct conversation *c) +{ + gtk_widget_destroy(c->save_icon); + c->save_icon = NULL; + return TRUE; +} + +static void do_save_icon(GtkObject *obj, struct conversation *c) +{ + FILE *file; + char *f = gtk_file_selection_get_filename(GTK_FILE_SELECTION(c->save_icon)); + if (file_is_dir(f, c->save_icon)) + return; + + file = fopen(f, "w"); + if (file) { + int len; + void *data = get_icon_data(c->gc, normalize(c->name), &len); + if (data) + fwrite(data, 1, len, file); + fclose(file); + } else { + do_error_dialog("Can't open file for writing", "Error"); + } + + gtk_widget_destroy(c->save_icon); + c->save_icon = NULL; +} + +static void cancel_save_icon(GtkObject *obj, struct conversation *c) +{ + gtk_widget_destroy(c->save_icon); + c->save_icon = NULL; +} + +static void save_icon(GtkObject *obj, struct conversation *c) +{ + char buf[BUF_LEN]; + + if (c->save_icon) { + gdk_window_raise(c->save_icon->window); + return; + } + + c->save_icon = gtk_file_selection_new(_("Gaim - Save Icon")); + gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(c->save_icon)); + g_snprintf(buf, BUF_LEN - 1, "%s/%s.icon", g_get_home_dir(), c->name); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(c->save_icon), buf); + gtk_signal_connect(GTK_OBJECT(c->save_icon), "delete_event", + GTK_SIGNAL_FUNC(des_save_icon), c); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(c->save_icon)->ok_button), "clicked", + GTK_SIGNAL_FUNC(do_save_icon), c); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(c->save_icon)->cancel_button), "clicked", + GTK_SIGNAL_FUNC(cancel_save_icon), c); + + gtk_widget_show(c->save_icon); +} + +static gboolean icon_menu(GtkObject *obj, GdkEventButton *e, struct conversation *c) +{ + GtkWidget *menu; + GtkWidget *button; + + if (e->button != 3) + return FALSE; + if (e->type != GDK_BUTTON_PRESS) + return FALSE; + + menu = gtk_menu_new(); + + if (c->icon_timer) { + button = gtk_menu_item_new_with_label(_("Disable Animation")); + gtk_signal_connect(GTK_OBJECT(button), "activate", GTK_SIGNAL_FUNC(stop_anim), c); + gtk_menu_append(GTK_MENU(menu), button); + gtk_widget_show(button); + } + + button = gtk_menu_item_new_with_label(_("Hide Icon")); + gtk_signal_connect_object(GTK_OBJECT(button), "activate", + GTK_SIGNAL_FUNC(remove_icon), (void *)c); + gtk_menu_append(GTK_MENU(menu), button); + gtk_widget_show(button); + + button = gtk_menu_item_new_with_label(_("Save Icon As...")); + gtk_signal_connect(GTK_OBJECT(button), "activate", GTK_SIGNAL_FUNC(save_icon), c); + gtk_menu_append(GTK_MENU(menu), button); + gtk_widget_show(button); + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); + + return TRUE; +} #endif void remove_icon(struct conversation *c) { #if USE_PIXBUF if (c->icon) - gtk_container_remove(GTK_CONTAINER(c->bbox), c->icon); + gtk_container_remove(GTK_CONTAINER(c->bbox), c->icon->parent); c->icon = NULL; if (c->anim) gdk_pixbuf_animation_unref(c->anim); @@ -2685,6 +2787,7 @@ void *data; int len; + GtkWidget *event; GdkPixbufLoader *load; GdkPixbuf *scale; GdkPixmap *pm; @@ -2739,9 +2842,14 @@ gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 0); gdk_pixbuf_unref(scale); + event = gtk_event_box_new(); + gtk_box_pack_start(GTK_BOX(c->bbox), event, FALSE, FALSE, 5); + gtk_signal_connect(GTK_OBJECT(event), "button-press-event", GTK_SIGNAL_FUNC(icon_menu), c); + gtk_widget_show(event); + c->icon = gtk_pixmap_new(pm, bm); gtk_widget_set_usize(c->icon, sf, sf); - gtk_box_pack_start(GTK_BOX(c->bbox), c->icon, FALSE, FALSE, 5); + gtk_container_add(GTK_CONTAINER(event), c->icon); gtk_widget_show(c->icon); gdk_pixmap_unref(pm); if (bm) diff -r bd66482296f9 -r 933e139fd0d3 src/ui.h --- a/src/ui.h Sat Oct 13 19:00:48 2001 +0000 +++ b/src/ui.h Sun Oct 14 03:54:40 2001 +0000 @@ -144,6 +144,7 @@ GdkPixbufAnimation *anim; guint32 icon_timer; int frame; + GtkWidget *save_icon; #endif /* stuff used just for chat */