rearrange stdin handler
This commit is contained in:
parent
1c538a003d
commit
a4cbf117c9
112
src/main.cpp
112
src/main.cpp
@ -51,6 +51,8 @@ struct Seat {
|
|||||||
static void updatemon(Monitor &mon);
|
static void updatemon(Monitor &mon);
|
||||||
static void setupStatusFifo();
|
static void setupStatusFifo();
|
||||||
static void onStatus();
|
static void onStatus();
|
||||||
|
static void onStdin();
|
||||||
|
static void handleStdin();
|
||||||
static void cleanup();
|
static void cleanup();
|
||||||
static void requireGlobal(const void* p, const char* name);
|
static void requireGlobal(const void* p, const char* name);
|
||||||
static void waylandFlush();
|
static void waylandFlush();
|
||||||
@ -177,61 +179,6 @@ static const struct wl_seat_listener seatListener = {
|
|||||||
.name = [](void*, wl_seat*, const char *name) { }
|
.name = [](void*, wl_seat*, const char *name) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void handleStdin(const std::string& line)
|
|
||||||
{
|
|
||||||
// this parses the lines that dwl sends in printstatus()
|
|
||||||
std::string monName, command;
|
|
||||||
auto stream = std::istringstream {line};
|
|
||||||
stream >> monName >> command;
|
|
||||||
if (!stream.good()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
auto mon = std::find_if(begin(monitors), end(monitors), [&](const Monitor& mon) {
|
|
||||||
return mon.xdgName == monName;
|
|
||||||
});
|
|
||||||
if (mon == end(monitors))
|
|
||||||
return;
|
|
||||||
if (command == "title") {
|
|
||||||
auto title = std::string {};
|
|
||||||
std::getline(stream, title);
|
|
||||||
mon->bar->setTitle(title);
|
|
||||||
} else if (command == "selmon") {
|
|
||||||
uint32_t selected;
|
|
||||||
stream >> selected;
|
|
||||||
mon->bar->setSelected(selected);
|
|
||||||
} else if (command == "tags") {
|
|
||||||
uint32_t occupied, tags, clientTags, urgent;
|
|
||||||
stream >> occupied >> tags >> clientTags >> urgent;
|
|
||||||
for (auto i=0u; i<tagNames.size(); i++) {
|
|
||||||
auto tagMask = 1 << i;
|
|
||||||
int state = TagState::None;
|
|
||||||
if (tags & tagMask)
|
|
||||||
state |= TagState::Active;
|
|
||||||
if (urgent & tagMask)
|
|
||||||
state |= TagState::Urgent;
|
|
||||||
mon->bar->setTag(i, state, occupied & tagMask ? 1 : 0, clientTags ? 1 : 0);
|
|
||||||
}
|
|
||||||
mon->tags = tags;
|
|
||||||
} else if (command == "layout") {
|
|
||||||
auto layout = std::string {};
|
|
||||||
std::getline(stream, layout);
|
|
||||||
mon->bar->setLayout(layout);
|
|
||||||
}
|
|
||||||
mon->hasData = true;
|
|
||||||
updatemon(*mon);
|
|
||||||
}
|
|
||||||
|
|
||||||
static LineBuffer<512> _stdinBuffer;
|
|
||||||
static void onStdin()
|
|
||||||
{
|
|
||||||
auto res = _stdinBuffer.readLines(
|
|
||||||
[](void* p, size_t size) { return read(0, p, size); },
|
|
||||||
[](char* p, size_t size) { handleStdin({p, size}); });
|
|
||||||
if (res == 0) {
|
|
||||||
quitting = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setupMonitor(Monitor& monitor) {
|
static void setupMonitor(Monitor& monitor) {
|
||||||
monitor.bar.emplace(&monitor);
|
monitor.bar.emplace(&monitor);
|
||||||
monitor.bar->setStatus(lastStatus);
|
monitor.bar->setStatus(lastStatus);
|
||||||
@ -307,6 +254,61 @@ static void setupStatusFifo()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LineBuffer<512> _stdinBuffer;
|
||||||
|
static void onStdin()
|
||||||
|
{
|
||||||
|
auto res = _stdinBuffer.readLines(
|
||||||
|
[](void* p, size_t size) { return read(0, p, size); },
|
||||||
|
[](char* p, size_t size) { handleStdin({p, size}); });
|
||||||
|
if (res == 0) {
|
||||||
|
quitting = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleStdin(const std::string& line)
|
||||||
|
{
|
||||||
|
// this parses the lines that dwl sends in printstatus()
|
||||||
|
std::string monName, command;
|
||||||
|
auto stream = std::istringstream {line};
|
||||||
|
stream >> monName >> command;
|
||||||
|
if (!stream.good()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto mon = std::find_if(begin(monitors), end(monitors), [&](const Monitor& mon) {
|
||||||
|
return mon.xdgName == monName;
|
||||||
|
});
|
||||||
|
if (mon == end(monitors))
|
||||||
|
return;
|
||||||
|
if (command == "title") {
|
||||||
|
auto title = std::string {};
|
||||||
|
std::getline(stream, title);
|
||||||
|
mon->bar->setTitle(title);
|
||||||
|
} else if (command == "selmon") {
|
||||||
|
uint32_t selected;
|
||||||
|
stream >> selected;
|
||||||
|
mon->bar->setSelected(selected);
|
||||||
|
} else if (command == "tags") {
|
||||||
|
uint32_t occupied, tags, clientTags, urgent;
|
||||||
|
stream >> occupied >> tags >> clientTags >> urgent;
|
||||||
|
for (auto i=0u; i<tagNames.size(); i++) {
|
||||||
|
auto tagMask = 1 << i;
|
||||||
|
int state = TagState::None;
|
||||||
|
if (tags & tagMask)
|
||||||
|
state |= TagState::Active;
|
||||||
|
if (urgent & tagMask)
|
||||||
|
state |= TagState::Urgent;
|
||||||
|
mon->bar->setTag(i, state, occupied & tagMask ? 1 : 0, clientTags ? 1 : 0);
|
||||||
|
}
|
||||||
|
mon->tags = tags;
|
||||||
|
} else if (command == "layout") {
|
||||||
|
auto layout = std::string {};
|
||||||
|
std::getline(stream, layout);
|
||||||
|
mon->bar->setLayout(layout);
|
||||||
|
}
|
||||||
|
mon->hasData = true;
|
||||||
|
updatemon(*mon);
|
||||||
|
}
|
||||||
|
|
||||||
const std::string prefixStatus = "status ";
|
const std::string prefixStatus = "status ";
|
||||||
const std::string prefixShow = "show ";
|
const std::string prefixShow = "show ";
|
||||||
const std::string prefixHide = "hide ";
|
const std::string prefixHide = "hide ";
|
||||||
|
Loading…
Reference in New Issue
Block a user