Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package hyprpaper for openSUSE:Factory 
checked in at 2026-02-17 18:44:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hyprpaper (Old)
 and      /work/SRC/openSUSE:Factory/.hyprpaper.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hyprpaper"

Tue Feb 17 18:44:39 2026 rev:9 rq:1333594 version:0.8.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/hyprpaper/hyprpaper.changes      2026-01-12 
10:31:25.170443161 +0100
+++ /work/SRC/openSUSE:Factory/.hyprpaper.new.1977/hyprpaper.changes    
2026-02-17 18:45:53.220315229 +0100
@@ -1,0 +2,13 @@
+Mon Feb 16 22:25:24 UTC 2026 - Avindra Goolcharan <[email protected]>
+
+- Update to version 0.8.3:
+  * matcher: fix matching in getSetting
+  * matcher: fix empty desc
+  * desc typo and keep state stable
+- Changes from version 0.8.2:
+  * config: bring back desc: for description matching
+  * core: add version argument
+  * fix(config): support * as wildcard monitor for default
+    wallpapers
+
+-------------------------------------------------------------------

Old:
----
  hyprpaper-0.8.1.tar.gz

New:
----
  hyprpaper-0.8.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ hyprpaper.spec ++++++
--- /var/tmp/diff_new_pack.5wWfoL/_old  2026-02-17 18:45:53.832340780 +0100
+++ /var/tmp/diff_new_pack.5wWfoL/_new  2026-02-17 18:45:53.836340947 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           hyprpaper
-Version:        0.8.1
+Version:        0.8.3
 Release:        0
 Summary:        Wayland wallpaper utility with IPC controls
 License:        BSD-3-Clause
@@ -64,6 +64,6 @@
 
 %files
 %license LICENSE
-%{_bindir}/hyprpaper
-%{_userunitdir}/hyprpaper.service
+%{_bindir}/%{name}
+%{_userunitdir}/%{name}.service
 

++++++ hyprpaper-0.8.1.tar.gz -> hyprpaper-0.8.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprpaper-0.8.1/VERSION new/hyprpaper-0.8.3/VERSION
--- old/hyprpaper-0.8.1/VERSION 2026-01-02 22:17:20.000000000 +0100
+++ new/hyprpaper-0.8.3/VERSION 2026-01-29 16:50:46.000000000 +0100
@@ -1 +1 @@
-0.8.1
+0.8.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprpaper-0.8.1/src/config/WallpaperMatcher.cpp 
new/hyprpaper-0.8.3/src/config/WallpaperMatcher.cpp
--- old/hyprpaper-0.8.1/src/config/WallpaperMatcher.cpp 2026-01-02 
22:17:20.000000000 +0100
+++ new/hyprpaper-0.8.3/src/config/WallpaperMatcher.cpp 2026-01-29 
16:50:46.000000000 +0100
@@ -2,6 +2,16 @@
 
 #include <algorithm>
 
+using namespace std::string_literals;
+
+// Check if a monitor string represents a wildcard (matches all monitors)
+// Empty string or "*" are both treated as wildcards.
+// "*" is preferred since hyprlang's special category system doesn't properly
+// return entries with empty string keys from listKeysForSpecialCategory().
+static bool isWildcard(const std::string& monitor) {
+    return monitor.empty() || monitor == "*";
+}
+
 void CWallpaperMatcher::addState(CConfigManager::SSetting&& s) {
     s.id = ++m_maxId;
 
@@ -20,22 +30,22 @@
     recalcStates();
 }
 
-void CWallpaperMatcher::registerOutput(const std::string_view& s) {
-    m_monitorNames.emplace_back(s);
+void CWallpaperMatcher::registerOutput(const std::string_view& s, const 
std::string_view& desc) {
+    m_monitorNames.emplace_back(std::make_pair<>(s, desc));
     recalcStates();
 }
 
 void CWallpaperMatcher::unregisterOutput(const std::string_view& s) {
-    std::erase(m_monitorNames, s);
+    std::erase_if(m_monitorNames, [&s](const auto& e) { return e.first == s; 
});
     std::erase_if(m_monitorStates, [&s](const auto& e) { return e.name == s; 
});
     recalcStates();
 }
 
 bool CWallpaperMatcher::outputExists(const std::string_view& s) {
-    return std::ranges::contains(m_monitorNames, s);
+    return std::ranges::any_of(m_monitorNames, [&s](const auto& e) { return 
e.first == s || "desc:" + e.second == s; });
 }
 
-std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> 
CWallpaperMatcher::getSetting(const std::string_view& monName) {
+std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> 
CWallpaperMatcher::getSetting(const std::string_view& monName, const 
std::string_view& monDesc) {
     for (const auto& m : m_monitorStates) {
         if (m.name != monName)
             continue;
@@ -52,18 +62,17 @@
     return std::nullopt;
 }
 
-std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> 
CWallpaperMatcher::matchSetting(const std::string_view& monName) {
+std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> 
CWallpaperMatcher::matchSetting(const std::string_view& monName, const 
std::string_view& monDesc) {
     // match explicit
     for (const auto& s : m_settings) {
-        if (s.monitor != monName)
+        if (s.monitor != monName && !("desc:"s + 
std::string{monDesc}).starts_with(s.monitor))
             continue;
-
         return s;
     }
 
-    // match wildcard
+    // match wildcard (empty string or "*")
     for (const auto& s : m_settings) {
-        if (s.monitor.empty())
+        if (isWildcard(s.monitor))
             return s;
     }
 
@@ -82,14 +91,15 @@
 void CWallpaperMatcher::recalcStates() {
     std::vector<std::string_view> namesChanged;
 
-    for (const auto& name : m_monitorNames) {
-        const auto STATE       = matchSetting(name);
+    for (const auto& [name, desc] : m_monitorNames) {
+        const auto STATE       = matchSetting(name, desc);
         auto&      activeState = getState(name);
 
         if (!STATE)
-            activeState = {.name = name};
+            activeState = {.name = name, .desc = desc};
         else {
             activeState.name = name;
+            activeState.desc = desc;
             if (activeState.currentID != STATE->get().id) {
                 activeState.currentID = STATE->get().id;
                 namesChanged.emplace_back(name);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprpaper-0.8.1/src/config/WallpaperMatcher.hpp 
new/hyprpaper-0.8.3/src/config/WallpaperMatcher.hpp
--- old/hyprpaper-0.8.1/src/config/WallpaperMatcher.hpp 2026-01-02 
22:17:20.000000000 +0100
+++ new/hyprpaper-0.8.3/src/config/WallpaperMatcher.hpp 2026-01-29 
16:50:46.000000000 +0100
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <optional>
+#include <tuple>
 
 #include "ConfigManager.hpp"
 
@@ -21,11 +22,11 @@
     void                                              
addState(CConfigManager::SSetting&&);
     void                                              
addStates(std::vector<CConfigManager::SSetting>&&);
 
-    void                                              registerOutput(const 
std::string_view&);
+    void                                              registerOutput(const 
std::string_view&, const std::string_view&);
     void                                              unregisterOutput(const 
std::string_view&);
     bool                                              outputExists(const 
std::string_view&);
 
-    std::optional<rw<const CConfigManager::SSetting>> getSetting(const 
std::string_view& monName);
+    std::optional<rw<const CConfigManager::SSetting>> getSetting(const 
std::string_view& monName, const std::string_view& monDesc);
 
     struct {
         Hyprutils::Signal::CSignalT<const std::string_view&> 
monitorConfigChanged;
@@ -33,21 +34,21 @@
 
   private:
     void                                              recalcStates();
-    std::optional<rw<const CConfigManager::SSetting>> matchSetting(const 
std::string_view& monName);
+    std::optional<rw<const CConfigManager::SSetting>> matchSetting(const 
std::string_view& monName, const std::string_view& monDesc);
 
     std::vector<CConfigManager::SSetting>             m_settings;
 
     struct SMonitorState {
-        std::string name;
+        std::string name, desc;
         uint32_t    currentID = CConfigManager::SETTING_INVALID;
     };
 
-    std::vector<std::string>   m_monitorNames;
-    std::vector<SMonitorState> m_monitorStates;
+    std::vector<std::pair<std::string, std::string>> m_monitorNames;
+    std::vector<SMonitorState>                       m_monitorStates;
 
-    uint32_t                   m_maxId = 0;
+    uint32_t                                         m_maxId = 0;
 
-    SMonitorState&             getState(const std::string_view& monName);
+    SMonitorState&                                   getState(const 
std::string_view& monName);
 };
 
 inline UP<CWallpaperMatcher> g_matcher = makeUnique<CWallpaperMatcher>();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprpaper-0.8.1/src/main.cpp 
new/hyprpaper-0.8.3/src/main.cpp
--- old/hyprpaper-0.8.1/src/main.cpp    2026-01-02 22:17:20.000000000 +0100
+++ new/hyprpaper-0.8.3/src/main.cpp    2026-01-29 16:50:46.000000000 +0100
@@ -14,6 +14,7 @@
 
     ASSERT(parser.registerStringOption("config", "c", "Set a custom config 
path"));
     ASSERT(parser.registerBoolOption("verbose", "", "Enable more logging"));
+    ASSERT(parser.registerBoolOption("version", "v", "Show hyprpaper's 
version"));
     ASSERT(parser.registerBoolOption("help", "h", "Show the help menu"));
 
     if (const auto ret = parser.parse(); !ret) {
@@ -26,6 +27,11 @@
         return 0;
     }
 
+    if (parser.getBool("version").value_or(false)) {
+        std::println("hyprpaper v{}", HYPRPAPER_VERSION);
+        return 0;
+    }
+
     if (parser.getBool("verbose").value_or(false)) {
         g_logger->setLogLevel(LOG_TRACE);
         g_state->verbose = true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hyprpaper-0.8.1/src/ui/UI.cpp 
new/hyprpaper-0.8.3/src/ui/UI.cpp
--- old/hyprpaper-0.8.1/src/ui/UI.cpp   2026-01-02 22:17:20.000000000 +0100
+++ new/hyprpaper-0.8.3/src/ui/UI.cpp   2026-01-29 16:50:46.000000000 +0100
@@ -8,12 +8,20 @@
 
 #include <hyprtoolkit/core/Output.hpp>
 
+#include <hyprutils/string/String.hpp>
+
 CUI::CUI() = default;
 
 CUI::~CUI() {
     m_targets.clear();
 }
 
+static std::string_view pruneDesc(const std::string_view& sv) {
+    if (sv.contains('('))
+        return Hyprutils::String::trim(sv.substr(0, sv.find_last_of('(')));
+    return sv;
+}
+
 class CWallpaperTarget::CImagesData {
   public:
     CImagesData(Hyprtoolkit::eImageFitMode fitMode, const 
std::vector<std::string>& images, const int timeout = 0) :
@@ -119,7 +127,7 @@
 }
 
 void CUI::registerOutput(const SP<Hyprtoolkit::IOutput>& mon) {
-    g_matcher->registerOutput(mon->port());
+    g_matcher->registerOutput(mon->port(), pruneDesc(mon->desc()));
     if (IPC::g_IPCSocket)
         IPC::g_IPCSocket->onNewDisplay(mon->port());
     mon->m_events.removed.listenStatic([this, m = 
WP<Hyprtoolkit::IOutput>{mon}] {
@@ -205,7 +213,7 @@
 }
 
 void CUI::targetChanged(const SP<Hyprtoolkit::IOutput>& mon) {
-    const auto TARGET = g_matcher->getSetting(mon->port());
+    const auto TARGET = g_matcher->getSetting(mon->port(), 
pruneDesc(mon->desc()));
 
     if (!TARGET) {
         g_logger->log(LOG_DEBUG, "Monitor {} has no target: no wp will be 
created", mon->port());

Reply via email to