e/music-control: Allow to change music player on gadget

Patch by: José Roberto de Souza  <zehortigoza@profusion.mobi>



SVN revision: 81992
This commit is contained in:
José Roberto de Souza 2013-01-02 13:21:41 +00:00 committed by Lucas De Marchi
parent 7302bcd8d4
commit 4cd377ca77
3 changed files with 160 additions and 12 deletions

View File

@ -1,11 +1,23 @@
#include "private.h"
#define MUSIC_CONTROL_DOMAIN "module.music_control"
static E_Module *music_control_mod = NULL;
static char tmpbuf[4096]; /* general purpose buffer, just use immediately */
static const char _e_music_control_Name[] = "Music controller";
const Player music_player_players[] =
{
{"gmusicbrowser", "org.mpris.MediaPlayer2.gmusicbrowser"},
{"Banshee", "org.mpris.MediaPlayer2.banshee"},
{"Audacious", "org.mpris.MediaPlayer2.audacious"},
{"VLC", "org.mpris.MediaPlayer2.vlc"},
{"BMP", "org.mpris.MediaPlayer2.bmp"},
{"XMMS2", "org.mpris.MediaPlayer2.xmms2"},
{NULL, NULL}
};
const char *
music_control_edj_path_get(void)
@ -154,6 +166,21 @@ prop_changed(void *data, EDBus_Proxy *proxy, void *event_info)
}
}
Eina_Bool
music_control_dbus_init(E_Music_Control_Module_Context *ctxt, const char *bus)
{
edbus_init();
ctxt->conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
EINA_SAFETY_ON_NULL_RETURN_VAL(ctxt->conn, EINA_FALSE);
ctxt->mrpis2 = mpris_media_player2_proxy_get(ctxt->conn, bus, NULL);
ctxt->mpris2_player = media_player2_player_proxy_get(ctxt->conn, bus, NULL);
media_player2_player_playback_status_propget(ctxt->mpris2_player, cb_playback_status_get, ctxt);
edbus_proxy_event_callback_add(ctxt->mpris2_player, EDBUS_PROXY_EVENT_PROPERTY_CHANGED,
prop_changed, ctxt);
return EINA_TRUE;
}
EAPI void *
e_modapi_init(E_Module *m)
{
@ -161,13 +188,20 @@ e_modapi_init(E_Module *m)
ctxt = calloc(1, sizeof(E_Music_Control_Module_Context));
EINA_SAFETY_ON_NULL_RETURN_VAL(ctxt, NULL);
edbus_init();
ctxt->conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
EINA_SAFETY_ON_NULL_GOTO(ctxt->conn, error_dbus_bus_get);
ctxt->mrpis2 = mpris_media_player2_proxy_get(ctxt->conn, "org.mpris.MediaPlayer2.gmusicbrowser", NULL);
ctxt->mpris2_player = media_player2_player_proxy_get(ctxt->conn, "org.mpris.MediaPlayer2.gmusicbrowser", NULL);
media_player2_player_playback_status_propget(ctxt->mpris2_player, cb_playback_status_get, ctxt);
edbus_proxy_event_callback_add(ctxt->mpris2_player, EDBUS_PROXY_EVENT_PROPERTY_CHANGED, prop_changed, ctxt);
music_control_mod = m;
ctxt->conf_edd = E_CONFIG_DD_NEW("music_control_config", Music_Control_Config);
#undef T
#undef D
#define T Music_Control_Config
#define D ctxt->conf_edd
E_CONFIG_VAL(D, T, player_selected, INT);
ctxt->config = e_config_domain_load(MUSIC_CONTROL_DOMAIN, ctxt->conf_edd);
if (!ctxt->config)
ctxt->config = calloc(1, sizeof(Music_Control_Config));
if (!music_control_dbus_init(ctxt, music_player_players[ctxt->config->player_selected].dbus_name))
goto error_dbus_bus_get;
music_control_mod = m;
e_gadcon_provider_register(&_gc_class);
@ -186,6 +220,9 @@ e_modapi_shutdown(E_Module *m)
EINA_SAFETY_ON_NULL_RETURN_VAL(music_control_mod, 0);
ctxt = music_control_mod->data;
free(ctxt->config);
E_CONFIG_DD_FREE(ctxt->conf_edd);
media_player2_player_proxy_unref(ctxt->mpris2_player);
mpris_media_player2_proxy_unref(ctxt->mrpis2);
edbus_connection_unref(ctxt->conn);
@ -205,10 +242,7 @@ e_modapi_shutdown(E_Module *m)
EAPI int
e_modapi_save(E_Module *m)
{
E_Music_Control_Module_Context *ctxt;
ctxt = m->data;
if (!ctxt)
return 0;
E_Music_Control_Module_Context *ctxt = m->data;
e_config_domain_save(MUSIC_CONTROL_DOMAIN, ctxt->conf_edd, ctxt->config);
return 1;
}

View File

@ -5,6 +5,11 @@
#include "gen/edbus_media_player2_player.h"
#include "gen/edbus_mpris_media_player2.h"
typedef struct _Music_Control_Config
{
int player_selected;
} Music_Control_Config;
typedef struct _E_Music_Control_Module_Context
{
Eina_List *instances;
@ -12,6 +17,8 @@ typedef struct _E_Music_Control_Module_Context
Eina_Bool playning:1;
EDBus_Proxy *mrpis2;
EDBus_Proxy *mpris2_player;
E_Config_DD *conf_edd;
Music_Control_Config *config;
} E_Music_Control_Module_Context;
typedef struct _E_Music_Control_Instance
@ -27,5 +34,11 @@ void music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void
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);
typedef struct _Player {
const char *name;
const char *dbus_name;
} Player;
#endif

View File

@ -1,5 +1,7 @@
#include "private.h"
extern Player music_player_players[];
static void
_play_state_update(E_Music_Control_Instance *inst)
{
@ -57,6 +59,84 @@ music_control_popup_del(E_Music_Control_Instance *inst)
inst->popup = NULL;
}
struct _E_Config_Dialog_Data
{
int index;
};
static Evas_Object *
_cfg_widgets_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *of, *ob;
E_Radio_Group *rg;
int i;
E_Music_Control_Instance *inst = cfd->data;
int player_selected = inst->ctxt->config->player_selected;
o = e_widget_list_add(evas, 0, 0);
of = e_widget_framelist_add(evas, "Music Player", 0);
e_widget_framelist_content_align_set(of, 0.0, 0.0);
rg = e_widget_radio_group_new(&(cfdata->index));
for (i = 0; music_player_players[i].dbus_name; i++)
{
ob = e_widget_radio_add(evas, music_player_players[i].name, i, rg);
e_widget_framelist_object_append(of, ob);
if (i == player_selected)
e_widget_radio_toggle_set(ob, EINA_TRUE);
}
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o;
}
static void *
_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;
return cfdata;
}
static void
_cfg_data_free(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
free(cfdata);
}
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)
return 1;
inst->ctxt->config->player_selected = cfdata->index;
inst->ctxt->playning = EINA_FALSE;
mpris_media_player2_proxy_unref(inst->ctxt->mpris2_player);
media_player2_player_proxy_unref(inst->ctxt->mrpis2);
music_control_dbus_init(inst->ctxt,
music_player_players[inst->ctxt->config->player_selected].dbus_name);
return 1;
}
static void
_cb_menu_cfg(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Config_Dialog_View *v;
v = calloc(1, sizeof(E_Config_Dialog_View));
v->create_cfdata = _cfg_data_create;
v->free_cfdata = _cfg_data_free;
v->basic.create_widgets = _cfg_widgets_create;
v->basic.apply_cfdata = _cfg_data_apply;
e_config_dialog_new(m->zone->container, "Music control Settings", "E",
"_e_mod_music_config_dialog",
music_control_edj_path_get(), 0, v, data);
}
void
music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
{
@ -70,4 +150,25 @@ music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *even
else
music_control_popup_del(inst);
}
else if (ev->button == 3)
{
E_Menu *m;
E_Menu_Item *mi;
E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
int x, y;
m = e_menu_new();
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, "Settings");
e_util_menu_item_theme_icon_set(mi, "configure");
e_menu_item_callback_set(mi, _cb_menu_cfg, inst);
m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL);
e_menu_activate_mouse(m, zone, (x + ev->output.x),(y + ev->output.y),
1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button,
EVAS_BUTTON_NONE, ev->timestamp, NULL);
}
}