stefan pushed a commit to branch devs/stefan/music-control.
commit 1035f10367d089bfa9e68dd94e882289f45b70b0
Author: Stefan Schmidt <[email protected]>
Date: Fri Feb 22 13:28:09 2013 +0000
e/music_control: Add option to pause music on desklock.
Locking your screen pauses the music unlocking starts playing again.
Option is off by default.
---
src/modules/music-control/e_mod_main.c | 39 ++++++++++++++++++++++++++++++++++
src/modules/music-control/private.h | 4 ++++
src/modules/music-control/ui.c | 23 +++++++++++++++++---
3 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/src/modules/music-control/e_mod_main.c
b/src/modules/music-control/e_mod_main.c
index 9479471..5da27bd 100644
--- a/src/modules/music-control/e_mod_main.c
+++ b/src/modules/music-control/e_mod_main.c
@@ -4,6 +4,8 @@
static E_Module *music_control_mod = NULL;
+static Eina_Bool was_playing_before_lock = EINA_FALSE;
+
static const char _e_music_control_Name[] = "Music controller";
const Player music_player_players[] =
@@ -17,6 +19,37 @@ const Player music_player_players[] =
{NULL, NULL}
};
+Eina_Bool
+_desklock_cb(void *data, int type, void *ev)
+{
+ E_Music_Control_Module_Context *ctxt;
+ E_Event_Desklock *event;
+
+ ctxt = data;
+ event = ev;
+
+ /* Lock with music on. Pause it */
+ if (event->on && ctxt->playing)
+ {
+ media_player2_player_play_pause_call(ctxt->mpris2_player);
+ was_playing_before_lock = EINA_TRUE;
+ return ECORE_CALLBACK_DONE;
+ }
+
+ /* Lock without music. Keep music off as state */
+ if (event->on && (!ctxt->playing))
+ {
+ was_playing_before_lock = EINA_FALSE;
+ return ECORE_CALLBACK_DONE;
+ }
+
+ /* Unlock with music pause and playing before lock. Turn it back on */
+ if ((!event->on) && (!ctxt->playing) && was_playing_before_lock)
+ media_player2_player_play_pause_call(ctxt->mpris2_player);
+
+ return ECORE_CALLBACK_DONE;
+}
+
static void
_music_control(E_Object *obj, const char *params)
{
@@ -242,6 +275,7 @@ e_modapi_init(E_Module *m)
#define T Music_Control_Config
#define D ctxt->conf_edd
E_CONFIG_VAL(D, T, player_selected, INT);
+ E_CONFIG_VAL(D, T, pause_on_desklock, INT);
ctxt->config = e_config_domain_load(MUSIC_CONTROL_DOMAIN, ctxt->conf_edd);
if (!ctxt->config)
ctxt->config = calloc(1, sizeof(Music_Control_Config));
@@ -252,6 +286,9 @@ e_modapi_init(E_Module *m)
e_gadcon_provider_register(&_gc_class);
+ if (ctxt->config->pause_on_desklock)
+ desklock_handler = ecore_event_handler_add(E_EVENT_DESKLOCK,
_desklock_cb, ctxt);
+
return ctxt;
error_dbus_bus_get:
@@ -269,6 +306,8 @@ e_modapi_shutdown(E_Module *m)
free(ctxt->config);
E_CONFIG_DD_FREE(ctxt->conf_edd);
+ E_FREE_FUNC(desklock_handler, ecore_event_handler_del);
+
media_player2_player_proxy_unref(ctxt->mpris2_player);
mpris_media_player2_proxy_unref(ctxt->mrpis2);
edbus_connection_unref(ctxt->conn);
diff --git a/src/modules/music-control/private.h
b/src/modules/music-control/private.h
index abfdb79..de78980 100644
--- a/src/modules/music-control/private.h
+++ b/src/modules/music-control/private.h
@@ -5,9 +5,12 @@
#include "gen/edbus_media_player2_player.h"
#include "gen/edbus_mpris_media_player2.h"
+static Ecore_Event_Handler *desklock_handler = NULL;
+
typedef struct _Music_Control_Config
{
int player_selected;
+ int pause_on_desklock;
} Music_Control_Config;
typedef struct _E_Music_Control_Module_Context
@@ -36,6 +39,7 @@ const char *music_control_edj_path_get(void);
void music_control_popup_del(E_Music_Control_Instance *inst);
void music_control_state_update_all(E_Music_Control_Module_Context *ctxt);
Eina_Bool music_control_dbus_init(E_Music_Control_Module_Context *ctxt, const
char *bus);
+Eina_Bool _desklock_cb(void *data, int type, void *ev);
typedef struct _Player {
const char *name;
diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c
index 9f5375d..d411b18 100644
--- a/src/modules/music-control/ui.c
+++ b/src/modules/music-control/ui.c
@@ -94,12 +94,13 @@ music_control_popup_del(E_Music_Control_Instance *inst)
struct _E_Config_Dialog_Data
{
int index;
+ int pause_on_desklock;
};
static Evas_Object *
_cfg_widgets_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
*cfdata)
{
- Evas_Object *o, *of, *ob;
+ Evas_Object *o, *of, *ob, *oc;
E_Radio_Group *rg;
int i;
E_Music_Control_Instance *inst = cfd->data;
@@ -119,6 +120,10 @@ _cfg_widgets_create(E_Config_Dialog *cfd, Evas *evas,
E_Config_Dialog_Data *cfda
}
ob = e_widget_label_add(evas, "* Your player must be configured to export
the DBus interface MPRIS2.");
e_widget_framelist_object_append(of, ob);
+
+ oc = e_widget_check_add(evas, _("Pause music when screen is locked"),
&(cfdata->pause_on_desklock));
+ e_widget_framelist_object_append(of, oc);
+
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o;
@@ -130,6 +135,8 @@ _cfg_data_create(E_Config_Dialog *cfd)
E_Music_Control_Instance *inst = cfd->data;
E_Config_Dialog_Data *cfdata = calloc(1, sizeof(E_Config_Dialog_Data));
cfdata->index = inst->ctxt->config->player_selected;
+ cfdata->pause_on_desklock = inst->ctxt->config->pause_on_desklock;
+
return cfdata;
}
@@ -144,17 +151,27 @@ _cfg_check_changed(E_Config_Dialog *cfd,
E_Config_Dialog_Data *cfdata)
{
E_Music_Control_Instance *inst = cfd->data;
- return inst->ctxt->config->player_selected != cfdata->index;
+ return ((inst->ctxt->config->pause_on_desklock !=
cfdata->pause_on_desklock) ||
+ (inst->ctxt->config->player_selected != cfdata->index));
}
static int
_cfg_data_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
E_Music_Control_Instance *inst = cfd->data;
- if (inst->ctxt->config->player_selected == cfdata->index)
+
+ if ((inst->ctxt->config->player_selected == cfdata->index) &&
+ (inst->ctxt->config->pause_on_desklock == cfdata->pause_on_desklock))
return 1;
inst->ctxt->config->player_selected = cfdata->index;
+ inst->ctxt->config->pause_on_desklock = cfdata->pause_on_desklock;
+
+ if (inst->ctxt->config->pause_on_desklock)
+ desklock_handler = ecore_event_handler_add(E_EVENT_DESKLOCK,
_desklock_cb, inst->ctxt);
+ else
+ E_FREE_FUNC(desklock_handler, ecore_event_handler_del);
+
inst->ctxt->playing = EINA_FALSE;
mpris_media_player2_proxy_unref(inst->ctxt->mpris2_player);
media_player2_player_proxy_unref(inst->ctxt->mrpis2);
--
------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the
endpoint security space. For insight on selecting the right partner to
tackle endpoint security challenges, access the full report.
http://p.sf.net/sfu/symantec-dev2dev