| 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); |
| 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 { |