davemds pushed a commit to branch master. http://git.enlightenment.org/enlightenment/modules/edgar.git/commit/?id=ea66f6dbc2d3a1fce0f22d0aad96b512d5b608ed
commit ea66f6dbc2d3a1fce0f22d0aad96b512d5b608ed Author: davemds <[email protected]> Date: Sat Aug 30 17:04:43 2014 +0200 Added the gadget option: popup_on_desktop If the gadget have this option setted then on the desktop we put directly the popup content, instead of the main obj. Used in the audio gadget --- GADGETS/audio/__init__.py | 1 + src/e_mod_edgar.c | 69 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/GADGETS/audio/__init__.py b/GADGETS/audio/__init__.py index 47580b0..7496de8 100644 --- a/GADGETS/audio/__init__.py +++ b/GADGETS/audio/__init__.py @@ -22,6 +22,7 @@ __gadget_auth__ = 'DaveMDS' __gadget_mail__ = '[email protected]' __gadget_desc__ = 'The complete audio gadget.' __gadget_vapi__ = 1 +__gadget_opts__ = { 'popup_on_desktop': True } _instance = None diff --git a/src/e_mod_edgar.c b/src/e_mod_edgar.c index bbbe5ef..415ba09 100644 --- a/src/e_mod_edgar.c +++ b/src/e_mod_edgar.c @@ -33,6 +33,7 @@ typedef struct { PyObject *instance; // the python Gadget class instance Eina_List *pops_obj; // list of edje objs that are set as popup content E_Gadcon_Client_Class *cclass; + Eina_Bool opt_pop_on_desk; }Edgar_Py_Gadget; @@ -41,7 +42,6 @@ static Edgar_Py_Gadget *edgar_gadget_load(const char *name, const char *path); static void edgar_gadget_unload(Edgar_Py_Gadget *gadget); static void edgar_gadgets_load_all(const char *path); static void edgar_gadgets_hash_free_func(void *data); -static void edgar_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static Eina_Bool edgar_theme_edje_object_set(Edgar_Py_Gadget *gadget, Evas_Object *obj, const char *group); /* Local Gadcon Prototypes */ @@ -197,7 +197,7 @@ edgar_gadget_load(const char *name, const char *path) E_Gadcon_Client_Class *cclass; char fname[PATH_MAX]; const char *label; - PyObject *mod, *attr; + PyObject *mod, *attr, *opts; long vapi = 0; // check the given path @@ -257,6 +257,7 @@ edgar_gadget_load(const char *name, const char *path) gadget->path = eina_stringshare_add(path); gadget->cclass = cclass; gadget->mod = mod; + gadget->opt_pop_on_desk = EINA_FALSE; // do gadget have a local edj ? snprintf(fname, sizeof(fname), "%s/%s.edj", path, name); if (ecore_file_exists(fname)) @@ -264,6 +265,16 @@ edgar_gadget_load(const char *name, const char *path) else gadget->edjefile = NULL; + // read the gadget options dict + if ((opts = PyObject_GetAttrString(mod, "__gadget_opts__"))) + { + attr = PyDict_GetItemString(opts, "popup_on_desktop"); + if (attr && PyObject_IsTrue(attr)) + gadget->opt_pop_on_desk = EINA_TRUE; + + Py_DECREF(opts); + } + //Register the new class e_gadcon_provider_register(cclass); eina_hash_add(edgar_gadgets, name, gadget); @@ -466,22 +477,19 @@ edgar_menu_info_cb(void *data, E_Menu *m, E_Menu_Item *mi) } static void -edgar_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +edgar_mouse_down3_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Gadcon_Client *gcc = data; Evas_Event_Mouse_Down *ev = event_info; Edgar_Py_Gadget *gadget = gcc->data; - E_Gadcon_Popup *popup; if (ev->button == 3) { - // gadcon menu on right-click E_Zone *zone; E_Menu *m; int x, y; zone = e_util_zone_current_get(e_manager_current_get()); - m = e_menu_new(); E_Menu_Item *mi; @@ -498,9 +506,18 @@ edgar_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) evas_event_feed_mouse_up(gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL); } - else if (ev->button == 1) +} + +static void +edgar_mouse_down1_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Gadcon_Client *gcc = data; + Evas_Event_Mouse_Down *ev = event_info; + Edgar_Py_Gadget *gadget = gcc->data; + E_Gadcon_Popup *popup; + + if (ev->button == 1) { - // toggle gadget popup on left-click if ((popup = evas_object_data_get(obj, "popup"))) { E_FREE_FUNC(popup, e_object_del); @@ -523,6 +540,8 @@ _edgar_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style { Edgar_Py_Gadget *gadget; Evas_Object *obj; + const char *group; + Eina_Bool pop_on_desk = EINA_FALSE; gadget = eina_hash_find(edgar_gadgets, name); if (!gadget) return NULL; @@ -538,9 +557,14 @@ _edgar_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style PY_ON_ERROR_RETURN(!gadget->instance, NULL, "Cannot create the Gadget instance"); } + // do we want the popup expanded on desktop ? + if (gc->location->site == E_GADCON_SITE_DESKTOP && gadget->opt_pop_on_desk) + pop_on_desk = EINA_TRUE; + // TODO search in the E theme ("e/gadget/name/main") obj = edje_object_add(gc->evas); - if (!edgar_theme_edje_object_set(gadget, obj, "main")) + group = pop_on_desk ? "popup" : "main"; + if (!edgar_theme_edje_object_set(gadget, obj, group)) { DBG("EDGAR: ERROR, cannot find a theme for the gadget: '%s'", name); evas_object_del(obj); @@ -553,16 +577,29 @@ _edgar_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style // setup default callbacks on object (right-click for menu, left for popup) evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, - edgar_mouse_down_cb, gcc); + edgar_mouse_down3_cb, gcc); + if (!pop_on_desk) + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, + edgar_mouse_down1_cb, gcc); - // call the instance_created() method of the gadget. + // notify the gadget about the new obj PyObject *pyobj = object_from_instance(obj); - PyObject *ret = PyObject_CallMethod(gadget->instance, "instance_created", - "(Si)", pyobj, gc->location->site); - PY_ON_ERROR_RETURN(!ret, NULL, "Cannot call instance_created()"); - Py_DECREF(pyobj); - Py_DECREF(ret); + PyObject *ret = NULL; + if (pop_on_desk) + { + ret = PyObject_CallMethod(gadget->instance, "popup_created", + "(S)", pyobj); + PY_ON_ERROR_RETURN(!ret, NULL, "Cannot call popup_created()"); + } + else + { + ret = PyObject_CallMethod(gadget->instance, "instance_created", + "(Si)", pyobj, gc->location->site); + PY_ON_ERROR_RETURN(!ret, NULL, "Cannot call instance_created()"); + } + Py_XDECREF(ret); + Py_XDECREF(pyobj); return gcc; } --
