--- sourceforge.net/trunk/rdesktop/xclip.c 2005/08/02 09:27:46 942 +++ sourceforge.net/trunk/rdesktop/xclip.c 2005/11/09 15:15:28 1026 @@ -127,7 +127,7 @@ goto fail; res = XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom, - 0, XMaxRequestSize(g_display), True, AnyPropertyType, + 0, XMaxRequestSize(g_display), False, AnyPropertyType, &type, &format, &nitems, &bytes_left, &data); if (res != Success) @@ -136,6 +136,24 @@ goto fail; } + + if (type == incr_atom) + { + DEBUG_CLIPBOARD(("Received INCR.\n")); + + XGetWindowAttributes(g_display, g_wnd, &wa); + if ((wa.your_event_mask | PropertyChangeMask) != wa.your_event_mask) + { + XSelectInput(g_display, g_wnd, (wa.your_event_mask | PropertyChangeMask)); + } + XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom); + XFree(data); + g_waiting_for_INCR = 1; + return; + } + + XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom); + /* Negotiate target format */ if (event->target == targets_atom) { @@ -164,43 +182,6 @@ return; } - if (type == incr_atom) - { - DEBUG_CLIPBOARD(("Received INCR.\n")); - - XGetWindowAttributes(g_display, g_wnd, &wa); - if ((wa.your_event_mask | PropertyChangeMask) != wa.your_event_mask) - { - XSelectInput(g_display, g_wnd, (wa.your_event_mask | PropertyChangeMask)); - } - XDeleteProperty(g_display, g_wnd, type); - XFree(data); - g_waiting_for_INCR = 1; - - if ((XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom, 0, - 4096L, True, AnyPropertyType, - &type, &format, &nitems, &bytes_left, &data) != Success)) - { - DEBUG_CLIPBOARD(("XGetWindowProperty failed.\n")); - goto fail; - } - else - { - uint8 *translated_data; - uint32 length = nitems; - - translated_data = lf2crlf(data, &length); - - g_clip_buffer = (uint8 *) xmalloc(length); - strncpy((char *) g_clip_buffer, (char *) translated_data, length); - xfree(translated_data); - g_clip_buflen = length; - - XFree(data); - return; - } - } - /* Translate linebreaks, but only if not getting data from other rdesktop instance */ if (event->target != rdesktop_clipboard_formats_atom) @@ -220,10 +201,12 @@ XFree(data); if (!rdesktop_is_selection_owner) - cliprdr_send_text_format_announce(); + cliprdr_send_simple_native_format_announce(CF_TEXT); return; - fail: + fail: + XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom); + XFree(data); cliprdr_send_data(NULL, 0); } @@ -276,13 +259,15 @@ DEBUG_CLIPBOARD(("xclip_handle_SelectionClear\n")); have_primary = 0; XDeleteProperty(g_display, DefaultRootWindow(g_display), rdesktop_clipboard_formats_atom); - cliprdr_send_text_format_announce(); + cliprdr_send_simple_native_format_announce(CF_TEXT); } void xclip_handle_PropertyNotify(XPropertyEvent * event) { - unsigned long nitems, bytes_left; + unsigned long nitems; + unsigned long offset = 0; + unsigned long bytes_left = 1; int format, res; XWindowAttributes wa; uint8 *data; @@ -291,55 +276,59 @@ if (event->state == PropertyNewValue && g_waiting_for_INCR) { DEBUG_CLIPBOARD(("x_clip_handle_PropertyNotify: g_waiting_for_INCR != 0\n")); - if ((XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom, 0, - 4096L, True, AnyPropertyType, - &type, &format, &nitems, &bytes_left, &data) != Success)) - { - XFree(data); - return; - } - if (nitems == 0) - { - XGetWindowAttributes(g_display, g_wnd, &wa); - XSelectInput(g_display, g_wnd, (wa.your_event_mask ^ PropertyChangeMask)); - XFree(data); - g_waiting_for_INCR = 0; + while (bytes_left > 0) { + if ((XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom, offset, + 4096L, False, AnyPropertyType, + &type, &format, &nitems, &bytes_left, &data) != Success)) + { + XFree(data); + return; + } - if (g_clip_buflen > 0) + if (nitems == 0) { - cliprdr_send_data(g_clip_buffer, g_clip_buflen + 1); + XGetWindowAttributes(g_display, g_wnd, &wa); + XSelectInput(g_display, g_wnd, (wa.your_event_mask ^ PropertyChangeMask)); + XFree(data); + g_waiting_for_INCR = 0; - if (!rdesktop_is_selection_owner) - cliprdr_send_text_format_announce(); + if (g_clip_buflen > 0) + { + cliprdr_send_data(g_clip_buffer, g_clip_buflen + 1); - xfree(g_clip_buffer); - g_clip_buffer = 0; - g_clip_buflen = 0; + if (!rdesktop_is_selection_owner) + cliprdr_send_simple_native_format_announce(CF_TEXT); + + xfree(g_clip_buffer); + g_clip_buffer = 0; + g_clip_buflen = 0; + } } - } - else - { - uint8 *translated_data; - uint32 length = nitems; - uint8 *tmp; - - DEBUG_CLIPBOARD(("Translating linebreaks before sending data\n")); - translated_data = lf2crlf(data, &length); - - tmp = xmalloc(length + g_clip_buflen); - strncpy((char *) tmp, (char *) g_clip_buffer, g_clip_buflen); - xfree(g_clip_buffer); + else + { + uint8 *translated_data; + uint32 length = nitems; + uint8 *tmp; + + offset += (length/4); + DEBUG_CLIPBOARD(("Translating linebreaks before sending data\n")); + translated_data = lf2crlf(data, &length); - strncpy((char *) (tmp + g_clip_buflen), (char *) translated_data, length); - xfree(translated_data); + tmp = xmalloc(length + g_clip_buflen); + strncpy((char *) tmp, (char *) g_clip_buffer, g_clip_buflen); + xfree(g_clip_buffer); - g_clip_buffer = tmp; - g_clip_buflen += length; + strncpy((char *) (tmp + g_clip_buflen), (char *) translated_data, length); + xfree(translated_data); - XFree(data); - return; + g_clip_buffer = tmp; + g_clip_buflen += length; + + XFree(data); + } } + XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom); } if (event->atom != rdesktop_clipboard_formats_atom) @@ -364,7 +353,7 @@ } /* PropertyDelete, or XGetWindowProperty failed */ - cliprdr_send_text_format_announce(); + cliprdr_send_simple_native_format_announce(CF_TEXT); rdesktop_is_selection_owner = 0; } #endif @@ -453,7 +442,7 @@ void ui_clip_sync(void) { - cliprdr_send_text_format_announce(); + cliprdr_send_simple_native_format_announce(CF_TEXT); }