| 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 |
| 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 |