comparison pidgin/gtkimhtmltoolbar.c @ 17984:a2c36e2010f1

Fix some stuff of bugs in the new toolbar.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Tue, 05 Jun 2007 06:20:13 +0000
parents 4d53ccae32b0
children d40fd7106ebf 2f9eabdc6011
comparison
equal deleted inserted replaced
17725:1873848dfddb 17984:a2c36e2010f1
790 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 790 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA,
791 0, 0, NULL, NULL, toolbar); 791 0, 0, NULL, NULL, toolbar);
792 g_object_unref(object); 792 g_object_unref(object);
793 } 793 }
794 794
795 static void update_buttons(GtkIMHtmlToolbar *toolbar) { 795 static void update_buttons(GtkIMHtmlToolbar *toolbar)
796 {
796 gboolean bold, italic, underline; 797 gboolean bold, italic, underline;
797 char *tmp; 798 char *tmp;
798 char *tmp2; 799 char *tmp2;
799 800
800 gtk_imhtml_get_current_format(GTK_IMHTML(toolbar->imhtml), 801 gtk_imhtml_get_current_format(GTK_IMHTML(toolbar->imhtml),
860 static void 861 static void
861 menu_position_func (GtkMenu *menu, 862 menu_position_func (GtkMenu *menu,
862 int *x, 863 int *x,
863 int *y, 864 int *y,
864 gboolean *push_in, 865 gboolean *push_in,
865 gpointer data) 866 gpointer data)
866 { 867 {
867 GtkRequisition menu_req; 868 GtkRequisition menu_req;
868 GtkTextDirection direction; 869 GtkTextDirection direction;
869 GdkRectangle monitor; 870 GdkRectangle monitor;
870 gint monitor_num; 871 gint monitor_num;
871 GdkScreen *screen; 872 GdkScreen *screen;
872 GtkWidget *widget = data; 873 GtkWidget *widget = GTK_WIDGET(data);
873 874
874 gtk_widget_size_request (GTK_WIDGET (widget), &menu_req); 875 gtk_widget_size_request (GTK_WIDGET (menu), &menu_req);
875 876
876 direction = gtk_widget_get_direction (widget); 877 direction = gtk_widget_get_direction (widget);
877 878
878 screen = gtk_widget_get_screen (GTK_WIDGET (menu)); 879 screen = gtk_widget_get_screen (GTK_WIDGET (menu));
879 monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window); 880 monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
880 if (monitor_num < 0) 881 if (monitor_num < 0)
881 monitor_num = 0; 882 monitor_num = 0;
882 gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); 883 gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
883 884
884 gdk_window_get_origin (widget->window, x, y); 885 gdk_window_get_origin (widget->window, x, y);
885 *x += widget->allocation.x; 886 *x += widget->allocation.x;
886 *y += widget->allocation.y; 887 *y += widget->allocation.y;
887 888
888 if (direction == GTK_TEXT_DIR_LTR) 889 if (direction == GTK_TEXT_DIR_LTR)
889 *x += MAX (widget->allocation.width - menu_req.width, 0); 890 *x += MAX (widget->allocation.width - menu_req.width, 0);
890 else if (menu_req.width > widget->allocation.width) 891 else if (menu_req.width > widget->allocation.width)
891 *x -= menu_req.width - widget->allocation.width; 892 *x -= menu_req.width - widget->allocation.width;
892 893
893 if ((*y + widget->allocation.height + menu_req.height) <= monitor.y + monitor.height) 894 if ((*y + widget->allocation.height + menu_req.height) <= monitor.y + monitor.height)
894 *y += widget->allocation.height; 895 *y += widget->allocation.height;
895 else if ((*y - menu_req.height) >= monitor.y) 896 else if ((*y - menu_req.height) >= monitor.y)
896 *y -= menu_req.height; 897 *y -= menu_req.height;
897 else if (monitor.y + monitor.height - (*y + widget->allocation.height) > *y) 898 else if (monitor.y + monitor.height - (*y + widget->allocation.height) > *y)
898 *y += widget->allocation.height; 899 *y += widget->allocation.height;
899 else 900 else
900 *y -= menu_req.height; 901 *y -= menu_req.height;
901 *push_in = FALSE; 902 *push_in = FALSE;
902 } 903 }
903 904
904 static void pidgin_menu_clicked(GtkWidget *button, GtkMenu *menu) { 905 static void pidgin_menu_clicked(GtkWidget *button, GtkMenu *menu)
906 {
905 gtk_widget_show_all(GTK_WIDGET(menu)); 907 gtk_widget_show_all(GTK_WIDGET(menu));
906 gtk_menu_popup(menu, NULL, NULL, menu_position_func, button, 0, gtk_get_current_event_time()); 908 gtk_menu_popup(menu, NULL, NULL, menu_position_func, button, 0, gtk_get_current_event_time());
907 } 909 }
908 910
909 static void pidgin_menu_deactivate(GtkWidget *menu, GtkToggleButton *button) { 911 static void pidgin_menu_deactivate(GtkWidget *menu, GtkToggleButton *button)
912 {
910 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); 913 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
911 } 914 }
912 915
913 enum { 916 enum {
914 LAST_SIGNAL 917 LAST_SIGNAL
1024 /* Insert Smiley */ 1027 /* Insert Smiley */
1025 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY); 1028 button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SMILEY);
1026 g_signal_connect(G_OBJECT(button), "clicked", 1029 g_signal_connect(G_OBJECT(button), "clicked",
1027 G_CALLBACK(insert_smiley_cb), toolbar); 1030 G_CALLBACK(insert_smiley_cb), toolbar);
1028 toolbar->smiley = button; 1031 toolbar->smiley = button;
1029 1032 }
1030 1033
1034 static void
1035 button_sensitiveness_changed(GtkWidget *button, gpointer dontcare, GtkWidget *item)
1036 {
1037 gtk_widget_set_sensitive(item, GTK_WIDGET_IS_SENSITIVE(button));
1038 }
1039
1040 static void
1041 update_menuitem(GtkToggleButton *button, GtkCheckMenuItem *item)
1042 {
1043 g_signal_handlers_block_by_func(G_OBJECT(item), G_CALLBACK(gtk_button_clicked), button);
1044 gtk_check_menu_item_set_active(item, gtk_toggle_button_get_active(button));
1045 g_signal_handlers_unblock_by_func(G_OBJECT(item), G_CALLBACK(gtk_button_clicked), button);
1031 } 1046 }
1032 1047
1033 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar) 1048 static void gtk_imhtmltoolbar_init (GtkIMHtmlToolbar *toolbar)
1034 { 1049 {
1035 GtkWidget *hbox = GTK_WIDGET(toolbar); 1050 GtkWidget *hbox = GTK_WIDGET(toolbar);
1040 GtkWidget *font_button; 1055 GtkWidget *font_button;
1041 GtkWidget *font_menu; 1056 GtkWidget *font_menu;
1042 GtkWidget *insert_menu; 1057 GtkWidget *insert_menu;
1043 GtkWidget *button; 1058 GtkWidget *button;
1044 GtkWidget *sep; 1059 GtkWidget *sep;
1060 int i;
1061 struct {
1062 const char *label;
1063 GtkWidget **button;
1064 } buttons[] = {
1065 {_("_Bold"), &toolbar->bold},
1066 {_("_Italic"), &toolbar->italic},
1067 {_("_Underline"), &toolbar->underline},
1068 {_("_Larger"), &toolbar->larger_size},
1069 #if 0
1070 {_("_Normal"), &toolbar->normal_size},
1071 #endif
1072 {_("_Smaller"), &toolbar->smaller_size},
1073 {_("_Font face"), &toolbar->font},
1074 {_("_Foreground color"), &toolbar->fgcolor},
1075 {_("_Background color"), &toolbar->bgcolor},
1076 {NULL, NULL}
1077 };
1078
1045 1079
1046 toolbar->imhtml = NULL; 1080 toolbar->imhtml = NULL;
1047 toolbar->font_dialog = NULL; 1081 toolbar->font_dialog = NULL;
1048 toolbar->fgcolor_dialog = NULL; 1082 toolbar->fgcolor_dialog = NULL;
1049 toolbar->bgcolor_dialog = NULL; 1083 toolbar->bgcolor_dialog = NULL;
1055 1089
1056 gtk_box_set_spacing(GTK_BOX(toolbar), 3); 1090 gtk_box_set_spacing(GTK_BOX(toolbar), 3);
1057 1091
1058 gtk_imhtmltoolbar_create_old_buttons(toolbar); 1092 gtk_imhtmltoolbar_create_old_buttons(toolbar);
1059 1093
1060 /* Bold */ 1094 /* Fonts */
1061 font_button = gtk_toggle_button_new(); 1095 font_button = gtk_toggle_button_new();
1062 gtk_button_set_relief(GTK_BUTTON(font_button), GTK_RELIEF_NONE); 1096 gtk_button_set_relief(GTK_BUTTON(font_button), GTK_RELIEF_NONE);
1063 bbox = gtk_hbox_new(FALSE, 3); 1097 bbox = gtk_hbox_new(FALSE, 3);
1064 gtk_container_add(GTK_CONTAINER(font_button), bbox); 1098 gtk_container_add(GTK_CONTAINER(font_button), bbox);
1065 image = gtk_image_new_from_stock(GTK_STOCK_BOLD, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); 1099 image = gtk_image_new_from_stock(GTK_STOCK_BOLD, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1068 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1102 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1069 gtk_box_pack_start(GTK_BOX(hbox), font_button, FALSE, FALSE, 0); 1103 gtk_box_pack_start(GTK_BOX(hbox), font_button, FALSE, FALSE, 0);
1070 gtk_widget_show_all(font_button); 1104 gtk_widget_show_all(font_button);
1071 1105
1072 font_menu = gtk_menu_new(); 1106 font_menu = gtk_menu_new();
1073 1107
1074 button = gtk_check_menu_item_new_with_mnemonic(_("_Bold")); 1108 for (i = 0; buttons[i].label; i++) {
1075 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->bold); 1109 GtkWidget *old = *buttons[i].button;
1076 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button); 1110 GtkWidget *menuitem = gtk_check_menu_item_new_with_mnemonic(buttons[i].label);
1077 1111 g_signal_connect_swapped(G_OBJECT(menuitem), "activate",
1078 button = gtk_check_menu_item_new_with_mnemonic(_("_Italic")); 1112 G_CALLBACK(gtk_button_clicked), old);
1079 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->italic); 1113 g_signal_connect_after(G_OBJECT(old), "toggled",
1080 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button); 1114 G_CALLBACK(update_menuitem), menuitem);
1081 1115 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), menuitem);
1082 button = gtk_check_menu_item_new_with_mnemonic(_("_Underline")); 1116 g_signal_connect(G_OBJECT(old), "notify::sensitive",
1083 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->underline); 1117 G_CALLBACK(button_sensitiveness_changed), menuitem);
1084 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button); 1118 }
1085 1119
1086 button = gtk_menu_item_new_with_mnemonic(_("_Larger"));
1087 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->larger_size);
1088 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1089
1090 button = gtk_menu_item_new_with_mnemonic(_("_Normal"));
1091 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->normal_size);
1092 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1093
1094 button = gtk_menu_item_new_with_mnemonic(_("_Smaller"));
1095 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->smaller_size);
1096 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1097
1098 button = gtk_menu_item_new_with_mnemonic(_("_Font face"));
1099 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->font);
1100 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1101
1102 button = gtk_menu_item_new_with_mnemonic(_("_Foreground color"));
1103 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->fgcolor);
1104 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1105
1106 button = gtk_menu_item_new_with_mnemonic(_("_Background color"));
1107 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->bgcolor);
1108 gtk_menu_shell_append(GTK_MENU_SHELL(font_menu), button);
1109
1110 g_signal_connect(G_OBJECT(font_button), "clicked", G_CALLBACK(pidgin_menu_clicked), font_menu); 1120 g_signal_connect(G_OBJECT(font_button), "clicked", G_CALLBACK(pidgin_menu_clicked), font_menu);
1111 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button); 1121 g_signal_connect(G_OBJECT(font_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), font_button);
1112 1122
1113 /* Sep */ 1123 /* Sep */
1114 sep = gtk_vseparator_new(); 1124 sep = gtk_vseparator_new();
1115 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); 1125 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
1116 gtk_widget_show_all(sep); 1126 gtk_widget_show_all(sep);
1133 /* Sep */ 1143 /* Sep */
1134 sep = gtk_vseparator_new(); 1144 sep = gtk_vseparator_new();
1135 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); 1145 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
1136 gtk_widget_show_all(sep); 1146 gtk_widget_show_all(sep);
1137 1147
1138 /* Insert Link */ 1148 /* Insert */
1139 insert_button = gtk_toggle_button_new(); 1149 insert_button = gtk_toggle_button_new();
1140 gtk_button_set_relief(GTK_BUTTON(insert_button), GTK_RELIEF_NONE); 1150 gtk_button_set_relief(GTK_BUTTON(insert_button), GTK_RELIEF_NONE);
1141 bbox = gtk_hbox_new(FALSE, 3); 1151 bbox = gtk_hbox_new(FALSE, 3);
1142 gtk_container_add(GTK_CONTAINER(insert_button), bbox); 1152 gtk_container_add(GTK_CONTAINER(insert_button), bbox);
1143 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); 1153 image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_INSERT, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
1146 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); 1156 gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
1147 gtk_box_pack_start(GTK_BOX(hbox), insert_button, FALSE, FALSE, 0); 1157 gtk_box_pack_start(GTK_BOX(hbox), insert_button, FALSE, FALSE, 0);
1148 gtk_widget_show_all(insert_button); 1158 gtk_widget_show_all(insert_button);
1149 1159
1150 insert_menu = gtk_menu_new(); 1160 insert_menu = gtk_menu_new();
1151 1161
1152 button = gtk_menu_item_new_with_mnemonic(_("_Smiley")); 1162 button = gtk_menu_item_new_with_mnemonic(_("_Smiley"));
1153 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->smiley); 1163 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
1154 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); 1164 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button);
1155 1165
1156 button = gtk_menu_item_new_with_mnemonic(_("_Image")); 1166 button = gtk_menu_item_new_with_mnemonic(_("_Image"));
1157 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image); 1167 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image);
1158 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); 1168 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button);
1159 1169
1160 button = gtk_menu_item_new_with_mnemonic(_("_Link")); 1170 button = gtk_menu_item_new_with_mnemonic(_("_Link"));
1161 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link); 1171 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link);
1162 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); 1172 gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button);
1163 1173
1164 g_signal_connect(G_OBJECT(insert_button), "clicked", G_CALLBACK(pidgin_menu_clicked), insert_menu); 1174 g_signal_connect(G_OBJECT(insert_button), "clicked", G_CALLBACK(pidgin_menu_clicked), insert_menu);
1165 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button); 1175 g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button);
1166 toolbar->sml = NULL; 1176 toolbar->sml = NULL;
1167 } 1177 }
1168 1178