Mercurial > pidgin.yaz
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 |