yoz pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=0a739058953f4569e082479ad9c8036daf9a9586

commit 0a739058953f4569e082479ad9c8036daf9a9586
Author: Michael Bouchaud <michael.bouch...@ext.actia.fr>
Date:   Mon Feb 20 00:45:41 2017 +0100

    e_client_volume: add E_EVENT_CLIENT_VOLUME_SINK handler
    
    This commit introduce 3 new handlers to e_client_volume API. These allow to
    catch event about sink add, del and update
---
 src/bin/e_client_volume.c      | 39 ++++++++++++++++++++++++++++++++++++++-
 src/bin/e_client_volume.h      | 10 ++++++++++
 src/modules/mixer/e_mod_main.c | 13 +------------
 3 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/src/bin/e_client_volume.c b/src/bin/e_client_volume.c
index a53082d..bdc54e3 100644
--- a/src/bin/e_client_volume.c
+++ b/src/bin/e_client_volume.c
@@ -3,6 +3,9 @@
 E_API int E_EVENT_CLIENT_VOLUME = -1;
 E_API int E_EVENT_CLIENT_MUTE = -1;
 E_API int E_EVENT_CLIENT_UNMUTE = -1;
+E_API int E_EVENT_CLIENT_VOLUME_SINK_ADD = -1;
+E_API int E_EVENT_CLIENT_VOLUME_SINK_DEL = -1;
+E_API int E_EVENT_CLIENT_VOLUME_SINK_CHANGED = -1;
 
 static void _e_client_volume_event_simple_free(void *d, E_Event_Client *ev);
 static void _e_client_volume_event_simple(E_Client *ec, int type);
@@ -33,6 +36,28 @@ _e_client_volume_event_simple(E_Client *ec, int type)
 }
 
 static void
+_e_client_volume_sink_event_simple_free(void *d EINA_UNUSED, 
E_Event_Client_Volume_Sink *ev)
+{
+   UNREFD(ev->ec, 3);
+   e_object_unref(E_OBJECT(ev->ec));
+   free(ev);
+}
+
+static void
+_e_client_volume_sink_event_simple(E_Client *ec, E_Client_Volume_Sink *sink, 
int type)
+{
+   E_Event_Client_Volume_Sink *ev;
+
+   ev = E_NEW(E_Event_Client_Volume_Sink, 1);
+   ev->ec = ec;
+   ev->sink = sink;
+   REFD(ec, 3);
+   e_object_ref(E_OBJECT(ec));
+   ecore_event_add(type, ev,
+                   (Ecore_End_Cb)_e_client_volume_sink_event_simple_free, 
NULL);
+}
+
+static void
 _e_client_volume_object_mouse_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    E_Client *ec;
@@ -107,6 +132,9 @@ e_client_volume_init(void)
    E_EVENT_CLIENT_VOLUME = ecore_event_type_new();
    E_EVENT_CLIENT_MUTE = ecore_event_type_new();
    E_EVENT_CLIENT_UNMUTE = ecore_event_type_new();
+   E_EVENT_CLIENT_VOLUME_SINK_ADD = ecore_event_type_new();
+   E_EVENT_CLIENT_VOLUME_SINK_DEL = ecore_event_type_new();
+   E_EVENT_CLIENT_VOLUME_SINK_CHANGED = ecore_event_type_new();
 
    return EINA_TRUE;
 }
@@ -141,6 +169,8 @@ e_client_volume_sink_del(E_Client_Volume_Sink *sink)
      {
         ec->sinks = eina_list_remove(ec->sinks, sink);
         e_comp_object_frame_volume_update(ec->frame);
+        _e_client_volume_sink_event_simple(ec, sink,
+                                           E_EVENT_CLIENT_VOLUME_SINK_DEL);
      }
    free(sink);
 }
@@ -222,6 +252,8 @@ e_client_volume_sink_append(E_Client *ec, 
E_Client_Volume_Sink *sink)
         ec->volume_control_enabled = EINA_TRUE;
      }
    e_comp_object_frame_volume_update(ec->frame);
+   _e_client_volume_sink_event_simple(ec, sink,
+                                      E_EVENT_CLIENT_VOLUME_SINK_ADD);
 }
 
 E_API void
@@ -231,6 +263,8 @@ e_client_volume_sink_remove(E_Client *ec, 
E_Client_Volume_Sink *sink)
    ec->sinks = eina_list_remove(ec->sinks, sink);
    sink->clients = eina_list_remove(sink->clients, ec);
    e_comp_object_frame_volume_update(ec->frame);
+   _e_client_volume_sink_event_simple(ec, sink,
+                                      E_EVENT_CLIENT_VOLUME_SINK_DEL);
 }
 
 E_API void
@@ -246,7 +280,10 @@ e_client_volume_sink_update(E_Client_Volume_Sink *sink)
    e_client_volume_sink_get(sink, &volume, &mute);
    EINA_LIST_FOREACH(sink->clients, l, ec)
      {
-        e_client_volume_display_set(ec, volume, mute);
+        if (eina_list_count(ec->sinks) == 1)
+          e_client_volume_display_set(ec, volume, mute);
+        _e_client_volume_sink_event_simple(ec, sink,
+                                           E_EVENT_CLIENT_VOLUME_SINK_CHANGED);
      }
 }
 
diff --git a/src/bin/e_client_volume.h b/src/bin/e_client_volume.h
index 44de594..68e172b 100644
--- a/src/bin/e_client_volume.h
+++ b/src/bin/e_client_volume.h
@@ -2,6 +2,7 @@
 #define E_CLIENT_VOLUME_H_
 
 typedef struct _E_Client_Volume_Sink E_Client_Volume_Sink;
+typedef struct _E_Event_Client_Volume_Sink E_Event_Client_Volume_Sink;
 
 typedef void (*E_Client_Volume_Sink_Get)(int *volume, Eina_Bool *mute, void 
*data);
 typedef void (*E_Client_Volume_Sink_Set)(int volume, Eina_Bool mute, void 
*data);
@@ -12,6 +13,9 @@ typedef const char *(*E_Client_Volume_Sink_Name_Get)(void 
*data);
 E_API extern int E_EVENT_CLIENT_VOLUME;
 E_API extern int E_EVENT_CLIENT_MUTE;
 E_API extern int E_EVENT_CLIENT_UNMUTE;
+E_API extern int E_EVENT_CLIENT_VOLUME_SINK_ADD;
+E_API extern int E_EVENT_CLIENT_VOLUME_SINK_DEL;
+E_API extern int E_EVENT_CLIENT_VOLUME_SINK_CHANGED;
 
 struct _E_Client_Volume_Sink
 {
@@ -24,6 +28,12 @@ struct _E_Client_Volume_Sink
    Eina_List *clients;
 };
 
+struct _E_Event_Client_Volume_Sink
+{
+   E_Client *ec;
+   E_Client_Volume_Sink *sink;
+};
+
 
 EINTERN int        e_client_volume_init(void);
 EINTERN void       e_client_volume_shutdown(void);
diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c
index 5c1880d..aa9b619 100644
--- a/src/modules/mixer/e_mod_main.c
+++ b/src/modules/mixer/e_mod_main.c
@@ -964,18 +964,7 @@ _sink_input_event(int type, Emix_Sink_Input *input)
            {
               if (sink->data == input)
                 {
-                   Eina_Bool update = EINA_TRUE;
-                   EINA_LIST_FOREACH(sink->clients, l, ec)
-                     {
-                        if (eina_list_count(ec->sinks) > 1)
-                          {
-                             update = EINA_FALSE;
-                             break;
-                          }
-                     }
-                   if (update)
-                     e_client_volume_sink_update(sink);
-
+                   e_client_volume_sink_update(sink);
                 }
            }
          break;

-- 


Reply via email to