comparison pidgin/gtkimhtmltoolbar.c @ 29869:f44718de8b06

merged with im.pidgin.pidgin
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 22 Feb 2010 16:05:25 +0900
parents 1929b7a0c2c8 45a94940c122
children 89de882d25b1
comparison
equal deleted inserted replaced
29445:d74e3cd6cbb5 29869:f44718de8b06
31 #include "notify.h" 31 #include "notify.h"
32 #include "prefs.h" 32 #include "prefs.h"
33 #include "request.h" 33 #include "request.h"
34 #include "pidginstock.h" 34 #include "pidginstock.h"
35 #include "util.h" 35 #include "util.h"
36 #include "debug.h"
36 37
37 #include "gtkdialogs.h" 38 #include "gtkdialogs.h"
38 #include "gtkimhtmltoolbar.h" 39 #include "gtkimhtmltoolbar.h"
39 #include "gtksmiley.h" 40 #include "gtksmiley.h"
40 #include "gtkthemes.h" 41 #include "gtkthemes.h"
476 GError *error = NULL; 477 GError *error = NULL;
477 int id; 478 int id;
478 GtkTextIter iter; 479 GtkTextIter iter;
479 GtkTextMark *ins; 480 GtkTextMark *ins;
480 481
481 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
482 if (response != GTK_RESPONSE_ACCEPT) 482 if (response != GTK_RESPONSE_ACCEPT)
483 #else /* FILECHOOSER */
484 if (response != GTK_RESPONSE_OK)
485 #endif /* FILECHOOSER */
486 { 483 {
487 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); 484 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
488 return; 485 return;
489 } 486 }
490 487
491 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
492 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); 488 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
493 #else /* FILECHOOSER */
494 filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget)));
495 #endif /* FILECHOOSER */
496 489
497 if (filename == NULL) { 490 if (filename == NULL) {
498 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); 491 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
499 return; 492 return;
500 } 493 }
501
502 #if !GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
503 if (pidgin_check_if_dir(filename, GTK_FILE_SELECTION(widget))) {
504 g_free(filename);
505 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
506 return;
507 }
508 #endif /* FILECHOOSER */
509 494
510 /* The following triggers a callback that closes the widget */ 495 /* The following triggers a callback that closes the widget */
511 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); 496 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE);
512 497
513 if (!g_file_get_contents(filename, &filedata, &size, &error)) { 498 if (!g_file_get_contents(filename, &filedata, &size, &error)) {
547 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar) 532 insert_image_cb(GtkWidget *save, GtkIMHtmlToolbar *toolbar)
548 { 533 {
549 GtkWidget *window; 534 GtkWidget *window;
550 535
551 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) { 536 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))) {
552 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
553 window = gtk_file_chooser_dialog_new(_("Insert Image"), 537 window = gtk_file_chooser_dialog_new(_("Insert Image"),
554 NULL, 538 NULL,
555 GTK_FILE_CHOOSER_ACTION_OPEN, 539 GTK_FILE_CHOOSER_ACTION_OPEN,
556 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 540 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
557 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 541 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
558 NULL); 542 NULL);
559 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT); 543 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT);
560 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(window)), 544 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(window)),
561 "response", G_CALLBACK(do_insert_image_cb), toolbar); 545 "response", G_CALLBACK(do_insert_image_cb), toolbar);
562 #else /* FILECHOOSER */
563 window = gtk_file_selection_new(_("Insert Image"));
564 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK);
565 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)),
566 "response", G_CALLBACK(do_insert_image_cb), toolbar);
567 #endif /* FILECHOOSER */
568 546
569 gtk_widget_show(window); 547 gtk_widget_show(window);
570 toolbar->image_dialog = window; 548 toolbar->image_dialog = window;
571 } else { 549 } else {
572 gtk_widget_destroy(toolbar->image_dialog); 550 gtk_widget_destroy(toolbar->image_dialog);
917 #endif 895 #endif
918 896
919 toolbar->smiley_dialog = dialog; 897 toolbar->smiley_dialog = dialog;
920 898
921 gtk_widget_grab_focus(toolbar->imhtml); 899 gtk_widget_grab_focus(toolbar->imhtml);
900 }
901
902 static void send_attention_cb(GtkWidget *attention, GtkIMHtmlToolbar *toolbar)
903 {
904 PurpleConversation *conv =
905 g_object_get_data(G_OBJECT(toolbar), "active_conv");
906 const gchar *who = purple_conversation_get_name(conv);
907 PurpleConnection *gc = purple_conversation_get_gc(conv);
908
909 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(attention), FALSE, toolbar);
910 purple_prpl_send_attention(gc, who, 0);
922 } 911 }
923 912
924 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) 913 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar)
925 { 914 {
926 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); 915 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD);
1239 {"", NULL, NULL, NULL}, 1228 {"", NULL, NULL, NULL},
1240 {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")}, 1229 {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")},
1241 {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")}, 1230 {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")},
1242 {"", NULL, NULL, NULL}, 1231 {"", NULL, NULL, NULL},
1243 {PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")}, 1232 {PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")},
1233 /*{PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, send_attention_cb,
1234 g_object_get_data(G_OBJECT(toolbar->imhtml), "attention"), _("Send Attention")},*/
1244 {NULL, NULL, NULL, NULL} 1235 {NULL, NULL, NULL, NULL}
1245 }; 1236 };
1246 int iter; 1237 int iter;
1247 1238
1248 hbox = gtk_hbox_new(FALSE, 0); 1239 hbox = gtk_hbox_new(FALSE, 0);
1256 gtk_tooltips_set_tip(toolbar->tooltips, button, buttons[iter].tooltip, NULL); 1247 gtk_tooltips_set_tip(toolbar->tooltips, button, buttons[iter].tooltip, NULL);
1257 } else 1248 } else
1258 button = gtk_vseparator_new(); 1249 button = gtk_vseparator_new();
1259 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 1250 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1260 } 1251 }
1252 /* create the attention button (this is a bit hacky to not break ABI) */
1253 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION);
1254 g_signal_connect(G_OBJECT(button), "clicked",
1255 G_CALLBACK(send_attention_cb), toolbar);
1256 g_object_set_data(G_OBJECT(toolbar), "attention", button);
1257 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Send Attention"), NULL);
1258 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1261 1259
1262 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0); 1260 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0);
1263 g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox); 1261 g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox);
1264 } 1262 }
1265 1263
1304 GtkWidget *image; 1302 GtkWidget *image;
1305 GtkWidget *label; 1303 GtkWidget *label;
1306 GtkWidget *insert_button; 1304 GtkWidget *insert_button;
1307 GtkWidget *font_button; 1305 GtkWidget *font_button;
1308 GtkWidget *smiley_button; 1306 GtkWidget *smiley_button;
1307 GtkWidget *attention_button;
1309 GtkWidget *font_menu; 1308 GtkWidget *font_menu;
1310 GtkWidget *insert_menu; 1309 GtkWidget *insert_menu;
1311 GtkWidget *menuitem; 1310 GtkWidget *menuitem;
1312 GtkWidget *sep; 1311 GtkWidget *sep;
1313 int i; 1312 int i;
1445 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1444 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1446 gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0); 1445 gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0);
1447 g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley); 1446 g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
1448 gtk_widget_show_all(smiley_button); 1447 gtk_widget_show_all(smiley_button);
1449 1448
1449 /* Sep */
1450 sep = gtk_vseparator_new();
1451 gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0);
1452 gtk_widget_show_all(sep);
1453
1454 /* Attention */
1455 attention_button = gtk_button_new();
1456 gtk_button_set_relief(GTK_BUTTON(attention_button), GTK_RELIEF_NONE);
1457 bbox = gtk_hbox_new(FALSE, 3);
1458 gtk_container_add(GTK_CONTAINER(attention_button), bbox);
1459 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION,
1460 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1461 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
1462 label = gtk_label_new_with_mnemonic(_("_Attention!"));
1463 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1464 gtk_box_pack_start(GTK_BOX(box), attention_button, FALSE, FALSE, 0);
1465 g_signal_connect_swapped(G_OBJECT(attention_button), "clicked",
1466 G_CALLBACK(gtk_button_clicked),
1467 g_object_get_data(G_OBJECT(toolbar), "attention"));
1468 gtk_widget_show_all(attention_button);
1469
1470 g_signal_connect(G_OBJECT(g_object_get_data(G_OBJECT(toolbar), "attention")),
1471 "notify::sensitive",
1472 G_CALLBACK(button_sensitiveness_changed), attention_button);
1473
1474 /* set attention button to be greyed out until we get a conversation */
1475 gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(toolbar), "attention"),
1476 FALSE);
1477
1450 gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0); 1478 gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0);
1451 g_object_set_data(G_OBJECT(hbox), "lean-view", box); 1479 g_object_set_data(G_OBJECT(hbox), "lean-view", box);
1452 gtk_widget_show(box); 1480 gtk_widget_show(box);
1453 1481
1454 purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide", 1482 purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
1455 imhtmltoolbar_view_pref_changed, toolbar); 1483 imhtmltoolbar_view_pref_changed, toolbar);
1456 g_signal_connect_data(G_OBJECT(toolbar), "realize", 1484 g_signal_connect_data(G_OBJECT(toolbar), "realize",
1457 G_CALLBACK(purple_prefs_trigger_callback), PIDGIN_PREFS_ROOT "/conversations/toolbar/wide", 1485 G_CALLBACK(purple_prefs_trigger_callback), PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",
1458 NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED); 1486 NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
1459 1487
1460 #if GTK_CHECK_VERSION(2,4,0)
1461 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 1488 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
1462 #endif
1463 1489
1464 gtk_widget_add_events(event, GDK_BUTTON_PRESS_MASK); 1490 gtk_widget_add_events(event, GDK_BUTTON_PRESS_MASK);
1465 gtk_box_pack_start(GTK_BOX(hbox), event, TRUE, TRUE, 0); 1491 gtk_box_pack_start(GTK_BOX(hbox), event, TRUE, TRUE, 0);
1466 g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar); 1492 g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar);
1467 gtk_widget_show(event); 1493 gtk_widget_show(event);
1522 void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id) 1548 void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id)
1523 { 1549 {
1524 g_free(toolbar->sml); 1550 g_free(toolbar->sml);
1525 toolbar->sml = g_strdup(proto_id); 1551 toolbar->sml = g_strdup(proto_id);
1526 } 1552 }
1553
1554 void gtk_imhtmltoolbar_switch_active_conversation(GtkIMHtmlToolbar *toolbar,
1555 PurpleConversation *conv)
1556 {
1557 PurpleConnection *gc = purple_conversation_get_gc(conv);
1558 PurplePlugin *prpl = purple_connection_get_prpl(gc);
1559 GtkWidget *attention =
1560 g_object_get_data(G_OBJECT(toolbar), "attention");
1561
1562 g_object_set_data(G_OBJECT(toolbar), "active_conv", conv);
1563
1564 /* gray out attention button on protocols that don't support it
1565 for the time being it is always disabled for chats */
1566 gtk_widget_set_sensitive(attention,
1567 conv && prpl && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM &&
1568 PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention != NULL);
1569 }
1570