2022-03-28 16:10:30 +02:00
|
|
|
#include "MiscFunctions.hpp"
|
|
|
|
#include "../defines.hpp"
|
2022-05-05 12:50:25 +02:00
|
|
|
#include <algorithm>
|
2022-03-28 16:10:30 +02:00
|
|
|
|
|
|
|
void addWLSignal(wl_signal* pSignal, wl_listener* pListener, void* pOwner, std::string ownerString) {
|
|
|
|
ASSERT(pSignal);
|
|
|
|
ASSERT(pListener);
|
|
|
|
|
|
|
|
wl_signal_add(pSignal, pListener);
|
|
|
|
|
|
|
|
Debug::log(LOG, "Registered signal for owner %x: %x -> %x (owner: %s)", pOwner, pSignal, pListener, ownerString.c_str());
|
2022-04-02 19:09:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void handleNoop(struct wl_listener *listener, void *data) {
|
|
|
|
// Do nothing
|
|
|
|
}
|
|
|
|
|
|
|
|
void wlr_signal_emit_safe(struct wl_signal *signal, void *data) {
|
|
|
|
struct wl_listener cursor;
|
|
|
|
struct wl_listener end;
|
|
|
|
|
|
|
|
/* Add two special markers: one cursor and one end marker. This way, we know
|
|
|
|
* that we've already called listeners on the left of the cursor and that we
|
|
|
|
* don't want to call listeners on the right of the end marker. The 'it'
|
|
|
|
* function can remove any element it wants from the list without troubles.
|
|
|
|
* wl_list_for_each_safe tries to be safe but it fails: it works fine
|
|
|
|
* if the current item is removed, but not if the next one is. */
|
|
|
|
wl_list_insert(&signal->listener_list, &cursor.link);
|
|
|
|
cursor.notify = handleNoop;
|
|
|
|
wl_list_insert(signal->listener_list.prev, &end.link);
|
|
|
|
end.notify = handleNoop;
|
|
|
|
|
|
|
|
while (cursor.link.next != &end.link) {
|
|
|
|
struct wl_list *pos = cursor.link.next;
|
|
|
|
struct wl_listener *l = wl_container_of(pos, l, link);
|
|
|
|
|
|
|
|
wl_list_remove(&cursor.link);
|
|
|
|
wl_list_insert(pos, &cursor.link);
|
|
|
|
|
|
|
|
l->notify(l, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
wl_list_remove(&cursor.link);
|
|
|
|
wl_list_remove(&end.link);
|
|
|
|
}
|
2022-04-04 19:44:25 +02:00
|
|
|
|
|
|
|
std::string getFormat(const char *fmt, ...) {
|
|
|
|
char buf[2048] = "";
|
|
|
|
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
|
|
|
|
vsprintf(buf, fmt, args);
|
|
|
|
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
return std::string(buf);
|
2022-04-17 18:47:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void scaleBox(wlr_box* box, float scale) {
|
|
|
|
box->width = std::round((box->x + box->width) * scale) - std::round(box->x * scale);
|
|
|
|
box->height = std::round((box->y + box->height) * scale) - std::round(box->y * scale);
|
|
|
|
box->x = std::round(box->x * scale);
|
|
|
|
box->y = std::round(box->y * scale);
|
2022-04-18 13:25:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string removeBeginEndSpacesTabs(std::string str) {
|
|
|
|
while (str[0] == ' ' || str[0] == '\t') {
|
|
|
|
str = str.substr(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
while (str[str.length() - 1] == ' ' || str[str.length() - 1] == '\t') {
|
|
|
|
str = str.substr(0, str.length() - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return str;
|
2022-04-20 16:53:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
float getPlusMinusKeywordResult(std::string source, float relative) {
|
|
|
|
float result = INT_MAX;
|
|
|
|
|
|
|
|
if (source.find_first_of("+") == 0) {
|
|
|
|
try {
|
|
|
|
if (source.find('.') != std::string::npos)
|
|
|
|
result = relative + std::stof(source.substr(1));
|
|
|
|
else
|
|
|
|
result = relative + std::stoi(source.substr(1));
|
|
|
|
} catch (...) {
|
|
|
|
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
|
|
|
|
return INT_MAX;
|
|
|
|
}
|
|
|
|
} else if (source.find_first_of("-") == 0) {
|
|
|
|
try {
|
|
|
|
if (source.find('.') != std::string::npos)
|
|
|
|
result = relative - std::stof(source.substr(1));
|
|
|
|
else
|
|
|
|
result = relative - std::stoi(source.substr(1));
|
|
|
|
} catch (...) {
|
|
|
|
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
|
|
|
|
return INT_MAX;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
if (source.find('.') != std::string::npos)
|
|
|
|
result = stof(source);
|
|
|
|
else
|
|
|
|
result = stoi(source);
|
|
|
|
} catch (...) {
|
|
|
|
Debug::log(ERR, "Invalid arg \"%s\" in getPlusMinusKeywordResult!", source.c_str());
|
|
|
|
return INT_MAX;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
2022-05-05 12:50:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool isNumber(const std::string& str) {
|
|
|
|
return std::ranges::all_of(str.begin(), str.end(), [](char c) { return isdigit(c) != 0; });
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isDirection(const std::string& arg) {
|
|
|
|
return arg == "l" || arg == "r" || arg == "u" || arg == "d" || arg == "t" || arg == "b";
|
2022-04-04 19:44:25 +02:00
|
|
|
}
|