Compare commits


19 Commits

Author SHA1 Message Date
Davide Andreoli e8749538ce Do not fail when no start_points are given 2015-02-03 19:58:49 +01:00
Davide Andreoli f05be9a21c Added support for Ctxpopup, Dayselector and Diskselector 2015-02-02 21:02:33 +01:00
Davide Andreoli 0a0991cdc8 Add support and test for Frame and Separator 2015-02-02 20:33:45 +01:00
Davide Andreoli f4445f05e7 Implement erigo json V3
NOTE: this is only compatible with erigo develop branch
2015-02-02 20:18:08 +01:00
Davide Andreoli 57481ac5fb Added a method called on each public widget creation
We can now populate the genlist when needed
2015-02-01 16:58:48 +01:00
Davide Andreoli 4d41e26f9b Use OrderedDict to keep items order from json 2015-02-01 16:12:21 +01:00
Davide Andreoli c737915efd Added support for Flip, Genlist, Gengrid and Toolbar 2015-02-01 16:08:20 +01:00
Davide Andreoli 3c76ede01e support enums from evas 2015-02-01 13:13:08 +01:00
Davide Andreoli 2e7ae199ad Added support for more erigo widgets 2015-01-31 16:29:33 +01:00
Davide Andreoli 6015567953 The file property seems ok now, will see... 2015-01-24 20:31:59 +01:00
Davide Andreoli 31320ca2e8 Workaround the visibility name in a simpler way 2015-01-24 20:12:50 +01:00
Davide Andreoli 6422f5a149 EvasObject: added the Eo position property
and deprecate the legacy name: pos
2015-01-24 20:04:31 +01:00
Davide Andreoli e091fc6064 Smaller tux image for the test 2015-01-24 18:52:36 +01:00
Davide Andreoli ce1101e317 Implemented resource management 2015-01-24 18:48:29 +01:00
Davide Andreoli 64c58021ea Implemented -Create- callback type 2015-01-24 13:03:44 +01:00
Davide Andreoli 8fecc5f55b Keep the json data around
Will be needed for the next commit
2015-01-24 13:00:31 +01:00
Davide Andreoli ae2dec22da Implemented Invoke type callbacks 2015-01-24 10:51:14 +01:00
Davide Andreoli 14a070012d Erigo: Implemented callbacks of -Modify- type
plus a fix for py3 and the test json updated
2015-01-22 23:22:32 +01:00
Davide Andreoli 2d2bbb1977 Initial work on erigo support in pyefl.
This will be developed in a separate branch and it will be ready for the 1.14 release.

The generator implemented here is on-the-fly, it does not generate the python code,
but actually generate the real interface from the json file on runtime.

The work is really at a good point yet, just need to fix/implement some
little more.

Test included
2015-01-22 20:43:51 +01:00
607 changed files with 23504 additions and 32014 deletions

.gitignore vendored
View File

@ -28,9 +28,4 @@ pip-log.txt
# Cython generated files
# Various editors trash

View File

@ -1,10 +0,0 @@
disable=consider-using-f-string, # for older python we still support
redundant-u-string-prefix, # for older python we still support
invalid-name, # seems too pedantic to me

View File

@ -1,28 +1,3 @@
* Automatically build and publish binary wheels on pypi
- for py: 36,37,38,39,310
- for linux x86 and rpi
- see
- see
- also include efl itsef in the wheels? PySide is doing this
* Drop python 2 compatibility
- Switch to cython3
- remove all the workarounds for py2 (see strings and enums)
* Improved editors support, at least on VSCode and PyCharm
* Try to implement better the elementary module, removing
the __init__ module hack (that create problems in the docs)
* Make the examples a first citizen!
- install them with python efl
- make them easily runnable
- show them in the docs
- show the code inside the examples themself?
- make the code editable on the fly?
@ -33,60 +8,6 @@ Style
* When comparing C pointers with NULL, use == and != instead of the python
operator "is". This makes a visual distinction between python and C code.
* For long lines that do not fit in the 80 cols please use only the first
raccomandation from PEP-8 (Aligned with opening delimiter). Example:
foo = long_function_name(var_one, var_two,
var_three, var_four)
foo = long_function_name(
var_one, var_two,
var_three, var_four)
This to keep new code consistent with the rest of the bindings and to
try to match the style of the C efl code style as much as possible.
...also because I found it more readable and I like it more :P -davemds-
Documentation cheatsheet
* Links:
:class:`List` (for classes)
:func:`elm_list_go` (for functions)
:attr:`homogeneous` (for properties)
:ref:`Elm_List_Mode` (for enums)
:data:`ELM_LIST_LIMIT` (for enum values)
:func:`efl.evas.Object.delete` (for items not in current scope)
:func:`~efl.evas.Object.delete` (will show it short, just "delete")
* Formatting:
``ELM_LIST_SCROLL`` (for enum values, bools and None)
* Versions:
.. versionadded:: 1.15
.. versionchanged:: 1.15
Description of the change.
.. deprecated:: 1.15
Use the blah, blah way instead.
* Notes:
.. seealso:: :py:attr:`mode`
.. note:: Some text to be noted, blah, blah, blah,
some more information for this note, etc.
.. warning:: Same as note, but the box will be red
some more information for this warning, etc.
Design patterns
@ -123,54 +44,61 @@ Tips
Release process instructions
* use " --python elementary" to see the missing bindings
* Version:
- change versions in efl/ (ex: 1.9.0)
- update EFL_MIN_VER in (if needed)
* Announce at that you are planning
for the release
* Change versions in efl/ (ex: 1.9.0)
* Update the ChangeLog file:
- build_doc -b changes ...and manually merge from the html file build_doc -b changes ...and manually merge from the html file
* Git push and wait jenkins to generate the 2 tarballs
* Test the generated tarballs
* scp tarballs & md5sums to:
* Announce at that tarballs are
ready for testing
* Generate the source (tar) and binary (wheel) distributions:
- make maintainer-clean (just to be sure nothing is cached)
- make dist
* Test the generated tarball and wheel:
- the targz must work by extracting and running: python install [--user]
- the targz must be installable using: pip install python-efl-1.9.0.tar.gz
- the wheel must be installable using: pip install python_efl-1.9.0-xxxx.whl
* Publish the 2 tar archive on
- scp tarballs & md5sums to:
- update download link on the wiki (
* Publish the .tar.gz archive on pypi:
- twine upload python-efl-1.9.0.tar.gz [--repository testpypy]
- TODO: also upload binary wheels for linux py36,37,38,39,310 (see manylinux on pypa)
* Documentation:
- make doc (check that inheritance graphs are there)
- scp the generated html documentation to:
- update the 'current' link on the server (ssh)
... wait 24 hours, fix any issues found. In the mean time you can prepare the
release announcement for phame/ml.
* ssh to and mv tarballs & md5sums to:
* Upload the .tar.gz archive to pypi
* Create and push the tag for the release
- git tag -a v1.9.0 && git push origin v1.9.0
git tag -a v1.9.0 && git push origin v1.9.0
* Create and push the branch for stable backporting
git branch python-efl-1.9 && git push origin python-efl-1.9
* Announce the release to and
* Publish the blog post on phame (Official Announcements)
* Announce the release to
(an alias for e-announce etc.)
* Update download link on website (clone website/www.git, edit, commit, push)
* Change versions again in efl/ (ex: 1.9.99)
for more info:
more info at:
* Internal utility functions used in the bindings must start with an
underscore and must have the shortest name as possible.
This needs further discussion/expansion.
When we define a function with cdef it is not exposed to Python API.
This should be explicit enough to not need the underscore prefix, which
at best looks ugly, and at worst just plain confusing.
A function name should summarize its functionality in one clear text,
short sentence. We have both too long and too short names. And I admit to
being guilty of adding many of both.
Let's build up a short review so we can see where we stand with this and
make necessary corrections.
/ kuuko
The underscore usage is a coding standard in all the EFL, we should try
to follow the efl style also here (where is possible and make sense)
/ davemds

View File

@ -1,410 +1,3 @@
2023-10-08 v1.26.1
Maintenance release:
* rebuilt using Cython 0.29.34 to fix install on python 3.11
2022-02-27 v1.26.0
* Switched to setuptools for the build system (can now install from pip again)
* Dropped py2.6 support, minimum is now 2.7
* Deprecated python2 support, with a big-fat-slow warning
* Improved documentation
* Fixed a memory allocation error in EvasSmart
2020-09-24 v1.25.0
* Switched to Cython 0.29.21 for the tarball generation
2020-04-30 v1.24.0
* Switched to Cython 0.29.16 for the tarball generation
* No more pypi packages uploaded, you must install from tarball
2019-10-06 v1.23.0
* Switched to Cython 0.29.13 for the tarball generation
2019-04-23 v1.22.0
* Switched to Cython 0.29.7 for the tarball generation
2018-08-24 v1.21.0
* systray.pxi do not work anymore as the widget has been removed from efl.
The widget has been completly removed and the function elm_need_systray
now always return False that means systray is not available.
Apologies for the inconvenient.
* Switched to Cython 0.28.4 for the tarball generation, should fix build
issues with python3.7
* edje.part_text_prediction_hint_hash_del
* edje.part_text_prediction_hint_hash_set
* elm.Entry.prediction_hint_hash_del
* elm.Entry.prediction_hint_hash_set
* elm.Ctxpopup.item_insert_after
* elm.Ctxpopup.item_insert_before
2017-05-06 v1.20.0
* ecore.input and ecore.x can now coexsist
* ecore.Poller is no more an Eo object in C (nothing should be changed in py)
* removed edje.Object custom __repr__ implementation
* Use Cython 23.5 to generate the C source in dist tarball (see T5589)
* elm.Entry.prediction_hint
* elm.Genlist.multi_select_mode
* elm.Spinner.callback_max_reached_add()
* elm.Spinner.callback_max_reached_del()
* edje.part_text_prediction_hint_set()
* evas.Map.coords_get()
2017-04-18 v1.19.0
* Fixes for cython 0.25 compatibility
* elm.font_properties_get
* elm.Gengrid.item_insert_after now work as expected
* Removed ecore warning about subprocess incompatibility, with test to prove it
* Emotion: changed default module_name to "gstreamer1"
* elm.font_properties_free: Changed to no-op as we now do the free
automatically when there are no more references to the FontProperties object
* elm.Panel.scrollable_content_size is now also readable
* EcoreConUrl is no more an Eo object in C
* evas.Image.load_head_skip
* elm.Calendar.date_max
* elm.Calendar.date_min
* elm.GengridItem.custom_size
* elm.Image.async_open
* elm.Image.callback_load_cancel_add
* elm.Image.callback_load_error_add
* elm.Image.callback_load_open_add
* elm.Image.callback_load_ready_add
* elm.Naviframe.callback_item_activated_add
* elm.Panel.callback_toggled_add
* elm.Progressbar.is_pulsing
* elm.Spinner.callback_drag_start_add
* elm.Spinner.callback_drag_stop_add
2016-08-22 v1.18.0
* Fixed (workaround) dbus crash on python >= 3.5
* Fixed Logger module to not fail on unicode error messages
* Changed enums implementation to gain compatibility with Cython > 0.22
* Docs: Allow to skip last_updated and sphinx_version
* elm.Combobox: The combobox widget has been deprecated.
* elm.Photo.editable property is now also readable
* elm.Photo.fill_inside property is now also readable
* elm.Photo.size property is now also readable
* ecore.Exe.is_deleted
* ecore.FdHandler.is_deleted
* edje.Edje.part_box_insert_after
* elm.Configuration.accel_preference_override
* elm.Configuration.first_item_focus_on_first_focusin
* elm.Configuration.font_hint_type
* elm.Configuration.icon_theme
* elm.Configuration.popup_scrollable
* elm.Configuration.scroll_accel_factor
* elm.Configuration.scroll_animation_disabled
* elm.Configuration.vsync
* elm.Configuration.web_backend
* elm.Entry.file_text_format
* elm.Entry.select_allow
* elm.Entry.select_region
* elm.GengridItem.all_contents_unset
* elm.Genlist.filtered_items_count
* elm.GenlistItem.all_contents_unset
* elm.List.multi_select_mode (and the Elm_Object_Multi_Select_Mode enum)
* elm.Object.focus_move_policy_automatic
* elm.Popup.align
* elm.Popup.scrollable
* elm.Slider.range
* elm.Slider.range_enabled
* elm.Slider.indicator_show_on_focus
* elm.Transit.revert
* elm.Window.noblank
2016-01-7 v1.17.0
* Fixed compatibility with python 3.5 (utils.deprecated was broken)
* Various ref leaks fixed in elementary
* Multibuttonentry filter callback
* ecore_input Module
* ecore_con Module
* ecore_con.Url Class
* ecore_con.Lookup Class
* evas.Object.paragraph_direction
* edje.Edje.color_class_clear
* edje.Edje.size_class_del
* edje.Edje.size_class_get
* edje.Edje.size_class_set
* edje.Edje.text_class_del
* edje.size_class_del
* edje.size_class_get
* edje.size_class_list
* edje.size_class_set
* ethumb Module
* ethumb.Ethumb Class
* ethumb_client Module
* ethumb_client.EthumbClient Class
* elm.Combobox Class
* elm.Configuration.context_menu_disabled
* elm.Configuration.profile_derived_add
* elm.Configuration.profile_derived_del
* elm.Configuration.profile_exists
* elm.Configuration.profile_list_full
* elm.Configuration.profile_save
* elm.Ctxpopup.callback_geometry_update_add
* elm.Gengrid.drag_item_container_add
* elm.Gengrid.drag_item_container_del
* elm.Gengrid.drop_item_container_add
* elm.Gengrid.drop_item_container_del
* elm.Genlist.callback_filter_done_add
* elm.Genlist.drag_item_container_add
* elm.Genlist.drag_item_container_del
* elm.Genlist.drop_item_container_add
* elm.Genlist.drop_item_container_del
* elm.Genlist.filter
* elm.MultiButtonEntry.filter_remove
* elm.Notify.callback_dismissed_add
* elm.Notify.dismiss
* elm.Object.callback_moved_add
* elm.Object.drag_action_set
* elm.Object.drag_start
* elm.Object.drop_target_add
* elm.Object.drop_target_del
* elm.Popup.callback_dismissed_add
* elm.Popup.dismiss
2015-11-14 v1.16.0
* elm.Configuration.scroll_thumbscroll_smooth_amount
* elm.Configuration.scroll_thumbscroll_smooth_start
* elm.Configuration.scroll_thumbscroll_smooth_time_window
* elm.Genlist.callback_changed_add
* is now also writable
* elm.Object.focus_next_item_get
* elm.Object.focus_next_item_set
* elm.Object.focus_region_show_mode
* elm.Object.tooltip_orient
* elm.ObjectItem.focus_next_item_get
* elm.ObjectItem.focus_next_item_set
* elm.ObjectItem.focus_next_object_get
* elm.ObjectItem.focus_next_object_set
2015-08-05 v1.15.0
* elm.Entry: Fixed name of the callback_rejected_del function
* Fixed build on OSX
* Fixed build when ecore-x is not available
* Fixed module init from embedded interpreter
* Elm: Unify modules into a monolithic module
* elm.Configuration.transition_duration_factor
* elm.Window.autohide
* elm.Entry.callback_context_open_add/del
* elm.Object.focus_move_policy
* elm.Scrollable.wheel_disabled
* evas.Textblock.obstacle_add
* evas.Textblock.obstacle_del
* evas.Textblock.obstacles_update
2015-05-07 v1.14.0
* Fixed evas.Textgrid to not leak on cellrow_set()
* Re-added evas.SmartObject (with incompatible API compared to the earlier
incarnation) and made elm.Object inherit from it.
* Better init/shutdown management in all modules, no more need to
manually call those functions (no harm in doing it though).
* elm.List.callback_highlighted_add: Added item param to func
* elm.List.callback_unhighlighted_add: Added item param to func
* elm.Toolbar.callback_clicked_add: Added item param to func
* elm.Toolbar.callback_longpressed_add: Added item param to func
* elm.Slideshow: item_data are now a single value, instead of args/kargs,
like is implemented in Gengrid/Genlist
* evas.Smart
* evas.Image.orient
* edje.Edje.text_class_get
* edje.text_class_get
* elm.systray
* elm.Configuration.window_auto_focus_animate
* elm.Configuration.window_auto_focus_enable
* elm.Image.memfile_set
* elm.MultiButtonEntry.callback_item_longpressed_add
* elm.MultiButtonEntry.callback_item_longpressed_del
* elm.NaviframeItem.pop_cb_set
* elm.Photocam.image_orient
* elm.Scrollable.loop
* elm.Slider.indicator_visible_mode
* elm.Transit.go_in
* elm.on_config_all_changed
* elm.on_ethumb_connect
* elm.on_policy_changed
* elm.on_process_background
* elm.LayoutClass.file is now also readable
* elm.Video.file is now also readable
* evas.Rect.intercepts: Use intersects() instead
2015-02-09 v1.13.0
* better docs for everything
* some new elm examples/tests
* new efl.utils.setup helper module to simplify user
* new uninstall command
* fixed elm.Entry.cursor_content_get() to not crash when called
* raised cython requirements to 0.21
* ecore.x module renamed to ecore_x
* removed evas.SmartObject class, it was broken
* efl.utils.setup module
* elm.Configuration.slider_indicator_visible_mode
* elm.Gengrid.callback_clicked_right_add
* elm.Genlist.callback_clicked_right_add
* elm.List.callback_clicked_right_add
* elm.Scrollable.step_size
* elm.Table.align
* elm.Theme.group_base_list_get
* elm.Transit.tween_mode_factor_n
* elm.DialogWindow
* elm.Window.callback_theme_changed_add
* evas.Map.util_object_move_sync
* evas.Object.size_hint_expand
* evas.Object.size_hint_fill
* evas.FILL_BOTH
* evas.FILL_VERT
* elm.Configuration.engine
* elm.Configuration.preferred_engine
2014-11-23 v1.12.0
@ -558,8 +151,7 @@ Additions:
* elm.Toolbar.callback_item_unfocused_add
* elm.Datetime.callback_languge_changed_add:
Use callback_language_changed_add instead.
@ -610,8 +202,7 @@ Additions:
* elm.Window.wm_rotation_supported
* elm.FileselectorButton.expandable: Combine with Fileselector class instead
* elm.FileselectorButton.folder_only: Combine with Fileselector class instead
* elm.FileselectorButton.is_save: Combine with Fileselector class instead
@ -678,7 +269,7 @@ Changes:
* elm.MenuItem.subitems: Calling del on this property clears the subitems
* elm.Diskselector.bounce: You should combine with Scrollable class instead
* elm.Diskselector.scroller_policy: You should combine with Scrollable class instead
@ -721,7 +312,6 @@ Deprecations:
* efl container package
* Loggers
* Using keyword arguments to set properties

View File

@ -2,20 +2,23 @@
* Python 2.6 or higher, 3.2 or higher (
- Tested with Python 3.8
* Python 2.6 or higher (
- Tested with Python 2.7 / 3.2 / 3.3 / 3.4
* Cython 0.21 or higher (
- Tested with Cython 0.29.16
- Tested with Cython 0.21.2
* EFL must be the same minor version of the bindings,
es. python-efl 1.24 need efl 1.24
* EFL core library
- eo, evas, ecore, edje, emotion and elementary
* pkg-config (
- Windows executable (and GLib dependency) can be downloaded from
* To build the DOCS you will also need:
- python-sphinx
- [optional] graphviz
* At least 4GB of free RAM to build
@ -26,11 +29,6 @@
python build
To build the bindings you will need at least 4GB of free ram!
Otherwise the build process will badly fail.
Distribution tarballs include pre-generated C source files, so
cython usage is disabled by default, while is enabled in development git
versions. You can always force the usage of cython using two environment
@ -56,7 +54,7 @@
python clean --all
* To also remove all the C/HTML files generated by Cython:
python clean_generated_files
WARNING: you will need cython to regenerate the C files, do not use this
@ -114,7 +112,7 @@
tests or use the in each folder or even in the tests/ base
dir to run all the tests at once.
Python 2.7 / 3.2 or greater is required for running the tests.
Python 2.7 is required for running the tests.
The scripts in examples/ folder must be run by the user as they require
user interaction.

View File

@ -16,7 +16,7 @@
PY = python3
PY = python
.PHONY: build
@ -29,11 +29,6 @@ install:
$(PY) install
.PHONY: uninstall
$(PY) uninstall
.PHONY: doc
$(PY) build build_doc
@ -49,20 +44,12 @@ clean:
$(PY) clean --all
.PHONY: maintainer-clean
.PHONY: maintaner-clean
$(PY) clean --all clean_generated_files
rm -rf build/
rm -rf dist/
rm -rf python_efl.egg-info/
rm -f installed_files-*.txt
.PHONY: dist
$(PY) sdist --formats=gztar,xztar
$(PY) bdist_wheel
@cd dist/; for f in `ls *.tar.*` ; do \
echo Generating sha256 for: $$f ; \
sha256sum $$f > $$f.sha256; \
$(PY) sdist --formats=gztar,bztar

README Normal file
View File

@ -0,0 +1,7 @@
EFL is a collection of libraries for handling many common tasks a
developer man have such as data structures, communication, rendering,
widgets and more.
PYTHON-EFL are the python bindings for the whole EFL stack (eo, evas, ecore,
edje, emotion, ethumb and elementary)

View File

@ -1,92 +0,0 @@
# Python bindings for the EFL
EFL, or the *Enlightenment Foundation Libraries*, is a collection of libraries for handling many common tasks such as data structures, communication, rendering, widgets and more. Read more on the [efl web site](
Python-EFL are the python bindings for the whole EFL stack (evas, ecore, edje, emotion, ethumb and elementary). You can use Python-EFL to build a portable GUI application in minutes.
The documentation for Python-EFL is available [here](
## Install from pypi
The last stable release is always available on pypi, and pip is the raccomanded way to install Python-EFL:
pip install python-efl
The only requirement is to have the EFL already installed on your machine, see [here]( for install instructions for various linux distro or for building EFL from sources.
NOTE: Currently only sources packages are available on pip, this means that the installation will be quite long as it need to compile all the modules, and that you need a C compiler for installation to work (we highly suggest to use clang as your C compiler). For the next release we have plans to also upload binary packages on pypi, so the installation will be blazing fast and will have zero dependencies!
## Install from released tarballs
All the stable releases of python-efl can always be found at:
To install download and unpack a tarball and run:
python build
python install --user
sudo python install (for sistem-wide installation)
NOTE: due to strange cython+gcc behaviour we highly suggest to build python-efl using clang. If you experience issues using gcc (like memory exhausted or strange compile errors) just use clang in this way:
CC=clang python build
## Source repository
If you would like to contribute to Python-EFL and make changes to the Python-EFL code you need to build from **git**. Development take place in the **master** branch, while we backport bugfixes in the release branches. You will find a branch for each released version, branches are named as **python-efl-X.X**.
To build from git you also need to have [Cython]( installed.
### Main repository
### GitHub repository
The GitHub repo has been created to simplify the workflow for people that do
not have a git account in the E repo, and thus improving collaboration.
Feel free to make pull requests on GitHub.
## Documentation
Documentation for the last stable release can be found [here](
Additionally you can generate the documentation yourself from the source code using the following command:
python build build_doc
The HTML generated documentation will be available in the folder: `build/sphinx/html/`
## Some of the projects using Python-EFL (in random order)
| **Project** | **Website** |
| **EpyMC** - Media Center | |
| **Espionage** - D-Bus inspector | |
| **Epour** - BitTorrent Client | |
| **Eluminance** - Fast photo browser | |
| **Egitu** - Git User Interface | |
| **Edone** - GettingThingsDone | |
| **Epack** - Archive extractor | |
... and many more that cannot fit in this short list. If have some code and want it in this list just let us know.
## A short history of Python-EFL
Python-EFL was begun in 2007 by work of Gustavo Sverzut Barbieri and others while working for Nokia on the software project Canola Media Player. The language bindings were initially developed for the individual components of EFL, until merged together in 2013.
He was later joined by Ulisses Furquim Freire da Silva, who together formed the company ProFUSION embedded systems where the developement continued and a new software project called Editje was created, which uses the Python bindings for most of its functionality.
Python-EFL gained many more developers, also at this time an independent application project called EpyMC was created by Davide Andreoli.
In the beginning of the year 2011 the developement was practically halted. In 2012 Davide Andreoli picked up the developement and Kai Huuhko (@kuuko) joined him shortly after. Work at this time was focused on finishing the Python bindings for Elementary, the toolkit library.
In 2013 the individual components were merged together and a new documentation system was implemented, enabling easier access for the end-user developers.
Currently (as in 2022) the bindings are still actively maintained and improved by Davide Andreoli, in his effort to bring to python a powerfull and attractive UI toolkit.

TODO Normal file
View File

@ -0,0 +1,47 @@
* EdjeEdit: PartState API does not work
* Elm.Map: overlays_show segfaults, scrollers in examples are jumpy
* Elementary: when we use custom function callbacks we usually leak some
reference around, some examples:
- Fileselector.custom_filter_append()
- Multibuttonentry.format_function_set()
- Multibuttonentry.filter_append()
- Multibuttonentry.filterprepend()
* Evas: SmartObject callbacks broken when object is deleted
Failing unit tests
* tests.edje.test_04_edit: testPartEffect (marked as known failure)
* tests.edje.test_04_edit: testGroupDel (skipped, segfault)
* tests.edje.test_04_edit: testExternal (skipped, TODO)
* update links and text on:
(requires shell account?)
* Review the internal functions and name them consistently
* Evas: SmartObject needs testing, work. Make it inheritable by extension
* Improve ethumb
* edje: complete the unit tests
* Initial Evas GL support (for Elm)
* Add more documentation for callbacks, events, etc.
* Check for missing Eo type mappings
* Drag-n-Drop
* Automate compilation of the example edje files.
* Add more examples
* Prefs
* GLView
* Unit tests
* Images missing in the documentation:
- datetime
- video
- web
- window ?
* How are the ecore events managed? for example: ELM_EVENT_PROCESS_FOREGROUND

View File

@ -24,12 +24,6 @@ c_exclude_list = [
"elm_access", # Access disabled until 1.9
"elm_config_access", # Access disabled until 1.9
"elm_object_item_access", # Access disabled until 1.9
"elm_systray", # We currently have this in using Eo API
"elm_code_", # The code widget is still in beta
"elm_need_e_dbus", # has been deprecated long time ago
"elm_check_selected_get", # We already provide state_get
"elm_check_selected_set", # We already provide state_set
c_excludes = "|".join(c_exclude_list)
@ -61,6 +55,8 @@ params = {
"elementary": ("efl/elementary", "Elementary", "elm"),
EFL_MIN_VERSION = "1.9.99"
parser = argparse.ArgumentParser(
description="Reports EFL vs. Python-EFL API functions coverage"
@ -169,9 +165,7 @@ def get_pyapis(pxd_path, header_name, prefix):
for path, dirs, files in os.walk(pxd_path):
for f in files:
# if not f.endswith(".pxd"):
# continue
if f.endswith(".pyc"):
if not f.endswith(".pxd"):
open_args = (os.path.join(path, f),)
open_kwargs = dict(mode="r")
@ -211,7 +205,7 @@ print("")
for lib in args.libs:
inc_paths = pkg_config(lib)
inc_paths = pkg_config(lib, EFL_MIN_VERSION)
inc_path = None
for p in inc_paths:
if lib in p:

doc/Makefile Normal file
View File

@ -0,0 +1,153 @@
# Makefile for Sphinx documentation
# You can set these variables from the command line.
SPHINXBUILD = sphinx-build
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
# the i18n builder cannot share the environment and doctrees with the others
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
-rm -rf $(BUILDDIR)/*
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
@echo "Build finished; now you can process the pickle files."
@echo "Build finished; now you can process the JSON files."
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PythonBindingsforEnlightenmentFoundationLibraries.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PythonBindingsforEnlightenmentFoundationLibraries.qhc"
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/PythonBindingsforEnlightenmentFoundationLibraries"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PythonBindingsforEnlightenmentFoundationLibraries"
@echo "# devhelp"
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
@echo "Build finished. The text files are in $(BUILDDIR)/text."
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
@echo "The overview file is in $(BUILDDIR)/changes."
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

View File

@ -1,47 +1,40 @@
# -*- coding: utf-8 -*-
# Configuration file for the Sphinx documentation builder.
# Python Bindings for EFL Elementary documentation build configuration file, created by
# sphinx-quickstart on Thu Jun 28 09:21:25 2012.
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# This file is execfile()d with the current directory set to its containing dir.
# Note that not all possible configuration values are present in this
# autogenerated file.
# All configuration values have a default; values that are commented out
# serve to show the default.
# pylint: disable=invalid-name
import os
import sys
import platform
# -- Path setup --------------------------------------------------------------
import sys, os, platform
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here.
d = 'lib.%s-%s-%d.%d' % (
sys.path.insert(0, os.path.abspath('../build/' + d))
# sys.path.insert(0, os.path.abspath('../build/lib.linux-i686-3.2'))
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
d = "lib.%s-%s-%d.%d" % (
sys.path.insert(0, os.path.abspath("../build/"+d))
#sys.path.insert(0, os.path.abspath('../build/lib.linux-i686-3.2'))
# Delete any previously imported efl package
if 'efl' in sys.modules:
del sys.modules['efl']
if "efl" in sys.modules:
del sys.modules["efl"]
# -- Project information -----------------------------------------------------
project = 'Python EFL'
author = 'The Python-EFL community (see AUTHORS)'
copyright = '2008-2022, ' + author # pylint: disable=redefined-builtin
# -- General configuration ----------------------------------------------------
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '3.1'
needs_sphinx = '1.1'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
@ -53,36 +46,113 @@ extensions = [
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
# master_doc = 'index'
master_doc = 'index'
# General information about the project.
project = u'Python EFL'
copyright = u'2008-2015, Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
# The short X.Y version.
# version = 'X.Y'
# The full version, including alpha/beta/rc tags.
# release = 'X.Y.Z'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# Setting this True will show missing references as warnings.
#nitpicky = True
# nitpick_ignore = [
# ('py:obj', 'int'),
# ('py:obj', 'float'),
# ('py:obj', 'double'),
# ('py:obj', 'callable'),
# ('py:obj', 'function'),
# ('py:obj', 'str'),
# ('py:exc', 'RuntimeError'),
# ('py:exc', 'RuntimeWarning'),
# ('py:exc', 'ValueError'),
# ('py:exc', 'TypeError'),
# ('py:obj', 'Evas_Coord (int)'),
# ('py:obj', 'string'),
# ('py:obj', 'list'),
# ('py:class', 'object'),
# ('py:obj', 'unicode'),
# ('py:obj', 'bool'),
# ('py:obj', 'tuple of ints'),
# ('py:class', 'efl.eo.Eo'),
# ('py:attr', ''),
# ('py:obj', ''),
# ]
# -- Autodoc configuration -----------------------------------------------------
autodoc_default_options = {
'members': True, # show methods for classes
'show-inheritance': True, # show bases class
'member-order': 'alphabetical', # bysource, alphabetical, groupwise
'no-undoc-members': True, # dont show members without docstring
'no-inherited-members': True, # dont show members from parent classes
# both the class and the __init__ methods docstring are concatenated
autoclass_content = 'both'
autodoc_default_flags = [
# 'inherited-members',
# 'undoc-members',
autoclass_content = "both"
autodoc_docstring_signature = True
# autodoc_member_order = "bysource"
def setup(app):
from sphinx.ext.autodoc import cut_lines
app.connect('autodoc-process-signature', autodoc_process_signature)
app.connect('autodoc-process-docstring', cut_lines(1, what=['class']))
def autodoc_process_signature(_app, what, _name, _obj, _options, signature, return_annotation):
def autodoc_process_signature(app, what, name, obj, options, signature, return_annotation):
"""Cleanup params: remove the 'self' param and all the cython types"""
if what not in ('function', 'method'):
return None
params = []
params = list()
for param in (p.strip() for p in signature[1:-1].split(',')):
if param != 'self':
params.append(param.rpartition(' ')[2])
@ -93,28 +163,28 @@ def autodoc_process_signature(_app, what, _name, _obj, _options, signature, retu
# -- Inheritance Diagram ------------------------------------------------------
import gv # pylint: disable=unused-import
import gv
except ImportError:
# svg scale better (look at the full elm dia)
# but svg links are broken :(
graphviz_output_format = 'png' # png (default) or svg
graphviz_output_format = "svg" # png (default) or svg
inheritance_graph_attrs = dict(
bgcolor = 'gray25', #404040
bgcolor = 'gray25', #404040
inheritance_node_attrs = dict(
style = 'rounded', # or 'filled',
# fillcolor = 'gray20', # bg color (should be #CCCCCC)
color = 'gray10', # border color (should be #202020)
style = 'rounded', # or 'filled',
# fillcolor = "gray20", # bg color (should be #CCCCCC)
color = 'gray10', # border color (should be #202020)
fontcolor = 'white',
font = 'sans',
inheritance_edge_attrs = dict(
color = 'dodgerblue3', # arrow color (should be #4399FF)
dir = 'none', # arrow direction (back, forward, both or none)
color = 'dodgerblue3', # arrow color (should be #4399FF)
dir = 'none', # arrow direction (back, forward, both or none)
@ -123,11 +193,10 @@ else:
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
# html_theme = 'alabaster' # Default sphinx theme
# html_theme = 'default' # Classic python style
# html_theme = 'sphinxdoc' # Much modern sphinx style
# html_theme = 'sphinx13' # The latest one from the sphinx site
html_theme = 'efldoc' # Our custom EFL dark style
html_theme = 'efldoc' # EFL dark style
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@ -142,16 +211,16 @@ html_theme_path = ['themes']
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
html_short_title = 'Python EFL'
html_short_title = "Python EFL"
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
html_logo = 'images/logo.png'
html_logo = "images/logo.png"
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
html_favicon = 'images/logo.ico'
html_favicon = "images/logo.ico"
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
@ -162,6 +231,10 @@ html_static_path = ['images']
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
@ -197,3 +270,121 @@ html_show_sourcelink = False
# Output file base name for HTML help builder.
htmlhelp_basename = 'PythonEFLdoc'
# -- Options for LaTeX output --------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'PythonEFL.tex', u'Python Bindings for EFL Documentation',
u'Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko', 'manual'),
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'python-efl', u'Python Bindings for EFL Documentation',
[u'Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko'], 1)
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'PythonBindingsforEFLElementary', u'Python Bindings for EFL Elementary Documentation',
u'Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko', 'PythonBindingsforEFLElementary', 'One line description of project.',
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# -- Options for Epub output ---------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = u'Python Bindings for EFL'
epub_author = u'Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko'
epub_publisher = u'Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko'
epub_copyright = u'2008-2015, Simon Busch, Gustavo Sverzut Barbieri, Ulisses Furquim, ProFUSION embedded systems, Boris Faure, Fabiano Fidencio, Davide Andreoli, Kai Huuhko'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
#epub_exclude_files = []
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True