Mercurial > pidgin
comparison src/gtkimhtml.c @ 10901:0711078e0e2d
[gaim-migrate @ 12622]
This fixes losing the HTML clipboard contents when the window is closed. Also make sure that the various clipboard initialization functions succeed before doing things that depend on them.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 05 May 2005 18:31:36 +0000 |
parents | d056acc96b30 |
children | ea9e65f52b4b |
comparison
equal
deleted
inserted
replaced
10900:d056acc96b30 | 10901:0711078e0e2d |
---|---|
42 #ifdef HAVE_LANGINFO_CODESET | 42 #ifdef HAVE_LANGINFO_CODESET |
43 #include <langinfo.h> | 43 #include <langinfo.h> |
44 #include <locale.h> | 44 #include <locale.h> |
45 #endif | 45 #endif |
46 #ifdef _WIN32 | 46 #ifdef _WIN32 |
47 #include <gdk/gdkwin32.h> | |
47 #include <windows.h> | 48 #include <windows.h> |
48 #endif | 49 #endif |
49 | 50 |
50 #ifdef ENABLE_NLS | 51 #ifdef ENABLE_NLS |
51 # include <libintl.h> | 52 # include <libintl.h> |
93 static void gtk_imhtml_link_drag_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, GtkSelectionData *sd, guint info, guint t, GtkIMHtml *imhtml); | 94 static void gtk_imhtml_link_drag_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, GtkSelectionData *sd, guint info, guint t, GtkIMHtml *imhtml); |
94 static void mark_set_cb(GtkTextBuffer *buffer, GtkTextIter *arg1, GtkTextMark *mark, GtkIMHtml *imhtml); | 95 static void mark_set_cb(GtkTextBuffer *buffer, GtkTextIter *arg1, GtkTextMark *mark, GtkIMHtml *imhtml); |
95 static void hijack_menu_cb(GtkIMHtml *imhtml, GtkMenu *menu, gpointer data); | 96 static void hijack_menu_cb(GtkIMHtml *imhtml, GtkMenu *menu, gpointer data); |
96 static void paste_received_cb (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer data); | 97 static void paste_received_cb (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer data); |
97 static void paste_plaintext_received_cb (GtkClipboard *clipboard, const gchar *text, gpointer data); | 98 static void paste_plaintext_received_cb (GtkClipboard *clipboard, const gchar *text, gpointer data); |
99 static void imhtml_paste_insert(GtkIMHtml *imhtml, const char *text, gboolean plaintext); | |
98 | 100 |
99 /* POINT_SIZE converts from AIM font sizes to a point size scale factor. */ | 101 /* POINT_SIZE converts from AIM font sizes to a point size scale factor. */ |
100 #define MAX_FONT_SIZE 7 | 102 #define MAX_FONT_SIZE 7 |
101 #define POINT_SIZE(x) (_point_sizes [MIN ((x > 0 ? x : 1), MAX_FONT_SIZE) - 1]) | 103 #define POINT_SIZE(x) (_point_sizes [MIN ((x > 0 ? x : 1), MAX_FONT_SIZE) - 1]) |
102 static gdouble _point_sizes [] = { .69444444, .8333333, 1, 1.2, 1.44, 1.728, 2.0736}; | 104 static gdouble _point_sizes [] = { .69444444, .8333333, 1, 1.2, 1.44, 1.728, 2.0736}; |
218 #if 0 /* Debugging for Windows clipboard */ | 220 #if 0 /* Debugging for Windows clipboard */ |
219 gaim_debug_info("imhtml clipboard", "from gaim: %s\n", ret); | 221 gaim_debug_info("imhtml clipboard", "from gaim: %s\n", ret); |
220 #endif | 222 #endif |
221 | 223 |
222 return ret; | 224 return ret; |
225 } | |
226 | |
227 static void clipboard_copy_html_win32(GtkIMHtml *imhtml) { | |
228 gchar *clipboard = clipboard_html_to_win32(imhtml->clipboard_html_string); | |
229 if (clipboard != NULL) { | |
230 HWND hwnd = GDK_WINDOW_HWND(GTK_WIDGET(imhtml)->window); | |
231 if (OpenClipboard(hwnd)) { | |
232 if (EmptyClipboard()) { | |
233 gint length = strlen(clipboard); | |
234 HGLOBAL hdata = GlobalAlloc(GMEM_MOVEABLE, length); | |
235 if (hdata != NULL) { | |
236 gchar *buffer = GlobalLock(hdata); | |
237 memcpy(buffer, clipboard, length); | |
238 GlobalUnlock(hdata); | |
239 | |
240 if (SetClipboardData(win_html_fmt, hdata) == NULL) { | |
241 gchar *err_msg = | |
242 g_win32_error_message(GetLastError()); | |
243 gaim_debug_info("html clipboard", | |
244 "Unable to set clipboard data: %s\n", | |
245 err_msg ? err_msg : "Unknown Error"); | |
246 g_free(err_msg); | |
247 } | |
248 } | |
249 } | |
250 CloseClipboard(); | |
251 } | |
252 g_free(clipboard); | |
253 } | |
254 } | |
255 | |
256 static gboolean clipboard_paste_html_win32(GtkIMHtml *imhtml) { | |
257 gboolean pasted = FALSE; | |
258 | |
259 if (gtk_text_view_get_editable(GTK_TEXT_VIEW(imhtml)) | |
260 && IsClipboardFormatAvailable(win_html_fmt)) { | |
261 gboolean error_reading_clipboard = FALSE; | |
262 HWND hwnd = GDK_WINDOW_HWND(GTK_WIDGET(imhtml)->window); | |
263 | |
264 if (OpenClipboard(hwnd)) { | |
265 HGLOBAL hdata = GetClipboardData(win_html_fmt); | |
266 if (hdata == NULL) { | |
267 error_reading_clipboard = TRUE; | |
268 } else { | |
269 char *buffer = GlobalLock(hdata); | |
270 if (buffer == NULL) { | |
271 error_reading_clipboard = TRUE; | |
272 } else { | |
273 char *text = clipboard_win32_to_html( | |
274 buffer); | |
275 imhtml_paste_insert(imhtml, text, | |
276 FALSE); | |
277 g_free(text); | |
278 pasted = TRUE; | |
279 } | |
280 GlobalUnlock(hdata); | |
281 } | |
282 | |
283 CloseClipboard(); | |
284 | |
285 } else { | |
286 error_reading_clipboard = TRUE; | |
287 } | |
288 | |
289 if (error_reading_clipboard) { | |
290 gchar *err_msg = g_win32_error_message(GetLastError()); | |
291 gaim_debug_info("html clipboard", | |
292 "Unable to read clipboard data: %s\n", | |
293 err_msg ? err_msg : "Unknown Error"); | |
294 g_free(err_msg); | |
295 } | |
296 } | |
297 | |
298 return pasted; | |
223 } | 299 } |
224 #endif | 300 #endif |
225 | 301 |
226 static GtkSmileyTree* | 302 static GtkSmileyTree* |
227 gtk_smiley_tree_new () | 303 gtk_smiley_tree_new () |
789 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); | 865 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); |
790 | 866 |
791 #ifdef _WIN32 | 867 #ifdef _WIN32 |
792 /* We're going to still copy plain text, but let's toss the "HTML Format" | 868 /* We're going to still copy plain text, but let's toss the "HTML Format" |
793 we need into the windows clipboard now as well. */ | 869 we need into the windows clipboard now as well. */ |
794 HGLOBAL hdata; | 870 clipboard_copy_html_win32(imhtml); |
795 gchar *clipboard = clipboard_html_to_win32(imhtml->clipboard_html_string); | |
796 gchar *buffer; | |
797 gint length = strlen(clipboard); | |
798 if(clipboard != NULL) { | |
799 OpenClipboard(NULL); | |
800 hdata = GlobalAlloc(GMEM_MOVEABLE, length); | |
801 buffer = GlobalLock(hdata); | |
802 memcpy(buffer, clipboard, length); | |
803 GlobalUnlock(hdata); | |
804 SetClipboardData(win_html_fmt, hdata); | |
805 CloseClipboard(); | |
806 g_free(clipboard); | |
807 } | |
808 #endif | 871 #endif |
809 | 872 |
810 g_signal_stop_emission_by_name(imhtml, "copy-clipboard"); | 873 g_signal_stop_emission_by_name(imhtml, "copy-clipboard"); |
811 } | 874 } |
812 | 875 |
833 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); | 896 imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); |
834 | 897 |
835 #ifdef _WIN32 | 898 #ifdef _WIN32 |
836 /* We're going to still copy plain text, but let's toss the "HTML Format" | 899 /* We're going to still copy plain text, but let's toss the "HTML Format" |
837 we need into the windows clipboard now as well. */ | 900 we need into the windows clipboard now as well. */ |
838 HGLOBAL hdata; | 901 clipboard_copy_html_win32(imhtml); |
839 gchar *clipboard = clipboard_html_to_win32(imhtml->clipboard_html_string); | |
840 gchar *buffer; | |
841 gint length = strlen(clipboard); | |
842 if(clipboard != NULL) { | |
843 OpenClipboard(NULL); | |
844 hdata = GlobalAlloc(GMEM_MOVEABLE, length); | |
845 buffer = GlobalLock(hdata); | |
846 memcpy(buffer, clipboard, length); | |
847 GlobalUnlock(hdata); | |
848 SetClipboardData(win_html_fmt, hdata); | |
849 CloseClipboard(); | |
850 g_free(clipboard); | |
851 } | |
852 #endif | 902 #endif |
853 | 903 |
854 if (imhtml->editable) | 904 if (imhtml->editable) |
855 gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE); | 905 gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE); |
856 g_signal_stop_emission_by_name(imhtml, "cut-clipboard"); | 906 g_signal_stop_emission_by_name(imhtml, "cut-clipboard"); |
950 | 1000 |
951 static void paste_clipboard_cb(GtkIMHtml *imhtml, gpointer blah) | 1001 static void paste_clipboard_cb(GtkIMHtml *imhtml, gpointer blah) |
952 { | 1002 { |
953 #ifdef _WIN32 | 1003 #ifdef _WIN32 |
954 /* If we're on windows, let's see if we can get data from the HTML Format | 1004 /* If we're on windows, let's see if we can get data from the HTML Format |
955 clipboard before we try to paste from the GTK+ buffer */ | 1005 clipboard before we try to paste from the GTK buffer */ |
956 HGLOBAL hdata; | 1006 if (!clipboard_paste_html_win32(imhtml)) { |
957 DWORD err; | |
958 char *buffer; | |
959 char *text; | |
960 | |
961 if (!gtk_text_view_get_editable(GTK_TEXT_VIEW(imhtml))) | |
962 return; | |
963 | |
964 if (IsClipboardFormatAvailable(win_html_fmt)) { | |
965 OpenClipboard(NULL); | |
966 hdata = GetClipboardData(win_html_fmt); | |
967 if (hdata == NULL) { | |
968 err = GetLastError(); | |
969 gaim_debug_info("html clipboard", "error number %u! See http://msdn.microsoft.com/library/en-us/debug/base/system_error_codes.asp\n", err); | |
970 CloseClipboard(); | |
971 return; | |
972 } | |
973 buffer = GlobalLock(hdata); | |
974 if (buffer == NULL) { | |
975 err = GetLastError(); | |
976 gaim_debug_info("html clipboard", "error number %u! See http://msdn.microsoft.com/library/en-us/debug/base/system_error_codes.asp\n", err); | |
977 CloseClipboard(); | |
978 return; | |
979 } | |
980 text = clipboard_win32_to_html(buffer); | |
981 GlobalUnlock(hdata); | |
982 CloseClipboard(); | |
983 | |
984 imhtml_paste_insert(imhtml, text, FALSE); | |
985 g_free(text); | |
986 } else { | |
987 #endif | 1007 #endif |
988 GtkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD); | 1008 GtkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD); |
989 gtk_clipboard_request_contents(clipboard, gdk_atom_intern("text/html", FALSE), | 1009 gtk_clipboard_request_contents(clipboard, gdk_atom_intern("text/html", FALSE), |
990 paste_received_cb, imhtml); | 1010 paste_received_cb, imhtml); |
991 #ifdef _WIN32 | 1011 #ifdef _WIN32 |