forked from enlightenment/efl
ecore_cocoa: add support for system cursors
- Ecore_Cocoa_Cursor enum which references system cursors; - API to show/hide cursor: ecore_cocoa_window_cursor_show(); - API to set system cursor: ecore_cocoa_window_cursor_set(); - Ecore_Evas interface to get Ecore_Cocoa_Window from Ecore_Evas. @feature Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
parent
ba4fbb99bc
commit
2c93c73cbd
|
@ -7,6 +7,7 @@ lib_LTLIBRARIES += lib/ecore_cocoa/libecore_cocoa.la
|
|||
installed_ecorecocoamainheadersdir = $(includedir)/ecore-cocoa-@VMAJ@
|
||||
dist_installed_ecorecocoamainheaders_DATA = \
|
||||
lib/ecore_cocoa/Ecore_Cocoa.h \
|
||||
lib/ecore_cocoa/Ecore_Cocoa_Cursor.h \
|
||||
lib/ecore_cocoa/Ecore_Cocoa_Keys.h
|
||||
|
||||
lib_ecore_cocoa_libecore_cocoa_la_SOURCES = \
|
||||
|
|
|
@ -20,6 +20,7 @@ lib/ecore_evas/ecore_evas_private.h \
|
|||
lib/ecore_evas/ecore_evas_extn.h \
|
||||
lib/ecore_evas/ecore_evas_extn.c \
|
||||
lib/ecore_evas/ecore_evas_wayland.h \
|
||||
lib/ecore_evas/ecore_evas_cocoa.h \
|
||||
lib/ecore_evas/ecore_evas_win32.h \
|
||||
lib/ecore_evas/ecore_evas_x11.h \
|
||||
lib/ecore_evas/ecore_evas_util.c
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#endif
|
||||
|
||||
#include <Eina.h>
|
||||
#include "Ecore_Cocoa_Cursor.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -165,6 +166,10 @@ EAPI int ecore_cocoa_titlebar_height_get(void);
|
|||
|
||||
EAPI Ecore_Cocoa_Window_Id ecore_cocoa_window_get_window_id(Ecore_Cocoa_Window *window);
|
||||
|
||||
|
||||
EAPI void ecore_cocoa_window_cursor_set(Ecore_Cocoa_Window *win, Ecore_Cocoa_Cursor c);
|
||||
EAPI void ecore_cocoa_window_cursor_show(Ecore_Cocoa_Window *win, Eina_Bool show);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef __ECORE_COCOA_CURSOR_H__
|
||||
#define __ECORE_COCOA_CURSOR_H__
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ECORE_COCOA_CURSOR_ARROW = 0,
|
||||
ECORE_COCOA_CURSOR_CONTEXTUAL_MENU,
|
||||
ECORE_COCOA_CURSOR_CLOSED_HAND,
|
||||
ECORE_COCOA_CURSOR_CROSSHAIR,
|
||||
ECORE_COCOA_CURSOR_DISAPPEARING_ITEM,
|
||||
ECORE_COCOA_CURSOR_DRAG_COPY,
|
||||
ECORE_COCOA_CURSOR_DRAG_LINK,
|
||||
ECORE_COCOA_CURSOR_IBEAM,
|
||||
ECORE_COCOA_CURSOR_OPEN_HAND,
|
||||
ECORE_COCOA_CURSOR_OPERATION_NOT_ALLOWED,
|
||||
ECORE_COCOA_CURSOR_POINTING_HAND,
|
||||
ECORE_COCOA_CURSOR_RESIZE_DOWN,
|
||||
ECORE_COCOA_CURSOR_RESIZE_LEFT,
|
||||
ECORE_COCOA_CURSOR_RESIZE_LEFT_RIGHT,
|
||||
ECORE_COCOA_CURSOR_RESIZE_RIGHT,
|
||||
ECORE_COCOA_CURSOR_RESIZE_UP,
|
||||
ECORE_COCOA_CURSOR_RESIZE_UP_DOWN,
|
||||
ECORE_COCOA_CURSOR_IBEAM_VERTICAL,
|
||||
|
||||
__ECORE_COCOA_CURSOR_LAST, /* Sentinel */
|
||||
|
||||
ECORE_COCOA_CURSOR_DEFAULT = ECORE_COCOA_CURSOR_ARROW
|
||||
|
||||
} Ecore_Cocoa_Cursor;
|
||||
|
||||
#endif /* ! __ECORE_COCOA_CURSOR_H__ */
|
||||
|
|
@ -61,6 +61,9 @@ ecore_cocoa_init(void)
|
|||
/* Start events monitoring */
|
||||
[NSApp run];
|
||||
|
||||
if (!_ecore_cocoa_window_init())
|
||||
return --_ecore_cocoa_init_count;
|
||||
|
||||
return _ecore_cocoa_init_count;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,4 +62,8 @@ struct _Ecore_Cocoa_Window
|
|||
};
|
||||
|
||||
|
||||
/* Internal init */
|
||||
Eina_Bool _ecore_cocoa_window_init(void);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,9 +6,13 @@
|
|||
|
||||
#include <Ecore.h>
|
||||
#include <Ecore_Cocoa.h>
|
||||
#include <Ecore_Cocoa_Cursor.h>
|
||||
#import "ecore_cocoa_window.h"
|
||||
#include "ecore_cocoa_private.h"
|
||||
|
||||
static NSCursor *_cursors[__ECORE_COCOA_CURSOR_LAST];
|
||||
|
||||
|
||||
@implementation EcoreCocoaWindow
|
||||
|
||||
@synthesize ecore_window_data;
|
||||
|
@ -501,3 +505,52 @@ Ecore_Cocoa_Window_Id ecore_cocoa_window_get_window_id(Ecore_Cocoa_Window *windo
|
|||
|
||||
return window->window;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
ecore_cocoa_window_cursor_set(Ecore_Cocoa_Window *win,
|
||||
Ecore_Cocoa_Cursor c)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN(win);
|
||||
EINA_SAFETY_ON_FALSE_RETURN((c >= 0) && (c <= __ECORE_COCOA_CURSOR_LAST));
|
||||
|
||||
NSCursor *cursor = _cursors[c];
|
||||
|
||||
DBG("Setting cursor %i (%s)", c, [[cursor description] UTF8String]);
|
||||
[cursor set];
|
||||
}
|
||||
|
||||
EAPI void
|
||||
ecore_cocoa_window_cursor_show(Ecore_Cocoa_Window *win,
|
||||
Eina_Bool show)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN(win);
|
||||
|
||||
if (show) [NSCursor unhide];
|
||||
else [NSCursor hide];
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
_ecore_cocoa_window_init(void)
|
||||
{
|
||||
_cursors[ECORE_COCOA_CURSOR_ARROW] = [NSCursor arrowCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_CONTEXTUAL_MENU] = [NSCursor contextualMenuCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_CLOSED_HAND] = [NSCursor closedHandCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_CROSSHAIR] = [NSCursor crosshairCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_DISAPPEARING_ITEM] = [NSCursor disappearingItemCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_DRAG_COPY] = [NSCursor dragCopyCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_DRAG_LINK] = [NSCursor dragLinkCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_IBEAM] = [NSCursor IBeamCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_OPEN_HAND] = [NSCursor openHandCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_OPERATION_NOT_ALLOWED] = [NSCursor operationNotAllowedCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_POINTING_HAND] = [NSCursor pointingHandCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_DOWN] = [NSCursor resizeDownCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_LEFT] = [NSCursor resizeLeftCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_LEFT_RIGHT] = [NSCursor resizeLeftRightCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_RIGHT] = [NSCursor resizeRightCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_UP] = [NSCursor resizeUpCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_RESIZE_UP_DOWN] = [NSCursor resizeUpDownCursor];
|
||||
_cursors[ECORE_COCOA_CURSOR_IBEAM_VERTICAL] = [NSCursor IBeamCursorForVerticalLayout];
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1317,6 +1317,8 @@ EAPI void ecore_evas_wayland_pointer_set(Ecore_Evas *ee, int hot_x, i
|
|||
EAPI void ecore_evas_wayland_type_set(Ecore_Evas *ee, int type);
|
||||
EAPI Ecore_Wl_Window *ecore_evas_wayland_window_get(const Ecore_Evas *ee);
|
||||
|
||||
EAPI Ecore_Cocoa_Window *ecore_evas_cocoa_window_get(const Ecore_Evas *ee);
|
||||
|
||||
EAPI Ecore_Evas *ecore_evas_drm_new(const char *device, unsigned int parent, int x, int y, int w, int h);
|
||||
EAPI Ecore_Evas *ecore_evas_gl_drm_new(const char *device, unsigned int parent, int x, int y, int w, int h); /** @since 1.12 */
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "ecore_evas_private.h"
|
||||
#include "ecore_evas_x11.h"
|
||||
#include "ecore_evas_wayland.h"
|
||||
#include "ecore_evas_cocoa.h"
|
||||
#include "ecore_evas_extn.h"
|
||||
#include "ecore_evas_win32.h"
|
||||
|
||||
|
@ -3983,6 +3984,15 @@ ecore_evas_wayland_window_get(const Ecore_Evas *ee)
|
|||
return iface->window_get(ee);
|
||||
}
|
||||
|
||||
EAPI Ecore_Cocoa_Window *
|
||||
ecore_evas_cocoa_window_get(const Ecore_Evas *ee)
|
||||
{
|
||||
Ecore_Evas_Interface_Cocoa *iface;
|
||||
iface = (Ecore_Evas_Interface_Cocoa *)_ecore_evas_interface_get(ee, "opengl_cocoa");
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(iface, NULL);
|
||||
return iface->window_get(ee);
|
||||
}
|
||||
|
||||
EAPI Ecore_Evas *
|
||||
ecore_evas_drm_new(const char *disp_name, unsigned int parent,
|
||||
int x, int y, int w, int h)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef __ECORE_EVAS_COCOA_H__
|
||||
#define __ECORE_EVAS_COCOA_H__
|
||||
|
||||
typedef struct _Ecore_Evas_Interface_Cocoa Ecore_Evas_Interface_Cocoa;
|
||||
|
||||
struct _Ecore_Evas_Interface_Cocoa
|
||||
{
|
||||
Ecore_Evas_Interface base;
|
||||
|
||||
Ecore_Cocoa_Window *(*window_get)(const Ecore_Evas *ee);
|
||||
};
|
||||
|
||||
#endif /* ! __ECORE_EVAS_COCOA_H__ */
|
||||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "Ecore_Evas.h"
|
||||
#include "ecore_evas_private.h"
|
||||
#include "ecore_evas_cocoa.h"
|
||||
|
||||
#ifdef EAPI
|
||||
# undef EAPI
|
||||
|
@ -44,6 +45,9 @@ static Eina_List *ecore_evases = NULL;
|
|||
static Ecore_Event_Handler *ecore_evas_event_handlers[5] = { 0 };
|
||||
static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
|
||||
|
||||
static const char *_iface_name = "opengl_cocoa";
|
||||
static const int _iface_version = 1;
|
||||
|
||||
static int
|
||||
_render_updates_process(Ecore_Evas *ee, Eina_List *updates)
|
||||
{
|
||||
|
@ -528,16 +532,19 @@ static void
|
|||
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
|
||||
{
|
||||
int x, y;
|
||||
Evas_Object *old;
|
||||
Ecore_Cocoa_Window *win = (Ecore_Cocoa_Window *)(ee->prop.window);
|
||||
DBG("");
|
||||
if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
|
||||
|
||||
old = ee->prop.cursor.object;
|
||||
if (obj == NULL)
|
||||
{
|
||||
ee->prop.cursor.object = NULL;
|
||||
ee->prop.cursor.layer = 0;
|
||||
ee->prop.cursor.hot.x = 0;
|
||||
ee->prop.cursor.hot.y = 0;
|
||||
return;
|
||||
ecore_cocoa_window_cursor_show(win, EINA_TRUE);
|
||||
goto end;
|
||||
}
|
||||
|
||||
ee->prop.cursor.object = obj;
|
||||
|
@ -546,17 +553,27 @@ _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int h
|
|||
ee->prop.cursor.hot.y = hot_y;
|
||||
|
||||
evas_pointer_output_xy_get(ee->evas, &x, &y);
|
||||
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
|
||||
if (obj != old)
|
||||
{
|
||||
ecore_cocoa_window_cursor_show(win, EINA_FALSE);
|
||||
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
|
||||
evas_object_pass_events_set(ee->prop.cursor.object, 1);
|
||||
if (evas_pointer_inside_get(ee->evas))
|
||||
evas_object_show(ee->prop.cursor.object);
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
|
||||
_ecore_evas_object_cursor_del, ee);
|
||||
}
|
||||
evas_object_move(ee->prop.cursor.object,
|
||||
x - ee->prop.cursor.hot.x,
|
||||
y - ee->prop.cursor.hot.y);
|
||||
|
||||
evas_object_pass_events_set(ee->prop.cursor.object, 1);
|
||||
|
||||
if (evas_pointer_inside_get(ee->evas))
|
||||
evas_object_show(ee->prop.cursor.object);
|
||||
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
|
||||
end:
|
||||
if ((old) && (obj != old))
|
||||
{
|
||||
evas_object_event_callback_del_full(old, EVAS_CALLBACK_DEL,
|
||||
_ecore_evas_object_cursor_del, ee);
|
||||
evas_object_del(old);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -688,10 +705,19 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
|
|||
NULL // msg_send
|
||||
};
|
||||
|
||||
static Ecore_Cocoa_Window *
|
||||
_ecore_evas_cocoa_window_get(const Ecore_Evas *ee)
|
||||
{
|
||||
/* See affectation of ee->prop.window in ecore_evas_cocoa_new_internal */
|
||||
return (Ecore_Cocoa_Window *)(ee->prop.window);
|
||||
}
|
||||
|
||||
|
||||
EAPI Ecore_Evas *
|
||||
ecore_evas_cocoa_new_internal(Ecore_Cocoa_Window *parent EINA_UNUSED, int x, int y, int w, int h)
|
||||
{
|
||||
Ecore_Evas *ee;
|
||||
Ecore_Evas_Interface_Cocoa *iface;
|
||||
|
||||
if (!ecore_cocoa_init())
|
||||
return NULL;
|
||||
|
@ -755,6 +781,18 @@ ecore_evas_cocoa_new_internal(Ecore_Cocoa_Window *parent EINA_UNUSED, int x, int
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Interface setup */
|
||||
iface = calloc(1, sizeof(*iface));
|
||||
if (EINA_UNLIKELY(!iface))
|
||||
{
|
||||
_ecore_evas_cocoa_shutdown();
|
||||
free(ee);
|
||||
return NULL;
|
||||
}
|
||||
iface->base.name = _iface_name;
|
||||
iface->base.version = _iface_version;
|
||||
iface->window_get = _ecore_evas_cocoa_window_get;
|
||||
ee->engine.ifaces = eina_list_append(ee->engine.ifaces, iface);
|
||||
|
||||
ee->engine.func->fn_render = _ecore_evas_cocoa_render;
|
||||
_ecore_evas_register(ee);
|
||||
|
|
Loading…
Reference in New Issue