|
|
@ -4,13 +4,14 @@
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include <sys/select.h>
|
|
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
#include <json-c/json.h>
|
|
|
|
#include <json-c/json.h>
|
|
|
|
#include <sys/un.h>
|
|
|
|
#include <sys/un.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <getopt.h>
|
|
|
|
#include <getopt.h>
|
|
|
|
#include "ipc-client.h"
|
|
|
|
#include "ipc-client.h"
|
|
|
|
#include "readline.h"
|
|
|
|
|
|
|
|
#include "client/registry.h"
|
|
|
|
#include "client/registry.h"
|
|
|
|
#include "client/window.h"
|
|
|
|
#include "client/window.h"
|
|
|
|
#include "client/pango.h"
|
|
|
|
#include "client/pango.h"
|
|
|
@ -50,7 +51,8 @@ int socketfd;
|
|
|
|
pid_t pid;
|
|
|
|
pid_t pid;
|
|
|
|
int pipefd[2];
|
|
|
|
int pipefd[2];
|
|
|
|
FILE *command;
|
|
|
|
FILE *command;
|
|
|
|
char *line, *output, *status_command;
|
|
|
|
char line[1024];
|
|
|
|
|
|
|
|
char *output, *status_command;
|
|
|
|
struct registry *registry;
|
|
|
|
struct registry *registry;
|
|
|
|
struct window *window;
|
|
|
|
struct window *window;
|
|
|
|
bool dirty = true;
|
|
|
|
bool dirty = true;
|
|
|
@ -106,7 +108,6 @@ void sway_terminate(void) {
|
|
|
|
close(pipefd[0]);
|
|
|
|
close(pipefd[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
free(line);
|
|
|
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -304,29 +305,6 @@ void bar_ipc_init(int outputi, const char *bar_id) {
|
|
|
|
ipc_update_workspaces();
|
|
|
|
ipc_update_workspaces();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void update() {
|
|
|
|
|
|
|
|
int pending;
|
|
|
|
|
|
|
|
// If no command is set, we don't have to update anything
|
|
|
|
|
|
|
|
if (status_command) {
|
|
|
|
|
|
|
|
if (ioctl(fileno(command), FIONREAD, &pending) != -1 && pending > 0) {
|
|
|
|
|
|
|
|
free(line);
|
|
|
|
|
|
|
|
line = read_line(command);
|
|
|
|
|
|
|
|
int l = strlen(line) - 1;
|
|
|
|
|
|
|
|
if (line[l] == '\n') {
|
|
|
|
|
|
|
|
line[l] = '\0';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dirty = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ioctl(socketfd, FIONREAD, &pending) != -1 && pending > 0) {
|
|
|
|
|
|
|
|
uint32_t len;
|
|
|
|
|
|
|
|
char *buf = ipc_recv_response(socketfd, &len);
|
|
|
|
|
|
|
|
free(buf);
|
|
|
|
|
|
|
|
ipc_update_workspaces();
|
|
|
|
|
|
|
|
dirty = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void render() {
|
|
|
|
void render() {
|
|
|
|
// Clear
|
|
|
|
// Clear
|
|
|
|
cairo_save(window->cairo);
|
|
|
|
cairo_save(window->cairo);
|
|
|
@ -379,6 +357,51 @@ void render() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void poll_for_update() {
|
|
|
|
|
|
|
|
fd_set readfds;
|
|
|
|
|
|
|
|
int activity;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
|
|
|
|
if (dirty && window_prerender(window) && window->cairo) {
|
|
|
|
|
|
|
|
render();
|
|
|
|
|
|
|
|
window_render(window);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (wl_display_dispatch(registry->display) == -1) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dirty = false;
|
|
|
|
|
|
|
|
FD_ZERO(&readfds);
|
|
|
|
|
|
|
|
FD_SET(socketfd, &readfds);
|
|
|
|
|
|
|
|
FD_SET(pipefd[0], &readfds);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
activity = select(FD_SETSIZE, &readfds, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (activity < 0) {
|
|
|
|
|
|
|
|
sway_log(L_ERROR, "polling failed: %d", errno);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (FD_ISSET(socketfd, &readfds)) {
|
|
|
|
|
|
|
|
sway_log(L_DEBUG, "Got workspace update.");
|
|
|
|
|
|
|
|
uint32_t len;
|
|
|
|
|
|
|
|
char *buf = ipc_recv_response(socketfd, &len);
|
|
|
|
|
|
|
|
free(buf);
|
|
|
|
|
|
|
|
ipc_update_workspaces();
|
|
|
|
|
|
|
|
dirty = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (status_command && FD_ISSET(pipefd[0], &readfds)) {
|
|
|
|
|
|
|
|
sway_log(L_DEBUG, "Got update from status command.");
|
|
|
|
|
|
|
|
fgets(line, sizeof(line), command);
|
|
|
|
|
|
|
|
int l = strlen(line) - 1;
|
|
|
|
|
|
|
|
if (line[l] == '\n') {
|
|
|
|
|
|
|
|
line[l] = '\0';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dirty = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
init_log(L_INFO);
|
|
|
|
init_log(L_INFO);
|
|
|
|
|
|
|
|
|
|
|
@ -465,7 +488,6 @@ int main(int argc, char **argv) {
|
|
|
|
|
|
|
|
|
|
|
|
close(pipefd[1]);
|
|
|
|
close(pipefd[1]);
|
|
|
|
command = fdopen(pipefd[0], "r");
|
|
|
|
command = fdopen(pipefd[0], "r");
|
|
|
|
line = malloc(1024);
|
|
|
|
|
|
|
|
line[0] = '\0';
|
|
|
|
line[0] = '\0';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -479,13 +501,7 @@ int main(int argc, char **argv) {
|
|
|
|
get_text_size(window, &width, &height, "Test string for measuring purposes");
|
|
|
|
get_text_size(window, &width, &height, "Test string for measuring purposes");
|
|
|
|
window->height = height + MARGIN * 2;
|
|
|
|
window->height = height + MARGIN * 2;
|
|
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
poll_for_update();
|
|
|
|
update();
|
|
|
|
|
|
|
|
if (dirty && window_prerender(window) && window->cairo) {
|
|
|
|
|
|
|
|
render();
|
|
|
|
|
|
|
|
window_render(window);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} while (wl_display_dispatch(registry->display) != -1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
window_teardown(window);
|
|
|
|
window_teardown(window);
|
|
|
|
registry_teardown(registry);
|
|
|
|
registry_teardown(registry);
|
|
|
@ -493,7 +509,6 @@ int main(int argc, char **argv) {
|
|
|
|
// terminate status_command process
|
|
|
|
// terminate status_command process
|
|
|
|
kill(pid, SIGTERM);
|
|
|
|
kill(pid, SIGTERM);
|
|
|
|
close(pipefd[0]);
|
|
|
|
close(pipefd[0]);
|
|
|
|
free(line);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|