mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-29 23:25:58 +01:00
28ce0e0f80
* window: use const references instead of copies use const references instead of wasteful copies and make the = operator check for self assignment and return early. also use const in all the other operators. * listener: pass std::function as const reference instead of copies pass the std::functions as const references. * config: dont unnecessarily convert to c_str getHyprlangConfigValuePtr wants an std::string and we already have an std::string, dont convert it to a c_str only for it to be converted back to an std::string. * buffer: pass attributes as const reference pass attributes as const reference instead of copies.
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
#include "WLListener.hpp"
|
|
#include "MiscFunctions.hpp"
|
|
#include <string>
|
|
#include "../debug/Log.hpp"
|
|
#include "Watchdog.hpp"
|
|
|
|
void handleWrapped(wl_listener* listener, void* data) {
|
|
CHyprWLListener::SWrapper* pWrap = wl_container_of(listener, pWrap, m_sListener);
|
|
|
|
if (g_pWatchdog)
|
|
g_pWatchdog->startWatching();
|
|
|
|
try {
|
|
pWrap->m_pSelf->emit(data);
|
|
} catch (std::exception& e) { Debug::log(ERR, "Listener {} threw or timed out and was killed by Watchdog!!! This is bad. what(): {}", (uintptr_t)listener, e.what()); }
|
|
|
|
if (g_pWatchdog)
|
|
g_pWatchdog->endWatching();
|
|
}
|
|
|
|
CHyprWLListener::CHyprWLListener(wl_signal* pSignal, std::function<void(void*, void*)> const& callback, void* pOwner) {
|
|
initCallback(pSignal, callback, pOwner);
|
|
}
|
|
|
|
CHyprWLListener::CHyprWLListener() {
|
|
m_swWrapper.m_pSelf = this;
|
|
m_swWrapper.m_sListener.notify = &handleWrapped;
|
|
wl_list_init(&m_swWrapper.m_sListener.link);
|
|
}
|
|
|
|
CHyprWLListener::~CHyprWLListener() {
|
|
removeCallback();
|
|
}
|
|
|
|
void CHyprWLListener::removeCallback() {
|
|
if (isConnected()) {
|
|
Debug::log(LOG, "Callback {:x} -> {:x}, {} removed.", (uintptr_t)&m_pCallback, (uintptr_t)&m_pOwner, m_szAuthor);
|
|
wl_list_remove(&m_swWrapper.m_sListener.link);
|
|
wl_list_init(&m_swWrapper.m_sListener.link);
|
|
}
|
|
}
|
|
|
|
bool CHyprWLListener::isConnected() {
|
|
return !wl_list_empty(&m_swWrapper.m_sListener.link);
|
|
}
|
|
|
|
void CHyprWLListener::initCallback(wl_signal* pSignal, std::function<void(void*, void*)> const& callback, void* pOwner, std::string author) {
|
|
if (isConnected()) {
|
|
Debug::log(ERR, "Tried to connect a listener twice?!");
|
|
return;
|
|
}
|
|
|
|
m_pOwner = pOwner;
|
|
m_pCallback = callback;
|
|
m_szAuthor = author;
|
|
|
|
addWLSignal(pSignal, &m_swWrapper.m_sListener, pOwner, m_szAuthor);
|
|
}
|
|
|
|
void CHyprWLListener::emit(void* data) {
|
|
m_pCallback(m_pOwner, data);
|
|
}
|