Fix for #163702, from Ivan Wong:

2005-01-23  Tor Lillqvist  <tml@novell.com>

	Fix for #163702, from Ivan Wong:

	* gdk/win32/gdkprivate-win32.h
	* gdk/win32/gdkglobals-win32.c: New flag _ignore_destroy_clipboard.

	* gdk/win32/gdkevents-win32.c (gdk_event_translate): Handle
	WM_DESTROYCLIPBOARD. Unless _ignore_destroy_clipboard, generate a
	GDK_SELECTION_CLEAR event.

	* gdk/win32/gdkselection-win32.c
	(gdk_selection_owner_set_for_display): Set _ignore_destroy_clipboard
	when emptying the clipboard ourselves.

	(gdk_selection_send_notify_for_display): Remove the artifical
	GDK_SELECTION_CLEAR event generation.
This commit is contained in:
Tor Lillqvist 2005-01-23 00:38:17 +00:00 committed by Tor Lillqvist
parent 26629f7a93
commit 736f4c8758
7 changed files with 69 additions and 32 deletions

View File

@ -16,6 +16,22 @@
connected or not, so it's easier to just not try getting the
volume name for them. See the bug report for discussion.
Fix for #163702, from Ivan Wong:
* gdk/win32/gdkprivate-win32.h
* gdk/win32/gdkglobals-win32.c: New flag _ignore_destroy_clipboard.
* gdk/win32/gdkevents-win32.c (gdk_event_translate): Handle
WM_DESTROYCLIPBOARD. Unless _ignore_destroy_clipboard, generate a
GDK_SELECTION_CLEAR event.
* gdk/win32/gdkselection-win32.c
(gdk_selection_owner_set_for_display): Set _ignore_destroy_clipboard
when emptying the clipboard ourselves.
(gdk_selection_send_notify_for_display): Remove the artifical
GDK_SELECTION_CLEAR event generation.
2005-01-21 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkwidget.c (gtk_widget_get_accessible): More details

View File

@ -16,6 +16,22 @@
connected or not, so it's easier to just not try getting the
volume name for them. See the bug report for discussion.
Fix for #163702, from Ivan Wong:
* gdk/win32/gdkprivate-win32.h
* gdk/win32/gdkglobals-win32.c: New flag _ignore_destroy_clipboard.
* gdk/win32/gdkevents-win32.c (gdk_event_translate): Handle
WM_DESTROYCLIPBOARD. Unless _ignore_destroy_clipboard, generate a
GDK_SELECTION_CLEAR event.
* gdk/win32/gdkselection-win32.c
(gdk_selection_owner_set_for_display): Set _ignore_destroy_clipboard
when emptying the clipboard ourselves.
(gdk_selection_send_notify_for_display): Remove the artifical
GDK_SELECTION_CLEAR event generation.
2005-01-21 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkwidget.c (gtk_widget_get_accessible): More details

View File

@ -16,6 +16,22 @@
connected or not, so it's easier to just not try getting the
volume name for them. See the bug report for discussion.
Fix for #163702, from Ivan Wong:
* gdk/win32/gdkprivate-win32.h
* gdk/win32/gdkglobals-win32.c: New flag _ignore_destroy_clipboard.
* gdk/win32/gdkevents-win32.c (gdk_event_translate): Handle
WM_DESTROYCLIPBOARD. Unless _ignore_destroy_clipboard, generate a
GDK_SELECTION_CLEAR event.
* gdk/win32/gdkselection-win32.c
(gdk_selection_owner_set_for_display): Set _ignore_destroy_clipboard
when emptying the clipboard ourselves.
(gdk_selection_send_notify_for_display): Remove the artifical
GDK_SELECTION_CLEAR event generation.
2005-01-21 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkwidget.c (gtk_widget_get_accessible): More details

View File

@ -3353,7 +3353,19 @@ gdk_event_translate (GdkDisplay *display,
handle_display_change ();
break;
case WM_DESTROYCLIPBOARD:
if (!_ignore_destroy_clipboard)
{
event = gdk_event_new (GDK_SELECTION_CLEAR);
event->selection.window = window;
event->selection.selection = GDK_SELECTION_CLIPBOARD;
event->selection.time = _gdk_win32_get_next_tick (msg->time);
append_event (display, event);
}
else
return_val = TRUE;
break;
#ifdef HAVE_WINTAB
/* Handle WINTAB events here, as we know that gdkinput.c will
* use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the

View File

@ -66,3 +66,4 @@ gint _gdk_input_ignore_wintab = FALSE;
gint _gdk_max_colors = 0;
gboolean _sizemove_in_progress = FALSE;
gboolean _ignore_destroy_clipboard = FALSE;

View File

@ -500,6 +500,9 @@ extern gint _gdk_max_colors;
/* TRUE while a user-initiated window move or resize operation is in progress */
extern gboolean _sizemove_in_progress;
/* TRUE when we are emptying the clipboard ourselves */
extern gboolean _ignore_destroy_clipboard;
/* Initialization */
void _gdk_windowing_window_init (void);
void _gdk_root_window_size_init (void);

View File

@ -238,16 +238,15 @@ gdk_selection_owner_set_for_display (GdkDisplay *display,
if (!API_CALL (OpenClipboard, (hwnd)))
return FALSE;
_ignore_destroy_clipboard = TRUE;
if (!API_CALL (EmptyClipboard, ()))
{
_ignore_destroy_clipboard = FALSE;
API_CALL (CloseClipboard, ());
return FALSE;
}
#if 0
/* No delayed rendering */
if (hwnd != NULL)
SetClipboardData (CF_TEXT, NULL);
#endif
_ignore_destroy_clipboard = FALSE;
if (!API_CALL (CloseClipboard, ()))
return FALSE;
@ -729,32 +728,6 @@ gdk_selection_send_notify_for_display (GdkDisplay *display,
g_free (sel_name),
g_free (tgt_name),
g_free (prop_name)));
/* Send ourselves a selection clear message so that gtk thinks we
* don't have the selection, and will claim it anew when needed, and
* we thus get a chance to store data in the Windows clipboard.
* Otherwise, if a gtkeditable does a copy to CLIPBOARD several
* times only the first one actually gets copied to the Windows
* clipboard, as only the first one causes a call to
* gdk_property_change().
*
* Hmm, there is something fishy with this. Cut and paste inside the
* same app didn't work, the gtkeditable immediately forgot the
* clipboard contents in gtk_editable_selection_clear() as a result
* of this message. OTOH, when I changed gdk_selection_owner_get to
* return NULL for CLIPBOARD, it works. Sigh.
*/
tmp_event.selection.type = GDK_SELECTION_CLEAR;
tmp_event.selection.window = gdk_window_lookup (requestor);
tmp_event.selection.send_event = FALSE;
tmp_event.selection.selection = selection;
tmp_event.selection.target = 0;
tmp_event.selection.property = 0;
tmp_event.selection.requestor = 0;
tmp_event.selection.time = time;
gdk_event_put (&tmp_event);
}
/* It's hard to say whether implementing this actually is of any use