Skip to content

Commit 72b72ab

Browse files
committed
- Add option for mpris text to slowly scroll right to left
1 parent 4a8d527 commit 72b72ab

File tree

1 file changed

+56
-17
lines changed

1 file changed

+56
-17
lines changed

src/modules/mpris/mpris.cpp

+56-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <fmt/core.h>
44

5+
#include <chrono>
56
#include <optional>
67
#include <sstream>
78
#include <string>
@@ -26,6 +27,8 @@ Mpris::Mpris(const std::string& id, const Json::Value& config)
2627
album_len_(-1),
2728
title_len_(-1),
2829
dynamic_len_(-1),
30+
dynamic_scroll_(false),
31+
scroll_index_(0),
2932
dynamic_prio_({"title", "artist", "album", "position", "length"}),
3033
dynamic_order_({"title", "artist", "album", "position", "length"}),
3134
dynamic_separator_(" - "),
@@ -82,6 +85,9 @@ Mpris::Mpris(const std::string& id, const Json::Value& config)
8285
if (config["dynamic-len"].isUInt()) {
8386
dynamic_len_ = config["dynamic-len"].asUInt();
8487
}
88+
if (config_["dynamic-scroll"].isBool()) {
89+
dynamic_scroll_ = config["dynamic-scroll"].asBool();
90+
}
8591
// "dynamic-priority" has been kept for backward compatibility
8692
if (config_["dynamic-importance-order"].isArray() || config_["dynamic-priority"].isArray()) {
8793
dynamic_prio_.clear();
@@ -167,7 +173,12 @@ Mpris::Mpris(const std::string& id, const Json::Value& config)
167173
}
168174

169175
// allow setting an interval count that triggers periodic refreshes
170-
if (interval_.count() > 0) {
176+
if (dynamic_scroll_) {
177+
thread_ = [this] {
178+
dp.emit();
179+
thread_.sleep_for(std::chrono::seconds(2));
180+
};
181+
} else if (interval_.count() > 0) {
171182
thread_ = [this] {
172183
dp.emit();
173184
thread_.sleep_for(interval_);
@@ -352,7 +363,8 @@ auto Mpris::getDynamicStr(const PlayerInfo& info, bool truncated, bool html) ->
352363
}
353364
}
354365

355-
std::stringstream dynamic;
366+
std::stringstream dynamic_first;
367+
std::stringstream dynamic_second;
356368
if (html) {
357369
artist = Glib::Markup::escape_text(artist);
358370
album = Glib::Markup::escape_text(album);
@@ -367,37 +379,63 @@ auto Mpris::getDynamicStr(const PlayerInfo& info, bool truncated, bool html) ->
367379
if ((order == "artist" && showArtist) || (order == "album" && showAlbum) ||
368380
(order == "title" && showTitle)) {
369381
if (previousShown && previousOrder != "length" && previousOrder != "position") {
370-
dynamic << dynamic_separator_;
382+
dynamic_first << dynamic_separator_;
371383
}
372384

373385
if (order == "artist") {
374-
dynamic << artist;
386+
dynamic_first << artist;
375387
} else if (order == "album") {
376-
dynamic << album;
388+
dynamic_first << album;
377389
} else if (order == "title") {
378-
dynamic << title;
390+
dynamic_first << title;
379391
}
380392

381393
previousShown = true;
382394
} else if (order == "length" || order == "position") {
383395
if (!lengthOrPositionShown && (showLength || showPos)) {
384-
if (html) dynamic << "<small>";
385-
if (previousShown) dynamic << ' ';
386-
dynamic << '[';
396+
if (previousShown) dynamic_second << ' ';
397+
dynamic_second << '[';
387398
if (showPos) {
388-
dynamic << position;
389-
if (showLength) dynamic << '/';
399+
dynamic_second << position;
400+
if (showLength) dynamic_second << '/';
390401
}
391-
if (showLength) dynamic << length;
392-
dynamic << ']';
393-
if (!dynamic.str().empty()) dynamic << ' ';
394-
if (html) dynamic << "</small>";
402+
if (showLength) dynamic_second << length;
403+
dynamic_second << ']';
404+
if (!dynamic_second.str().empty()) dynamic_second << ' ';
395405
lengthOrPositionShown = true;
396406
}
397407
}
398408
previousOrder = order;
399409
}
400-
return dynamic.str();
410+
411+
auto first = dynamic_first.str();
412+
auto second = dynamic_second.str();
413+
414+
if ( scroll_index_ >= first.length() + second.length() ) {
415+
scroll_index_ = 0;
416+
} else if (scroll_index_ >= first.length() && scroll_index_ < first.length() + second.length()) {
417+
dynamic_first.str("");
418+
dynamic_first.clear();
419+
420+
dynamic_second.str("");
421+
dynamic_second.clear();
422+
423+
dynamic_second << second.substr( first.length() - scroll_index_ );
424+
} else {
425+
dynamic_first.str("");
426+
dynamic_first.clear();
427+
428+
dynamic_first << first.substr( scroll_index_ );
429+
}
430+
scroll_index_++;
431+
432+
if (html) {
433+
dynamic_first << "<small>";
434+
dynamic_second << "</small>";
435+
}
436+
dynamic_first << dynamic_second.str();
437+
438+
return dynamic_first.str();
401439
}
402440

403441
auto Mpris::onPlayerNameAppeared(PlayerctlPlayerManager* manager, PlayerctlPlayerName* player_name,
@@ -626,7 +664,8 @@ bool Mpris::handleToggle(GdkEventButton* const& e) {
626664

627665
auto Mpris::update() -> void {
628666
const auto now = std::chrono::system_clock::now();
629-
if (now - last_update_ < interval_) return;
667+
auto delta = now - last_update_;
668+
if (delta < interval_) return;
630669
last_update_ = now;
631670

632671
auto opt = getPlayerInfo();

0 commit comments

Comments
 (0)