comparison pidgin/gtkimhtmltoolbar.c @ 30909:25e200cb3532

propagate from branch 'im.pidgin.pidgin' (head dca20e09164518b0f7a773edd7e9649f41d8873d) to branch 'im.pidgin.cpw.malu.xmpp.google_refactor' (head 7823c556f2d1bbca43f5ef9f0fea30cabc5d313f)
author Marcus Lundblad <ml@update.uu.se>
date Tue, 31 Aug 2010 18:28:10 +0000
parents 351d07aefb09
children c5ba7dd399fa a8cc50c2279f
comparison
equal deleted inserted replaced
30908:c44ec533a48c 30909:25e200cb3532
47 47
48 static void toggle_button_set_active_block(GtkToggleButton *button, 48 static void toggle_button_set_active_block(GtkToggleButton *button,
49 gboolean is_active, 49 gboolean is_active,
50 GtkIMHtmlToolbar *toolbar); 50 GtkIMHtmlToolbar *toolbar);
51 51
52 static gboolean
53 gtk_imhtmltoolbar_popup_menu(GtkWidget *widget,
54 GdkEventButton *event, GtkIMHtmlToolbar *toolbar);
52 55
53 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar) 56 static void do_bold(GtkWidget *bold, GtkIMHtmlToolbar *toolbar)
54 { 57 {
55 g_return_if_fail(toolbar != NULL); 58 g_return_if_fail(toolbar != NULL);
56 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml)); 59 gtk_imhtml_toggle_bold(GTK_IMHTML(toolbar->imhtml));
906 const gchar *who = purple_conversation_get_name(conv); 909 const gchar *who = purple_conversation_get_name(conv);
907 PurpleConnection *gc = purple_conversation_get_gc(conv); 910 PurpleConnection *gc = purple_conversation_get_gc(conv);
908 911
909 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(attention), FALSE, toolbar); 912 toggle_button_set_active_block(GTK_TOGGLE_BUTTON(attention), FALSE, toolbar);
910 purple_prpl_send_attention(gc, who, 0); 913 purple_prpl_send_attention(gc, who, 0);
914 gtk_widget_grab_focus(toolbar->imhtml);
911 } 915 }
912 916
913 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) 917 static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar)
914 { 918 {
915 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); 919 gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD);
1096 1100
1097 if (savy > *y + ythickness + 1) 1101 if (savy > *y + ythickness + 1)
1098 *y -= widget->allocation.height; 1102 *y -= widget->allocation.height;
1099 } 1103 }
1100 1104
1105 static gboolean
1106 button_activate_on_click(GtkWidget *button, GdkEventButton *event, GtkIMHtmlToolbar *toolbar)
1107 {
1108 if (event->button == 1 && GTK_IS_TOGGLE_BUTTON(button))
1109 gtk_widget_activate(button);
1110 else if (event->button == 3)
1111 return gtk_imhtmltoolbar_popup_menu(button, event, toolbar);
1112 return FALSE;
1113 }
1114
1101 static void pidgin_menu_clicked(GtkWidget *button, GtkMenu *menu) 1115 static void pidgin_menu_clicked(GtkWidget *button, GtkMenu *menu)
1102 { 1116 {
1103 gtk_widget_show_all(GTK_WIDGET(menu)); 1117 gtk_widget_show_all(GTK_WIDGET(menu));
1104 gtk_menu_popup(menu, NULL, NULL, menu_position_func, button, 0, gtk_get_current_event_time()); 1118 gtk_menu_popup(menu, NULL, NULL, menu_position_func, button, 0, gtk_get_current_event_time());
1105 } 1119 }
1189 } 1203 }
1190 1204
1191 /* Boring GTK+ stuff */ 1205 /* Boring GTK+ stuff */
1192 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class) 1206 static void gtk_imhtmltoolbar_class_init (GtkIMHtmlToolbarClass *class)
1193 { 1207 {
1194 GtkObjectClass *object_class;
1195 GObjectClass *gobject_class; 1208 GObjectClass *gobject_class;
1196 object_class = (GtkObjectClass*) class;
1197 gobject_class = (GObjectClass*) class; 1209 gobject_class = (GObjectClass*) class;
1198 parent_class = g_type_class_ref(GTK_TYPE_HBOX); 1210 parent_class = g_type_class_ref(GTK_TYPE_HBOX);
1199 gobject_class->finalize = gtk_imhtmltoolbar_finalize; 1211 gobject_class->finalize = gtk_imhtmltoolbar_finalize;
1200 1212
1201 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/toolbar"); 1213 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/conversations/toolbar");
1228 {"", NULL, NULL, NULL}, 1240 {"", NULL, NULL, NULL},
1229 {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")}, 1241 {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")},
1230 {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")}, 1242 {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")},
1231 {"", NULL, NULL, NULL}, 1243 {"", NULL, NULL, NULL},
1232 {PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")}, 1244 {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")},*/
1235 {NULL, NULL, NULL, NULL} 1245 {NULL, NULL, NULL, NULL}
1236 }; 1246 };
1237 int iter; 1247 int iter;
1238 1248
1239 hbox = gtk_hbox_new(FALSE, 0); 1249 hbox = gtk_hbox_new(FALSE, 0);
1240 1250
1241 for (iter = 0; buttons[iter].stock; iter++) { 1251 for (iter = 0; buttons[iter].stock; iter++) {
1242 if (buttons[iter].stock[0]) { 1252 if (buttons[iter].stock[0]) {
1243 button = pidgin_pixbuf_toolbar_button_from_stock(buttons[iter].stock); 1253 button = pidgin_pixbuf_toolbar_button_from_stock(buttons[iter].stock);
1254 g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
1244 g_signal_connect(G_OBJECT(button), "clicked", 1255 g_signal_connect(G_OBJECT(button), "clicked",
1245 G_CALLBACK(buttons[iter].callback), toolbar); 1256 G_CALLBACK(buttons[iter].callback), toolbar);
1246 *(buttons[iter].button) = button; 1257 *(buttons[iter].button) = button;
1247 gtk_tooltips_set_tip(toolbar->tooltips, button, buttons[iter].tooltip, NULL); 1258 gtk_tooltips_set_tip(toolbar->tooltips, button, buttons[iter].tooltip, NULL);
1248 } else 1259 } else
1249 button = gtk_vseparator_new(); 1260 button = gtk_vseparator_new();
1250 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 1261 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1251 } 1262 }
1252 /* create the attention button (this is a bit hacky to not break ABI) */ 1263 /* 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); 1264 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION);
1265 g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
1254 g_signal_connect(G_OBJECT(button), "clicked", 1266 g_signal_connect(G_OBJECT(button), "clicked",
1255 G_CALLBACK(send_attention_cb), toolbar); 1267 G_CALLBACK(send_attention_cb), toolbar);
1256 g_object_set_data(G_OBJECT(toolbar), "attention", button); 1268 g_object_set_data(G_OBJECT(toolbar), "attention", button);
1257 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Send Attention"), NULL); 1269 gtk_tooltips_set_tip(toolbar->tooltips, button, _("Send Attention"), NULL);
1258 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 1270 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1259 1271
1260 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0); 1272 gtk_box_pack_start(GTK_BOX(toolbar), hbox, FALSE, FALSE, 0);
1261 g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox); 1273 g_object_set_data(G_OBJECT(toolbar), "wide-view", hbox);
1274 }
1275
1276 static void
1277 button_visibility_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item)
1278 {
1279 if (GTK_WIDGET_VISIBLE(button))
1280 gtk_widget_hide(item);
1281 else
1282 gtk_widget_show(item);
1262 } 1283 }
1263 1284
1264 static void 1285 static void
1265 button_sensitiveness_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item) 1286 button_sensitiveness_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item)
1266 { 1287 {
1307 GtkWidget *attention_button; 1328 GtkWidget *attention_button;
1308 GtkWidget *font_menu; 1329 GtkWidget *font_menu;
1309 GtkWidget *insert_menu; 1330 GtkWidget *insert_menu;
1310 GtkWidget *menuitem; 1331 GtkWidget *menuitem;
1311 GtkWidget *sep; 1332 GtkWidget *sep;
1333 GObject *wide_attention_button;
1312 int i; 1334 int i;
1313 struct { 1335 struct {
1314 const char *label; 1336 const char *label;
1315 GtkWidget **button; 1337 GtkWidget **button;
1316 gboolean check; 1338 gboolean check;
1377 g_signal_connect_swapped(G_OBJECT(menuitem), "activate", 1399 g_signal_connect_swapped(G_OBJECT(menuitem), "activate",
1378 G_CALLBACK(gtk_button_clicked), old); 1400 G_CALLBACK(gtk_button_clicked), old);
1379 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), menuitem); 1401 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), menuitem);
1380 g_signal_connect(G_OBJECT(old), "notify::sensitive", 1402 g_signal_connect(G_OBJECT(old), "notify::sensitive",
1381 G_CALLBACK(button_sensitiveness_changed), menuitem); 1403 G_CALLBACK(button_sensitiveness_changed), menuitem);
1404 g_signal_connect(G_OBJECT(old), "notify::visible",
1405 G_CALLBACK(button_visibility_changed), menuitem);
1382 gtk_container_foreach(GTK_CONTAINER(menuitem), (GtkCallback)enable_markup, NULL); 1406 gtk_container_foreach(GTK_CONTAINER(menuitem), (GtkCallback)enable_markup, NULL);
1383 } 1407 }
1384 1408
1385 g_signal_connect_swapped(G_OBJECT(font_button), "button-press-event", G_CALLBACK(gtk_widget_activate), font_button); 1409 g_signal_connect(G_OBJECT(font_button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
1386 g_signal_connect(G_OBJECT(font_button), "activate", G_CALLBACK(pidgin_menu_clicked), font_menu); 1410 g_signal_connect(G_OBJECT(font_button), "activate", G_CALLBACK(pidgin_menu_clicked), font_menu);
1387 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button); 1411 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button);
1388 1412
1389 /* Sep */ 1413 /* Sep */
1390 sep = gtk_vseparator_new(); 1414 sep = gtk_vseparator_new();
1409 menuitem = gtk_menu_item_new_with_mnemonic(_("_Image")); 1433 menuitem = gtk_menu_item_new_with_mnemonic(_("_Image"));
1410 g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image); 1434 g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image);
1411 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); 1435 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem);
1412 g_signal_connect(G_OBJECT(toolbar->image), "notify::sensitive", 1436 g_signal_connect(G_OBJECT(toolbar->image), "notify::sensitive",
1413 G_CALLBACK(button_sensitiveness_changed), menuitem); 1437 G_CALLBACK(button_sensitiveness_changed), menuitem);
1438 g_signal_connect(G_OBJECT(toolbar->image), "notify::visible",
1439 G_CALLBACK(button_visibility_changed), menuitem);
1414 1440
1415 menuitem = gtk_menu_item_new_with_mnemonic(_("_Link")); 1441 menuitem = gtk_menu_item_new_with_mnemonic(_("_Link"));
1416 g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link); 1442 g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link);
1417 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); 1443 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem);
1418 g_signal_connect(G_OBJECT(toolbar->link), "notify::sensitive", 1444 g_signal_connect(G_OBJECT(toolbar->link), "notify::sensitive",
1419 G_CALLBACK(button_sensitiveness_changed), menuitem); 1445 G_CALLBACK(button_sensitiveness_changed), menuitem);
1446 g_signal_connect(G_OBJECT(toolbar->link), "notify::visible",
1447 G_CALLBACK(button_visibility_changed), menuitem);
1420 1448
1421 menuitem = gtk_menu_item_new_with_mnemonic(_("_Horizontal rule")); 1449 menuitem = gtk_menu_item_new_with_mnemonic(_("_Horizontal rule"));
1422 g_signal_connect(G_OBJECT(menuitem), "activate" , G_CALLBACK(insert_hr_cb), toolbar); 1450 g_signal_connect(G_OBJECT(menuitem), "activate" , G_CALLBACK(insert_hr_cb), toolbar);
1423 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); 1451 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem);
1424 toolbar->insert_hr = menuitem; 1452 toolbar->insert_hr = menuitem;
1425 1453
1426 g_signal_connect_swapped(G_OBJECT(insert_button), "button-press-event", G_CALLBACK(gtk_widget_activate), insert_button); 1454 g_signal_connect(G_OBJECT(insert_button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
1427 g_signal_connect(G_OBJECT(insert_button), "activate", G_CALLBACK(pidgin_menu_clicked), insert_menu); 1455 g_signal_connect(G_OBJECT(insert_button), "activate", G_CALLBACK(pidgin_menu_clicked), insert_menu);
1428 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button); 1456 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button);
1429 toolbar->sml = NULL; 1457 toolbar->sml = NULL;
1430 1458
1431 /* Sep */ 1459 /* Sep */
1441 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); 1469 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1442 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); 1470 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
1443 label = gtk_label_new_with_mnemonic(_("_Smile!")); 1471 label = gtk_label_new_with_mnemonic(_("_Smile!"));
1444 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1472 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1445 gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0); 1473 gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0);
1474 g_signal_connect(G_OBJECT(smiley_button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
1446 g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley); 1475 g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
1447 gtk_widget_show_all(smiley_button); 1476 gtk_widget_show_all(smiley_button);
1448 1477
1449 /* Sep */ 1478 /* Sep */
1450 sep = gtk_vseparator_new(); 1479 sep = gtk_vseparator_new();
1451 gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0); 1480 gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0);
1452 gtk_widget_show_all(sep); 1481 gtk_widget_show_all(sep);
1453 1482
1454 /* Attention */ 1483 /* Attention */
1484 wide_attention_button = g_object_get_data(G_OBJECT(toolbar), "attention");
1485
1455 attention_button = gtk_button_new(); 1486 attention_button = gtk_button_new();
1456 gtk_button_set_relief(GTK_BUTTON(attention_button), GTK_RELIEF_NONE); 1487 gtk_button_set_relief(GTK_BUTTON(attention_button), GTK_RELIEF_NONE);
1457 bbox = gtk_hbox_new(FALSE, 3); 1488 bbox = gtk_hbox_new(FALSE, 3);
1458 gtk_container_add(GTK_CONTAINER(attention_button), bbox); 1489 gtk_container_add(GTK_CONTAINER(attention_button), bbox);
1459 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, 1490 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION,
1460 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); 1491 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1461 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); 1492 gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0);
1462 label = gtk_label_new_with_mnemonic(_("_Attention!")); 1493 label = gtk_label_new_with_mnemonic(_("_Attention!"));
1463 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1494 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1464 gtk_box_pack_start(GTK_BOX(box), attention_button, FALSE, FALSE, 0); 1495 gtk_box_pack_start(GTK_BOX(box), attention_button, FALSE, FALSE, 0);
1465 g_signal_connect_swapped(G_OBJECT(attention_button), "clicked", 1496 g_signal_connect_swapped(G_OBJECT(attention_button), "clicked",
1466 G_CALLBACK(gtk_button_clicked), 1497 G_CALLBACK(gtk_button_clicked), wide_attention_button);
1467 g_object_get_data(G_OBJECT(toolbar), "attention"));
1468 gtk_widget_show_all(attention_button); 1498 gtk_widget_show_all(attention_button);
1469 1499
1470 g_signal_connect(G_OBJECT(g_object_get_data(G_OBJECT(toolbar), "attention")), 1500 g_signal_connect(wide_attention_button, "notify::sensitive",
1471 "notify::sensitive",
1472 G_CALLBACK(button_sensitiveness_changed), attention_button); 1501 G_CALLBACK(button_sensitiveness_changed), attention_button);
1502 g_signal_connect(wide_attention_button, "notify::visible",
1503 G_CALLBACK(button_visibility_changed), attention_button);
1473 1504
1474 /* set attention button to be greyed out until we get a conversation */ 1505 /* 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"), 1506 gtk_widget_set_sensitive(GTK_WIDGET(wide_attention_button), FALSE);
1476 FALSE); 1507
1477
1478 gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0); 1508 gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0);
1479 g_object_set_data(G_OBJECT(hbox), "lean-view", box); 1509 g_object_set_data(G_OBJECT(hbox), "lean-view", box);
1480 gtk_widget_show(box); 1510 gtk_widget_show(box);
1481 1511
1482 purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide", 1512 purple_prefs_connect_callback(toolbar, PIDGIN_PREFS_ROOT "/conversations/toolbar/wide",