pidgin/gtkimhtml.c

branch
release-2.1.0
changeset 18103
0b37f2f70dfb
parent 18086
1d1c5850b248
parent 17546
51b1c1e2c3fe
child 18108
cb8669f16994
equal deleted inserted replaced
18102:9139e4655e6f 18103:0b37f2f70dfb
142 REDO, 142 REDO,
143 LAST_SIGNAL 143 LAST_SIGNAL
144 }; 144 };
145 static guint signals [LAST_SIGNAL] = { 0 }; 145 static guint signals [LAST_SIGNAL] = { 0 };
146 146
147 static char *html_clipboard = NULL;
148 static char *text_clipboard = NULL;
149 GtkClipboard *clipboard_selection = NULL;
150
147 static GtkTargetEntry selection_targets[] = { 151 static GtkTargetEntry selection_targets[] = {
148 #ifndef _WIN32 152 #ifndef _WIN32
149 { "text/html", 0, TARGET_HTML }, 153 { "text/html", 0, TARGET_HTML },
150 #else 154 #else
151 { "HTML Format", 0, TARGET_HTML }, 155 { "HTML Format", 0, TARGET_HTML },
873 } 877 }
874 878
875 879
876 static void gtk_imhtml_clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, GtkIMHtml *imhtml) { 880 static void gtk_imhtml_clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, GtkIMHtml *imhtml) {
877 char *text = NULL; 881 char *text = NULL;
878 gboolean primary; 882 gboolean primary = (clipboard != clipboard_selection);
879 GtkTextIter start, end; 883 GtkTextIter start, end;
880 GtkTextMark *sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer); 884 GtkTextMark *sel = NULL;
881 GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer); 885 GtkTextMark *ins = NULL;
882 886
883 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, sel); 887 if (primary) {
884 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &end, ins); 888 ins = gtk_text_buffer_get_insert(imhtml->text_buffer);
885 primary = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_PRIMARY) == clipboard; 889 sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer);
890 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, sel);
891 gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &end, ins);
892 }
886 893
887 if (info == TARGET_HTML) { 894 if (info == TARGET_HTML) {
888 char *selection; 895 char *selection;
889 #ifndef _WIN32 896 #ifndef _WIN32
890 gsize len; 897 gsize len;
891 GString *str = g_string_new(NULL); 898 GString *str = g_string_new(NULL);
892 if (primary) { 899 if (primary) {
893 text = gtk_imhtml_get_markup_range(imhtml, &start, &end); 900 text = gtk_imhtml_get_markup_range(imhtml, &start, &end);
894 } else 901 } else
895 text = imhtml->clipboard_html_string; 902 text = html_clipboard;
896 903
897 /* Mozilla asks that we start our text/html with the Unicode byte order mark */ 904 /* Mozilla asks that we start our text/html with the Unicode byte order mark */
898 str = g_string_append_unichar(str, 0xfeff); 905 str = g_string_append_unichar(str, 0xfeff);
899 str = g_string_append(str, text); 906 str = g_string_append(str, text);
900 str = g_string_append_unichar(str, 0x0000); 907 str = g_string_append_unichar(str, 0x0000);
908 g_free(selection); 915 g_free(selection);
909 } else { 916 } else {
910 if (primary) { 917 if (primary) {
911 text = gtk_imhtml_get_text(imhtml, &start, &end); 918 text = gtk_imhtml_get_text(imhtml, &start, &end);
912 } else 919 } else
913 text = imhtml->clipboard_text_string; 920 text = text_clipboard;
914 gtk_selection_data_set_text(selection_data, text, strlen(text)); 921 gtk_selection_data_set_text(selection_data, text, strlen(text));
915 } 922 }
916 if (primary) /* This was allocated here */ 923 if (primary) /* This was allocated here */
917 g_free(text); 924 g_free(text);
918 } 925 }
931 gtk_text_buffer_move_mark (imhtml->text_buffer, 938 gtk_text_buffer_move_mark (imhtml->text_buffer,
932 gtk_text_buffer_get_mark (imhtml->text_buffer, "selection_bound"), 939 gtk_text_buffer_get_mark (imhtml->text_buffer, "selection_bound"),
933 &insert); 940 &insert);
934 } 941 }
935 942
943 static void gtk_imhtml_clipboard_clear (GtkClipboard *clipboard, GtkSelectionData *sel_data,
944 guint info, gpointer user_data_or_owner)
945 {
946 clipboard_selection = NULL;
947 }
948
936 static void copy_clipboard_cb(GtkIMHtml *imhtml, gpointer unused) 949 static void copy_clipboard_cb(GtkIMHtml *imhtml, gpointer unused)
937 { 950 {
938 GtkTextIter start, end; 951 GtkTextIter start, end;
939 if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { 952 if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) {
940 gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD), 953 if (!clipboard_selection)
954 clipboard_selection = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD);
955 gtk_clipboard_set_with_owner(clipboard_selection,
941 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry), 956 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
942 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get, 957 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
943 (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml)); 958 (GtkClipboardClearFunc)gtk_imhtml_clipboard_clear, G_OBJECT(imhtml));
944 959
945 g_free(imhtml->clipboard_html_string); 960 g_free(imhtml->clipboard_html_string);
946 g_free(imhtml->clipboard_text_string); 961 g_free(imhtml->clipboard_text_string);
947 962
948 imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end); 963 imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
949 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); 964 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
965
966 text_clipboard = imhtml->clipboard_text_string;
967 html_clipboard = imhtml->clipboard_html_string;
968
950 } 969 }
951 970
952 g_signal_stop_emission_by_name(imhtml, "copy-clipboard"); 971 g_signal_stop_emission_by_name(imhtml, "copy-clipboard");
953 } 972 }
954 973
955 static void cut_clipboard_cb(GtkIMHtml *imhtml, gpointer unused) 974 static void cut_clipboard_cb(GtkIMHtml *imhtml, gpointer unused)
956 { 975 {
957 GtkTextIter start, end; 976 GtkTextIter start, end;
958 if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) { 977 if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) {
959 gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD), 978 if (!clipboard_selection)
979 clipboard_selection = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD);
980 gtk_clipboard_set_with_owner(clipboard_selection,
960 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry), 981 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
961 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get, 982 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
962 (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml)); 983 (GtkClipboardClearFunc)gtk_imhtml_clipboard_clear, G_OBJECT(imhtml));
963 984
964 g_free(imhtml->clipboard_html_string); 985 g_free(imhtml->clipboard_html_string);
965 g_free(imhtml->clipboard_text_string); 986 g_free(imhtml->clipboard_text_string);
966 987
967 imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end); 988 imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
968 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); 989 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
990
991 text_clipboard = imhtml->clipboard_text_string;
992 html_clipboard = imhtml->clipboard_html_string;
969 993
970 if (imhtml->editable) 994 if (imhtml->editable)
971 gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE); 995 gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE);
972 } 996 }
973 997
1218 if (imhtml->funcs->image_unref) 1242 if (imhtml->funcs->image_unref)
1219 imhtml->funcs->image_unref(img_data->id); 1243 imhtml->funcs->image_unref(img_data->id);
1220 g_free(img_data); 1244 g_free(img_data);
1221 } 1245 }
1222 1246
1223 if (imhtml->clipboard_text_string) {
1224 g_free(imhtml->clipboard_text_string);
1225 g_free(imhtml->clipboard_html_string);
1226 }
1227
1228 g_list_free(imhtml->scalables); 1247 g_list_free(imhtml->scalables);
1229 g_slist_free(imhtml->im_images); 1248 g_slist_free(imhtml->im_images);
1230 g_queue_free(imhtml->animations); 1249 g_queue_free(imhtml->animations);
1231 g_free(imhtml->protocol_name); 1250 g_free(imhtml->protocol_name);
1232 g_free(imhtml->search_string); 1251 g_free(imhtml->search_string);
1233 g_object_unref(imhtml->undo_manager); 1252 g_object_unref(imhtml->undo_manager);
1234 G_OBJECT_CLASS(parent_class)->finalize (object); 1253 G_OBJECT_CLASS(parent_class)->finalize (object);
1254 if (clipboard_selection)
1255 gtk_clipboard_set_with_owner(clipboard_selection,
1256 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
1257 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
1258 (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml));
1259
1235 } 1260 }
1236 1261
1237 /* Boring GTK+ stuff */ 1262 /* Boring GTK+ stuff */
1238 static void gtk_imhtml_class_init (GtkIMHtmlClass *klass) 1263 static void gtk_imhtml_class_init (GtkIMHtmlClass *klass)
1239 { 1264 {

mercurial