| 420 gtk_widget_grab_focus(toolbar->imhtml); |
420 gtk_widget_grab_focus(toolbar->imhtml); |
| 421 } |
421 } |
| 422 |
422 |
| 423 |
423 |
| 424 static void |
424 static void |
| 425 do_insert_image_cb(GtkWidget *widget, int resp, GtkIMHtmlToolbar *toolbar) |
425 do_insert_image_cb(GtkWidget *widget, int response, GtkIMHtmlToolbar *toolbar) |
| 426 { |
426 { |
| 427 char *name, *filename; |
427 gchar *filename, *name, *buf; |
| 428 char *buf, *filedata; |
428 char *filedata; |
| 429 size_t size; |
429 size_t size; |
| 430 GError *error = NULL; |
430 GError *error = NULL; |
| 431 int id; |
431 int id; |
| 432 GtkTextIter iter; |
432 GtkTextIter iter; |
| 433 GtkTextMark *ins; |
433 GtkTextMark *ins; |
| 434 |
434 |
| 435 if (resp != GTK_RESPONSE_OK) { |
435 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
| |
436 if (response != GTK_RESPONSE_ACCEPT) { |
| |
437 #else /* FILECHOOSER */ |
| |
438 if (response != GTK_RESPONSE_OK) { |
| |
439 #endif /* FILECHOOSER */ |
| 436 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
440 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
| 437 return; |
441 return; |
| 438 } |
442 } |
| 439 |
443 |
| 440 name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget))); |
444 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
| 441 |
445 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); |
| 442 if (!name) { |
446 #else /* FILECHOOSER */ |
| |
447 filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget))); |
| |
448 #endif /* FILECHOOSER */ |
| |
449 |
| |
450 if (filename == NULL) { |
| 443 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
451 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
| 444 return; |
452 return; |
| 445 } |
453 } |
| 446 |
454 |
| 447 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(widget))) { |
455 #if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
| 448 g_free(name); |
456 if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(widget))) { |
| |
457 g_free(filename); |
| 449 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
458 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
| 450 return; |
459 return; |
| 451 } |
460 } |
| 452 |
461 #endif /* FILECHOOSER */ |
| |
462 |
| |
463 /* The following triggers a callback that closes the widget */ |
| 453 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
464 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); |
| 454 |
465 |
| 455 if (!g_file_get_contents(name, &filedata, &size, &error)) { |
466 if (!g_file_get_contents(filename, &filedata, &size, &error)) { |
| 456 gaim_notify_error(NULL, NULL, error->message, NULL); |
467 gaim_notify_error(NULL, NULL, error->message, NULL); |
| 457 |
468 |
| 458 g_error_free(error); |
469 g_error_free(error); |
| 459 g_free(name); |
470 g_free(filename); |
| 460 |
471 |
| 461 return; |
472 return; |
| 462 } |
473 } |
| 463 |
474 |
| 464 filename = name; |
475 name = strrchr(filename, G_DIR_SEPARATOR) + 1; |
| 465 while (strchr(filename, '/')) |
476 |
| 466 filename = strchr(filename, '/') + 1; |
477 id = gaim_imgstore_add(filedata, size, name); |
| 467 |
|
| 468 id = gaim_imgstore_add(filedata, size, filename); |
|
| 469 g_free(filedata); |
478 g_free(filedata); |
| 470 |
479 |
| 471 if (!id) { |
480 if (id == 0) { |
| 472 buf = g_strdup_printf(_("Failed to store image: %s\n"), name); |
481 buf = g_strdup_printf(_("Failed to store image: %s\n"), filename); |
| 473 gaim_notify_error(NULL, NULL, buf, NULL); |
482 gaim_notify_error(NULL, NULL, buf, NULL); |
| 474 |
483 |
| 475 g_free(buf); |
484 g_free(buf); |
| 476 g_free(name); |
485 g_free(filename); |
| 477 |
486 |
| 478 return; |
487 return; |
| 479 } |
488 } |
| |
489 |
| |
490 g_free(filename); |
| 480 |
491 |
| 481 ins = gtk_text_buffer_get_insert(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml))); |
492 ins = gtk_text_buffer_get_insert(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml))); |
| 482 gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml)), |
493 gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(toolbar->imhtml)), |
| 483 &iter, ins); |
494 &iter, ins); |
| 484 gtk_imhtml_insert_image_at_iter(GTK_IMHTML(toolbar->imhtml), id, &iter); |
495 gtk_imhtml_insert_image_at_iter(GTK_IMHTML(toolbar->imhtml), id, &iter); |
| 485 gaim_imgstore_unref(id); |
496 gaim_imgstore_unref(id); |
| 486 |
|
| 487 g_free(name); |
|
| 488 } |
497 } |
| 489 |
498 |
| 490 |
499 |
| 491 static void |
500 static void |
| 492 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar) |
501 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar) |
| 493 { |
502 { |
| 494 char buf[BUF_LONG]; |
|
| 495 GtkWidget *window; |
503 GtkWidget *window; |
| 496 |
504 |
| 497 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) { |
505 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) { |
| |
506 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ |
| |
507 window = gtk_file_chooser_dialog_new(_("Insert Image"), |
| |
508 NULL, |
| |
509 GTK_FILE_CHOOSER_ACTION_OPEN, |
| |
510 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
| |
511 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, |
| |
512 NULL); |
| |
513 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT); |
| |
514 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(window)), |
| |
515 "response", G_CALLBACK(do_insert_image_cb), toolbar); |
| |
516 #else /* FILECHOOSER */ |
| 498 window = gtk_file_selection_new(_("Insert Image")); |
517 window = gtk_file_selection_new(_("Insert Image")); |
| 499 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S, gaim_home_dir()); |
|
| 500 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); |
|
| 501 |
|
| 502 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK); |
518 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK); |
| 503 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)), |
519 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)), |
| 504 "response", G_CALLBACK(do_insert_image_cb), toolbar); |
520 "response", G_CALLBACK(do_insert_image_cb), toolbar); |
| |
521 #endif /* FILECHOOSER */ |
| 505 |
522 |
| 506 gtk_widget_show(window); |
523 gtk_widget_show(window); |
| 507 toolbar->image_dialog = window; |
524 toolbar->image_dialog = window; |
| 508 } else { |
525 } else { |
| 509 gtk_widget_destroy(toolbar->image_dialog); |
526 gtk_widget_destroy(toolbar->image_dialog); |
| 510 toolbar->image_dialog = NULL; |
527 toolbar->image_dialog = NULL; |
| 511 } |
528 } |
| |
529 |
| 512 gtk_widget_grab_focus(toolbar->imhtml); |
530 gtk_widget_grab_focus(toolbar->imhtml); |
| 513 } |
531 } |
| 514 |
532 |
| 515 |
533 |
| 516 static void |
534 static void |