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;