CVS: rdesktop xclip.c,1.20,1.21
Erik Forsberg <[email protected]>
| Newsgroups | gmane.network.rdesktop.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6134
Modified Files:
xclip.c
Log Message:
Applied patch from Burt Holzman <burt at fnal gov>, which fixes problems with
the INCR support, used when doing clipboard operations with a lot of data.
With this patch, I can copy and then paste a 32 page document from
oowriter->winword.
Index: xclip.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/xclip.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** xclip.c 7 Nov 2005 13:15:19 -0000 1.20
--- xclip.c 9 Nov 2005 15:15:28 -0000 1.21
***************
*** 128,132 ****
res = XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom,
! 0, XMaxRequestSize(g_display), True, AnyPropertyType,
&type, &format, &nitems, &bytes_left, &data);
--- 128,132 ----
res = XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom,
! 0, XMaxRequestSize(g_display), False, AnyPropertyType,
&type, &format, &nitems, &bytes_left, &data);
***************
*** 137,140 ****
--- 137,158 ----
}
+
+ 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)
***************
*** 165,205 ****
}
- 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 */
--- 183,186 ----
***************
*** 224,228 ****
return;
! fail:
cliprdr_send_data(NULL, 0);
}
--- 205,211 ----
return;
! fail:
! XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom);
! XFree(data);
cliprdr_send_data(NULL, 0);
}
***************
*** 283,287 ****
xclip_handle_PropertyNotify(XPropertyEvent * event)
{
! unsigned long nitems, bytes_left;
int format, res;
XWindowAttributes wa;
--- 266,272 ----
xclip_handle_PropertyNotify(XPropertyEvent * event)
{
! unsigned long nitems;
! unsigned long offset = 0;
! unsigned long bytes_left = 1;
int format, res;
XWindowAttributes wa;
***************
*** 292,344 ****
{
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;
! if (g_clip_buflen > 0)
{
! cliprdr_send_data(g_clip_buffer, g_clip_buflen + 1);
! 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);
! strncpy((char *) (tmp + g_clip_buflen), (char *) translated_data, length);
! xfree(translated_data);
! g_clip_buffer = tmp;
! g_clip_buflen += length;
! XFree(data);
! return;
}
}
--- 277,333 ----
{
DEBUG_CLIPBOARD(("x_clip_handle_PropertyNotify: g_waiting_for_INCR != 0\n"));
! 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 (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;
! if (g_clip_buflen > 0)
! {
! cliprdr_send_data(g_clip_buffer, g_clip_buflen + 1);
! 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;
! offset += (length/4);
! 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);
! strncpy((char *) (tmp + g_clip_buflen), (char *) translated_data, length);
! xfree(translated_data);
! g_clip_buffer = tmp;
! g_clip_buflen += length;
! XFree(data);
! }
}
+ XDeleteProperty(g_display, g_wnd, rdesktop_clipboard_target_atom);
}
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php