diff options
Diffstat (limited to 'swaybar/state.c')
-rw-r--r-- | swaybar/state.c | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/swaybar/state.c b/swaybar/state.c deleted file mode 100644 index 535efbc4..00000000 --- a/swaybar/state.c +++ /dev/null @@ -1,185 +0,0 @@ -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/wait.h> - -#include "ipc-client.h" -#include "list.h" -#include "log.h" -#include "ipc.h" -#include "render.h" -#include "config.h" -#include "status_line.h" -#include "state.h" - -static void state_init(struct swaybar_state *state) { - state->config = init_config(); - state->status = init_status_line(); - state->output = malloc(sizeof(struct output)); - state->output->window = NULL; - state->output->registry = NULL; - state->output->workspaces = create_list(); - state->output->name = NULL; -} - -static void spawn_status_cmd_proc(struct swaybar_state *state) { - if (state->config->status_command) { - int pipefd[2]; - pipe(pipefd); - state->status_command_pid = fork(); - if (state->status_command_pid == 0) { - close(pipefd[0]); - dup2(pipefd[1], STDOUT_FILENO); - close(pipefd[1]); - char *const cmd[] = { - "sh", - "-c", - state->config->status_command, - NULL, - }; - execvp(cmd[0], cmd); - return; - } - - close(pipefd[1]); - state->status_read_fd = pipefd[0]; - fcntl(state->status_read_fd, F_SETFL, O_NONBLOCK); - } -} - - -void state_setup(struct swaybar_state *state, const char *socket_path, const char *bar_id, int desired_output) { - /* initialize state with default values */ - state_init(state); - - state->output->registry = registry_poll(); - - if (!state->output->registry->desktop_shell) { - sway_abort("swaybar requires the compositor to support the desktop-shell extension."); - } - - /* connect to sway ipc */ - state->ipc_socketfd = ipc_open_socket(socket_path); - state->ipc_event_socketfd = ipc_open_socket(socket_path); - - ipc_bar_init(state, desired_output, bar_id); - - struct output_state *output = state->output->registry->outputs->items[desired_output]; - - state->output->window = window_setup(state->output->registry, output->width, 30, false); - if (!state->output->window) { - sway_abort("Failed to create window."); - } - desktop_shell_set_panel(state->output->registry->desktop_shell, output->output, state->output->window->surface); - desktop_shell_set_panel_position(state->output->registry->desktop_shell, state->config->position); - - /* set font */ - state->output->window->font = state->config->font; - - /* set window height */ - set_window_height(state->output->window, state->config->height); - - /* spawn status command */ - spawn_status_cmd_proc(state); -} - -void state_run(struct swaybar_state *state) { - fd_set readfds; - int activity; - bool dirty = true; - - while (1) { - if (dirty) { - struct output *output = state->output; - if (window_prerender(output->window) && output->window->cairo) { - render(output, state->config, state->status); - window_render(output->window); - if (wl_display_dispatch(output->registry->display) == -1) { - break; - } - } - } - - dirty = false; - FD_ZERO(&readfds); - FD_SET(state->ipc_event_socketfd, &readfds); - FD_SET(state->status_read_fd, &readfds); - - activity = select(FD_SETSIZE, &readfds, NULL, NULL, NULL); - if (activity < 0) { - sway_log(L_ERROR, "polling failed: %d", errno); - } - - if (FD_ISSET(state->ipc_event_socketfd, &readfds)) { - sway_log(L_DEBUG, "Got IPC event."); - dirty = handle_ipc_event(state); - } - - if (state->config->status_command && FD_ISSET(state->status_read_fd, &readfds)) { - sway_log(L_DEBUG, "Got update from status command."); - dirty = handle_status_line(state); - } - } -} - -void free_workspaces(list_t *workspaces) { - int i; - for (i = 0; i < workspaces->length; ++i) { - struct workspace *ws = workspaces->items[i]; - free(ws->name); - free(ws); - } - list_free(workspaces); -} - -static void free_output(struct output *output) { - window_teardown(output->window); - if (output->registry) { - registry_teardown(output->registry); - } - - free(output->name); - - if (output->workspaces) { - free_workspaces(output->workspaces); - } - - free(output); -} - -static void terminate_status_command(pid_t pid) { - if (pid) { - // terminate status_command process - int ret = kill(pid, SIGTERM); - if (ret != 0) { - sway_log(L_ERROR, "Unable to terminate status_command [pid: %d]", pid); - } else { - int status; - waitpid(pid, &status, 0); - } - } -} - -void state_teardown(struct swaybar_state *state) { - free_config(state->config); - free_output(state->output); - free_status_line(state->status); - - /* close sockets/pipes */ - if (state->status_read_fd) { - close(state->status_read_fd); - } - - if (state->ipc_socketfd) { - close(state->ipc_socketfd); - } - - if (state->ipc_event_socketfd) { - close(state->ipc_event_socketfd); - } - - /* terminate status command process */ - terminate_status_command(state->status_command_pid); -} |