forked from flightlessmango/MangoHud
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdbus_info.h
148 lines (120 loc) · 3.78 KB
/
dbus_info.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once
#ifndef MANGOHUD_DBUS_INFO_H
#define MANGOHUD_DBUS_INFO_H
#ifdef HAVE_DBUS
#include <array>
#include <functional>
#include <map>
#include <mutex>
#include <stdexcept>
#include <string>
#include <thread>
#include <unordered_map>
#include <vector>
#include "loaders/loader_dbus.h"
struct metadata {
// std::vector<std::string> artists;
std::string artists; // pre-concatenate
std::string title;
std::string album;
std::string something;
std::string artUrl;
bool playing = false;
bool valid = false;
bool got_song_data = false;
bool got_playback_data = false;
};
struct mp_fmt
{
std::string text;
float width;
};
struct mutexed_metadata {
std::mutex mtx;
metadata meta;
struct {
float pos;
float longest;
int dir = -1;
bool needs_recalc = true;
std::vector<mp_fmt> formatted;
} ticker;
};
enum SignalType {
ST_NAMEOWNERCHANGED,
ST_PROPERTIESCHANGED,
};
extern struct mutexed_metadata main_metadata;
namespace dbusmgr {
class dbus_manager;
using signal_handler_func = bool (dbus_manager::*)(DBusMessage*, const char*);
enum Service
{
SRV_NONE = 0,
SRV_MPRIS = (1ul << 0),
SRV_GAMEMODE = (1ul << 1),
SRV_ALL = 0xFFFFFFFF,
};
struct DBusSignal {
Service srv;
const char* intf;
const char* signal;
signal_handler_func handler;
};
class dbus_manager {
public:
dbus_manager() {}
~dbus_manager();
bool init(Service srv);
bool init_mpris(const std::string& requested_player);
void deinit(Service srv);
bool get_media_player_metadata(metadata& meta, std::string name = "");
void connect_to_signals(Service srv);
void disconnect_from_signals(Service srv);
DBusConnection* get_conn() const { return m_dbus_conn; }
bool gamemode_enabled(pid_t pid);
libdbus_loader& dbus() { return m_dbus_ldr; }
protected:
bool init_internal();
void stop_thread();
void start_thread();
void dbus_thread();
bool dbus_list_name_to_owner();
bool select_active_player();
static DBusHandlerResult filter_signals(DBusConnection*, DBusMessage*,
void*);
bool handle_properties_changed(DBusMessage*, const char*);
bool handle_name_owner_changed(DBusMessage*, const char*);
bool handle_game_registered(DBusMessage*, const char*);
bool handle_game_unregistered(DBusMessage*, const char*);
void onNewPlayer(
metadata& meta); // A different player has become the active player
void onNoPlayer(); // There is no longer any player active
void onPlayerUpdate(
metadata& meta); // The active player has sent an update
DBusError m_error;
DBusConnection* m_dbus_conn = nullptr;
bool m_quit = false;
bool m_inited = false;
std::thread m_thread;
libdbus_loader m_dbus_ldr;
std::unordered_map<std::string, std::string> m_name_owners;
std::string m_requested_player;
std::string m_active_player;
uint32_t m_active_srvs = SRV_NONE;
const std::array<DBusSignal, 2> m_signals{{
{SRV_MPRIS, "org.freedesktop.DBus", "NameOwnerChanged",
&dbus_manager::handle_name_owner_changed},
{SRV_MPRIS, "org.freedesktop.DBus.Properties", "PropertiesChanged",
&dbus_manager::handle_properties_changed},
// {SRV_GAMEMODE, "com.feralinteractive.GameMode", "GameRegistered",
// &dbus_manager::handle_game_registered},
// {SRV_GAMEMODE, "com.feralinteractive.GameMode", "GameUnregistered",
// &dbus_manager::handle_game_unregistered},
}};
};
extern dbus_manager dbus_mgr;
} // namespace dbusmgr
bool get_media_player_metadata(dbusmgr::dbus_manager& dbus, const std::string& name, metadata& meta);
#endif // HAVE_DBUS
#endif //MANGOHUD_DBUS_INFO_H