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"
|
#include "private.h"
|
||||||
|
|
||||||
|
#define MUSIC_CONTROL_DOMAIN "module.music_control"
|
||||||
|
|
||||||
static E_Module *music_control_mod = NULL;
|
static E_Module *music_control_mod = NULL;
|
||||||
|
|
||||||
static char tmpbuf[4096]; /* general purpose buffer, just use immediately */
|
static char tmpbuf[4096]; /* general purpose buffer, just use immediately */
|
||||||
|
|
||||||
static const char _e_music_control_Name[] = "Music controller";
|
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 *
|
const char *
|
||||||
music_control_edj_path_get(void)
|
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 *
|
EAPI void *
|
||||||
e_modapi_init(E_Module *m)
|
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));
|
ctxt = calloc(1, sizeof(E_Music_Control_Module_Context));
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(ctxt, NULL);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(ctxt, NULL);
|
||||||
edbus_init();
|
music_control_mod = m;
|
||||||
ctxt->conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
|
|
||||||
EINA_SAFETY_ON_NULL_GOTO(ctxt->conn, error_dbus_bus_get);
|
ctxt->conf_edd = E_CONFIG_DD_NEW("music_control_config", Music_Control_Config);
|
||||||
ctxt->mrpis2 = mpris_media_player2_proxy_get(ctxt->conn, "org.mpris.MediaPlayer2.gmusicbrowser", NULL);
|
#undef T
|
||||||
ctxt->mpris2_player = media_player2_player_proxy_get(ctxt->conn, "org.mpris.MediaPlayer2.gmusicbrowser", NULL);
|
#undef D
|
||||||
media_player2_player_playback_status_propget(ctxt->mpris2_player, cb_playback_status_get, ctxt);
|
#define T Music_Control_Config
|
||||||
edbus_proxy_event_callback_add(ctxt->mpris2_player, EDBUS_PROXY_EVENT_PROPERTY_CHANGED, prop_changed, ctxt);
|
#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;
|
music_control_mod = m;
|
||||||
|
|
||||||
e_gadcon_provider_register(&_gc_class);
|
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);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(music_control_mod, 0);
|
||||||
ctxt = music_control_mod->data;
|
ctxt = music_control_mod->data;
|
||||||
|
|
||||||
|
free(ctxt->config);
|
||||||
|
E_CONFIG_DD_FREE(ctxt->conf_edd);
|
||||||
|
|
||||||
media_player2_player_proxy_unref(ctxt->mpris2_player);
|
media_player2_player_proxy_unref(ctxt->mpris2_player);
|
||||||
mpris_media_player2_proxy_unref(ctxt->mrpis2);
|
mpris_media_player2_proxy_unref(ctxt->mrpis2);
|
||||||
edbus_connection_unref(ctxt->conn);
|
edbus_connection_unref(ctxt->conn);
|
||||||
|
@ -205,10 +242,7 @@ e_modapi_shutdown(E_Module *m)
|
||||||
EAPI int
|
EAPI int
|
||||||
e_modapi_save(E_Module *m)
|
e_modapi_save(E_Module *m)
|
||||||
{
|
{
|
||||||
E_Music_Control_Module_Context *ctxt;
|
E_Music_Control_Module_Context *ctxt = m->data;
|
||||||
|
e_config_domain_save(MUSIC_CONTROL_DOMAIN, ctxt->conf_edd, ctxt->config);
|
||||||
ctxt = m->data;
|
|
||||||
if (!ctxt)
|
|
||||||
return 0;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,11 @@
|
||||||
#include "gen/edbus_media_player2_player.h"
|
#include "gen/edbus_media_player2_player.h"
|
||||||
#include "gen/edbus_mpris_media_player2.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
|
typedef struct _E_Music_Control_Module_Context
|
||||||
{
|
{
|
||||||
Eina_List *instances;
|
Eina_List *instances;
|
||||||
|
@ -12,6 +17,8 @@ typedef struct _E_Music_Control_Module_Context
|
||||||
Eina_Bool playning:1;
|
Eina_Bool playning:1;
|
||||||
EDBus_Proxy *mrpis2;
|
EDBus_Proxy *mrpis2;
|
||||||
EDBus_Proxy *mpris2_player;
|
EDBus_Proxy *mpris2_player;
|
||||||
|
E_Config_DD *conf_edd;
|
||||||
|
Music_Control_Config *config;
|
||||||
} E_Music_Control_Module_Context;
|
} E_Music_Control_Module_Context;
|
||||||
|
|
||||||
typedef struct _E_Music_Control_Instance
|
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);
|
const char *music_control_edj_path_get(void);
|
||||||
void music_control_popup_del(E_Music_Control_Instance *inst);
|
void music_control_popup_del(E_Music_Control_Instance *inst);
|
||||||
void music_control_state_update_all(E_Music_Control_Module_Context *ctxt);
|
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
|
#endif
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "private.h"
|
#include "private.h"
|
||||||
|
|
||||||
|
extern Player music_player_players[];
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_play_state_update(E_Music_Control_Instance *inst)
|
_play_state_update(E_Music_Control_Instance *inst)
|
||||||
{
|
{
|
||||||
|
@ -57,6 +59,84 @@ music_control_popup_del(E_Music_Control_Instance *inst)
|
||||||
inst->popup = NULL;
|
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
|
void
|
||||||
music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
|
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
|
else
|
||||||
music_control_popup_del(inst);
|
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