aboutsummaryrefslogtreecommitdiff
path: root/i3bar/include/child.h
blob: e77b51e3157050d96949d0a185f0f463aec6ddb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 * vim:ts=4:sw=4:expandtab
 *
 * i3bar - an xcb-based status- and ws-bar for i3
 * © 2010 Axel Wagner and contributors (see also: LICENSE)
 *
 * child.c: Getting input for the statusline
 *
 */
#pragma once

#include <config.h>

#include <ev.h>

#define STDIN_CHUNK_SIZE 1024

typedef struct {
    pid_t pid;

    /**
     * The version number is an uint32_t to avoid machines with different sizes of
     * 'int' to allow different values here. It’s highly unlikely we ever exceed
     * even an int8_t, but still…
     */
    uint32_t version;

    bool stopped;
    /**
     * The signal requested by the client to inform it of the hidden state of i3bar
     */
    int stop_signal;
    /**
     * The signal requested by the client to inform it of the unhidden state of i3bar
     */
    int cont_signal;

    /**
     * Enable click events
     */
    bool click_events;
    bool click_events_init;

    /**
     * stdin- and SIGCHLD-watchers
     */
    ev_io *stdin_io;
    ev_child *child_sig;
    int stdin_fd;

    /**
     * Line read from child that did not include a newline character.
     */
    char *pending_line;
} i3bar_child;

/*
 * Remove all blocks from the given statusline.
 * If free_resources is set, the fields of each status block will be free'd.
 */
void clear_statusline(struct statusline_head *head, bool free_resources);

/*
 * Start a child process with the specified command and reroute stdin.
 * We actually start a shell to execute the command so we don't have to care
 * about arguments and such.
 *
 * If `command' is NULL, such as in the case when no `status_command' is given
 * in the bar config, no child will be started.
 *
 */
void start_child(char *command);

/*
 * Same as start_child but starts the configured client that manages workspace
 * buttons.
 *
 */
void start_ws_child(char *command);

/*
 * Returns true if the status child process is alive.
 *
 */
bool status_child_is_alive(void);

/*
 * Returns true if the workspace child process is alive.
 *
 */
bool ws_child_is_alive(void);

/*
 * kill()s the child process (if any). Called when exit()ing.
 *
 */
void kill_children_at_exit(void);

/*
 * kill()s the child process (if any) and closes and free()s the stdin- and
 * SIGCHLD-watchers
 *
 */
void kill_child(void);

/*
 * kill()s the workspace child process (if any) and closes and free()s the
 * stdin- and SIGCHLD-watchers.
 * Similar to kill_child.
 *
 */
void kill_ws_child(void);

/*
 * Sends a SIGSTOP to the child process (if existent)
 *
 */
void stop_children(void);

/*
 * Sends a SIGCONT to the child process (if existent)
 *
 */
void cont_children(void);

/*
 * Whether or not the child want click events
 *
 */
bool child_want_click_events(void);

/*
 * Generates a click event, if enabled.
 *
 */
void send_block_clicked(int button, const char *name, const char *instance, int x, int y, int x_rel, int y_rel, int out_x, int out_y, int width, int height, int mods);

/*
 * When workspace_command is enabled this function is used to re-parse the
 * latest received JSON from the client.
 */
void repeat_last_ws_json(void);

/*
 * Replaces the workspace buttons with an error message.
 */
void set_workspace_button_error(const char *message);