summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--ChangeLog.pre-2-816
-rw-r--r--gdk/win32/gdkevents-win32.c14
-rw-r--r--gdk/win32/gdkglobals-win32.c1
-rw-r--r--gdk/win32/gdkprivate-win32.h3
-rw-r--r--gdk/win32/gdkselection-win32.c35
7 files changed, 69 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index feaed22ac..4fb8bc9b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index feaed22ac..4fb8bc9b8 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -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
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index feaed22ac..4fb8bc9b8 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -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
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index 3e14cf904..e8560cfad 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -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
diff --git a/gdk/win32/gdkglobals-win32.c b/gdk/win32/gdkglobals-win32.c
index 4af1eb72d..3778d7fda 100644
--- a/gdk/win32/gdkglobals-win32.c
+++ b/gdk/win32/gdkglobals-win32.c
@@ -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;
diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h
index f614aadba..221e3429a 100644
--- a/gdk/win32/gdkprivate-win32.h
+++ b/gdk/win32/gdkprivate-win32.h
@@ -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);
diff --git a/gdk/win32/gdkselection-win32.c b/gdk/win32/gdkselection-win32.c
index 43e51cb9b..aaf728376 100644
--- a/gdk/win32/gdkselection-win32.c
+++ b/gdk/win32/gdkselection-win32.c
@@ -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