Mercurial > pidgin.yaz
changeset 15050:d0f5147753dd
[gaim-migrate @ 17833]
Fix "Paste" and "Paste as Plain Text" from the imhtml on win32.
This was apparently broken by gtk changing how the clipboard is handled internally. This is a much cleaner way to do this anyway.
I should probably check if it works on GTK+ 2.6.10.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 28 Nov 2006 06:37:12 +0000 |
parents | b44d6517e16c |
children | f0ffd80aa196 |
files | gtk/gtkimhtml.c |
diffstat | 1 files changed, 22 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/gtk/gtkimhtml.c Tue Nov 28 00:15:31 2006 +0000 +++ b/gtk/gtkimhtml.c Tue Nov 28 06:37:12 2006 +0000 @@ -142,7 +142,11 @@ static guint signals [LAST_SIGNAL] = { 0 }; static GtkTargetEntry selection_targets[] = { +#ifndef _WIN32 { "text/html", 0, TARGET_HTML }, +#else + { "HTML Format", 0, TARGET_HTML }, +#endif { "UTF8_STRING", 0, TARGET_UTF8_STRING }, { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }, { "STRING", 0, TARGET_STRING }, @@ -153,11 +157,6 @@ }; #ifdef _WIN32 -/* Win32 clipboard format value, and functions to convert back and - * forth between HTML and the clipboard format. - */ -static UINT win_html_fmt; - static gchar * clipboard_win32_to_html(char *clipboard) { const char *header; @@ -241,38 +240,18 @@ return g_string_free(clipboard, FALSE); } -static void clipboard_copy_html_win32(GtkIMHtml *imhtml) { - gchar *clipboard = clipboard_html_to_win32(imhtml->clipboard_html_string); - if (clipboard != NULL) { - HWND hwnd = GDK_WINDOW_HWND(GTK_WIDGET(imhtml)->window); - if (OpenClipboard(hwnd)) { - if (EmptyClipboard()) { - gint length = strlen(clipboard); - HGLOBAL hdata = GlobalAlloc(GMEM_MOVEABLE, length); - if (hdata != NULL) { - gchar *buffer = GlobalLock(hdata); - memcpy(buffer, clipboard, length); - GlobalUnlock(hdata); - - if (SetClipboardData(win_html_fmt, hdata) == NULL) { - gchar *err_msg = - g_win32_error_message(GetLastError()); - gaim_debug_info("html clipboard", - "Unable to set clipboard data: %s\n", - err_msg ? err_msg : "Unknown Error"); - g_free(err_msg); - } - } - } - CloseClipboard(); - } - g_free(clipboard); - } -} - static gboolean clipboard_paste_html_win32(GtkIMHtml *imhtml) { gboolean pasted = FALSE; + /* Win32 clipboard format value, and functions to convert back and + * forth between HTML and the clipboard format. + */ + static UINT win_html_fmt = 0; + + /* Register HTML Format as desired clipboard format */ + if (!win_html_fmt) + win_html_fmt = RegisterClipboardFormat("HTML Format"); + if (gtk_text_view_get_editable(GTK_TEXT_VIEW(imhtml)) && IsClipboardFormatAvailable(win_html_fmt)) { gboolean error_reading_clipboard = FALSE; @@ -281,7 +260,8 @@ if (OpenClipboard(hwnd)) { HGLOBAL hdata = GetClipboardData(win_html_fmt); if (hdata == NULL) { - error_reading_clipboard = TRUE; + if (GetLastError() != ERROR_SUCCESS) + error_reading_clipboard = TRUE; } else { char *buffer = GlobalLock(hdata); if (buffer == NULL) { @@ -298,7 +278,6 @@ } CloseClipboard(); - } else { error_reading_clipboard = TRUE; } @@ -892,7 +871,7 @@ static void gtk_imhtml_clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, GtkIMHtml *imhtml) { - char *text; + char *text = NULL; gboolean primary; GtkTextIter start, end; GtkTextMark *sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer); @@ -903,8 +882,9 @@ primary = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_PRIMARY) == clipboard; if (info == TARGET_HTML) { + char *selection; +#ifndef _WIN32 gsize len; - char *selection; GString *str = g_string_new(NULL); if (primary) { text = gtk_imhtml_get_markup_range(imhtml, &start, &end); @@ -918,6 +898,10 @@ selection = g_convert(str->str, str->len, "UCS-2", "UTF-8", NULL, &len, NULL); gtk_selection_data_set(selection_data, gdk_atom_intern("text/html", FALSE), 16, (const guchar *)selection, len); g_string_free(str, TRUE); +#else + selection = clipboard_html_to_win32(imhtml->clipboard_html_string); + gtk_selection_data_set(selection_data, gdk_atom_intern("HTML Format", FALSE), 8, (const guchar *)selection, strlen(selection)); +#endif g_free(selection); } else { if (primary) { @@ -968,12 +952,6 @@ imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end); imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); -#ifdef _WIN32 - /* We're going to still copy plain text, but let's toss the "HTML Format" - we need into the windows clipboard now as well. */ - clipboard_copy_html_win32(imhtml); -#endif - g_signal_stop_emission_by_name(imhtml, "copy-clipboard"); } @@ -999,12 +977,6 @@ imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end); imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end); -#ifdef _WIN32 - /* We're going to still copy plain text, but let's toss the "HTML Format" - we need into the windows clipboard now as well. */ - clipboard_copy_html_win32(imhtml); -#endif - if (imhtml->editable) gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE); g_signal_stop_emission_by_name(imhtml, "cut-clipboard"); @@ -1431,11 +1403,6 @@ gtk_imhtml_set_editable(imhtml, FALSE); g_signal_connect(G_OBJECT(imhtml), "populate-popup", G_CALLBACK(hijack_menu_cb), NULL); - -#ifdef _WIN32 - /* Register HTML Format as desired clipboard format */ - win_html_fmt = RegisterClipboardFormat("HTML Format"); -#endif } GtkWidget *gtk_imhtml_new(void *a, void *b)