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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.