add move window to hyprland service

This commit is contained in:
2026-02-02 12:23:44 +01:00
parent 9404321249
commit da9f167747
12 changed files with 264 additions and 102 deletions

View File

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