[Spice-devel] [PATCH spice 10/17] spicec-x11: remove clipboard_changer hack

Arnon Gilboa agilboa at redhat.com
Mon Oct 4 08:24:20 PDT 2010


Hans de Goede wrote:
> Instead of keeping a flag, we can and should simply check wether the
> new owner reported in the event it us or not. Also check for the
> new owner being none and send a clipboard_release when that is the
> case (through set_clipboard_owner(owner_none)).
> ---
>  client/x11/platform.cpp |   40 +++++++++++++++++++++-------------------
>  1 files changed, 21 insertions(+), 19 deletions(-)
>
> diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
> index 832374a..4385f85 100644
> --- a/client/x11/platform.cpp
> +++ b/client/x11/platform.cpp
> @@ -112,7 +112,6 @@ static int32_t clipboard_data_type = 0;
>  static int32_t clipboard_data_size = 0;
>  static int32_t clipboard_data_space = 0;
>  static int32_t clipboard_request_type = 0;
> -static bool clipboard_changer = false;
>  static XEvent clipboard_event;
>  static Mutex clipboard_lock;
>  static Atom clipboard_prop;
> @@ -831,14 +830,13 @@ DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
>      X_DEBUG_SYNC(display);
>      //FIXME: replace RootWindow() in other refs as well?
>      platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
> +    LOG_INFO("platform_win: %u", (unsigned int)platform_win);
>      intern_clipboard_atoms();
>      XSelectInput(display, platform_win, StructureNotifyMask);
>      XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
>      if (using_xfixes_1_0) {
>          XFixesSelectSelectionInput(display, platform_win, clipboard_prop,
> -                                   XFixesSetSelectionOwnerNotifyMask |
> -                                   XFixesSelectionWindowDestroyNotifyMask |
> -                                   XFixesSelectionClientCloseNotifyMask);
> +                                   XFixesSetSelectionOwnerNotifyMask);
>      }
>  
>      Monitor::self_monitors_change++;
> @@ -1107,6 +1105,7 @@ MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
>      }
>  
>      platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
> +    LOG_INFO("platform_win: %u", (unsigned int)platform_win);
>      intern_clipboard_atoms();
>      XSelectInput(display, platform_win, StructureNotifyMask);
>      X_DEBUG_SYNC(get_display());
> @@ -1114,9 +1113,7 @@ MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
>      X_DEBUG_SYNC(get_display());
>      if (using_xfixes_1_0) {
>          XFixesSelectSelectionInput(display, platform_win, clipboard_prop,
> -                                   XFixesSetSelectionOwnerNotifyMask |
> -                                   XFixesSelectionWindowDestroyNotifyMask |
> -                                   XFixesSelectionClientCloseNotifyMask);
> +                                   XFixesSetSelectionOwnerNotifyMask);
>      }
>  
>      XMonitor::inc_change_ref();
> @@ -2382,17 +2379,24 @@ static void root_win_proc(XEvent& event)
>      if (event.type == XFixesSelectionNotify + xfixes_event_base) {
>          XFixesSelectionNotifyEvent* selection_event = (XFixesSelectionNotifyEvent *)&event;
>          if (selection_event->subtype != XFixesSetSelectionOwnerNotify) {
> -            // FIXME: for some reason the XFixesSelectionWindowDestroyNotify/ClientCloseNotify
> -            // events which can help for sending CLIPBOARD_RELEASE to the agent are not received
>              LOG_INFO("Unsupported selection event %u", selection_event->subtype);
>              return;
>          }
> -        LOG_INFO("XFixesSetSelectionOwnerNotify %u", clipboard_changer);
> -        if (clipboard_changer) {
> -            clipboard_changer = false;
> +        LOG_INFO("XFixesSetSelectionOwnerNotify %u",
> +                 (unsigned int)selection_event->owner);
> +
> +        /* Ignore becoming the owner ourselves */
> +        if (selection_event->owner == platform_win)
>              return;
> -        }
> -        // FIXME: use actual type
> +
> +        /* If the clipboard owner is changed we no longer own it */
> +        Platform::set_clipboard_owner(Platform::owner_none);
> +        if (selection_event->owner == None)
> +            return;
> +
> +        // FIXME: request targets from new owner, then on receiving the
> +        // targets see if there are usable types and only if there are
> +        // grab the clipboard with the found usable types
>          uint32_t type = VD_AGENT_CLIPBOARD_UTF8_TEXT;
>          clipboard_listener->on_clipboard_grab(&type, 1);
>          return;
> @@ -2421,11 +2425,10 @@ static void root_win_proc(XEvent& event)
>          clipboard_listener->on_clipboard_request(type);
>          break;
>      }
> -    case SelectionClear: {
> -        Lock lock(clipboard_lock);
> -        clipboard_data_size = 0;
> +    case SelectionClear:
> +        /* Do nothing the clipboard ownership will get updated through
> +           the XFixesSetSelectionOwnerNotify event */
>          break;
> -    }
>      case SelectionNotify: {
>          Atom type;
>          int format;
> @@ -3156,7 +3159,6 @@ bool Platform::on_clipboard_grab(uint32_t *types, uint32_t type_count)
>          LOG_INFO("Unsupported clipboard type %u", types[0]);
>          return false;
>      }
> -    clipboard_changer = true;
>      clipboard_data_size = 0;
>      XSetSelectionOwner(x_display, clipboard_prop, platform_win, CurrentTime);
>      return true;
>   
Regartding the SelectionClear, will ownership be updated on 
SelectionWindowDestroyNotify & SelectionClientClose as well?
Another nice cleanup
Ack


More information about the Spice-devel mailing list