[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24567] trunk/blender/intern/ghost/intern: MAC/Cocoa:

Damien Plisson damien.plisson at yahoo.fr
Sun Nov 15 09:34:32 CET 2009


Revision: 24567
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24567
Author:   damien78
Date:     2009-11-15 09:34:31 +0100 (Sun, 15 Nov 2009)

Log Message:
-----------
MAC/Cocoa:
- Drag'n'Drop events are now correctly signaled to the main loop for dispatch (these events were directly handled in cocoa callbacks without notifying the process loop)
- Fix timestamping of events & add debug print of drag'n'drop events.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm
    trunk/blender/intern/ghost/intern/GHOST_EventPrinter.cpp
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm

Modified: trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm	2009-11-14 23:24:15 UTC (rev 24566)
+++ trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm	2009-11-15 08:34:31 UTC (rev 24567)
@@ -155,11 +155,11 @@
 		NULL);*/
 
 #ifdef GHOST_DEBUG
-	printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): switching to:\n");
+/*	printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): switching to:\n");
 	printf("  setting.xPixels=%d\n", getValue(displayModeValues, kCGDisplayWidth));
 	printf("  setting.yPixels=%d\n", getValue(displayModeValues, kCGDisplayHeight));
 	printf("  setting.bpp=%d\n", getValue(displayModeValues, kCGDisplayBitsPerPixel));
-	printf("  setting.frequency=%d\n", getValue(displayModeValues, kCGDisplayRefreshRate));
+	printf("  setting.frequency=%d\n", getValue(displayModeValues, kCGDisplayRefreshRate)); */
 #endif // GHOST_DEBUG
 
 	//CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues);

Modified: trunk/blender/intern/ghost/intern/GHOST_EventPrinter.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_EventPrinter.cpp	2009-11-14 23:24:15 UTC (rev 24566)
+++ trunk/blender/intern/ghost/intern/GHOST_EventPrinter.cpp	2009-11-15 08:34:31 UTC (rev 24567)
@@ -33,6 +33,7 @@
 #include "GHOST_EventPrinter.h"
 #include <iostream>
 #include "GHOST_EventKey.h"
+#include "GHOST_EventDragnDrop.h"
 #include "GHOST_Debug.h"
 
 #ifdef HAVE_CONFIG_H
@@ -97,7 +98,77 @@
 		std::cout << "GHOST_kEventKeyDown, key: " << str.Ptr();
 		}
 		break;
+			
+	case GHOST_kEventDraggingEntered:
+		{
+			GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData();
+			std::cout << "GHOST_kEventDraggingEntered, dragged object type : " << dragnDropData->dataType;
+			std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y;
+		}
+		break;
+			
+	case GHOST_kEventDraggingUpdated:
+		{
+			GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData();
+			std::cout << "GHOST_kEventDraggingUpdated, dragged object type : " << dragnDropData->dataType;
+			std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y;
+		}
+		break;
 
+	case GHOST_kEventDraggingExited:
+		{
+			GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData();
+			std::cout << "GHOST_kEventDraggingExited, dragged object type : " << dragnDropData->dataType;
+		}
+		break;
+	
+	case GHOST_kEventDraggingDropDone:
+		{
+			GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData();
+			std::cout << "GHOST_kEventDraggingDropDone, dragged object type : " << dragnDropData->dataType;
+			std::cout << " mouse at x=" << dragnDropData->x << " y=" << dragnDropData->y;
+			switch (dragnDropData->dataType) {
+				case GHOST_kDragnDropTypeString:
+					std::cout << " string received = " << (char*)dragnDropData->data;
+					break;
+				case GHOST_kDragnDropTypeFilenames:
+				{
+					GHOST_TStringArray *strArray = (GHOST_TStringArray*)dragnDropData->data;
+					int i;
+					std::cout << "\nReceived " << strArray->count << " filenames";
+					for (i=0;i<strArray->count;i++)
+						std::cout << " Filename #" << i << ": " << strArray->strings[i];
+				}
+					break;
+				default:
+					break;
+			}
+		}
+		break;
+
+	case GHOST_kEventDraggingDropOnIcon:
+		{
+			GHOST_TEventDragnDropData* dragnDropData = (GHOST_TEventDragnDropData*)((GHOST_IEvent*)event)->getData();
+			std::cout << "GHOST_kEventDraggingDropOnIcon, dragged object type : " << dragnDropData->dataType;
+			switch (dragnDropData->dataType) {
+				case GHOST_kDragnDropTypeString:
+					std::cout << " string received = " << (char*)dragnDropData->data;
+					break;
+				case GHOST_kDragnDropTypeFilenames:
+				{
+					GHOST_TStringArray *strArray = (GHOST_TStringArray*)dragnDropData->data;
+					int i;
+					std::cout << "\nReceived " << strArray->count << " filenames";
+					for (i=0;i<strArray->count;i++)
+						std::cout << " Filename #" << i << ": " << strArray->strings[i];
+				}
+					break;
+				default:
+					break;
+			}
+		}
+		break;
+			
 	case GHOST_kEventQuit:
 		std::cout << "GHOST_kEventQuit"; 
 		break;

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h	2009-11-14 23:24:15 UTC (rev 24566)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.h	2009-11-15 08:34:31 UTC (rev 24567)
@@ -246,6 +246,9 @@
 	/** Start time at initialization. */
 	GHOST_TUns64 m_start_time;
 	
+	/** Event has been processed directly by Cocoa and has sent a ghost event to be dispatched */
+	bool m_outsideLoopEventProcessed;
+	
 	/** Mouse buttons state */
 	GHOST_TUns32 m_pressedMouseButtons;
 	

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-11-14 23:24:15 UTC (rev 24566)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2009-11-15 08:34:31 UTC (rev 24567)
@@ -449,12 +449,12 @@
 	m_pressedMouseButtons =0;
 	m_cursorDelta_x=0;
 	m_cursorDelta_y=0;
+	m_outsideLoopEventProcessed = false;
 	m_displayManager = new GHOST_DisplayManagerCocoa ();
 	GHOST_ASSERT(m_displayManager, "GHOST_SystemCocoa::GHOST_SystemCocoa(): m_displayManager==0\n");
 	m_displayManager->initialize();
 
 	//NSEvent timeStamp is given in system uptime, state start date is boot time
-	//FIXME : replace by Cocoa equivalent
 	int mib[2];
 	struct timeval boottime;
 	size_t len;
@@ -560,17 +560,13 @@
 GHOST_TUns64 GHOST_SystemCocoa::getMilliSeconds() const
 {
 	//Cocoa equivalent exists in 10.6 ([[NSProcessInfo processInfo] systemUptime])
-	int mib[2];
-	struct timeval boottime;
-	size_t len;
+	struct timeval currentTime;
 	
-	mib[0] = CTL_KERN;
-	mib[1] = KERN_BOOTTIME;
-	len = sizeof(struct timeval);
+	gettimeofday(&currentTime, NULL);
 	
-	sysctl(mib, 2, &boottime, &len, NULL, 0);
-
-	return ((boottime.tv_sec*1000)+(boottime.tv_usec/1000));
+	//Return timestamp of system uptime
+	
+	return ((currentTime.tv_sec*1000)+(currentTime.tv_usec/1000)-m_start_time);
 }
 
 
@@ -744,6 +740,8 @@
 	bool anyProcessed = false;
 	NSEvent *event;
 	
+	m_outsideLoopEventProcessed = false;
+	
 	//	SetMouseCoalescingEnabled(false, NULL);
 	//TODO : implement timer ??
 	
@@ -842,7 +840,7 @@
 	
 	
 	
-    return anyProcessed;
+    return anyProcessed || m_outsideLoopEventProcessed;
 }
 
 //Note: called from NSWindow delegate
@@ -879,6 +877,8 @@
 				return GHOST_kFailure;
 				break;
 		}
+	
+	m_outsideLoopEventProcessed = true;
 	return GHOST_kSuccess;
 }
 
@@ -895,7 +895,7 @@
 			setAcceptDragOperation(FALSE); //Drag operation needs to be accepted explicitely by the event manager
 		case GHOST_kEventDraggingUpdated:
 		case GHOST_kEventDraggingExited:
-			pushEvent(new GHOST_EventDragnDrop(getMilliSeconds(),GHOST_kEventDraggingEntered,draggedObjectType,window,mouseX,mouseY,NULL));
+			pushEvent(new GHOST_EventDragnDrop(getMilliSeconds(),eventType,draggedObjectType,window,mouseX,mouseY,NULL));
 			break;
 			
 		case GHOST_kEventDraggingDropDone:
@@ -969,12 +969,13 @@
 					return GHOST_kFailure;
 					break;
 			}
-			pushEvent(new GHOST_EventDragnDrop(getMilliSeconds(),GHOST_kEventDraggingEntered,draggedObjectType,window,mouseX,mouseY,eventData));
+			pushEvent(new GHOST_EventDragnDrop(getMilliSeconds(),eventType,draggedObjectType,window,mouseX,mouseY,eventData));
 		}
 			break;
 		default:
 			return GHOST_kFailure;
 	}
+	m_outsideLoopEventProcessed = true;
 	return GHOST_kSuccess;
 }
 
@@ -1007,6 +1008,7 @@
 	}
 	else {
 		pushEvent( new GHOST_Event(getMilliSeconds(), GHOST_kEventQuit, NULL) );
+		m_outsideLoopEventProcessed = true;
 		return GHOST_kExitNow;
 	}
 	
@@ -1079,7 +1081,7 @@
 		case NSLeftMouseDown:
 		case NSRightMouseDown:
 		case NSOtherMouseDown:
-			pushEvent(new GHOST_EventButton([event timestamp], GHOST_kEventButtonDown, window, convertButton([event buttonNumber])));
+			pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonDown, window, convertButton([event buttonNumber])));
 			//Handle tablet events combined with mouse events
 			switch ([event subtype]) {
 				case NX_SUBTYPE_TABLET_POINT:
@@ -1097,7 +1099,7 @@
 		case NSLeftMouseUp:
 		case NSRightMouseUp:
 		case NSOtherMouseUp:
-			pushEvent(new GHOST_EventButton([event timestamp], GHOST_kEventButtonUp, window, convertButton([event buttonNumber])));
+			pushEvent(new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonUp, window, convertButton([event buttonNumber])));
 			//Handle tablet events combined with mouse events
 			switch ([event subtype]) {
 				case NX_SUBTYPE_TABLET_POINT:
@@ -1141,7 +1143,7 @@
 						y_accum += -[event deltaY]; //Strange Apple implementation (inverted coordinates for the deltaY) ...
 						window->setCursorGrabAccum(x_accum, y_accum);
 						
-						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, x_warp+x_accum, y_warp+y_accum));
+						pushEvent(new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, x_warp+x_accum, y_warp+y_accum));
 					}
 						break;
 					case GHOST_kGrabWrap: //Wrap cursor at area/window boundaries
@@ -1185,14 +1187,14 @@
 						
 						//Post event
 						window->getCursorGrabInitPos(x_cur, y_cur);
-						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, x_cur + x_accum, y_cur + y_accum));
+						pushEvent(new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, x_cur + x_accum, y_cur + y_accum));
 					}
 						break;
 					default:
 					{
 						//Normal cursor operation: send mouse position in window
 						NSPoint mousePos = [event locationInWindow];
-						pushEvent(new GHOST_EventCursor([event timestamp], GHOST_kEventCursorMove, window, mousePos.x, mousePos.y));
+						pushEvent(new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, mousePos.x, mousePos.y));
 						m_cursorDelta_x=0;
 						m_cursorDelta_y=0; //Mouse motion occured between two cursor warps, so we can reset the delta counter
 					}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list