diff --git a/README.md b/README.md index a216a016..33cdb37b 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ A partial list of parameters are below. See the config file for a complete list. | `toggle_hud=`
`toggle_logging=` | Modifiable toggle hotkeys. Default are F12 and F2, respectively. | | `reload_cfg=` | Change keybind for reloading the config | | `time`
`time_format=%T` | Displays local time. See [std::put_time](https://en.cppreference.com/w/cpp/io/manip/put_time) for formatting help. | -| `gpu_color`
`gpu_color`
`vram_color`
`ram_color`
`io_color`
`engine_color`
`frametime_color`
`background_color`
`text_color` | Change default colors: `gpu_color=RRGGBB`| +| `gpu_color`
`gpu_color`
`vram_color`
`ram_color`
`io_color`
`engine_color`
`frametime_color`
`background_color`
`text_color`
`media_player_color` | Change default colors: `gpu_color=RRGGBB`| | `alpha` | Set the opacity of all text and frametime graph `0.0-1.0` | | `background_alpha` | Set the opacity of the background `0.0-1.0` | | `read_cfg` | Add to MANGOHUD_CONFIG as first parameter to also load config file. Otherwise only MANGOHUD_CONFIG parameters are used. | @@ -130,7 +130,8 @@ A partial list of parameters are below. See the config file for a complete list. | `font_file` | Change default font (set location to .TTF/.OTF file ) | | `log_duration` | Set amount of time the logging will run for (in seconds) | | `vsync`
`gl_vsync` | Set vsync for OpenGL or Vulkan | -| `media_player` | Show Spotify metadata | +| `media_player` | Show media player metadata | +| `media_player_name` | Set main media player DBus service name without the `org.mpris.MediaPlayer2` part, like `spotify`, `vlc`, `audacious` or `cantata`. Defaults to `spotify`. | | `io_read`
`io_write` | Show non-cached IO read/write, in MiB/s | | `pci_dev` | Select GPU device in multi-gpu setups | | `version` | Shows current mangohud version | diff --git a/bin/MangoHud.conf b/bin/MangoHud.conf index 62c2998a..0b3ecdaa 100644 --- a/bin/MangoHud.conf +++ b/bin/MangoHud.conf @@ -82,6 +82,7 @@ background_alpha=0.5 # io_color=A491D3 # frametime_color=00FF00 # background_color=020202 +# media_player_color=FFFFFF ### Change default font (set location to .TTF/.OTF file ) # font_file @@ -91,8 +92,9 @@ background_alpha=0.5 # crosshair_size= # crosshair_color=RRGGBB -### Show Spotify metadata +### Show media player metadata # media_player +# media_player_name = spotify ### Specify gpu with pci bus id for amdgpu and NVML stats. ### Set to 'domain:bus:slot.function' diff --git a/src/dbus.cpp b/src/dbus.cpp index da23fbb1..a54d3db7 100644 --- a/src/dbus.cpp +++ b/src/dbus.cpp @@ -7,7 +7,7 @@ using ms = std::chrono::milliseconds; -struct metadata spotify; +struct metadata main_metadata; struct metadata generic_mpris; typedef std::vector> string_pair_vec; @@ -401,7 +401,7 @@ static void assign_metadata(metadata& meta, string_pair_vec_map& entries_map) } if (meta.artists.size() || !meta.title.empty()) - meta.valid = meta.playing; + meta.valid = true; meta.ticker.needs_recalc = true; meta.ticker.pos = 0; @@ -539,17 +539,18 @@ void dbus_get_player_property(dbusmgr::dbus_manager& dbus_mgr, string_pair_vec& dbus.error_free(&error); } -void get_spotify_metadata(dbusmgr::dbus_manager& dbus, metadata& meta) +void get_media_player_metadata(dbusmgr::dbus_manager& dbus, const std::string& name, metadata& meta) { meta.artists.clear(); string_pair_vec_map entries; - dbus_get_player_property(dbus, entries["Metadata"], "org.mpris.MediaPlayer2.spotify", "Metadata"); - dbus_get_player_property(dbus, entries["PlaybackStatus"], "org.mpris.MediaPlayer2.spotify", "PlaybackStatus"); + std::string dest = "org.mpris.MediaPlayer2." + name; + dbus_get_player_property(dbus, entries["Metadata"], dest.c_str(), "Metadata"); + dbus_get_player_property(dbus, entries["PlaybackStatus"], dest.c_str(), "PlaybackStatus"); assign_metadata(meta, entries); } namespace dbusmgr { -void dbus_manager::init() +void dbus_manager::init(const std::string& dest) { if (m_inited) return; @@ -566,6 +567,7 @@ void dbus_manager::init() } std::cout << "Connected to D-Bus as \"" << m_dbus_ldr.bus_get_unique_name(m_dbus_conn) << "\"." << std::endl; + m_dest = dest; dbus_list_name_to_owner(*this, m_name_owners); connect_to_signals(); @@ -648,6 +650,8 @@ void dbus_manager::dbus_thread(dbus_manager *pmgr) DBusMessage *msg = nullptr; auto& dbus = pmgr->dbus(); + const std::string main_dest = "org.mpris.MediaPlayer2." + pmgr->m_dest; + // loop listening for signals being emmitted while (!pmgr->m_quit) { @@ -687,8 +691,8 @@ void dbus_manager::dbus_thread(dbus_manager *pmgr) if (source != "org.mpris.MediaPlayer2.Player") break; - if (pmgr->m_name_owners["org.mpris.MediaPlayer2.spotify"] == sender) { - assign_metadata(spotify, entries_map); + if (pmgr->m_name_owners[main_dest] == sender) { + assign_metadata(main_metadata, entries_map); } else { assign_metadata(generic_mpris, entries_map); if (generic_mpris.playing && !generic_mpris.valid) { @@ -723,9 +727,9 @@ void dbus_manager::dbus_thread(dbus_manager *pmgr) // did a player quit? if (str[2].empty()) { if (str.size() == 3 - && str[0] == "org.mpris.MediaPlayer2.spotify" + && str[0] == main_dest ) { - spotify.valid = false; + main_metadata.valid = false; } else { auto it = pmgr->m_name_owners.find(str[0]); if (it != pmgr->m_name_owners.end() diff --git a/src/dbus_info.h b/src/dbus_info.h index 4626f923..0e7919a8 100644 --- a/src/dbus_info.h +++ b/src/dbus_info.h @@ -46,7 +46,7 @@ struct DBusSignal SignalType type; }; -extern struct metadata spotify; +extern struct metadata main_metadata; extern struct metadata generic_mpris; namespace dbusmgr { @@ -82,7 +82,7 @@ namespace dbusmgr { ~dbus_manager(); - void init(); + void init(const std::string& dest); void deinit(); void add_callback(CBENUM type, callback_func func); void connect_to_signals(); @@ -111,6 +111,7 @@ namespace dbusmgr { std::map m_callbacks; libdbus_loader m_dbus_ldr; std::unordered_map m_name_owners; + std::string m_dest; const std::array m_signals {{ { "org.freedesktop.DBus", "NameOwnerChanged", ST_NAMEOWNERCHANGED }, @@ -122,4 +123,4 @@ namespace dbusmgr { extern dbus_manager dbus_mgr; } -void get_spotify_metadata(dbusmgr::dbus_manager& dbus, metadata& meta); +void get_media_player_metadata(dbusmgr::dbus_manager& dbus, const std::string& name, metadata& meta); diff --git a/src/overlay.cpp b/src/overlay.cpp index 7601afe0..ef05134b 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -1090,7 +1090,7 @@ float get_ticker_limited_pos(float pos, float tw, float& left_limit, float& righ } #ifdef HAVE_DBUS -void render_mpris_metadata(swapchain_stats& data, metadata& meta, uint64_t frame_timing) +void render_mpris_metadata(swapchain_stats& data, const ImVec4& color, metadata& meta, uint64_t frame_timing, bool is_main) { scoped_lock lk(meta.mutex); if (meta.valid) { @@ -1124,17 +1124,22 @@ void render_mpris_metadata(swapchain_stats& data, metadata& meta, uint64_t frame new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw0, left_limit, right_limit); ImGui::SetCursorPosX(new_pos); - ImGui::Text("%s", meta.title.c_str()); + ImGui::TextColored(color, "%s", meta.title.c_str()); new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw1, left_limit, right_limit); ImGui::SetCursorPosX(new_pos); - ImGui::Text("%s", meta.artists.c_str()); + ImGui::TextColored(color, "%s", meta.artists.c_str()); //ImGui::NewLine(); if (!meta.album.empty()) { new_pos = get_ticker_limited_pos(meta.ticker.pos, meta.ticker.tw2, left_limit, right_limit); ImGui::SetCursorPosX(new_pos); - ImGui::Text("%s", meta.album.c_str()); + ImGui::TextColored(color, "%s", meta.album.c_str()); } + + if (is_main && main_metadata.valid && !main_metadata.playing) { + ImGui::TextColored(color, "(paused)"); + } + ImGui::PopFont(); ImGui::PopStyleVar(); } @@ -1378,8 +1383,9 @@ void render_imgui(swapchain_stats& data, struct overlay_params& params, ImVec2& } #ifdef HAVE_DBUS - render_mpris_metadata(data, spotify, frame_timing); - render_mpris_metadata(data, generic_mpris, frame_timing); + auto media_color = ImGui::ColorConvertU32ToFloat4(params.media_player_color); + render_mpris_metadata(data, media_color, main_metadata, frame_timing, true); + render_mpris_metadata(data, media_color, generic_mpris, frame_timing, false); #endif window_size = ImVec2(window_size.x, ImGui::GetCursorPosY() + 10.0f); diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index f5dd6ad2..09df5f43 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -184,6 +184,7 @@ parse_path(const char *str) #define parse_io_read(s) parse_unsigned(s) #define parse_io_write(s) parse_unsigned(s) #define parse_pci_dev(s) parse_str(s) +#define parse_media_player_name(s) parse_str(s) #define parse_crosshair_color(s) parse_color(s) #define parse_cpu_color(s) parse_color(s) @@ -195,6 +196,7 @@ parse_path(const char *str) #define parse_frametime_color(s) parse_color(s) #define parse_background_color(s) parse_color(s) #define parse_text_color(s) parse_color(s) +#define parse_media_player_color(s) parse_color(s) static bool parse_help(const char *str) @@ -339,15 +341,17 @@ parse_overlay_config(struct overlay_params *params, params->background_alpha = 0.5; params->alpha = 1.0; params->time_format = "%T"; - params->gpu_color = strtol("2e9762", NULL, 16); - params->cpu_color = strtol("2e97cb", NULL, 16); - params->vram_color = strtol("ad64c1", NULL, 16); - params->ram_color = strtol("c26693", NULL, 16); - params->engine_color = strtol("eb5b5b", NULL, 16); - params->io_color = strtol("a491d3", NULL, 16); - params->frametime_color = strtol("00ff00", NULL, 16); - params->background_color = strtol("020202", NULL, 16); - params->text_color = strtol("ffffff", NULL, 16); + params->gpu_color = 0x2e9762; + params->cpu_color = 0x2e97cb; + params->vram_color = 0xad64c1; + params->ram_color = 0xc26693; + params->engine_color = 0xeb5b5b; + params->io_color = 0xa491d3; + params->frametime_color = 0x00ff00; + params->background_color = 0x020202; + params->text_color = 0xffffff; + params->media_player_color = 0xffffff; + params->media_player_name = "spotify"; #ifdef HAVE_X11 params->toggle_hud = XK_F12; @@ -400,7 +404,7 @@ parse_overlay_config(struct overlay_params *params, parse_overlay_env(params, env); // Convert from 0xRRGGBB to ImGui's format - std::array colors = { + std::array colors = { ¶ms->crosshair_color, ¶ms->cpu_color, ¶ms->gpu_color, @@ -411,6 +415,7 @@ parse_overlay_config(struct overlay_params *params, ¶ms->background_color, ¶ms->frametime_color, ¶ms->text_color, + ¶ms->media_player_color, }; for (auto color : colors){ @@ -445,14 +450,14 @@ parse_overlay_config(struct overlay_params *params, #ifdef HAVE_DBUS if (params->enabled[OVERLAY_PARAM_ENABLED_media_player]) { try { - dbusmgr::dbus_mgr.init(); - get_spotify_metadata(dbusmgr::dbus_mgr, spotify); + dbusmgr::dbus_mgr.init(params->media_player_name); + get_media_player_metadata(dbusmgr::dbus_mgr, params->media_player_name, main_metadata); } catch (std::runtime_error& e) { std::cerr << "Failed to get initial Spotify metadata: " << e.what() << std::endl; } } else { dbusmgr::dbus_mgr.deinit(); - spotify.valid = false; + main_metadata.valid = false; } #endif diff --git a/src/overlay_params.h b/src/overlay_params.h index 9b1aeea1..0fee2d9b 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -80,6 +80,8 @@ typedef unsigned long KeySym; OVERLAY_PARAM_CUSTOM(alpha) \ OVERLAY_PARAM_CUSTOM(log_duration) \ OVERLAY_PARAM_CUSTOM(pci_dev) \ + OVERLAY_PARAM_CUSTOM(media_player_name) \ + OVERLAY_PARAM_CUSTOM(media_player_color) \ OVERLAY_PARAM_CUSTOM(help) enum overlay_param_position { @@ -122,6 +124,7 @@ struct overlay_params { int gl_vsync; int log_duration; unsigned crosshair_color, cpu_color, gpu_color, vram_color, ram_color, engine_color, io_color, frametime_color, background_color, text_color; + unsigned media_player_color; unsigned tableCols; float font_size; float background_alpha, alpha; @@ -130,6 +133,7 @@ struct overlay_params { KeySym reload_cfg; std::string time_format, output_file, font_file; std::string pci_dev; + std::string media_player_name; std::string config_file_path; std::unordered_map options;