2010-03-27 11:28:50 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
#import "ecore_cocoa_window.h"
|
2014-09-03 11:34:52 -07:00
|
|
|
#import "ecore_cocoa_app.h"
|
2010-03-27 11:28:50 -07:00
|
|
|
|
|
|
|
#include <Eina.h>
|
|
|
|
|
|
|
|
#include <Ecore.h>
|
|
|
|
#include <ecore_private.h>
|
|
|
|
#include <Ecore_Input.h>
|
|
|
|
|
|
|
|
#include "Ecore_Cocoa.h"
|
|
|
|
#include "Ecore_Cocoa_Keys.h"
|
|
|
|
|
2011-11-02 12:20:09 -07:00
|
|
|
|
2010-03-27 11:28:50 -07:00
|
|
|
EAPI int ECORE_COCOA_EVENT_GOT_FOCUS = 0;
|
|
|
|
EAPI int ECORE_COCOA_EVENT_LOST_FOCUS = 0;
|
|
|
|
EAPI int ECORE_COCOA_EVENT_RESIZE = 0;
|
|
|
|
EAPI int ECORE_COCOA_EVENT_EXPOSE = 0;
|
|
|
|
|
|
|
|
static int _ecore_cocoa_init_count = 0;
|
|
|
|
|
|
|
|
static int old_flags;
|
|
|
|
|
2015-01-29 08:08:23 -08:00
|
|
|
static int _ecore_cocoa_log_domain = -1;
|
|
|
|
|
2010-03-27 11:28:50 -07:00
|
|
|
EAPI int
|
2011-11-02 12:20:09 -07:00
|
|
|
ecore_cocoa_init(void)
|
2010-03-27 11:28:50 -07:00
|
|
|
{
|
|
|
|
if (++_ecore_cocoa_init_count != 1)
|
|
|
|
return _ecore_cocoa_init_count;
|
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!ecore_init())
|
2010-03-27 11:28:50 -07:00
|
|
|
return --_ecore_cocoa_init_count;
|
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!ecore_event_init())
|
|
|
|
return --_ecore_cocoa_init_count;
|
2011-11-02 12:20:09 -07:00
|
|
|
|
2015-01-29 08:08:23 -08:00
|
|
|
_ecore_cocoa_log_domain = eina_log_domain_register("ecore_cocoa", ECORE_DEFAULT_LOG_COLOR);
|
|
|
|
if(_ecore_cocoa_log_domain < 0)
|
|
|
|
{
|
|
|
|
EINA_LOG_ERR("Unable to create a log domain for ecore_cocoa.");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-03-27 11:28:50 -07:00
|
|
|
ECORE_COCOA_EVENT_GOT_FOCUS = ecore_event_type_new();
|
|
|
|
ECORE_COCOA_EVENT_LOST_FOCUS = ecore_event_type_new();
|
|
|
|
ECORE_COCOA_EVENT_RESIZE = ecore_event_type_new();
|
|
|
|
ECORE_COCOA_EVENT_EXPOSE = ecore_event_type_new();
|
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
/* Init the Application handler */
|
|
|
|
[Ecore_Cocoa_Application sharedApplication];
|
|
|
|
[NSApp setDelegate:[Ecore_Cocoa_AppDelegate appDelegate]];
|
|
|
|
|
|
|
|
/* Start events monitoring */
|
|
|
|
[NSApp run];
|
|
|
|
|
2010-03-27 11:28:50 -07:00
|
|
|
return _ecore_cocoa_init_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Shuts down the Ecore_Cocoa library.
|
|
|
|
* @return @c The number of times the system has been initialised without
|
|
|
|
* being shut down.
|
|
|
|
* @ingroup Ecore_Cocoa_Library_Group
|
|
|
|
*/
|
|
|
|
EAPI int
|
|
|
|
ecore_cocoa_shutdown(void)
|
|
|
|
{
|
|
|
|
if (--_ecore_cocoa_init_count != 0)
|
|
|
|
return _ecore_cocoa_init_count;
|
|
|
|
|
2015-01-29 08:08:23 -08:00
|
|
|
eina_log_domain_unregister(_ecore_cocoa_log_domain);
|
2010-03-27 11:28:50 -07:00
|
|
|
ecore_event_shutdown();
|
|
|
|
|
|
|
|
return _ecore_cocoa_init_count;
|
|
|
|
}
|
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
static unsigned int
|
|
|
|
_ecore_cocoa_event_modifiers(unsigned int mod)
|
|
|
|
{
|
|
|
|
unsigned int modifiers = 0;
|
|
|
|
|
|
|
|
if(mod & NSShiftKeyMask) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
|
|
|
|
if(mod & NSControlKeyMask) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
|
|
|
|
if(mod & NSAlternateKeyMask) modifiers |= ECORE_EVENT_MODIFIER_ALT;
|
|
|
|
if(mod & NSCommandKeyMask) modifiers |= ECORE_EVENT_MODIFIER_WIN;
|
|
|
|
if(mod & NSNumericPadKeyMask) modifiers |= ECORE_EVENT_LOCK_NUM;
|
|
|
|
|
2015-01-29 08:08:23 -08:00
|
|
|
DBG("key modifiers: %d, %d\n", mod, modifiers);
|
2014-06-08 12:50:42 -07:00
|
|
|
return modifiers;
|
|
|
|
}
|
|
|
|
|
2014-07-23 07:56:16 -07:00
|
|
|
static inline Eina_Bool
|
|
|
|
_nsevent_window_is_type_of(NSEvent *event, Class class)
|
|
|
|
{
|
|
|
|
/* An NSPeriodic event has no window (undefined behaviour) */
|
|
|
|
if ([event type] == NSPeriodic) return EINA_FALSE;
|
2014-12-23 08:51:51 -08:00
|
|
|
return [[event window] isKindOfClass:class];
|
2014-07-23 07:56:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline Eina_Bool
|
|
|
|
_has_ecore_cocoa_window(NSEvent *event)
|
|
|
|
{
|
|
|
|
return _nsevent_window_is_type_of(event, [EcoreCocoaWindow class]);
|
|
|
|
}
|
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
EAPI Eina_Bool
|
|
|
|
ecore_cocoa_feed_events(void *anEvent)
|
2010-03-27 11:28:50 -07:00
|
|
|
{
|
2014-09-03 11:34:52 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(anEvent, EINA_FALSE);
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
NSEvent *event = anEvent;
|
2010-03-27 11:28:50 -07:00
|
|
|
unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
|
2014-09-03 11:34:52 -07:00
|
|
|
Eina_Bool pass = EINA_FALSE;
|
2015-01-22 02:24:42 -08:00
|
|
|
static Eina_Bool compose = EINA_FALSE;
|
|
|
|
static NSText *edit;
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
switch ([event type])
|
2010-03-27 11:28:50 -07:00
|
|
|
{
|
|
|
|
case NSMouseMoved:
|
|
|
|
case NSLeftMouseDragged:
|
|
|
|
case NSRightMouseDragged:
|
|
|
|
case NSOtherMouseDragged:
|
|
|
|
{
|
2014-07-23 07:56:16 -07:00
|
|
|
if (_has_ecore_cocoa_window(event))
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Move * ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!ev) return pass;
|
2014-07-23 07:56:16 -07:00
|
|
|
|
|
|
|
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;
|
2014-09-03 11:34:52 -07:00
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
2014-07-23 07:56:16 -07:00
|
|
|
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.
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
pass = EINA_TRUE;
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSLeftMouseDown:
|
|
|
|
case NSRightMouseDown:
|
|
|
|
case NSOtherMouseDown:
|
|
|
|
{
|
2014-07-23 07:56:16 -07:00
|
|
|
if (_has_ecore_cocoa_window(event))
|
|
|
|
{
|
|
|
|
EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
|
|
|
|
NSView *view = [window contentView];
|
|
|
|
NSPoint pt = [event locationInWindow];
|
|
|
|
|
2015-01-29 08:04:28 -08:00
|
|
|
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;
|
|
|
|
|
2014-07-23 07:56:16 -07:00
|
|
|
ev->x = pt.x;
|
2015-01-29 08:04:28 -08:00
|
|
|
ev->y = y;
|
2014-07-23 07:56:16 -07:00
|
|
|
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;
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
2014-07-23 07:56:16 -07:00
|
|
|
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);
|
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
else
|
2014-07-23 07:56:16 -07:00
|
|
|
{
|
|
|
|
// We might want to handle cases such as events on the menubar.
|
|
|
|
// If so, let's do it here.
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
pass = EINA_TRUE;
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSLeftMouseUp:
|
|
|
|
case NSRightMouseUp:
|
|
|
|
case NSOtherMouseUp:
|
|
|
|
{
|
2013-12-09 23:24:14 -08:00
|
|
|
|
2014-07-23 07:56:16 -07:00
|
|
|
if (_has_ecore_cocoa_window(event))
|
|
|
|
{
|
|
|
|
EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
|
|
|
|
NSView *view = [window contentView];
|
|
|
|
NSPoint pt = [event locationInWindow];
|
|
|
|
|
2015-01-29 08:04:28 -08:00
|
|
|
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;
|
|
|
|
|
2014-07-23 07:56:16 -07:00
|
|
|
ev->x = pt.x;
|
2015-01-29 08:04:28 -08:00
|
|
|
ev->y = y;
|
2014-07-23 07:56:16 -07:00
|
|
|
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;
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
2014-07-23 07:56:16 -07:00
|
|
|
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);
|
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
else
|
2014-07-23 07:56:16 -07:00
|
|
|
{
|
|
|
|
// We might want to handle cases such as events on the menubar.
|
|
|
|
// If so, let's do it here.
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
pass = EINA_TRUE;
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSKeyDown:
|
|
|
|
{
|
|
|
|
Ecore_Event_Key *ev;
|
2014-06-08 12:50:42 -07:00
|
|
|
unsigned int i;
|
2013-12-10 15:13:59 -08:00
|
|
|
EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
|
2015-01-22 02:24:42 -08:00
|
|
|
NSString *keychar = [event characters];
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
ev = calloc(1, sizeof (Ecore_Event_Key));
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!ev) return pass;
|
2014-06-08 12:50:42 -07:00
|
|
|
ev->timestamp = time;
|
|
|
|
ev->modifiers = _ecore_cocoa_event_modifiers([event modifierFlags]);
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2015-01-22 02:24:42 -08:00
|
|
|
if (compose)
|
|
|
|
{
|
|
|
|
[edit interpretKeyEvents:[NSArray arrayWithObject:event]];
|
|
|
|
compose=EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2015-01-22 02:24:42 -08:00
|
|
|
if ([keychar length] > 0)
|
2015-01-22 02:24:42 -08:00
|
|
|
{
|
2015-01-22 02:24:42 -08:00
|
|
|
for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
|
|
|
|
{
|
|
|
|
if (keystable[i].code == [keychar characterAtIndex:0])
|
|
|
|
{
|
|
|
|
DBG("Key pressed: %s %d\n", keystable[i].name, [keychar characterAtIndex:0]);
|
|
|
|
ev->keyname = keystable[i].name;
|
|
|
|
ev->key = keystable[i].name;
|
|
|
|
ev->string = keystable[i].compose;
|
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
|
|
|
ev->event_window = ev->window;
|
|
|
|
ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
|
|
|
|
return pass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
compose=EINA_TRUE;
|
|
|
|
edit = [[event window] fieldEditor:YES forObject:nil];
|
|
|
|
[edit interpretKeyEvents:[NSArray arrayWithObject:event]];
|
2015-01-22 02:24:42 -08:00
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSKeyUp:
|
|
|
|
{
|
|
|
|
Ecore_Event_Key *ev;
|
2014-06-08 12:50:42 -07:00
|
|
|
unsigned int i;
|
2013-12-10 15:13:59 -08:00
|
|
|
EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
|
2015-01-22 02:24:42 -08:00
|
|
|
NSString *keychar = [event characters];
|
2013-12-10 15:13:59 -08:00
|
|
|
|
2015-01-29 08:08:23 -08:00
|
|
|
DBG("Key Up\n");
|
2014-06-08 12:50:42 -07:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof (Ecore_Event_Key));
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!ev) return pass;
|
2014-06-08 12:50:42 -07:00
|
|
|
ev->timestamp = time;
|
|
|
|
ev->modifiers = _ecore_cocoa_event_modifiers([event modifierFlags]);
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2015-01-22 02:24:42 -08:00
|
|
|
if ([keychar length] > 0)
|
2015-01-22 02:24:42 -08:00
|
|
|
{
|
2015-01-22 02:24:42 -08:00
|
|
|
for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
|
|
|
|
{
|
|
|
|
if (keystable[i].code == [keychar characterAtIndex:0])
|
|
|
|
{
|
|
|
|
ev->keyname = keystable[i].name;
|
|
|
|
ev->key = keystable[i].name;
|
|
|
|
ev->string = keystable[i].compose;
|
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
|
|
|
ev->event_window = ev->window;
|
|
|
|
ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
|
|
|
|
return pass;
|
|
|
|
}
|
|
|
|
}
|
2015-01-22 02:24:42 -08:00
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSFlagsChanged:
|
|
|
|
{
|
2014-01-11 01:17:04 -08:00
|
|
|
int flags = [event modifierFlags];
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
Ecore_Event_Key *evDown = NULL;
|
|
|
|
Ecore_Event_Key *evUp = NULL;
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
evDown = calloc(1, sizeof (Ecore_Event_Key));
|
2014-09-03 11:34:52 -07:00
|
|
|
if (!evDown) return pass;
|
2014-06-08 12:50:42 -07:00
|
|
|
|
|
|
|
evUp = calloc(1, sizeof (Ecore_Event_Key));
|
|
|
|
if (!evUp)
|
|
|
|
{
|
|
|
|
free(evDown);
|
2014-09-03 11:34:52 -07:00
|
|
|
return pass;
|
2014-06-08 12:50:42 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Turn special key flags on
|
2010-03-27 11:28:50 -07:00
|
|
|
if (flags & NSShiftKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evDown->key = "Shift_L";
|
2010-03-27 11:28:50 -07:00
|
|
|
else if (flags & NSControlKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evDown->key = "Control_L";
|
2010-03-27 11:28:50 -07:00
|
|
|
else if (flags & NSAlternateKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evDown->key = "Alt_L";
|
2010-03-27 11:28:50 -07:00
|
|
|
else if (flags & NSCommandKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evDown->key = "Super_L";
|
2010-03-27 11:28:50 -07:00
|
|
|
else if (flags & NSAlphaShiftKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evDown->key = "Caps_Lock";
|
2014-06-08 12:50:42 -07:00
|
|
|
|
2015-01-28 06:11:01 -08:00
|
|
|
if (evDown->key)
|
2014-06-08 12:50:42 -07:00
|
|
|
{
|
|
|
|
evDown->timestamp = time;
|
|
|
|
evDown->string = "";
|
|
|
|
ecore_event_add(ECORE_EVENT_KEY_DOWN, evDown, NULL, NULL);
|
|
|
|
old_flags = flags;
|
|
|
|
break;
|
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
|
2014-06-08 12:50:42 -07:00
|
|
|
int changed_flags = flags ^ old_flags;
|
|
|
|
|
|
|
|
// Turn special key flags off
|
|
|
|
if (changed_flags & NSShiftKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evUp->key = "Shift_L";
|
2014-06-08 12:50:42 -07:00
|
|
|
else if (changed_flags & NSControlKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evUp->key = "Control_L";
|
2014-06-08 12:50:42 -07:00
|
|
|
else if (changed_flags & NSAlternateKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evUp->key = "Alt_L";
|
2014-06-08 12:50:42 -07:00
|
|
|
else if (changed_flags & NSCommandKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evUp->key = "Super_L";
|
2014-06-08 12:50:42 -07:00
|
|
|
else if (changed_flags & NSAlphaShiftKeyMask)
|
2015-01-28 06:11:01 -08:00
|
|
|
evUp->key = "Caps_Lock";
|
2014-06-08 12:50:42 -07:00
|
|
|
|
2015-01-28 06:11:01 -08:00
|
|
|
if (evUp->key)
|
2010-03-27 11:28:50 -07:00
|
|
|
{
|
2014-06-08 12:50:42 -07:00
|
|
|
evUp->timestamp = time;
|
|
|
|
evUp->string = "";
|
|
|
|
ecore_event_add(ECORE_EVENT_KEY_UP, evUp, NULL, NULL);
|
2010-03-27 11:28:50 -07:00
|
|
|
old_flags = flags;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSAppKitDefined:
|
|
|
|
{
|
|
|
|
if ([event subtype] == NSApplicationActivatedEventType)
|
2015-01-15 08:20:16 -08:00
|
|
|
{
|
|
|
|
Ecore_Cocoa_Event_Window *ev;
|
|
|
|
|
|
|
|
ev = malloc(sizeof(Ecore_Cocoa_Event_Window));
|
|
|
|
if (!ev)
|
|
|
|
{
|
|
|
|
pass = EINA_FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ev->wid = [event window];
|
|
|
|
ecore_event_add(ECORE_COCOA_EVENT_GOT_FOCUS, ev, NULL, NULL);
|
|
|
|
}
|
2010-03-27 11:28:50 -07:00
|
|
|
else if ([event subtype] == NSApplicationDeactivatedEventType)
|
2015-01-15 08:20:16 -08:00
|
|
|
{
|
|
|
|
Ecore_Cocoa_Event_Window *ev;
|
|
|
|
|
|
|
|
ev = malloc(sizeof(Ecore_Cocoa_Event_Window));
|
|
|
|
if (!ev)
|
|
|
|
{
|
|
|
|
pass = EINA_FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ev->wid = [event window];
|
|
|
|
ecore_event_add(ECORE_COCOA_EVENT_LOST_FOCUS, ev, NULL, NULL);
|
|
|
|
}
|
2014-09-03 11:34:52 -07:00
|
|
|
pass = EINA_TRUE; // pass along AppKit events, for window manager
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NSScrollWheel:
|
|
|
|
{
|
2015-01-29 08:08:23 -08:00
|
|
|
DBG("Scroll Wheel\n");
|
2015-01-29 04:56:49 -08:00
|
|
|
|
|
|
|
EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
|
|
|
|
Ecore_Event_Mouse_Wheel *ev;
|
|
|
|
|
|
|
|
ev = malloc(sizeof(Ecore_Event_Mouse_Wheel));
|
|
|
|
if (!ev) return pass;
|
|
|
|
|
|
|
|
ev->window = (Ecore_Window)window.ecore_window_data;
|
|
|
|
ev->event_window = ev->window;
|
|
|
|
ev->modifiers = 0; /* FIXME: keep modifier around. */
|
|
|
|
ev->timestamp = time;
|
|
|
|
ev->z = [event deltaX] != 0 ? [event deltaX] : -([event deltaY]);
|
|
|
|
ev->direction = [event deltaX] != 0 ? 0 : 1;
|
|
|
|
|
|
|
|
ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
|
|
|
|
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
2014-09-03 11:34:52 -07:00
|
|
|
pass = EINA_TRUE;
|
2010-03-27 11:28:50 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-03 11:34:52 -07:00
|
|
|
return pass;
|
2010-03-27 11:28:50 -07:00
|
|
|
}
|
2014-06-08 12:50:42 -07:00
|
|
|
|
|
|
|
EAPI void
|
|
|
|
ecore_cocoa_screen_size_get(Ecore_Cocoa_Screen *screen, int *w, int *h)
|
|
|
|
{
|
|
|
|
NSSize pt = [[[NSScreen screens] objectAtIndex:0] frame].size;
|
|
|
|
|
|
|
|
if (w) *w = (int)pt.width;
|
|
|
|
if (h) *h = (int)pt.height;
|
|
|
|
}
|
2014-07-10 11:04:24 -07:00
|
|
|
|
|
|
|
EAPI int
|
|
|
|
ecore_cocoa_titlebar_height_get(void)
|
|
|
|
{
|
|
|
|
static int height = -1;
|
|
|
|
|
|
|
|
if (height == -1)
|
|
|
|
{
|
|
|
|
NSRect frame = NSMakeRect(0, 0, 100, 100);
|
|
|
|
NSRect contentRect;
|
|
|
|
contentRect = [NSWindow contentRectForFrameRect:frame
|
|
|
|
styleMask:NSTitledWindowMask];
|
|
|
|
height = (frame.size.height - contentRect.size.height);
|
|
|
|
}
|
|
|
|
return height;
|
|
|
|
}
|
|
|
|
|