# HG changeset patch # User Mark Doliner # Date 1089472682 0 # Node ID 44a5bfa4730b5fd54f3c96faf6fc7bb8730e46be # Parent 27a595d413ff55d3601004dcc9162541f493e2f1 [gaim-migrate @ 10323] Done with the file chooser for right clicking and saving icons. There is a lot of code duplication here... I'm going to look at the file chooser in the request API now. committer: Tailor Script diff -r 27a595d413ff -r 44a5bfa4730b src/gtkconv.c --- a/src/gtkconv.c Fri Jul 09 22:37:13 2004 +0000 +++ b/src/gtkconv.c Sat Jul 10 15:18:02 2004 +0000 @@ -2582,6 +2582,153 @@ gtkconv->u.im->iter = NULL; } +static void +saveicon_writefile_cb(GaimConversation *conv, gint id) +{ + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + const char *filename; + FILE *fp; + GaimBuddyIcon *icon; + const void *data; + size_t len; + +#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(gtkconv->u.im->saveicon)); +#else /* FILECHOOSER */ + filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(gtkconv->u.im->saveicon)); +#endif /* FILECHOOSER */ + + gaim_notify_close_with_handle(gtkconv->u.im->saveicon); + + if (filename == NULL) { + gaim_notify_error(gtkconv->u.im->saveicon, NULL, _("Invalid file name."), NULL); + return; + } + + if ((fp = fopen(filename, "wb")) == NULL) { + gaim_notify_error(gtkconv->u.im->saveicon, NULL, _("Unable to open file."), NULL); + return; + } + + icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); + data = gaim_buddy_icon_get_data(icon, &len); + + if ((len <= 0) || (data == NULL)) { + gaim_notify_error(gtkconv->u.im->saveicon, NULL, _("Unable to save icon file to disk."), NULL); + return; + } + + fwrite(data, 1, len, fp); + fclose(fp); + + gtk_widget_destroy(gtkconv->u.im->saveicon); + gtkconv->u.im->saveicon = NULL; +} + +#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ +static void +saveicon_checkfile_cb(GtkWidget *widget, gint response, GaimConversation *conv) +{ + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + const char *filename; + + if (response != GTK_RESPONSE_ACCEPT) { + gaim_notify_close_with_handle(gtkconv->u.im->saveicon); + gaim_request_close_with_handle(gtkconv->u.im->saveicon); + if (response == GTK_RESPONSE_CANCEL) + gtk_widget_destroy(gtkconv->u.im->saveicon); + gtkconv->u.im->saveicon = NULL; + return; + } + + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); +#else /* FILECHOOSER */ +static void +saveicon_checkfile_cb(GtkWidget *widget, GaimConversation *conv) +{ + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + const char *filename; + + filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(gtkconv->u.im->saveicon)); + if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(gtkconv->u.im->saveicon))) { + return; + } +#endif /* FILECHOOSER */ + + gaim_request_close_with_handle(gtkconv->u.im->saveicon); + + if (g_file_test(filename, G_FILE_TEST_EXISTS)) + { + gaim_request_yes_no(gtkconv->u.im->saveicon, NULL, _("That file already exists"), + _("Would you like to overwrite it?"), 1, + conv, G_CALLBACK(saveicon_writefile_cb), NULL); + } + else + saveicon_writefile_cb(conv, 1); +} + +#if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ +static void +saveicon_destroy_cb(GtkWidget *widget, GaimConversation *conv) +{ + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + if (gtkconv->u.im->saveicon != NULL) { + gaim_notify_close_with_handle(gtkconv->u.im->saveicon); + gaim_request_close_with_handle(gtkconv->u.im->saveicon); + gtk_widget_destroy(gtkconv->u.im->saveicon); + gtkconv->u.im->saveicon = NULL; + } +} +#endif + +static void +icon_menu_save_cb(GtkWidget *widget, GaimConversation *conv) +{ + GaimConvWindow *win = (GaimConvWindow *)conv->window; + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); + gchar *buf; + + g_return_if_fail(conv != NULL); + g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_IM); + g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); + + if (gtkconv->u.im->saveicon != NULL) { + gtk_window_present(GTK_WINDOW(gtkconv->u.im->saveicon)); + return; + } + +#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ + buf = g_strdup_printf("%s.icon", gaim_normalize(conv->account, conv->name)); + gtkconv->u.im->saveicon = gtk_file_chooser_dialog_new(_("Save Icon"), + GTK_WINDOW(GAIM_GTK_WINDOW(win)->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_default_response(GTK_DIALOG(gtkconv->u.im->saveicon), + GTK_RESPONSE_ACCEPT); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(gtkconv->u.im->saveicon), + buf); + g_signal_connect(G_OBJECT(gtkconv->u.im->saveicon), "response", + G_CALLBACK(saveicon_checkfile_cb), conv); +#else /* FILECHOOSER */ + buf = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.icon", gaim_home_dir(), + gaim_normalize(conv->account, conv->name)); + gtkconv->u.im->saveicon = gtk_file_selection_new(_("Save Icon")); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(gtkconv->u.im->saveicon), buf); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->u.im->saveicon)->ok_button), + "clicked", G_CALLBACK(saveicon_checkfile_cb), conv); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->u.im->saveicon)->cancel_button), + "clicked", G_CALLBACK(saveicon_destroy_cb), conv); + g_signal_connect(G_OBJECT(gtkconv->u.im->saveicon), + "destroy", G_CALLBACK(saveicon_destroy_cb), conv); +#endif /* FILECHOOSER */ + + g_free(buf); + + gtk_widget_show_all(GTK_WIDGET(gtkconv->u.im->saveicon)); +} + static gboolean icon_menu(GtkObject *obj, GdkEventButton *e, GaimConversation *conv) { @@ -2618,7 +2765,7 @@ gtk_widget_show(button); gaim_new_item_from_stock(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS, - G_CALLBACK(gaim_gtk_save_icon_dialog), conv, + G_CALLBACK(icon_menu_save_cb), conv, 0, 0, NULL); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); @@ -4864,8 +5011,11 @@ if (gtkconv->u.im->icon_timer != 0) g_source_remove(gtkconv->u.im->icon_timer); - if (gtkconv->u.im->save_icon != NULL) - gtk_widget_destroy(gtkconv->u.im->save_icon); + if (gtkconv->u.im->saveicon != NULL) { + gaim_notify_close_with_handle(gtkconv->u.im->saveicon); + gaim_request_close_with_handle(gtkconv->u.im->saveicon); + gtk_widget_destroy(gtkconv->u.im->saveicon); + } if (gtkconv->u.im->anim != NULL) g_object_unref(G_OBJECT(gtkconv->u.im->anim)); diff -r 27a595d413ff -r 44a5bfa4730b src/gtkconv.h --- a/src/gtkconv.h Fri Jul 09 22:37:13 2004 +0000 +++ b/src/gtkconv.h Sat Jul 10 15:18:02 2004 +0000 @@ -111,7 +111,7 @@ GdkPixbufAnimation *anim; GdkPixbufAnimationIter *iter; guint32 icon_timer; - GtkWidget *save_icon; + GtkWidget *saveicon; }; /** diff -r 27a595d413ff -r 44a5bfa4730b src/gtkutils.c --- a/src/gtkutils.c Fri Jul 09 22:37:13 2004 +0000 +++ b/src/gtkutils.c Sat Jul 10 15:18:02 2004 +0000 @@ -109,100 +109,6 @@ (*text != '\0')); } -static int -des_save_icon(GtkObject *obj, GdkEvent *e, - GaimGtkConversation *gtkconv) -{ - gtk_widget_destroy(gtkconv->u.im->save_icon); - gtkconv->u.im->save_icon = NULL; - - return TRUE; -} - -static void -do_save_icon(GtkObject *obj, GaimConversation *c) -{ - GaimGtkConversation *gtkconv; - FILE *file; - const char *f; - GaimBuddyIcon *icon; - size_t len; - const void *data; - - - gtkconv = GAIM_GTK_CONVERSATION(c); - - f = gtk_file_selection_get_filename( - GTK_FILE_SELECTION(gtkconv->u.im->save_icon)); - - if (gaim_gtk_check_if_dir(f, GTK_FILE_SELECTION(gtkconv->u.im->save_icon))) - return; - - icon = gaim_conv_im_get_icon(GAIM_CONV_IM(c)); - data = gaim_buddy_icon_get_data(icon, &len); - - if ((len > 0) && (data != NULL) && (file = fopen(f, "wb")) != NULL) { - fwrite(data, 1, len, file); - fclose(file); - } else { - gaim_notify_error(NULL, NULL, - _("Can't save icon file to disk."), NULL); - } - - gtk_widget_destroy(gtkconv->u.im->save_icon); - gtkconv->u.im->save_icon = NULL; -} - -static void -cancel_save_icon(GtkObject *obj, GaimGtkConversation *gtkconv) -{ - gtk_widget_destroy(gtkconv->u.im->save_icon); - gtkconv->u.im->save_icon = NULL; -} - - -void -gaim_gtk_save_icon_dialog(GtkObject *obj, GaimConversation *conv) -{ - GaimGtkConversation *gtkconv; - char buf[BUF_LEN]; - - if (conv == NULL || gaim_conversation_get_type(conv) != GAIM_CONV_IM) - return; - - if (!GAIM_IS_GTK_CONVERSATION(conv)) - return; - - gtkconv = GAIM_GTK_CONVERSATION(conv); - - if (gtkconv->u.im->save_icon != NULL) - { - gdk_window_raise(gtkconv->u.im->save_icon->window); - return; - } - - gtkconv->u.im->save_icon = gtk_file_selection_new(_("Save Icon")); - - gtk_file_selection_hide_fileop_buttons( - GTK_FILE_SELECTION(gtkconv->u.im->save_icon)); - - g_snprintf(buf, BUF_LEN - 1, - "%s" G_DIR_SEPARATOR_S "%s.icon", - gaim_home_dir(), gaim_conversation_get_name(conv)); - - gtk_file_selection_set_filename( - GTK_FILE_SELECTION(gtkconv->u.im->save_icon), buf); - - g_signal_connect(G_OBJECT(gtkconv->u.im->save_icon), "delete_event", - G_CALLBACK(des_save_icon), gtkconv); - g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->u.im->save_icon)->ok_button), "clicked", - G_CALLBACK(do_save_icon), conv); - g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(gtkconv->u.im->save_icon)->cancel_button), "clicked", - G_CALLBACK(cancel_save_icon), gtkconv); - - gtk_widget_show(gtkconv->u.im->save_icon); -} - int gaim_gtk_get_dispstyle(GaimConversationType type) { diff -r 27a595d413ff -r 44a5bfa4730b src/gtkutils.h --- a/src/gtkutils.h Fri Jul 09 22:37:13 2004 +0000 +++ b/src/gtkutils.h Sat Jul 10 15:18:02 2004 +0000 @@ -67,14 +67,6 @@ void gaim_setup_imhtml(GtkWidget *imhtml); /** - * Displays a dialog for saving the buddy icon in a conversation. - * - * @param obj @c NULL - * @param conv The conversation. - */ -void gaim_gtk_save_icon_dialog(GtkObject *obj, GaimConversation *conv); - -/** * Returns the display style for buttons for the specified conversation * type. *