From b0fb3acfa097504d18ec8d5498cab808fd4718ee Mon Sep 17 00:00:00 2001 From: Mike Massonnet Date: Sun, 9 Jan 2011 20:40:09 +0100 Subject: [PATCH] Dispatch primary clipboard restoration (bug #6819). The GtkEntryCompletion widget is continuously removing ownership over the clipboard, quickly after that setting it back. The code assumed that when the ownership was removed, it could safely restore the cached value. Wrong. This causes the widget to "erase" its current selection and typing continues at the end of the string (as seen in GNOME bug 333320). Now restoring works through a dispatched GSource, which enables to remove this GSource if ownership is set right back again. --- xfce4-settings-helper/clipboard-manager.c | 37 +++++++++++++++++++--------- 1 files changed, 25 insertions(+), 12 deletions(-) diff --git a/xfce4-settings-helper/clipboard-manager.c b/xfce4-settings-helper/clipboard-manager.c index 76a5a7c..b65ad02 100644 --- a/xfce4-settings-helper/clipboard-manager.c +++ b/xfce4-settings-helper/clipboard-manager.c @@ -4,7 +4,7 @@ * Copyright (C) 2007 Anders Carlsson * Copyright (C) 2007 Rodrigo Moya * Copyright (C) 2007 William Jon McCann - * Copyright (C) 2009 Mike Massonnet + * Copyright (C) 2009-2011 Mike Massonnet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -269,6 +269,21 @@ xfce_clipboard_manager_primary_clipboard_store (XfceClipboardManager *manager) } +static gboolean +xfce_clipboard_manager_primary_clipboard_restore (XfceClipboardManager *manager) +{ + if (manager->primary_cache != NULL) + { + gtk_clipboard_set_text (manager->primary_clipboard, + manager->primary_cache, + -1); + manager->primary_internal_change = TRUE; + } + + return FALSE; +} + + static void xfce_clipboard_manager_primary_owner_change (XfceClipboardManager *manager, GdkEventOwnerChange *event) @@ -278,6 +293,12 @@ xfce_clipboard_manager_primary_owner_change (XfceClipboardManager *manager, if (event->send_event == TRUE) return; + if (manager->primary_timeout != 0) + { + g_source_remove (manager->primary_timeout); + manager->primary_timeout = 0; + } + if (event->owner != 0) { if (manager->primary_internal_change == TRUE) @@ -286,19 +307,11 @@ xfce_clipboard_manager_primary_owner_change (XfceClipboardManager *manager, return; } - if (manager->primary_timeout == 0) - { - manager->primary_timeout = - g_timeout_add (250, (GSourceFunc)xfce_clipboard_manager_primary_clipboard_store, manager); - } + manager->primary_timeout = g_timeout_add (250, (GSourceFunc)xfce_clipboard_manager_primary_clipboard_store, manager); } - else + else if (gtk_clipboard_wait_is_text_available (manager->primary_clipboard) == FALSE) { - if (manager->primary_cache != NULL) - gtk_clipboard_set_text (manager->primary_clipboard, - manager->primary_cache, - -1); - manager->primary_internal_change = TRUE; + manager->primary_timeout = g_timeout_add (250, (GSourceFunc)xfce_clipboard_manager_primary_clipboard_restore, manager); } } -- 1.7.3.4