qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] ui/cocoa: Add clipboard support


From: Akihiko Odaki
Subject: Re: [PATCH] ui/cocoa: Add clipboard support
Date: Wed, 9 Feb 2022 20:27:42 +0900

On Wed, Feb 9, 2022 at 2:54 AM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 16 Jun 2021 at 15:20, Akihiko Odaki <akihiko.odaki@gmail.com> wrote:
> >
> > Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
>
> Hi Akihiko -- I have a similar question here to the other
> patch about doing things not on the Cocoa UI thread...
>
> > +static void cocoa_clipboard_notify(Notifier *notifier, void *data)
> > +{
> > +    QemuClipboardInfo *info = data;
> > +
> > +    if (info->owner == &cbpeer || info->selection != 
> > QEMU_CLIPBOARD_SELECTION_CLIPBOARD) {
> > +        return;
> > +    }
> > +
> > +    if (info != cbinfo) {
> > +        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
> > +        qemu_clipboard_info_unref(cbinfo);
> > +        cbinfo = qemu_clipboard_info_ref(info);
> > +        cbchangecount = [[NSPasteboard generalPasteboard] 
> > declareTypes:@[NSPasteboardTypeString] owner:cbowner];
> > +        [pool release];
>
> Is this OK to do on a non-Cocoa thread with an autorelease pool,
> or should it be done via dispatch_async ?
>
> > +    }
> > +
> > +    qemu_event_set(&cbevent);
> > +}
>
> >  /*
> >   * The startup process for the OSX/Cocoa UI is complicated, because
> >   * OSX insists that the UI runs on the initial main thread, and so we
> > @@ -1845,6 +1937,7 @@ static void addRemovableDevicesMenuItems(void)
> >      COCOA_DEBUG("Second thread: calling qemu_main()\n");
> >      status = qemu_main(gArgc, gArgv, *_NSGetEnviron());
> >      COCOA_DEBUG("Second thread: qemu_main() returned, exiting\n");
> > +    [cbowner release];
> >      exit(status);
> >  }
> >
> > @@ -1965,6 +2058,18 @@ static void cocoa_refresh(DisplayChangeListener *dcl)
> >              [cocoaView setAbsoluteEnabled:YES];
> >          });
> >      }
> > +
> > +    if (cbchangecount != [[NSPasteboard generalPasteboard] changeCount]) {
> > +        qemu_clipboard_info_unref(cbinfo);
> > +        cbinfo = qemu_clipboard_info_new(&cbpeer, 
> > QEMU_CLIPBOARD_SELECTION_CLIPBOARD);
> > +        if ([[NSPasteboard generalPasteboard] 
> > availableTypeFromArray:@[NSPasteboardTypeString]]) {
> > +            cbinfo->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
> > +        }
> > +        qemu_clipboard_update(cbinfo);
> > +        cbchangecount = [[NSPasteboard generalPasteboard] changeCount];
> > +        qemu_event_set(&cbevent);
> > +    }
> > +
>
> This work in the cocoa_refresh() function is done not on the Cocoa
> UI thread. Is it OK for it to do that, or should we put it into a
> dispatch_async block ?
>
> >      [pool release];
> >  }
>
> thanks
> -- PMM

It should be fine since it doesn't touch NSView. The following
documentation is the latest one which I have found so far:
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-SW1

It is unfortunate that Apple no longer updates it. They should at
least note about the main thread requirement in the documentation of
NSView.

Regards,
Akihiko Odaki



reply via email to

[Prev in Thread] Current Thread [Next in Thread]