diff --git a/doc/ecore/ecore.rst b/doc/ecore/ecore.rst index cfb36c1..ca89065 100644 --- a/doc/ecore/ecore.rst +++ b/doc/ecore/ecore.rst @@ -110,6 +110,7 @@ API Reference :titlesonly: module-ecore + module-ecore_input module-ecore_con diff --git a/doc/ecore/module-ecore_input.rst b/doc/ecore/module-ecore_input.rst new file mode 100644 index 0000000..8022ea2 --- /dev/null +++ b/doc/ecore/module-ecore_input.rst @@ -0,0 +1,3 @@ + +.. automodule:: efl.ecore_input + diff --git a/efl/ecore_input/efl.ecore_input.pxd b/efl/ecore_input/efl.ecore_input.pxd new file mode 100644 index 0000000..ce0de79 --- /dev/null +++ b/efl/ecore_input/efl.ecore_input.pxd @@ -0,0 +1,244 @@ +# Copyright (C) 2007-2015 various contributors (see AUTHORS) +# +# This file is part of Python-EFL. +# +# Python-EFL is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# Python-EFL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this Python-EFL. If not, see . + +from efl.eina cimport Eina_Bool +from efl.ecore cimport Ecore_Event_Handler, ecore_event_handler_add, \ + ecore_event_handler_del + + +cdef extern from "Ecore_Input.h": + + #################################################################### + # Enums + # + cpdef enum Ecore_Event_Modifier: # this is not really an enum + ECORE_EVENT_MODIFIER_SHIFT + ECORE_EVENT_MODIFIER_CTRL + ECORE_EVENT_MODIFIER_ALT + ECORE_EVENT_MODIFIER_WIN + ECORE_EVENT_MODIFIER_SCROLL + ECORE_EVENT_MODIFIER_NUM + ECORE_EVENT_MODIFIER_CAPS + ECORE_EVENT_LOCK_SCROLL + ECORE_EVENT_LOCK_NUM + ECORE_EVENT_LOCK_CAPS + ECORE_EVENT_LOCK_SHIFT + ECORE_EVENT_MODIFIER_ALTGR + ctypedef enum Ecore_Event_Modifier: + pass + + #################################################################### + # events (not exposed to python) + # + int ECORE_EVENT_KEY_DOWN + int ECORE_EVENT_KEY_UP + int ECORE_EVENT_MOUSE_BUTTON_DOWN + int ECORE_EVENT_MOUSE_BUTTON_UP + int ECORE_EVENT_MOUSE_MOVE + int ECORE_EVENT_MOUSE_IN + int ECORE_EVENT_MOUSE_OUT + int ECORE_EVENT_MOUSE_WHEEL + + #################################################################### + # Data Types + # + ctypedef void *Ecore_Window + + ctypedef struct _EventPoint: + int x + int y + + ctypedef struct _EventMulti: + int device + double radius + double radius_x + double radius_y + double pressure + double angle + double x + double y + _EventPoint root + + ctypedef struct Ecore_Event_Key: + const char *keyname + const char *key + const char *string + const char *compose + Ecore_Window window + Ecore_Window root_window + Ecore_Window event_window + unsigned int timestamp + unsigned int modifiers + int same_screen + unsigned int keycode + void *data + + ctypedef struct Ecore_Event_Mouse_Button: + Ecore_Window window + Ecore_Window root_window + Ecore_Window event_window + unsigned int timestamp + unsigned int modifiers + unsigned int buttons + unsigned int double_click + unsigned int triple_click + int same_screen + int x + int y + _EventPoint root + _EventMulti multi + + ctypedef struct Ecore_Event_Mouse_Wheel: + Ecore_Window window + Ecore_Window root_window + Ecore_Window event_window + unsigned int timestamp + unsigned int modifiers + int same_screen + int direction + int z + int x + int y + _EventPoint root + + ctypedef struct Ecore_Event_Mouse_Move: + Ecore_Window window + Ecore_Window root_window + Ecore_Window event_window + unsigned int timestamp + unsigned int modifiers + int same_screen + int x + int y + _EventPoint root + _EventMulti multi + + ctypedef struct Ecore_Event_Mouse_IO: + Ecore_Window window + Ecore_Window event_window + unsigned int timestamp + unsigned int modifiers + int x + int y + + + #################################################################### + # Functions + # + int ecore_event_init() + int ecore_event_shutdown() + + +#################################################################### +# Python classes +# +from efl.ecore cimport Event, EventHandler + + +cdef class Window: + # Can we do something with this opaque stuct ? + pass + + +cdef class InputEventHandler(EventHandler): + pass + + +cdef class EventPoint: + cdef readonly int x + cdef readonly int y + + +cdef class EventMulti: + cdef readonly int device + cdef readonly double radius + cdef readonly double radius_x + cdef readonly double radius_y + cdef readonly double pressure + cdef readonly double angle + cdef readonly double x + cdef readonly double y + cdef readonly double root_x + cdef readonly double root_y + + +cdef class EventKey(Event): + cdef readonly object keyname + cdef readonly object key + cdef readonly object string + cdef readonly object compose + ## Can we do something with this Window opaque struct ? + # cdef readonly Window window + # cdef readonly Window root_window + # cdef readonly Window event_window + cdef readonly unsigned int modifiers + cdef readonly unsigned int timestamp + cdef readonly unsigned int keycode + cdef readonly object same_screen + + +cdef class EventMouseButton(Event): + # cdef readonly Window window + # cdef readonly Window root_window + # cdef readonly Window event_window + cdef readonly unsigned int modifiers + cdef readonly unsigned int timestamp + cdef readonly unsigned int buttons + cdef readonly object double_click + cdef readonly object triple_click + cdef readonly object same_screen + cdef readonly int x + cdef readonly int y + cdef readonly EventPoint root + cdef readonly EventMulti multi + + +cdef class EventMouseMove(Event): + # cdef readonly Window window + # cdef readonly Window root_window + # cdef readonly Window event_window + cdef readonly unsigned int modifiers + cdef readonly unsigned int timestamp + cdef readonly object same_screen + cdef readonly int x + cdef readonly int y + cdef readonly EventPoint root + cdef readonly EventMulti multi + + +cdef class EventMouseIO(Event): + # cdef readonly Window window + # cdef readonly Window event_window + cdef readonly unsigned int modifiers + cdef readonly unsigned int timestamp + cdef readonly int x + cdef readonly int y + + +cdef class EventMouseWheel(Event): + # cdef readonly Window window + # cdef readonly Window root_window + # cdef readonly Window event_window + cdef readonly unsigned int modifiers + cdef readonly unsigned int timestamp + cdef readonly object same_screen + cdef readonly int direction + cdef readonly int z + cdef readonly int x + cdef readonly int y + cdef readonly EventPoint root + diff --git a/efl/ecore_input/efl.ecore_input.pyx b/efl/ecore_input/efl.ecore_input.pyx new file mode 100644 index 0000000..1a7f891 --- /dev/null +++ b/efl/ecore_input/efl.ecore_input.pyx @@ -0,0 +1,112 @@ +# Copyright (C) 2007-2015 various contributors (see AUTHORS) +# +# This file is part of Python-EFL. +# +# Python-EFL is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# Python-EFL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this Python-EFL. If not, see . + +""" + +:mod:`efl.ecore_input` Module +############################# + +.. versionadded:: 1.17 + +This module provide access to the low-level input events, you usually +don't need to use this stuff, unless you need some sort of custom event +handling. + +To be informed about specific events just use one of the +on_*_add(func, \*args, \**kargs) functions, the callback given will be fired +when events occur. + +Callback signature is:: + + func(event, *args, **kargs) → int + +Where ``event`` will be a class relative to the specific event (such as +:class:`EventKey`) All the additional arguments and keyword arguments passed +in the \*_add function will be passed back in the callback. + +In some events (EventKey at least) the callback function may return +ecore.ECORE_CALLBACK_DONE or ecore.ECORE_CALLBACK_PASS_ON to block the +event propagation down the chain or not. + +To stop receiving event use :func:`efl.ecore.EventHandler.delete` + + +Enumerations +============ + +.. _Ecore_Event_Modifier: + +Ecore_Event_Modifier +-------------------- + +.. data:: ECORE_EVENT_MODIFIER_SHIFT + +.. data:: ECORE_EVENT_MODIFIER_CTRL + +.. data:: ECORE_EVENT_MODIFIER_ALT + +.. data:: ECORE_EVENT_MODIFIER_WIN + +.. data:: ECORE_EVENT_MODIFIER_SCROLL + +.. data:: ECORE_EVENT_MODIFIER_NUM + +.. data:: ECORE_EVENT_MODIFIER_CAPS + +.. data:: ECORE_EVENT_LOCK_SCROLL + +.. data:: ECORE_EVENT_LOCK_NUM + +.. data:: ECORE_EVENT_LOCK_CAPS + +.. data:: ECORE_EVENT_LOCK_SHIFT + +.. data:: ECORE_EVENT_MODIFIER_ALTGR + + +Classes and Functions +===================== + +""" + + +import atexit +import traceback + + +def init(): + """ Initialize the Ecore Input library + + .. note:: You never need to call this, it is automatically called at module + import + """ + ecore_event_init() + _ecore_input_events_register() + +def shutdown(): + """ Shutdown the Ecore Input library. + + .. note:: You never need to call this, it is automatically called at exit + + """ + ecore_event_shutdown() + + +include "efl.ecore_input_events.pxi" + +init() +atexit.register(shutdown) diff --git a/efl/ecore_input/efl.ecore_input_events.pxi b/efl/ecore_input/efl.ecore_input_events.pxi new file mode 100644 index 0000000..6824f9a --- /dev/null +++ b/efl/ecore_input/efl.ecore_input_events.pxi @@ -0,0 +1,377 @@ +# Copyright (C) 2007-2015 various contributors (see AUTHORS) +# +# This file is part of Python-EFL. +# +# Python-EFL is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# Python-EFL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this Python-EFL. If not, see . + + +from efl.utils.conversions cimport _ctouni +from efl.ecore cimport _event_mapping_register, _event_mapping_get + + +cdef int _input_events_registered = 0 + +cdef int _ecore_input_events_register() except 0: + global _input_events_registered + + if _input_events_registered == 0: + _event_mapping_register(ECORE_EVENT_KEY_DOWN, EventKey) + _event_mapping_register(ECORE_EVENT_KEY_UP, EventKey) + _event_mapping_register(ECORE_EVENT_MOUSE_BUTTON_DOWN, EventMouseButton) + _event_mapping_register(ECORE_EVENT_MOUSE_BUTTON_UP, EventMouseButton) + _event_mapping_register(ECORE_EVENT_MOUSE_MOVE, EventMouseMove) + _event_mapping_register(ECORE_EVENT_MOUSE_IN, EventMouseIO) + _event_mapping_register(ECORE_EVENT_MOUSE_OUT, EventMouseIO) + _event_mapping_register(ECORE_EVENT_MOUSE_WHEEL, EventMouseWheel) + + _input_events_registered = 1 + + return 1 + + +cdef Eina_Bool _input_event_handler_cb(void *data, int type, void *event) with gil: + cdef EventHandler handler + cdef Eina_Bool r + + assert event != NULL + assert data != NULL, "data should not be NULL!" + handler = data + assert type == handler.type, "handler type isn't the same as event type!" + + try: + r = handler._exec(event) + except Exception: + traceback.print_exc() + r = 0 + + return r + + +cdef class InputEventHandler(EventHandler): + """ + The event handler class + + You never instantiate this class directly, instead use one of the + on_*_add() functions. + """ + def __init__(self, int type, func, *args, **kargs): + + if not callable(func): + raise TypeError("Parameter 'func' must be callable") + + event_cls = _event_mapping_get(type) + if event_cls is None: + raise ValueError("Unknow Ecore_Event type %d" % type) + + self.type = type + self.event_cls = event_cls + self.func = func + self.args = args + self.kargs = kargs + self._set_obj(ecore_event_handler_add(type, _input_event_handler_cb, + self)) + + +cdef class EventKey(Event): + """ EventKey() + + Contains information about an Ecore keyboard event. + + .. seealso :: :func:`on_key_down_add`, :func:`on_key_up_add` + + :ivar str keyname: The key name + :ivar str key: The key symbol + :ivar str string: + :ivar int compose: Final string corresponding to the key symbol composed + :ivar int timestamp: Time when the event occurred. + :ivar int modifiers: :ref:`Ecore_Event_Modifier` The OR combination of modifiers key + :ivar bool same_screen: Same screen flag + :ivar int keycode: Key scan code numeric value + + """ + cdef int _set_obj(self, void *o) except 0: + cdef Ecore_Event_Key *obj + obj = o + self.keyname = _ctouni(obj.keyname) + self.key = _ctouni(obj.key) + self.string = _ctouni(obj.string) + self.compose = _ctouni(obj.compose) + ## Can we do something with this Window opaque struct ? + # self.window = Window(obj.window) + # self.root_window = Window(obj.root_window) + # self.event_window = Window(obj.event_window) + self.timestamp = obj.timestamp + self.modifiers = obj.modifiers + self.same_screen = bool(obj.same_screen) + self.keycode = obj.keycode + return 1 + + +cdef class EventPoint: + """ + :ivar int x: x coordinate + :ivar int y: y coordinate + """ + def __init__(self, int x, int y): + self.x = x + self.y = y + + def __repr__(self): + return "" % (self.x, self.y) + +cdef class EventMulti: + """ + :ivar int device: 0 if normal mouse, 1+ for other mouse-devices (eg multi-touch - other fingers) + :ivar double radius: radius of press point - radius_x and y if its an ellipse (radius is the average of the 2) + :ivar double radius_x: + :ivar double radius_y: + :ivar double pressure: 1.0 == normal, > 1.0 == more, 0.0 == none + :ivar double angle: relative to perpendicular (0.0 == perpendicular), in degrees + :ivar double x: with sub-pixel precision, if available + :ivar double y: with sub-pixel precision, if available + :ivar double root_x: with sub-pixel precision, if available + :ivar double root_y: with sub-pixel precision, if available + """ + def __init__(self, int device, double radius, double radius_x, double radius_y, + double pressure, double angle, double x, double y, + double root_x, double root_y): + self.device = device + self.radius = radius + self.radius_x = radius_x + self.radius_y = radius_y + self.pressure = pressure + self.angle = angle + self.x = x + self.y = y + self.root_x = root_x + self.root_y = root_y + + def __repr__(self): + return "" + + +cdef class EventMouseButton(Event): + """ EventMouseButton() + + Contains information about an Ecore mouse button event. + + .. seealso :: :func:`on_mouse_button_down_add`, :func:`on_mouse_button_up_add` + + :ivar int timestamp: Time when the event occurred + :ivar int modifiers: :ref:`Ecore_Event_Modifier` The OR combination of modifiers key + :ivar int buttons: The button that was used + :ivar bool double_click: Double click event + :ivar bool triple_click: Triple click event + :ivar bool same_screen: Same screen flag + :ivar int x: x coordinate relative to window where event happened + :ivar int y: y coordinate relative to window where event happened + :ivar EventPoint root: :class:`EventPoint` Coordinates relative to root window + + """ + cdef int _set_obj(self, void *o) except 0: + cdef Ecore_Event_Mouse_Button *obj + obj = o + # self.window = Window(obj.window) + # self.root_window = Window(obj.root_window) + # self.event_window = Window(obj.event_window) + self.timestamp = obj.timestamp + self.modifiers = obj.modifiers + self.buttons = obj.buttons + self.double_click = bool(obj.double_click) + self.triple_click = bool(obj.triple_click) + self.same_screen = bool(obj.same_screen) + self.x = obj.x + self.y = obj.y + self.root = EventPoint(obj.root.x, obj.root.y) + self.multi = EventMulti(obj.multi.device, obj.multi.radius, + obj.multi.radius_x, obj.multi.radius_y, + obj.multi.pressure, obj.multi.angle, + obj.multi.x, obj.multi.y, + obj.multi.root.x, obj.multi.root.y) + return 1 + + +cdef class EventMouseMove(Event): + """ EventMouseMove() + + Contains information about an Ecore mouse move event. + + .. seealso :: :func:`on_mouse_move_add` + + :ivar int timestamp: Time when the event occurred + :ivar int modifiers: :ref:`Ecore_Event_Modifier` The OR combination of modifiers key + :ivar bool same_screen: Same screen flag + :ivar int x: x coordinate relative to window where event happened + :ivar int y: y coordinate relative to window where event happened + :ivar EventPoint root: Coordinates relative to root window + + """ + cdef int _set_obj(self, void *o) except 0: + cdef Ecore_Event_Mouse_Move *obj + obj = o + # self.window = Window(obj.window) + # self.root_window = Window(obj.root_window) + # self.event_window = Window(obj.event_window) + self.timestamp = obj.timestamp + self.modifiers = obj.modifiers + self.same_screen = bool(obj.same_screen) + self.x = obj.x + self.y = obj.y + self.root = EventPoint(obj.root.x, obj.root.y) + self.multi = EventMulti(obj.multi.device, obj.multi.radius, + obj.multi.radius_x, obj.multi.radius_y, + obj.multi.pressure, obj.multi.angle, + obj.multi.x, obj.multi.y, + obj.multi.root.x, obj.multi.root.y) + return 1 + + +cdef class EventMouseIO(Event): + """ EventMouseIO() + + Contains information about an Ecore mouse input/output event. + + .. seealso :: :func:`on_mouse_in_add`, :func:`on_mouse_out_add` + + :ivar int timestamp: Time when the event occurred + :ivar int modifiers: :ref:`Ecore_Event_Modifier` The OR combination of modifiers key + :ivar int x: x coordinate relative to window where event happened + :ivar int y: y coordinate relative to window where event happened + + """ + cdef int _set_obj(self, void *o) except 0: + cdef Ecore_Event_Mouse_IO *obj + obj = o + # self.window = Window(obj.window) + # self.event_window = Window(obj.event_window) + self.timestamp = obj.timestamp + self.modifiers = obj.modifiers + self.x = obj.x + self.y = obj.y + return 1 + + +cdef class EventMouseWheel(Event): + """ EventMouseWheel() + + Contains information about an Ecore mouse wheel event. + + .. seealso :: :func:`on_mouse_wheel_add` + + :ivar int timestamp: Time when the event occurred + :ivar int modifiers: :ref:`Ecore_Event_Modifier` The OR combination of modifiers key + :ivar bool same_screen: Same screen flag + :ivar int direction: Orientation of the wheel (horizontal/vertical) + :ivar int z: Value of the wheel event (+1/-1) + :ivar int x: x coordinate relative to window where event happened + :ivar int y: y coordinate relative to window where event happened + :ivar EventPoint root: Coordinates relative to root window. + + """ + cdef int _set_obj(self, void *o) except 0: + cdef Ecore_Event_Mouse_Wheel *obj + obj = o + # self.window = Window(obj.window) + # self.root_window = Window(obj.root_window) + # self.event_window = Window(obj.event_window) + self.timestamp = obj.timestamp + self.modifiers = obj.modifiers + self.same_screen = bool(obj.same_screen) + self.direction = obj.direction + self.z = obj.z + self.x = obj.x + self.y = obj.y + self.root = EventPoint(obj.root.x, obj.root.y) + return 1 + + +def on_key_down_add(func, *args, **kargs): + """ + Creates an ecore event handler for the ECORE_EVENT_KEY_DOWN event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventKey` + """ + return InputEventHandler(ECORE_EVENT_KEY_DOWN, func, *args, **kargs) + +def on_key_up_add(func, *args, **kargs): + """ + Creates an ecore event handler for the ECORE_EVENT_KEY_UP event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventKey` + """ + return InputEventHandler(ECORE_EVENT_KEY_UP, func, *args, **kargs) + +def on_mouse_button_down_add(func, *args, **kargs): + """ + Creates an ecore event handler for the ECORE_EVENT_MOUSE_BUTTON_DOWN event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseButton` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_BUTTON_DOWN, func, *args, **kargs) + +def on_mouse_button_up_add(func, *args, **kargs): + """ + Create an ecore event handler for the ECORE_EVENT_MOUSE_BUTTON_UP event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseButton` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_BUTTON_UP, func, *args, **kargs) + +def on_mouse_move_add(func, *args, **kargs): + """ + Create an ecore event handler for the ECORE_EVENT_MOUSE_MOVE event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseMove` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_MOVE, func, *args, **kargs) + +def on_mouse_in_add(func, *args, **kargs): + """ + Create an ecore event handler for the ECORE_EVENT_MOUSE_IN event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseIO` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_IN, func, *args, **kargs) + +def on_mouse_out_add(func, *args, **kargs): + """ + Create an ecore event handler for the ECORE_EVENT_MOUSE_OUT event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseIO` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_OUT, func, *args, **kargs) + +def on_mouse_wheel_add(func, *args, **kargs): + """ + Create an ecore event handler for the ECORE_EVENT_MOUSE_WHEEL event. + + :return: :class:`InputEventHandler` + + .. seealso:: :class:`EventMouseWheel` + """ + return InputEventHandler(ECORE_EVENT_MOUSE_WHEEL, func, *args, **kargs) diff --git a/examples/ecore/input/events.py b/examples/ecore/input/events.py new file mode 100755 index 0000000..1dca5a4 --- /dev/null +++ b/examples/ecore/input/events.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +from efl import evas +from efl import ecore +from efl import ecore_input +from efl import elementary as elm + + + +def _event_cb1(event, one, two, asd): + print(event) + print(one, two, asd) # test args and kargs + print() + return ecore.ECORE_CALLBACK_PASS_ON # or ECORE_CALLBACK_DONE to stop propagation + +def _event_cb2(event): + print(event) + print() + return ecore.ECORE_CALLBACK_PASS_ON + + +move_handler = None + +def move_connect_cb(btn): + global move_handler + + if move_handler is None: + move_handler = ecore_input.on_mouse_move_add(_event_cb2) + +def move_delete_cb(btn): + global move_handler + + if move_handler is not None: + move_handler.delete() + move_handler = None + + +if __name__ == "__main__": + + win = elm.StandardWindow("ecore_input_test", "Ecore Input Test", + size=(200,200)) + win.callback_delete_request_add(lambda w: elm.exit()) + win.focus_highlight_enabled = True + win.focus_highlight_animate = True + + tb = elm.Table(win, padding=(10,10), size_hint_expand=evas.EXPAND_BOTH, + size_hint_fill=evas.FILL_BOTH) + win.resize_object_add(tb) + tb.show() + + lb = elm.Label(tb, text="Watch for events in console.") + tb.pack(lb, 0, 0, 2, 1) + lb.show() + + bt = elm.Button(tb, text="Connect MouseMove") + bt.callback_clicked_add(move_connect_cb) + tb.pack(bt, 0, 1, 1, 1) + bt.show() + bt.focus = True + + bt = elm.Button(tb, text="Delete MouseMove") + bt.callback_clicked_add(move_delete_cb) + tb.pack(bt, 1, 1, 1, 1) + bt.show() + + en = elm.Entry(tb, text="Test event propagation", + editable=True, scrollable=True, single_line=True, + size_hint_expand=evas.EXPAND_HORIZ, + size_hint_fill=evas.FILL_BOTH) + tb.pack(en, 0, 2, 2, 1) + en.show() + + # NOTE FOR BRAVE HACKERS: + # You can setup the event callbacks BEFORE win creation to have the ability + # to stop (ECORE_CALLBACK_DONE) or continue (ECORE_CALLBACK_PASS_ON) the + # event propagation down to elementary widgets. + ecore_input.on_key_down_add(_event_cb1, 1, 2, 'DOWN') + ecore_input.on_key_up_add(_event_cb2) + ecore_input.on_mouse_button_down_add(_event_cb2) + ecore_input.on_mouse_button_up_add(_event_cb2) + ecore_input.on_mouse_in_add(_event_cb2) # this event do not work here + ecore_input.on_mouse_out_add(_event_cb2) # this event do not work here + ecore_input.on_mouse_wheel_add(_event_cb2) + + win.show() + elm.run() diff --git a/setup.py b/setup.py index f29884e..2cff90f 100755 --- a/setup.py +++ b/setup.py @@ -308,6 +308,20 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): eina_libs + evas_libs) ext_modules.append(ecore_ext) + # === Ecore Input === + ecore_input_cflags, ecore_input_libs = pkg_config('EcoreInput', + 'ecore-input', + EFL_MIN_VER) + ecore_input_ext = Extension("ecore_input", + ["efl/ecore_input/efl.ecore_input" + module_suffix], + include_dirs=['include/'], + extra_compile_args=list(set(ecore_cflags + + ecore_file_cflags + + ecore_input_cflags)), + extra_link_args=ecore_libs + ecore_file_libs + + ecore_input_libs) + ext_modules.append(ecore_input_ext) + # === Ecore Con === ecore_con_cflags, ecore_con_libs = pkg_config('EcoreCon', 'ecore-con', EFL_MIN_VER) @@ -323,9 +337,6 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): # === Ecore X === try: - ecore_input_cflags, ecore_input_libs = pkg_config('EcoreInput', - 'ecore-input', - EFL_MIN_VER) ecore_x_cflags, ecore_x_libs = pkg_config('EcoreX', 'ecore-x', EFL_MIN_VER) except SystemExit: