Skip to content

Commit d701804

Browse files
committed
protocol: add a status object
1 parent 8e649e8 commit d701804

5 files changed

Lines changed: 68 additions & 8 deletions

File tree

hw-protocols/hyprpaper_core.xml

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<protocol name="hyprpaper_core" version="1">
2+
<protocol name="hyprpaper_core" version="2">
33
<copyright>
44
BSD 3-Clause License
55

@@ -31,7 +31,7 @@
3131
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
</copyright>
3333

34-
<object name="hyprpaper_core_manager" version="1">
34+
<object name="hyprpaper_core_manager" version="2">
3535
<description summary="manager object">
3636
This is the core manager object for hyprpaper operations
3737
</description>
@@ -62,6 +62,13 @@
6262
Destroys this object. Children remain alive until destroyed.
6363
</description>
6464
</c2s>
65+
66+
<c2s name="get_status_object" since="2">
67+
<description summary="Get a status object">
68+
Creates a status object
69+
</description>
70+
<returns iface="hyprpaper_status"/>
71+
</c2s>
6572
</object>
6673

6774
<enum name="wallpaper_fit_mode">
@@ -141,4 +148,25 @@
141148
</description>
142149
</c2s>
143150
</object>
151+
152+
<object name="hyprpaper_status" version="2">
153+
<description summary="status object">
154+
This is an object which will emit various status updates.
155+
</description>
156+
157+
<s2c name="active_wallpaper">
158+
<description summary="Active wallpaper state">
159+
Sends the active wallpaper for a given monitor. This will be emitted
160+
immediately after binding, and then every time the path changes.
161+
</description>
162+
<arg name="monitor" type="varchar" summary="monitor name"/>
163+
<arg name="path" type="varchar" summary="wallpaper path"/>
164+
</s2c>
165+
166+
<c2s name="destroy" destructor="true">
167+
<description summary="Destroy this object">
168+
Destroys this object.
169+
</description>
170+
</c2s>
171+
</object>
144172
</protocol>

src/ipc/IPC.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
using namespace IPC;
99
using namespace std::string_literals;
1010

11-
constexpr const char* SOCKET_NAME = ".hyprpaper.sock";
11+
constexpr const char* SOCKET_NAME = ".hyprpaper.sock";
12+
constexpr const size_t HP_PROTO_VERSION = 2;
1213

1314
static SP<CHyprpaperCoreImpl> g_coreImpl;
1415

@@ -114,7 +115,7 @@ CSocket::CSocket() {
114115
if (!m_socket)
115116
return;
116117

117-
g_coreImpl = makeShared<CHyprpaperCoreImpl>(1, [this](SP<Hyprwire::IObject> obj) {
118+
g_coreImpl = makeShared<CHyprpaperCoreImpl>(HP_PROTO_VERSION, [this](SP<Hyprwire::IObject> obj) {
118119
auto manager = m_managers.emplace_back(makeShared<CHyprpaperCoreManagerObject>(std::move(obj)));
119120

120121
manager->setDestroy([this, weak = WP<CHyprpaperCoreManagerObject>{manager}] { std::erase(m_managers, weak); });
@@ -127,6 +128,18 @@ CSocket::CSocket() {
127128
m_wallpaperObjects.emplace_back(makeShared<CWallpaperObject>(
128129
makeShared<CHyprpaperWallpaperObject>(m_socket->createObject(weak->getObject()->client(), weak->getObject(), "hyprpaper_wallpaper", id))));
129130
});
131+
132+
manager->setGetStatusObject([this, weak = WP<CHyprpaperCoreManagerObject>{manager}](uint32_t id) {
133+
if (!weak)
134+
return;
135+
136+
auto x =
137+
m_statusObjects.emplace_back(makeShared<CHyprpaperStatusObject>(m_socket->createObject(weak->getObject()->client(), weak->getObject(), "hyprpaper_status", id)));
138+
139+
for (const auto& m : g_ui->targets()) {
140+
x->sendActiveWallpaper(m->m_monitorName.c_str(), m->m_lastPath.c_str());
141+
}
142+
});
130143
});
131144

132145
m_socket->addImplementation(g_coreImpl);
@@ -145,3 +158,9 @@ void CSocket::onRemovedDisplay(const std::string& sv) {
145158
m->sendRemoveMonitor(sv.c_str());
146159
}
147160
}
161+
162+
void CSocket::onWallpaperChanged(const std::string& mon, const std::string& path) {
163+
for (const auto& so : m_statusObjects) {
164+
so->sendActiveWallpaper(mon.c_str(), path.c_str());
165+
}
166+
}

src/ipc/IPC.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace IPC {
3030

3131
void onNewDisplay(const std::string& sv);
3232
void onRemovedDisplay(const std::string& sv);
33+
void onWallpaperChanged(const std::string& mon, const std::string& path);
3334

3435
private:
3536
SP<Hyprwire::IServerSocket> m_socket;
@@ -38,6 +39,7 @@ namespace IPC {
3839

3940
std::vector<SP<CHyprpaperCoreManagerObject>> m_managers;
4041
std::vector<SP<CWallpaperObject>> m_wallpaperObjects;
42+
std::vector<SP<CHyprpaperStatusObject>> m_statusObjects;
4143

4244
friend class CWallpaperObject;
4345
};

src/ui/UI.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ CWallpaperTarget::CWallpaperTarget(SP<Hyprtoolkit::IBackend> backend, SP<Hyprtoo
6565
->fitMode(fitMode)
6666
->commence();
6767

68+
m_lastPath = path.front();
69+
6870
m_image->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE);
6971
m_image->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_CENTER, true);
7072

@@ -107,15 +109,19 @@ void CWallpaperTarget::onRepeatTimer() {
107109

108110
ASSERT(m_imagesData);
109111

112+
m_lastPath = m_imagesData->nextImage();
113+
110114
m_image->rebuild()
111-
->path(m_imagesData->nextImage())
115+
->path(std::string{m_lastPath})
112116
->size({Hyprtoolkit::CDynamicSize::HT_SIZE_PERCENT, Hyprtoolkit::CDynamicSize::HT_SIZE_PERCENT, {1.F, 1.F}})
113117
->sync(true)
114118
->fitMode(m_imagesData->fitMode)
115119
->commence();
116120

117121
m_timer =
118122
m_backend->addTimer(std::chrono::milliseconds(std::chrono::seconds(m_imagesData->timeout)), [this](ASP<Hyprtoolkit::CTimer> self, void*) { onRepeatTimer(); }, nullptr);
123+
124+
IPC::g_IPCSocket->onWallpaperChanged(m_monitorName, m_lastPath);
119125
}
120126

121127
void CUI::registerOutput(const SP<Hyprtoolkit::IOutput>& mon) {
@@ -216,3 +222,7 @@ void CUI::targetChanged(const SP<Hyprtoolkit::IOutput>& mon) {
216222

217223
m_targets.emplace_back(makeShared<CWallpaperTarget>(m_backend, mon, TARGET->get().paths, toFitMode(TARGET->get().fitMode), TARGET->get().timeout));
218224
}
225+
226+
const std::vector<SP<CWallpaperTarget>>& CUI::targets() {
227+
return m_targets;
228+
}

src/ui/UI.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class CWallpaperTarget {
2424
CWallpaperTarget(CWallpaperTarget&) = delete;
2525
CWallpaperTarget(CWallpaperTarget&&) = delete;
2626

27-
std::string m_monitorName;
27+
std::string m_monitorName, m_lastPath;
2828

2929
private:
3030
void onRepeatTimer();
@@ -46,8 +46,9 @@ class CUI {
4646
CUI();
4747
~CUI();
4848

49-
bool run();
50-
SP<Hyprtoolkit::IBackend> backend();
49+
bool run();
50+
SP<Hyprtoolkit::IBackend> backend();
51+
const std::vector<SP<CWallpaperTarget>>& targets();
5152

5253
private:
5354
void targetChanged(const SP<Hyprtoolkit::IOutput>& mon);

0 commit comments

Comments
 (0)