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;
 }

-- 


Reply via email to