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