diff --git a/src/modules/music-control/e_mod_main.c b/src/modules/music-control/e_mod_main.c index 7ec5f3de5..ab910311f 100644 --- a/src/modules/music-control/e_mod_main.c +++ b/src/modules/music-control/e_mod_main.c @@ -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; } diff --git a/src/modules/music-control/private.h b/src/modules/music-control/private.h index d0cba6b4d..99c3bc2aa 100644 --- a/src/modules/music-control/private.h +++ b/src/modules/music-control/private.h @@ -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 diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c index 5da979bc0..8624c43fe 100644 --- a/src/modules/music-control/ui.c +++ b/src/modules/music-control/ui.c @@ -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); + } }