Add `media_player_name` and `media_player_color` params

Allows to set "main" media player and text color
pull/197/head
jackun 4 years ago
parent 6c2b00ffb7
commit d694a61d21
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -122,7 +122,7 @@ A partial list of parameters are below. See the config file for a complete list.
| `toggle_hud=`<br>`toggle_logging=` | Modifiable toggle hotkeys. Default are F12 and F2, respectively. |
| `reload_cfg=` | Change keybind for reloading the config |
| `time`<br>`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`<br>`gpu_color`<br>`vram_color`<br>`ram_color`<br>`io_color`<br>`engine_color`<br>`frametime_color`<br>`background_color`<br>`text_color` | Change default colors: `gpu_color=RRGGBB`|
| `gpu_color`<br>`gpu_color`<br>`vram_color`<br>`ram_color`<br>`io_color`<br>`engine_color`<br>`frametime_color`<br>`background_color`<br>`text_color`<br>`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`<br> `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`<br> `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 |

@ -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'

@ -7,7 +7,7 @@
using ms = std::chrono::milliseconds;
struct metadata spotify;
struct metadata main_metadata;
struct metadata generic_mpris;
typedef std::vector<std::pair<std::string, std::string>> 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()

@ -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<CBENUM, callback_func> m_callbacks;
libdbus_loader m_dbus_ldr;
std::unordered_map<std::string, std::string> m_name_owners;
std::string m_dest;
const std::array<DBusSignal, 2> 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);

@ -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);

@ -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<unsigned *, 10> colors = {
std::array<unsigned *, 11> colors = {
&params->crosshair_color,
&params->cpu_color,
&params->gpu_color,
@ -411,6 +415,7 @@ parse_overlay_config(struct overlay_params *params,
&params->background_color,
&params->frametime_color,
&params->text_color,
&params->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

@ -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<std::string,std::string> options;

Loading…
Cancel
Save