kuuko pushed a commit to branch master. http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=2ce228be96cc1aa5b412ec36468851f70e462c59
commit 2ce228be96cc1aa5b412ec36468851f70e462c59 Author: Kai Huuhko <kai.huu...@gmail.com> Date: Sat Feb 21 05:39:28 2015 +0200 Elementary: Add module systray Test/example needs more work --- doc/elementary/elementary.rst | 1 + doc/elementary/systray.rst | 2 + efl/ecore/efl.ecore_events.pxi | 6 +- efl/elementary/systray.pxd | 44 ++++++ efl/elementary/systray.pyx | 304 ++++++++++++++++++++++++++++++++++++ examples/elementary/test_systray.py | 36 +++++ setup.py | 12 +- 7 files changed, 400 insertions(+), 5 deletions(-) diff --git a/doc/elementary/elementary.rst b/doc/elementary/elementary.rst index be0ac5c..657598f 100644 --- a/doc/elementary/elementary.rst +++ b/doc/elementary/elementary.rst @@ -120,6 +120,7 @@ Inheritance diagram efl.elementary.slider efl.elementary.slideshow efl.elementary.spinner + efl.elementary.systray efl.elementary.table efl.elementary.theme efl.elementary.thumb diff --git a/doc/elementary/systray.rst b/doc/elementary/systray.rst new file mode 100644 index 0000000..d0972b1 --- /dev/null +++ b/doc/elementary/systray.rst @@ -0,0 +1,2 @@ + +.. automodule:: efl.elementary.systray diff --git a/efl/ecore/efl.ecore_events.pxi b/efl/ecore/efl.ecore_events.pxi index ccb19bb..880cc7e 100644 --- a/efl/ecore/efl.ecore_events.pxi +++ b/efl/ecore/efl.ecore_events.pxi @@ -34,10 +34,10 @@ cdef Eina_Bool event_handler_cb(void *data, int type, void *event) with gil: cdef EventHandler handler cdef Eina_Bool r - assert event != NULL - assert data != NULL + #assert event != NULL + assert data != NULL, "data should not be NULL!" handler = <EventHandler>data - assert type == handler.type + assert type == handler.type, "handler type isn't the same as event type!" try: r = handler._exec(event) diff --git a/efl/elementary/systray.pxd b/efl/elementary/systray.pxd new file mode 100644 index 0000000..f5b9f83 --- /dev/null +++ b/efl/elementary/systray.pxd @@ -0,0 +1,44 @@ +from efl.eina cimport Eina_Bool, Eina_List +from efl.evas cimport Evas_Object, Evas_Coord +from efl.c_eo cimport Eo, Eo_Class + +cdef extern from "Elementary.h": + + ctypedef Eo Elm_Systray + + cpdef enum: + ELM_EVENT_SYSTRAY_READY + + cpdef enum _Elm_Systray_Category: + ELM_SYSTRAY_CATEGORY_APP_STATUS + ELM_SYSTRAY_CATEGORY_COMMUNICATIONS + ELM_SYSTRAY_CATEGORY_SYS_SERVICES + ELM_SYSTRAY_CATEGORY_HARDWARE + ELM_SYSTRAY_CATEGORY_OTHER + ctypedef _Elm_Systray_Category Elm_Systray_Category + + cpdef enum _Elm_Systray_Status: + ELM_SYSTRAY_STATUS_PASSIVE + ELM_SYSTRAY_STATUS_ACTIVE + ELM_SYSTRAY_STATUS_ATTENTION + ctypedef _Elm_Systray_Status Elm_Systray_Status + + const Eo_Class *elm_systray_class_get() + + void elm_obj_systray_id_set(const char *id) + const char * elm_obj_systray_id_get() + void elm_obj_systray_category_set(Elm_Systray_Category cat) + Elm_Systray_Category elm_obj_systray_category_get() + void elm_obj_systray_icon_theme_path_set(const char *icon_theme_path) + const char * elm_obj_systray_icon_theme_path_get() + void elm_obj_systray_menu_set(const Eo *menu) + const Eo * elm_obj_systray_menu_get() + void elm_obj_systray_att_icon_name_set(const char *att_icon_name) + const char * elm_obj_systray_att_icon_name_get() + void elm_obj_systray_status_set(Elm_Systray_Status st) + Elm_Systray_Status elm_obj_systray_status_get() + void elm_obj_systray_icon_name_set(const char *icon_name) + const char * elm_obj_systray_icon_name_get() + void elm_obj_systray_title_set(const char *title) + const char * elm_obj_systray_title_get() + Eina_Bool elm_obj_systray_register() diff --git a/efl/elementary/systray.pyx b/efl/elementary/systray.pyx new file mode 100644 index 0000000..24e967b --- /dev/null +++ b/efl/elementary/systray.pyx @@ -0,0 +1,304 @@ +# 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 <http://www.gnu.org/licenses/>. + +""" +:mod:`systray` Module +########################## + +.. versionadded:: 1.14 + + +Enumerations +============ + +.. _Elm_Systray_Category: + +Category of the Status Notifier Item. +------------------------------------- + +.. data:: ELM_SYSTRAY_CATEGORY_APP_STATUS + + Indicators of application status + +.. data:: ELM_SYSTRAY_CATEGORY_COMMUNICATIONS + + Communications apps + +.. data:: ELM_SYSTRAY_CATEGORY_SYS_SERVICES + + System Service apps + +.. data:: ELM_SYSTRAY_CATEGORY_HARDWARE + + Hardware indicators + +.. data:: ELM_SYSTRAY_CATEGORY_OTHER + + Undefined category + + +.. _Elm_Systray_Status: + +Application status information. +------------------------------- + +.. data:: ELM_SYSTRAY_STATUS_PASSIVE + + Passive (normal) + +.. data:: ELM_SYSTRAY_STATUS_ACTIVE + + Active + +.. data:: ELM_SYSTRAY_STATUS_ATTENTION + + Needs Attention + +Inheritance diagram +=================== + +.. inheritance-diagram:: efl.elementary.systray + :parts: 2 + +""" + +from cpython cimport PyUnicode_AsUTF8String, Py_INCREF + +from efl.c_eo cimport eo_do, eo_add, Eo as cEo +from efl.eo cimport Eo, object_from_instance +from object cimport Object +from efl.ecore cimport Event, EventHandler, _event_mapping_register +from efl.utils.conversions cimport _ctouni + + +cdef class EventSystrayReady(Event): + cdef int _set_obj(self, void *o) except 0: + return 1 + + def __repr__(self): + return "<%s()>" % (self.__class__.__name__,) + +_event_mapping_register(ELM_EVENT_SYSTRAY_READY, EventSystrayReady) + + +cdef class Systray(Object): + + """ + + This is the class that actually implements the widget. + + """ + + def __init__(self, Eo parent not None, *args, **kwargs): + self._set_obj(eo_add(elm_systray_class_get(), parent.obj)) + self._set_properties_from_keyword_args(kwargs) + + property id: + """The id of the Status Notifier Item. + + :type: string + + """ + def __set__(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_id_set( + <const char *>value if value is not None else NULL + ) + ) + + def __get__(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_id_get())) + + def id_set(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_id_set( + <const char *>value if value is not None else NULL + ) + ) + + def id_get(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_id_get())) + + property category: + """ + + The category of the Status Notifier Item. + + :type: string + + """ + def __set__(self, Elm_Systray_Category value): + eo_do(self.obj, elm_obj_systray_category_set(value)) + + def __get__(self): + return <Elm_Systray_Category>eo_do(self.obj, elm_obj_systray_category_get()) + + def category_set(self, Elm_Systray_Category value): + eo_do(self.obj, elm_obj_systray_category_set(value)) + + def category_get(self): + return <Elm_Systray_Category>eo_do(self.obj, elm_obj_systray_category_get()) + + property icon_theme_path: + """The path to the theme where the icons can be found. + + Set this value to "" to use the default path. + + :type: string + """ + def __set__(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_icon_theme_path_set( + <const char *>value if value is not None else NULL + ) + ) + + def __get__(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_icon_theme_path_get())) + + def icon_theme_path_set(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_icon_theme_path_set( + <const char *>value if value is not None else NULL + ) + ) + + def icon_theme_path_get(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_icon_theme_path_get())) + + property menu: + """The object path of the D-Bus Menu to be shown when the Status Notifier Item is activated by the user. + + :type: Eo + """ + def __set__(self, Eo value): + eo_do(self.obj, elm_obj_systray_menu_set(value.obj)) + + def __get__(self): + return object_from_instance(<cEo *>eo_do(self.obj, elm_obj_systray_menu_get())) + + def menu_set(self, Eo value): + eo_do(self.obj, elm_obj_systray_menu_set(value.obj)) + + def menu_get(self): + return object_from_instance(<cEo *>eo_do(self.obj, elm_obj_systray_menu_get())) + + property att_icon_name: + """The name of the attention icon to be used by the Status Notifier Item. + + :type: string + """ + def __set__(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_att_icon_name_set( + <const char *>value if value is not None else NULL + ) + ) + + def __get__(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_att_icon_name_get())) + + def att_icon_name_set(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_att_icon_name_set( + <const char *>value if value is not None else NULL + ) + ) + + def att_icon_name_get(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_att_icon_name_get())) + + property status: + """The status of the Status Notifier Item. + + :type: Elm_Systray_Status + """ + def __set__(self, Elm_Systray_Status value): + eo_do(self.obj, elm_obj_systray_status_set(value)) + + def __get__(self): + return <Elm_Systray_Status>eo_do(self.obj, elm_obj_systray_status_get()) + + def status_set(self, Elm_Systray_Status value): + eo_do(self.obj, elm_obj_systray_status_set(value)) + + def status_get(self): + return <Elm_Systray_Status>eo_do(self.obj, elm_obj_systray_status_get()) + + property icon_name: + """The name of the icon to be used by the Status Notifier Item. + + :type: string + """ + def __set__(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_icon_name_set( + <const char *>value if value is not None else NULL + ) + ) + + def __get__(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_icon_name_get())) + + def icon_name_set(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_icon_name_set( + <const char *>value if value is not None else NULL + ) + ) + + def icon_name_get(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_icon_name_get())) + + property title: + """The title of the Status Notifier Item. + + :type: string + """ + def __set__(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_title_set( + <const char *>value if value is not None else NULL + ) + ) + + def __get__(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_title_get())) + + def title_set(self, value): + if isinstance(value, unicode): value = PyUnicode_AsUTF8String(value) + eo_do(self.obj, elm_obj_systray_title_set( + <const char *>value if value is not None else NULL + ) + ) + + def title_get(self): + return _ctouni(<const char *>eo_do(self.obj, elm_obj_systray_title_get())) + + def register(self): + """Register this Status Notifier Item in the System Tray Watcher. + + This function should only be called after the event + #ELM_EVENT_SYSTRAY_READY is emitted. + + """ + return bool(<Eina_Bool>eo_do(self.obj, elm_obj_systray_register())) + + +def on_systray_ready(func, *args, **kwargs): + """Use this to set a handler for the systray ready event.""" + return EventHandler(ELM_EVENT_SYSTRAY_READY, func, *args, **kwargs) diff --git a/examples/elementary/test_systray.py b/examples/elementary/test_systray.py new file mode 100644 index 0000000..81feb8b --- /dev/null +++ b/examples/elementary/test_systray.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +from efl.ecore import ECORE_CALLBACK_DONE +import efl.elementary as elm +elm.init() +if not elm.need_systray(): + raise SystemExit("systray support missing") + +from efl.elementary.window import StandardWindow +from efl.elementary.systray import Systray, on_systray_ready +from efl.elementary.menu import Menu + + +def ready_cb(event): + print(tray.register()) + + return ECORE_CALLBACK_DONE + + +win = StandardWindow("test", "systray test", size=(400, 400)) +win.callback_delete_request_add(lambda x: elm.exit()) + +on_systray_ready(ready_cb) + +menu = Menu(win) +menu.item_add(None, "it works!") + +tray = Systray(win) +tray.icon_name = "elementary" +tray.att_icon_name = "elementary" +tray.menu = menu + +win.show() + +elm.run() +elm.shutdown() diff --git a/setup.py b/setup.py index 60f73ea..be653ca 100755 --- a/setup.py +++ b/setup.py @@ -251,7 +251,10 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): # === Eo === eo_cflags, eo_libs = pkg_config('Eo', 'eo', EFL_MIN_VER) eo_ext = Extension("eo", ["efl/eo/efl.eo" + module_suffix], - define_macros=[('EFL_BETA_API_SUPPORT', None)], + define_macros=[ + ('EFL_BETA_API_SUPPORT', 1), + ('EFL_EO_API_SUPPORT', 1) + ], include_dirs=['include/'], extra_compile_args=eo_cflags, extra_link_args=eo_libs + eina_libs @@ -437,6 +440,7 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): "slideshow", "spinner", #"store", + "systray", "table", "theme", "thumb", @@ -451,9 +455,13 @@ if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): for m in elm_mods: e = Extension("elementary." + m, ["efl/elementary/" + m + module_suffix], + define_macros=[ + ('EFL_BETA_API_SUPPORT', 1), + ('EFL_EO_API_SUPPORT', 1) + ], include_dirs=["include/"], extra_compile_args=elm_cflags, - extra_link_args=elm_libs + eina_libs + evas_libs) + extra_link_args=elm_libs + eina_libs + eo_libs + evas_libs) ext_modules.append(e) packages.append("efl.elementary") --