[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13964] trunk/blender: Added Copy and Paste functions to GHOST.

Ton Roosendaal ton at blender.org
Thu Mar 6 18:31:12 CET 2008


Hi Ricki,

You should provide new code in a style and conventions of how the code  
currently works.
Ghost has a nice API, and sticking to naming conventions of libraries  
is very useful.

Main question: who approved on this, or reviewed it?

-Ton-


On 4 Mar, 2008, at 1:41, Ricki Myers wrote:

> Revision: 13964
>            
> http://projects.blender.org/plugins/scmsvn/viewcvs.php? 
> view=rev&root=bf-blender&revision=13964
> Author:   themyers
> Date:     2008-03-04 01:41:30 +0100 (Tue, 04 Mar 2008)
>
> Log Message:
> -----------
> Added Copy and Paste functions to GHOST.
> - Moved WIN32 code to ghost and added code for other systems.
> - Added functions getClipboard(flag), and putClipboard(buffer, flag)
>     -Flag is used on X11 to request selection buffer or clipboard.
>     -If any other system uses flag = 1 the function returns doing  
> nothing.
> - Changed ctrl +c/v and shift+ctrl + c/v to do the same thing (use the  
> clipboard).
> - Changed the menu items (copy, paste) to use the clipboard.
>
> Modified Paths:
> --------------
>     trunk/blender/intern/ghost/GHOST_C-api.h
>     trunk/blender/intern/ghost/GHOST_ISystem.h
>     trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
>     trunk/blender/intern/ghost/intern/GHOST_System.h
>     trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.cpp
>     trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.h
>     trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
>     trunk/blender/intern/ghost/intern/GHOST_SystemWin32.h
>     trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
>     trunk/blender/intern/ghost/intern/GHOST_SystemX11.h
>     trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
>     trunk/blender/source/blender/blenkernel/BKE_text.h
>     trunk/blender/source/blender/src/drawtext.c
>     trunk/blender/source/blender/src/header_text.c
>
> Modified: trunk/blender/intern/ghost/GHOST_C-api.h
> ===================================================================
> --- trunk/blender/intern/ghost/GHOST_C-api.h	2008-03-03 21:43:31 UTC  
> (rev 13963)
> +++ trunk/blender/intern/ghost/GHOST_C-api.h	2008-03-04 00:41:30 UTC  
> (rev 13964)
> @@ -758,6 +758,18 @@
>   */
>  extern GHOST_TSuccess GHOST_ClipRectangle(GHOST_RectangleHandle  
> rectanglehandle,
>  										  GHOST_RectangleHandle anotherrectanglehandle);
> +
> +/**
> + * Return the data from the clipboad
> + * @return clipboard data
> + */
> +extern GHOST_TUns8* getClipboard(int flag);
> +
> +/**
> + * Put data to the Clipboard
> + */
> +extern void putClipboard(GHOST_TInt8 *buffer, int flag);
> +
>  #ifdef __cplusplus
>  }
>  #endif
>
> Modified: trunk/blender/intern/ghost/GHOST_ISystem.h
> ===================================================================
> --- trunk/blender/intern/ghost/GHOST_ISystem.h	2008-03-03 21:43:31 UTC  
> (rev 13963)
> +++ trunk/blender/intern/ghost/GHOST_ISystem.h	2008-03-04 00:41:30 UTC  
> (rev 13964)
> @@ -336,6 +336,18 @@
>  	 */
>  	virtual GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool&  
> isDown) const = 0;
>
> +	/**
> +	 * Returns the selection buffer
> +	 * @return Returns "unsinged char" from X11 XA_CUT_BUFFER0 buffer
> +	 *
> +	 */
> +	 virtual GHOST_TUns8* getClipboard(int flag) const = 0;
> +
> +	/**
> +	 * Put data to the Clipboard
> +	 */
> +	virtual void putClipboard(GHOST_TInt8 *buffer, int flag) const = 0;
> +
>  protected:
>  	/**
>  	 * Initialize the system.
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -802,3 +802,16 @@
>
>  	return result;
>  }
> +
> +GHOST_TUns8* getClipboard(int flag)
> +{
> +	GHOST_ISystem* system = GHOST_ISystem::getSystem();
> +	return system->getClipboard(flag);
> +}
> +
> +void putClipboard(GHOST_TInt8 *buffer, int flag)
> +{
> +	GHOST_ISystem* system = GHOST_ISystem::getSystem();
> +	system->putClipboard(buffer, flag);
> +}
> +
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_System.h
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_System.h	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_System.h	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -257,6 +257,21 @@
>  	 */
>  	virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const = 0;
>
> +	/**
> +	 * Returns the selection buffer
> +	 * @param flag		Only used on X11
> +	 * @return 		Returns the clipboard data
> +	 *
> +	 */
> +	 virtual GHOST_TUns8* getClipboard(int flag) const = 0;
> +	
> +	  /**
> +	   * Put data to the Clipboard
> +	   * @param buffer	The buffer to copy to the clipboard
> +	   * @param flag	The clipboard to copy too only used on X11
> +	   */
> +	  virtual void putClipboard(GHOST_TInt8 *buffer, int flag) const = 0;
> +
>  protected:
>  	/**
>  	 * Initialize the system.
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.cpp
> ===================================================================
> ---  
> trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.cpp	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++  
> trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.cpp	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -1065,3 +1065,71 @@
>
>      return err;
>  }
> +
> +GHOST_TUns8* GHOST_SystemCarbon::getClipboard(int flag) const
> +{
> +	PasteboardRef inPasteboard;
> +	PasteboardItemID itemID;
> +	CFDataRef flavorData;
> +	OSStatus err = noErr;
> +	GHOST_TUns8 * temp_buff;
> +	CFRange range;
> +	
> +	err = PasteboardCreate(kPasteboardClipboard, &inPasteboard);
> +	if(err != noErr) { return NULL;}
> +
> +	err = PasteboardSynchronize( inPasteboard );
> +	if(err != noErr) { return NULL;}
> +
> +	err = PasteboardGetItemIdentifier( inPasteboard, 1, &itemID );
> +	if(err != noErr) { return NULL;}
> +
> +	err = PasteboardCopyItemFlavorData( inPasteboard, itemID,  
> CFSTR("public.utf8-plain-text"), &flavorData);
> +	if(err != noErr) { return NULL;}
> +
> +	range = CFRangeMake(0, CFDataGetLength(flavorData));
> +	
> +	temp_buff = (GHOST_TUns8*) malloc(range.length+1);
> +
> +	CFDataGetBytes(flavorData, range, (UInt8*)temp_buff);
> +	
> +	temp_buff[range.length] = '\0';
> +	
> +	if(temp_buff) {
> +		return temp_buff;
> +	} else {
> +		return NULL;
> +	}
> +}
> +
> +void GHOST_SystemCarbon::putClipboard(GHOST_TInt8 *buffer, int flag)  
> const
> +{
> +	if(flag == 1) {return;} //If Flag is 1 means the selection and is  
> used on X11
> +	PasteboardRef inPasteboard;
> +	CFDataRef textData = NULL;
> +	OSStatus err = noErr; /*For error checking*/
> +	
> +	err = PasteboardCreate(kPasteboardClipboard, &inPasteboard);
> +	if(err != noErr) { return;}
> +	
> +	err = PasteboardSynchronize( inPasteboard );
> +	if(err != noErr) { return;}
> +	
> +	err = PasteboardClear( inPasteboard );
> +	if(err != noErr) { return;}
> +	
> +	textData = CFDataCreate(kCFAllocatorDefault, (UInt8*)buffer,  
> strlen(buffer));
> +	
> +	if (textData) {
> +		err = PasteboardPutItemFlavor( inPasteboard, (PasteboardItemID)1,  
> CFSTR("public.utf8-plain-text"), textData, 0);
> +			if(err != noErr) {
> +				if(textData) { CFRelease(textData);}
> +				return;
> +			}
> +	}
> +	
> +	if(textData) {
> +		CFRelease(textData);
> +	}
> +}
> +
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.h
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.h	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_SystemCarbon.h	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -168,6 +168,20 @@
>  	 */
>  	virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const;
>
> +	/**
> +	 * Returns Clipboard data
> +	 * @param flag		Indicate which buffer to return
> +	 * @return		Returns the selected buffer
> +	 */
> +	virtual GHOST_TUns8* GHOST_SystemCarbon::getClipboard(int flag)  
> const;
> +	
> +	/**
> +	 * Puts buffer to system clipboard
> +	 * @param buffer	The buffer to be copied
> +	 * @param flag		Indicates which buffer to copy too Only used on X11
> +	 */
> +	virtual void putClipboard(GHOST_TInt8 *buffer, int flag) const;
> +
>  protected:
>  	/**
>  	 * Initializes the system.
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -873,3 +873,54 @@
>  	}
>  	return lResult;
>  }
> +
> +GHOST_TUns8* GHOST_SystemWin32::getClipboard(int flag) const
> +{
> +	char *buffer;
> +	char *temp_buff;
> +	
> +	if ( OpenClipboard(NULL) ) {
> +		HANDLE hData = GetClipboardData( CF_TEXT );
> +		buffer = (char*)GlobalLock( hData );
> +		
> +		temp_buff = (char*) malloc(strlen(buffer)+1);
> +		strcpy(temp_buff, buffer);
> +		
> +		GlobalUnlock( hData );
> +		CloseClipboard();
> +		
> +		temp_buff[strlen(buffer)] = '\0';
> +		if (buffer) {
> +			return (GHOST_TUns8*)temp_buff;
> +		} else {
> +			return NULL;
> +		}
> +	} else {
> +		return NULL;
> +	}
> +}
> +
> +void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, int flag)  
> const
> +{
> +	if(flag == 1) {return;} //If Flag is 1 means the selection and is  
> used on X11
> +	if (OpenClipboard(NULL)) {
> +		HLOCAL clipbuffer;
> +		char *data;
> +		
> +		if (buffer) {
> +			EmptyClipboard();
> +			
> +			clipbuffer = LocalAlloc(LMEM_FIXED,((strlen(buffer)+1)));
> +			data = (char*)GobalLock(clipbuffer);
> +
> +			strcpy(data, (char*)buffer);
> +			data[strlen(buffer)] = '\0';
> +			LocalUnlock(clipbuffer);
> +			SetClipboardData(CF_TEXT,clipbuffer);
> +		}
> +		CloseClipboard();
> +	} else {
> +		return;
> +	}
> +}
> +
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.h
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.h	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.h	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -170,6 +170,20 @@
>  	 */
>  	virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const;
>
> +	/**
> +	 * Returns unsinged char from CUT_BUFFER0
> +	 * @param flag		Flag is not used on win32 on used on X11
> +	 * @return		Returns the Clipboard
> +	 */
> +	virtual GHOST_TUns8* getClipboard(int flag) const;
> +	
> +	/**
> +	 * Puts buffer to system clipboard
> +	 * @param flag		Flag is not used on win32 on used on X11
> +	 * @return		No return
> +	 */
> +	virtual void putClipboard(GHOST_TInt8 *buffer, int flag) const;
> +	
>  protected:
>  	/**
>  	 * Initializes the system.
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2008-03-03  
> 21:43:31 UTC (rev 13963)
> +++ trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2008-03-04  
> 00:41:30 UTC (rev 13964)
> @@ -95,6 +95,9 @@
>  #include <unistd.h>
>
>  #include <vector>
> +//these are for copy and select copy
> +static char *txt_cut_buffer= NULL;
> +static char *txt_select_buffer= NULL;
>
>  using namespace std;
>
> @@ -336,7 +339,7 @@
>  	if (!window) {
>  		return;
>  	}
> -
> +	
>  	switch (xe->type) {
>  		case Expose:
>  		{
> @@ -504,8 +507,57 @@
>  		case MappingNotify:
>  		case ReparentNotify:
>  			break;
> -
> -      	default: {
> +		case SelectionRequest:
> +		{
> +			XEvent nxe;
> +			Atom target, string, compound_text, c_string;
> +			XSelectionRequestEvent *xse = &xe->xselectionrequest;
> +			
> +			target = XInternAtom(m_display, "TARGETS", False);
> +			string = XInternAtom(m_display, "STRING", False);
> +			compound_text = XInternAtom(m_display, "COMPOUND_TEXT", False);
> +			c_string = XInternAtom(m_display, "C_STRING", False);
> +			
> +			/* support obsolete clients */
> +			if (xse->property == None) {
> +				xse->property = xse->target;
> +			}
> +			
> +			nxe.xselection.type = SelectionNotify;
> +			nxe.xselection.requestor = xse->requestor;
> +			nxe.xselection.property = xse->property;
> +			nxe.xselection.display = xse->display;
> +			nxe.xselection.selection = xse->selection;
> +			nxe.xselection.target = xse->target;
> +			nxe.xselection.time = xse->time;
> +			
> +			/*Check to see if the requestor is asking for String*/
> +			if(xse->target == string || xse->target == compound_text ||  
> xse->target == c_string) {
> +				if (xse->selection == XInternAtom(m_display, "PRIMARY", False)) {
> +					XChangeProperty(m_display, xse->requestor, xse->property,  
> xse->target, 8, PropModeReplace, (unsigned char*)txt_select_buffer,  
> strlen(txt_select_buffer));
> +				} else if (xse->selection == XInternAtom(m_display, "CLIPBOARD",  
> False)) {
> +					XChangeProperty(m_display, xse->requestor, xse->property,  
> xse->target, 8, PropModeReplace, (unsigned char*)txt_cut_buffer,  
> strlen(txt_cut_buffer));
> +				}
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
>
------------------------------------------------------------------------ 
--
Ton Roosendaal  Blender Foundation ton at blender.org  
http://www.blender.org



More information about the Bf-committers mailing list