ecore_cocoa: move mouse event handling to NSWindow
authorpierre lamot <pierre.lamot@openwide.fr>
Wed, 18 Feb 2015 13:11:00 +0000 (14:11 +0100)
committerCedric BAIL <cedric@osg.samsung.com>
Thu, 12 Mar 2015 06:43:59 +0000 (07:43 +0100)
Mouse events was broken after a resize of the window from the left
or the bottom. As I understand, theses resize were changing the origin
of Cocoa window independly from the origin of the EFL.

This has been resolved by moving mouse envents handling to our NSWindow
delegate. thus events are always in the right referential.

@fix

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
src/lib/ecore_cocoa/ecore_cocoa.m
src/lib/ecore_cocoa/ecore_cocoa_window.m

index 396e1bc..60229b7 100644 (file)
@@ -125,153 +125,15 @@ ecore_cocoa_feed_events(void *anEvent)
       case NSLeftMouseDragged:
       case NSRightMouseDragged:
       case NSOtherMouseDragged:
-      {
-         if (_has_ecore_cocoa_window(event))
-           {
-              Ecore_Event_Mouse_Move * ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));
-              if (!ev) return pass;
-
-              EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
-              NSView *view = [window contentView];
-              NSPoint pt = [event locationInWindow];
-
-              ev->x = pt.x;
-              ev->y = [view frame].size.height - pt.y;
-              ev->root.x = ev->x;
-              ev->root.y = ev->y;
-              ev->timestamp = time;
-              ev->window = (Ecore_Window)window.ecore_window_data;
-              ev->event_window = ev->window;
-              ev->modifiers = 0; /* FIXME: keep modifier around. */
-
-              ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
-           }
-         else
-           {
-              // We might want to handle cases such as events on the menubar.
-              // If so, let's do it here.
-           }
-         pass = EINA_TRUE;
-         break;
-      }
       case NSLeftMouseDown:
       case NSRightMouseDown:
       case NSOtherMouseDown:
-      {
-         if (_has_ecore_cocoa_window(event))
-           {
-              EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
-              NSView *view = [window contentView];
-              NSPoint pt = [event locationInWindow];
-
-              int w = [view frame].size.width;
-              int h = [view frame].size.height;
-              int x = pt.x;
-              int y = h - pt.y;
-
-              if (y <= 0 || x <= 0 || y > h || x > w)
-                {
-                   pass = EINA_TRUE;
-                   break;
-                }
-
-              Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
-              if (!ev) return pass;
-
-              ev->x = pt.x;
-              ev->y = y;
-              ev->root.x = ev->x;
-              ev->root.y = ev->y;
-              ev->timestamp = time;
-              switch ([event buttonNumber])
-                {
-                 case 0: ev->buttons = 1; break;
-                 case 1: ev->buttons = 3; break;
-                 case 2: ev->buttons = 2; break;
-                 default: ev->buttons = 0; break;
-                }
-              ev->window = (Ecore_Window)window.ecore_window_data;
-              ev->event_window = ev->window;
-
-              if ([event clickCount] == 2)
-                ev->double_click = 1;
-              else
-                ev->double_click = 0;
-
-              if ([event clickCount] >= 3)
-                ev->triple_click = 1;
-              else
-                ev->triple_click = 0;
-
-              ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
-           }
-         else
-           {
-              // We might want to handle cases such as events on the menubar.
-              // If so, let's do it here.
-           }
-         pass = EINA_TRUE;
-         break;
-      }
       case NSLeftMouseUp:
       case NSRightMouseUp:
       case NSOtherMouseUp:
       {
-
-         if (_has_ecore_cocoa_window(event))
-           {
-              EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
-              NSView *view = [window contentView];
-              NSPoint pt = [event locationInWindow];
-
-              int w = [view frame].size.width;
-              int h = [view frame].size.height;
-              int x = pt.x;
-              int y = h - pt.y;
-              
-              if (y <= 0 || x <= 0 || y > h || x > w)
-                {
-                   pass = EINA_TRUE;
-                   break;
-                }
-
-              Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
-              if (!ev) return pass;
-
-              ev->x = pt.x;
-              ev->y = y;
-              ev->root.x = ev->x;
-              ev->root.y = ev->y;
-              ev->timestamp = time;
-              switch ([event buttonNumber])
-                {
-                 case 0: ev->buttons = 1; break;
-                 case 1: ev->buttons = 3; break;
-                 case 2: ev->buttons = 2; break;
-                 default: ev->buttons = 0; break;
-                }
-              ev->window = (Ecore_Window)window.ecore_window_data;
-              ev->event_window = ev->window;
-
-              if ([event clickCount] == 2)
-                ev->double_click = 1;
-              else
-                ev->double_click = 0;
-
-              if ([event clickCount] >= 3)
-                ev->triple_click = 1;
-              else
-                ev->triple_click = 0;
-
-              ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
-           }
-         else
-           {
-              // We might want to handle cases such as events on the menubar.
-              // If so, let's do it here.
-           }
-         pass = EINA_TRUE;
-         break;
+        //mouse events are managed in EcoreCocoaWindow
+         return EINA_TRUE;
       }
       case NSKeyDown:
       {
@@ -416,8 +278,8 @@ ecore_cocoa_feed_events(void *anEvent)
       case NSAppKitDefined:
       {
          if ([event subtype] == NSApplicationActivatedEventType)
-        {
-           Ecore_Cocoa_Event_Window *ev;
+     {
+        Ecore_Cocoa_Event_Window *ev;
 
             ev = malloc(sizeof(Ecore_Cocoa_Event_Window));
             if (!ev)
@@ -429,7 +291,7 @@ ecore_cocoa_feed_events(void *anEvent)
             ecore_event_add(ECORE_COCOA_EVENT_GOT_FOCUS, ev, NULL, NULL);
          }
          else if ([event subtype] == NSApplicationDeactivatedEventType)
-        {
+     {
             Ecore_Cocoa_Event_Window *ev;
 
             ev = malloc(sizeof(Ecore_Cocoa_Event_Window));
index 76b9024..0a7d290 100644 (file)
@@ -6,6 +6,7 @@
 #include <Ecore_Cocoa.h>\r
 #include "ecore_cocoa_private.h"\r
 #import "ecore_cocoa_window.h"\r
+#include <Ecore_Input.h>\r
 \r
 @implementation EcoreCocoaWindow\r
 \r
@@ -67,7 +68,6 @@
       (([self isFullScreen] == YES) ? 0 : ecore_cocoa_titlebar_height_get());\r
    event->wid = [notif object];\r
    ecore_event_add(ECORE_COCOA_EVENT_RESIZE, event, NULL, NULL);\r
-   ecore_main_loop_iterate();\r
 }\r
 \r
 - (void)windowDidBecomeKey:(NSNotification *)notification\r
   ecore_event_add(ECORE_COCOA_EVENT_LOST_FOCUS, e, NULL, NULL);\r
 }\r
 \r
+- (void) mouseDown:(NSEvent*) event\r
+{\r
+   unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);\r
+\r
+   NSView *view = [self contentView];\r
+   NSPoint event_location = [event locationInWindow];\r
+   NSPoint pt = [view convertPoint:event_location fromView:nil];\r
+\r
+   int w = [view frame].size.width;\r
+   int h = [view frame].size.height;\r
+   int x = pt.x;\r
+   int y = h - pt.y;\r
+\r
+   if (y <= 0 || x <= 0 || y > h || x > w)\r
+     return;\r
+\r
+   Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));\r
+   if (!ev) return;\r
+\r
+   ev->x = pt.x;\r
+   ev->y = y;\r
+   ev->root.x = ev->x;\r
+   ev->root.y = ev->y;\r
+   ev->timestamp = time;\r
+   switch ([event buttonNumber])\r
+     {\r
+      case 0: ev->buttons = 1; break;\r
+      case 1: ev->buttons = 3; break;\r
+      case 2: ev->buttons = 2; break;\r
+      default: ev->buttons = 0; break;\r
+     }\r
+   ev->window = (Ecore_Window)self.ecore_window_data;\r
+   ev->event_window = ev->window;\r
+\r
+   if ([event clickCount] == 2)\r
+     ev->double_click = 1;\r
+   else\r
+     ev->double_click = 0;\r
+\r
+   if ([event clickCount] >= 3)\r
+     ev->triple_click = 1;\r
+   else\r
+     ev->triple_click = 0;\r
+\r
+   ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);\r
+}\r
+\r
+- (void) mouseUp:(NSEvent*) event\r
+{\r
+   unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);\r
+\r
+   NSView *view = [self contentView];\r
+   NSPoint event_location = [event locationInWindow];\r
+   NSPoint pt = [view convertPoint:event_location fromView:nil];\r
+\r
+   int w = [view frame].size.width;\r
+   int h = [view frame].size.height;\r
+   int x = pt.x;\r
+   int y = h - pt.y;\r
+\r
+   if (y <= 0 || x <= 0 || y > h || x > w)\r
+     return;\r
+\r
+   Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));\r
+   if (!ev) return;\r
+\r
+   ev->x = pt.x;\r
+   ev->y = y;\r
+   ev->root.x = ev->x;\r
+   ev->root.y = ev->y;\r
+   ev->timestamp = time;\r
+   switch ([event buttonNumber])\r
+     {\r
+      case 0: ev->buttons = 1; break;\r
+      case 1: ev->buttons = 3; break;\r
+      case 2: ev->buttons = 2; break;\r
+      default: ev->buttons = 0; break;\r
+     }\r
+   ev->window = (Ecore_Window)self.ecore_window_data;\r
+   ev->event_window = ev->window;\r
+\r
+   if ([event clickCount] == 2)\r
+     ev->double_click = 1;\r
+   else\r
+     ev->double_click = 0;\r
+\r
+   if ([event clickCount] >= 3)\r
+     ev->triple_click = 1;\r
+   else\r
+     ev->triple_click = 0;\r
+\r
+   ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);\r
+}\r
+\r
+- (void) mouseMoved:(NSEvent*) event\r
+{\r
+   Ecore_Event_Mouse_Move * ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));\r
+   if (!ev) return;\r
+\r
+   NSView *view = [self contentView];\r
+   NSPoint event_location = [event locationInWindow];\r
+   NSPoint pt = [view convertPoint:event_location fromView:nil];\r
+\r
+   ev->x = pt.x;\r
+   ev->y = [view frame].size.height - pt.y;\r
+   ev->root.x = ev->x;\r
+   ev->root.y = ev->y;\r
+   ev->timestamp = time;\r
+   ev->window = (Ecore_Window)self.ecore_window_data;\r
+   ev->event_window = ev->window;\r
+   ev->modifiers = 0; /* FIXME: keep modifier around. */\r
+\r
+   ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);\r
+}\r
+\r
+- (void) mouseDragged: (NSEvent*) event\r
+{\r
+   [self mouseMoved:event];\r
+}\r
+\r
 @end\r
 \r
 Ecore_Cocoa_Window *\r