forked from enlightenment/enlightenment
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:
parent
7302bcd8d4
commit
4cd377ca77
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue