[Spice-devel] [PATCH] spice-win: handle multiple types on clipboard grab send & receive
Hans de Goede
hdegoede at redhat.com
Tue Oct 12 01:49:02 PDT 2010
Ack.
On 10/11/2010 03:12 PM, Arnon Gilboa wrote:
> ---
> client/windows/platform.cpp | 55 ++++++++++++++++++++++++++++---------------
> 1 files changed, 36 insertions(+), 19 deletions(-)
>
> diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp
> index cb3d18e..b426522 100644
> --- a/client/windows/platform.cpp
> +++ b/client/windows/platform.cpp
> @@ -75,6 +75,8 @@ static ClipboardFormat clipboard_formats[] = {
> {CF_UNICODETEXT, VD_AGENT_CLIPBOARD_UTF8_TEXT},
> {0, 0}};
>
> +#define clipboard_formats_count (sizeof(clipboard_formats) / sizeof(clipboard_formats[0]))
> +
> static const unsigned long MODAL_LOOP_TIMER_ID = 1;
> static const int MODAL_LOOP_DEFAULT_TIMEOUT = 100;
> static bool modal_loop_active = false;
> @@ -100,17 +102,21 @@ static uint32_t get_clipboard_format(uint32_t type) {
> return iter->format;
> }
>
> -//FIXME: handle multiple types
> -static uint32_t get_available_clipboard_type()
> +static int get_available_clipboard_types(uint32_t** types)
> {
> - uint32_t type = 0;
> + int count = 0;
>
> - for (ClipboardFormat* iter = clipboard_formats; iter->format&& !type; iter++) {
> + *types = new uint32_t[clipboard_formats_count];
> + for (ClipboardFormat* iter = clipboard_formats; iter->format; iter++) {
> if (IsClipboardFormatAvailable(iter->format)) {
> - type = iter->type;
> + *types[count++] = iter->type;
> }
> }
> - return type;
> + if (!count) {
> + delete[] *types;
> + *types = NULL;
> + }
> + return count;
> }
>
> static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
> @@ -145,11 +151,12 @@ static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam,
> break;
> case WM_DRAWCLIPBOARD:
> if (platform_win != GetClipboardOwner()) {
> + int type_count;
> + uint32_t* types;
> Platform::set_clipboard_owner(Platform::owner_none);
> - //FIXME: handle multiple types
> - uint32_t type = get_available_clipboard_type();
> - if (type) {
> - clipboard_listener->on_clipboard_grab(&type, 1);
> + if (type_count = get_available_clipboard_types(&types)) {
> + clipboard_listener->on_clipboard_grab(types, type_count);
> + delete[] types;
> } else {
> LOG_INFO("Unsupported clipboard format");
> }
> @@ -869,18 +876,28 @@ void Platform::set_clipboard_owner(int new_owner)
>
> bool Platform::on_clipboard_grab(uint32_t *types, uint32_t type_count)
> {
> - /* FIXME use all types rather then just the first one */
> - uint32_t format = get_clipboard_format(types[0]);
> -
> - if (!format) {
> - LOG_INFO("Unsupported clipboard type %u", types[0]);
> - return false;
> + bool has_supported_type = false;
> + uint32_t format;
> +
> + for (uint32_t i = 0; i< type_count; i++) {
> + format = get_clipboard_format(types[i]);
> + //On first supported type, open and empty the clipboard
> + if (format&& !has_supported_type) {
> + has_supported_type = true;
> + if (!OpenClipboard(platform_win)) {
> + return false;
> + }
> + EmptyClipboard();
> + }
> + //For all supported type set delayed rendering
> + if (format) {
> + SetClipboardData(format, NULL);
> + }
> }
> - if (!OpenClipboard(platform_win)) {
> + if (!has_supported_type) {
> + LOG_INFO("No supported clipboard types in client grab");
> return false;
> }
> - EmptyClipboard();
> - SetClipboardData(format, NULL);
> CloseClipboard();
> return true;
> }
More information about the Spice-devel
mailing list