diff --git a/efl-eo-files b/efl-eo-files index 9a206aa..c7d0c4b 100644 --- a/efl-eo-files +++ b/efl-eo-files @@ -131,7 +131,7 @@ #./elm_app_server.eo #./elm_progressbar.eo #./elm_atspi_app_object.eo -#./elm_bg.eo +./elm_bg.eo #./elm_photo.eo #./elm_bubble.eo #./elm_interface_scrollable.eo @@ -141,10 +141,10 @@ #./elm_flip.eo #./elm_video.eo #./elm_gengrid_pan.eo -#./elm_image.eo +./elm_image.eo #./elm_calendar.eo #./elm_naviframe.eo -#./elm_layout.eo +./elm_layout.eo #./elm_map_pan.eo #./elm_genlist_pan.eo #./elm_interface_atspi_component.eo diff --git a/efl/efl/__init__.py b/efl/efl/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/efl/efl/__init__.pyx b/efl/efl/efl.efl.pyx similarity index 100% rename from efl/efl/__init__.pyx rename to efl/efl/efl.efl.pyx diff --git a/efl/eo/efl.eo.pyx b/efl/eo/efl.eo.pyx index 089d665..0e0bed2 100644 --- a/efl/eo/efl.eo.pyx +++ b/efl/eo/efl.eo.pyx @@ -208,7 +208,7 @@ cdef Eina_Bool _py_efl_eo_event_cb( bint ret _Eo o EventDesc py_ev_desc - #EventInfo py_ev_info_obj + # EventStruct py_ev_info_obj func = data o = object_from_instance(obj) @@ -216,21 +216,22 @@ cdef Eina_Bool _py_efl_eo_event_cb( py_ev_desc = EventDesc.__new__(EventDesc) py_ev_desc.desc = desc - #tmp1 = eina_hash_find(o.event_conv_to_py_mapping, desc) - #tmp2 = eina_hash_find(o.event_conv_to_c_mapping, desc) - #if tmp1 == NULL: - # py_ev_info_obj = None - #else: - #py_ev_info_cls = tmp - # use a generic class and set some conv func?? - #py_ev_info_obj = py_ev_info_cls.__new__(py_ev_info_cls) - #py_ev_info_obj = EventInfo.__new__(EventInfo) - #py_ev_info_obj.event_info = event_info - #py_ev_info_obj.conv_to_python = tmp1 - #py_ev_info_obj.conv_to_c = tmp2 + # tmp1 = eina_hash_find(o.event_conv_mapping, desc) + # tmp2 = eina_hash_find(o.event_conv_to_c_mapping, desc) + # if tmp1 == NULL: + # py_ev_info_obj = None + # else: + # py_ev_info_cls = tmp1 + # use a generic class and set some conv func?? + # py_ev_info_obj = py_ev_info_cls.__new__(py_ev_info_cls) + # py_ev_info_obj = EventStruct.__new__(EventStruct) + # py_ev_info_obj.event_info = event_info + # py_ev_info_obj.conv_to_python_func = tmp1 + # py_ev_info_obj.conv_to_c = tmp2 - #ret = func(py_ev_desc, py_ev_info_obj) # o as first param? - #return ret + # ret = func(py_ev_desc, py_ev_info_obj) # o as first param? + ret = func(py_ev_desc, None) + return ret cdef class EventDesc(object): @@ -253,18 +254,18 @@ cdef class EventDesc(object): return bool(self.desc.unfreezable) -#cdef class EventStruct(object): +# cdef class EventStruct(object): # cdef: # void *event_info - +# void *conv_to_python_func # property value: # def __get__(self): -# return self.conv_to_python(self.event_info) +# return self.conv_to_python_func(self.event_info) -# def __set__(self, val): -# self.event_info = self.conv_to_c(val) + # def __set__(self, val): + # self.event_info = self.conv_to_c(val) cdef class _Eo(object): @@ -390,10 +391,13 @@ cdef class _Eo(object): if desc is NULL: raise RuntimeError("Unknown Eo event name: %s" % (event_name)) - eo_event_callback_add( - desc, - _py_efl_eo_event_cb, - func + eo_do( + self.obj, + eo_event_callback_add( + desc, + _py_efl_eo_event_cb, + func + ) ) Py_INCREF(func) @@ -411,9 +415,12 @@ cdef class _Eo(object): if desc is NULL: raise RuntimeError("Unknown Eo event name: %s" % (event_name)) - eo_event_callback_del( - desc, - _py_efl_eo_event_cb, - func + eo_do( + self.obj, + eo_event_callback_del( + desc, + _py_efl_eo_event_cb, + func + ) ) Py_DECREF(func) diff --git a/eolian-example.py b/eolian-example.py new file mode 100755 index 0000000..353e17a --- /dev/null +++ b/eolian-example.py @@ -0,0 +1,49 @@ +#!/usr/bin/python +import logging +efllog = logging.getLogger("efl") +efllog.addHandler(logging.StreamHandler()) + +import sys +if len(sys.argv) < 2: + sys.exit("Usage: %s [file2] ... [fileN]".format(sys.argv[0])) + +w, h = 600, 600 + +from efl import elementary as elm +elm.init() + +win = elm.Win("pydemo", 1) +win.title = "Python demo" +win.autodel = False +win.size = (w, h) +win.event_callback_add("delete,request", lambda x, y: elm.exit()) + +bg = elm.Bg(win) +bg.size_hint_weight = (1.0, 1.0) +win.resize_object_add(bg) +bg.show() + +img = elm.Image(win) +img.size_hint_weight = (1.0, 1.0) +img.smooth = True +img.aspect_fixed = True +img.file = sys.argv[1], "" +img.position = (0, 0) +img.size = (w, h) + +file_idx = 1 +def _mouse_down_cb(*args): + global file_idx + file_idx += 1 + if file_idx > len(sys.argv): + file_idx = 1 + global img + img.file = sys.argv[file_idx], "" + return True + +img.event_callback_add("mouse,down", _mouse_down_cb) +img.show() + +win.show() +elm.run() +elm.shutdown() diff --git a/eolian/converters.py b/eolian/converters.py index 79b5345..5fd2b1c 100644 --- a/eolian/converters.py +++ b/eolian/converters.py @@ -57,7 +57,8 @@ builtin_types = ( # automatically converted by cython #"bool", #"void", "Evas_Coord", - "Evas_Real" + "Evas_Real", + "Elm_Win_Type" ) complex_types = ( @@ -67,9 +68,9 @@ complex_types = ( mapping_in = { # c_type: pyx_type "bool": "bint", - #"char": "", - "Evas_Object": "_Eo_Base", - "Eo": "_Eo_Base", + "char": None, + "Evas_Object": "_Eo", + "Eo": "_Eo", } conversions_in_python = { @@ -88,8 +89,8 @@ mapping_out = { "bool": "bint", "char": "unicode", #"Elm_Object_Item": "_ObjectItem", - "Evas_Object": "_Eo_Base", - "Eo": "_Eo_Base", + "Evas_Object": "_Eo", + "Eo": "_Eo", } conversions_out = { @@ -161,7 +162,7 @@ def convert_in_param(tp, param_name, is_nonull=None): conv_t = mapping_in[key] if conv_t is None: # conv_t = "" - conv_t = c_type + conv_t = "" if not is_nonull: key = "<{0}>{1} if {1} is not None else NULL".format(c_type, param_name) diff --git a/eolian/generator.py b/eolian/generator.py index 4c3a031..f04ee43 100755 --- a/eolian/generator.py +++ b/eolian/generator.py @@ -12,7 +12,7 @@ formatter = logging.Formatter("%(name)s %(levelname)s: %(message)s") handler.setFormatter(formatter) log = logging.getLogger("eolian") log.addHandler(handler) -log_level = logging.ERROR +log_level = logging.WARN log.setLevel(log_level) import eolian @@ -380,7 +380,7 @@ class Function(object): gen.write("cdef:") gen.indent() for i, (t, n) in enumerate(expand_params): - gen.write("%s %s = tmp_prm%d" % (t, n, i)) + gen.write("%s = tmp_prm%d" % (" ".join((t, n)).strip(), i)) gen.dedent() @@ -491,7 +491,7 @@ class Constructor(object): def generate(self, gen): cls_get = self.clsgetter - header_params = [("_Eo", "parent=None")] + header_params = [] c_ctors = [] for ctor in self.ctors: @@ -522,6 +522,8 @@ class Constructor(object): c_call_params = ", ".join(c_call_params) c_ctors.append((c_name, c_call_params)) + header_params.append(("_Eo", "parent=None")) + gen.write("def __init__(self, %s):" % (", ".join([" ".join((t, n)).strip() for t, n in header_params]))) gen.indent() @@ -698,9 +700,10 @@ class Class(object): try: o.generate(gen) except EolianTypeError: - log.info("Skipping %r because of unknown type", o) + raise + #log.error("Skipping %s constructor because of unknown type", self.full_c_name) except Exception: - log.exception("Error while generating %r", o) + log.exception("Error while generating %s constructor", self.full_c_name) for o in ( list(self.methods) + @@ -738,7 +741,8 @@ class Class(object): imports.append((lib_name, "_" + name)) for l, n in imports: - l2 = PY_EFL_TOP_LEVEL_PACKAGE + "." + l.lower() + #l2 = PY_EFL_TOP_LEVEL_PACKAGE + "." + l.lower() + l2 = l.lower() gen.write("from %s import %s as %s" % (l2, n, l.replace(".", "_") + n)) gen.write() @@ -747,10 +751,10 @@ class Class(object): gen.write("class %s(%s):" % (self.name, ", ".join(inherits))) gen.indent() - gen.write("def __init__(self, parent=None, *args, **kwargs):") + gen.write("def __init__(self, *args, **kwargs):") gen.indent() gen.write( - "_%s.__init__(self, parent=None, *args, **kwargs)" % ( + "_%s.__init__(self, *args, **kwargs)" % ( self.name ) ) diff --git a/include/efl.eina.pxd b/include/efl.eina.pxd index a6445a7..9aedb9c 100644 --- a/include/efl.eina.pxd +++ b/include/efl.eina.pxd @@ -101,6 +101,7 @@ cdef extern from "Eina.h": ctypedef _Eina_Inlist Eina_Inlist ctypedef struct Eina_Accessor + ctypedef struct Eina_File #################################################################### # Other typedefs diff --git a/include/efl.elementary.pxd b/include/efl.elementary.pxd index 4beb3d7..f0901ce 100644 --- a/include/efl.elementary.pxd +++ b/include/efl.elementary.pxd @@ -18,7 +18,7 @@ from libc.stdint cimport uintptr_t -from efl.evas cimport Eina_List, Eina_Bool +from efl.eina cimport Eina_File, Eina_List, Eina_Bool from efl.evas cimport Evas_Object, Evas_Font_Size, Evas_Coord from efl.evas cimport Evas_Event_Flags, Evas_Display_Mode from efl.evas.enums cimport Evas_Callback_Type @@ -27,7 +27,7 @@ from efl.elementary.enums cimport Elm_Sys_Notify_Closed_Reason, \ Elm_Illume_Command, Elm_Win_Keyboard_Mode, \ Elm_Win_Indicator_Opacity_Mode, Elm_Win_Indicator_Mode, \ Elm_Scroller_Movement_Block, Elm_Scroller_Policy, \ - Elm_Scroller_Single_Direction + Elm_Scroller_Single_Direction, Elm_Bg_Option, Elm_Image_Orient cdef extern from "time.h": struct tm: @@ -179,4 +179,6 @@ cdef extern from "Elementary.h": ctypedef void (*Elm_Interface_Scrollable_Min_Limit_Cb)(Evas_Object *obj, Eina_Bool w, Eina_Bool h) ctypedef void (*Elm_Interface_Scrollable_Resize_Cb)(Evas_Object *obj, Evas_Coord w, Evas_Coord h) + ctypedef struct Elm_Layout_Part_Alias_Description + cdef int PY_EFL_ELM_LOG_DOMAIN diff --git a/include/efl.eo.pxd b/include/efl.eo.pxd index ad29871..a61da02 100644 --- a/include/efl.eo.pxd +++ b/include/efl.eo.pxd @@ -31,6 +31,8 @@ cdef: #_add_obj(self, Eo_Class *klass, cEo *parent) + object (*conv_to_python)(void *c_ei) + int PY_REFCOUNT(object o) void _object_mapping_register(char *name, object cls) except * diff --git a/setup.py b/setup.py index b9cb645..afda161 100755 --- a/setup.py +++ b/setup.py @@ -323,7 +323,7 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): output_path = "/".join((PY_EFL_TOP_LEVEL_PACKAGE, library_name)) generate_pxis(library_name, header_name, output_path) efl_ext = Extension( - ".".join((library_name, "__init__")), ["/".join((output_path, "__init__" + module_suffix))], + "efl", ["/".join((output_path, "efl.efl" + module_suffix))], define_macros=[ ('EFL_BETA_API_SUPPORT', 1), ('EFL_EO_API_SUPPORT', 1),