diff --git a/TODO b/TODO index 2a6fe90f2..f9d016404 100644 --- a/TODO +++ b/TODO @@ -144,7 +144,6 @@ TODO: * start: start menu could do with more featured content * like you see on windows for example (search and multiple columns etc.) * a touch screen android-style scrolling fullscreen app icon style -* music-control: auto search for known mpris services * music-control: allow manual addition of new named mpris services * wireless: fix on connman to work properly * probably redesign to have a single icon and on click pop up like bz5 diff --git a/src/modules/music-control/e_mod_main.c b/src/modules/music-control/e_mod_main.c index fe8c0fd92..d701d28f2 100644 --- a/src/modules/music-control/e_mod_main.c +++ b/src/modules/music-control/e_mod_main.c @@ -318,26 +318,26 @@ prop_changed(void *data, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info) } static void -cb_name_owner_has(void *data, const Eldbus_Message *msg, - Eldbus_Pending *pending EINA_UNUSED) +cb_name_owner_changed(void *data, + const char *bus EINA_UNUSED, + const char *from EINA_UNUSED, + const char *to) { E_Music_Control_Module_Context *ctxt = data; - Eina_Bool owner_exists; - if (eldbus_message_error_get(msg, NULL, NULL)) return; - if (!eldbus_message_arguments_get(msg, "b", &owner_exists)) return; - if (owner_exists) + have_player = EINA_FALSE; + if (to[0]) { media_player2_player_playback_status_propget (ctxt->mpris2_player, cb_playback_status_get, ctxt); media_player2_player_metadata_propget (ctxt->mpris2_player, cb_metadata_get, ctxt); + have_player = EINA_TRUE; } - have_player = owner_exists; } void -music_control_launch(void) +music_control_launch(E_Music_Control_Instance *inst) { E_Music_Control_Module_Context *ctxt; @@ -346,26 +346,60 @@ music_control_launch(void) if (have_player) return; if (ctxt->config->player_selected < 0) { + Efreet_Desktop *desktop; + int i; + + for (i = 0; i < PLAYER_COUNT; i++) + { + desktop = efreet_util_desktop_exec_find + (music_player_players[i].command); + if (desktop) + { + E_Zone *zone = e_gadcon_zone_get(inst->gcc->gadcon); + e_exec(zone, desktop, NULL/* command */, + NULL/* file list */, "module/music-control"); + ctxt->config->player_selected = i; + music_control_dbus_init + (ctxt, music_player_players[i].dbus_name); + break; + } + } } else if (ctxt->config->player_selected < PLAYER_COUNT) { - ecore_exe_run - (music_player_players[ctxt->config->player_selected].command, NULL); + E_Zone *zone = e_gadcon_zone_get(inst->gcc->gadcon); + e_exec(zone, NULL/* efreet desktop*/, + music_player_players[ctxt->config->player_selected].command, + NULL/* file list */, "module/music-control"); } } Eina_Bool music_control_dbus_init(E_Music_Control_Module_Context *ctxt, const char *bus) { - ctxt->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); + if (!ctxt->conn) + ctxt->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); EINA_SAFETY_ON_NULL_RETURN_VAL(ctxt->conn, EINA_FALSE); + if (ctxt->mpris2_player) + mpris_media_player2_proxy_unref(ctxt->mpris2_player); + if (ctxt->mrpis2) + media_player2_player_proxy_unref(ctxt->mrpis2); ctxt->mrpis2 = mpris_media_player2_proxy_get(ctxt->conn, bus, NULL); ctxt->mpris2_player = media_player2_player_proxy_get(ctxt->conn, bus, NULL); eldbus_proxy_event_callback_add(ctxt->mpris2_player, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED, prop_changed, ctxt); - eldbus_name_owner_has(ctxt->conn, bus, cb_name_owner_has, ctxt); + if (ctxt->dbus_name) + { + eldbus_name_owner_changed_callback_del + (ctxt->conn, ctxt->dbus_name, cb_name_owner_changed, ctxt); + eina_stringshare_del(ctxt->dbus_name); + } + ctxt->dbus_name = eina_stringshare_add(bus); + eldbus_name_owner_changed_callback_add(ctxt->conn, bus, + cb_name_owner_changed, + ctxt, EINA_TRUE); return EINA_TRUE; } @@ -386,7 +420,11 @@ e_modapi_init(E_Module *m) 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)); + if (!ctxt->config) + { + ctxt->config = calloc(1, sizeof(Music_Control_Config)); + ctxt->config->player_selected = -1; + } if (ctxt->config->player_selected < 0) { @@ -430,6 +468,9 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) E_FREE_FUNC(desklock_handler, ecore_event_handler_del); + eldbus_name_owner_changed_callback_del + (ctxt->conn, ctxt->dbus_name, cb_name_owner_changed, ctxt); + eina_stringshare_del(ctxt->dbus_name); media_player2_player_proxy_unref(ctxt->mpris2_player); mpris_media_player2_proxy_unref(ctxt->mrpis2); eldbus_connection_unref(ctxt->conn); diff --git a/src/modules/music-control/private.h b/src/modules/music-control/private.h index 6f288f149..8420d4d32 100644 --- a/src/modules/music-control/private.h +++ b/src/modules/music-control/private.h @@ -26,6 +26,7 @@ typedef struct _E_Music_Control_Module_Context Eldbus_Proxy *mpris2_player; E_Config_DD *conf_edd; Music_Control_Config *config; + const char *dbus_name; Eina_Bool actions_set E_BITFIELD; } E_Music_Control_Module_Context; @@ -38,7 +39,7 @@ typedef struct _E_Music_Control_Instance Evas_Object *content_popup; } E_Music_Control_Instance; -void music_control_launch(void); +void music_control_launch(E_Music_Control_Instance *inst); void music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event); const char *music_control_edj_path_get(void); void music_control_popup_del(E_Music_Control_Instance *inst); diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c index 4c08ce5de..d0bd8f428 100644 --- a/src/modules/music-control/ui.c +++ b/src/modules/music-control/ui.c @@ -92,7 +92,7 @@ _label_clicked(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EI { E_Music_Control_Instance *inst = data; music_control_popup_del(inst); - music_control_launch(); + music_control_launch(inst); mpris_media_player2_raise_call(inst->ctxt->mrpis2); } @@ -229,8 +229,6 @@ _cfg_data_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 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); music_control_dbus_init(inst->ctxt, music_player_players[inst->ctxt->config->player_selected].dbus_name); return 1; @@ -261,6 +259,7 @@ music_control_mouse_down_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj if (ev->button == 1) { + music_control_launch(inst); if (!inst->popup) _popup_new(inst); else