add move window to hyprland service
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "services/dbus/mpris.hpp"
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "helpers/string.hpp"
|
||||
|
||||
@@ -13,7 +14,6 @@ std::shared_ptr<MprisController> MprisController::getInstance() {
|
||||
}
|
||||
|
||||
MprisController::MprisController() {
|
||||
// 1. Connect to the Session Bus
|
||||
Gio::DBus::Connection::get(
|
||||
Gio::DBus::BusType::SESSION,
|
||||
sigc::mem_fun(*this, &MprisController::on_bus_connected));
|
||||
@@ -44,7 +44,6 @@ void MprisController::on_bus_connected(const Glib::RefPtr<Gio::AsyncResult> &res
|
||||
if (m_proxy) {
|
||||
std::cout << "Connected to: " << player_bus_name << std::endl;
|
||||
|
||||
// uncomment if launch notification on start
|
||||
signalNotification();
|
||||
|
||||
m_proxy->signal_properties_changed().connect(
|
||||
@@ -69,6 +68,11 @@ void MprisController::signalNotification() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!metadata_var.is_of_type(Glib::VariantType("a{sv}"))) {
|
||||
std::cout << "Unexpected metadata type." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
using MetadataMap = std::map<Glib::ustring, Glib::VariantBase>;
|
||||
MetadataMap metadata_map;
|
||||
|
||||
@@ -78,26 +82,46 @@ void MprisController::signalNotification() {
|
||||
metadata_map = variant_dict.get();
|
||||
|
||||
std::string title, artist, artwork_url;
|
||||
|
||||
if (metadata_map.count("xesam:title")) {
|
||||
auto title_var = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(metadata_map["xesam:title"]);
|
||||
title = title_var.get();
|
||||
const auto &title_base = metadata_map["xesam:title"];
|
||||
if (title_base.is_of_type(Glib::VariantType("s"))) {
|
||||
auto title_var = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(title_base);
|
||||
title = title_var.get();
|
||||
}
|
||||
}
|
||||
|
||||
if (metadata_map.count("xesam:artist")) {
|
||||
auto artist_var = metadata_map["xesam:artist"];
|
||||
const auto &artist_var = metadata_map["xesam:artist"];
|
||||
|
||||
if (artist_var.is_of_type(Glib::VariantType("as"))) {
|
||||
auto artists = Glib::VariantBase::cast_dynamic<Glib::Variant<std::vector<Glib::ustring>>>(artist_var).get();
|
||||
if (!artists.empty()) {
|
||||
artist = artists[0]; // Take the first artist
|
||||
}
|
||||
} else if (artist_var.is_of_type(Glib::VariantType("s"))) {
|
||||
auto artist_str = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(artist_var);
|
||||
artist = artist_str.get();
|
||||
}
|
||||
}
|
||||
|
||||
if (metadata_map.count("mpris:artUrl")) {
|
||||
auto art_var = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(metadata_map["mpris:artUrl"]);
|
||||
artwork_url = art_var.get();
|
||||
const auto &art_base = metadata_map["mpris:artUrl"];
|
||||
if (art_base.is_of_type(Glib::VariantType("s"))) {
|
||||
auto art_var = Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(art_base);
|
||||
artwork_url = art_var.get();
|
||||
}
|
||||
}
|
||||
|
||||
int64_t length_us = 0;
|
||||
if (metadata_map.count("mpris:length")) {
|
||||
const auto &length_base = metadata_map["mpris:length"];
|
||||
if (length_base.is_of_type(Glib::VariantType("x"))) {
|
||||
auto length_var = Glib::VariantBase::cast_dynamic<Glib::Variant<gint64>>(length_base);
|
||||
length_us = static_cast<int64_t>(length_var.get());
|
||||
} else if (length_base.is_of_type(Glib::VariantType("t"))) {
|
||||
auto length_var = Glib::VariantBase::cast_dynamic<Glib::Variant<guint64>>(length_base);
|
||||
length_us = static_cast<int64_t>(length_var.get());
|
||||
}
|
||||
}
|
||||
|
||||
MprisPlayer2Message mpris;
|
||||
@@ -107,6 +131,7 @@ void MprisController::signalNotification() {
|
||||
mpris.play_pause = [this]() { this->toggle_play(); };
|
||||
mpris.next = [this]() { this->next_song(); };
|
||||
mpris.previous = [this]() { this->previous_song(); };
|
||||
mpris.length_ms = length_us;
|
||||
mprisUpdatedSignal.emit(mpris);
|
||||
}
|
||||
|
||||
@@ -136,3 +161,18 @@ void MprisController::next_song() {
|
||||
m_proxy->call("Next");
|
||||
}
|
||||
}
|
||||
|
||||
void MprisController::emit_seeked(int64_t position_us) {
|
||||
if (!m_proxy) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Glib::VariantContainerBase params = Glib::VariantContainerBase::create_tuple(
|
||||
Glib::Variant<gint64>::create(position_us));
|
||||
|
||||
m_proxy->call("Seek", params);
|
||||
} catch (const Glib::Error &ex) {
|
||||
std::cerr << "Error seeking: " << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user