diff options
Diffstat (limited to 'swaybar/i3bar.c')
-rw-r--r-- | swaybar/i3bar.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/swaybar/i3bar.c b/swaybar/i3bar.c index 88404703..8e9b038b 100644 --- a/swaybar/i3bar.c +++ b/swaybar/i3bar.c | |||
@@ -6,7 +6,9 @@ | |||
6 | #include <string.h> | 6 | #include <string.h> |
7 | #include <unistd.h> | 7 | #include <unistd.h> |
8 | #include <wlr/util/log.h> | 8 | #include <wlr/util/log.h> |
9 | #include "swaybar/bar.h" | ||
9 | #include "swaybar/config.h" | 10 | #include "swaybar/config.h" |
11 | #include "swaybar/i3bar.h" | ||
10 | #include "swaybar/status_line.h" | 12 | #include "swaybar/status_line.h" |
11 | 13 | ||
12 | void i3bar_block_unref(struct i3bar_block *block) { | 14 | void i3bar_block_unref(struct i3bar_block *block) { |
@@ -117,7 +119,9 @@ bool i3bar_handle_readable(struct status_line *status) { | |||
117 | memmove(status->buffer, &status->buffer[c], status->buffer_index); | 119 | memmove(status->buffer, &status->buffer[c], status->buffer_index); |
118 | break; | 120 | break; |
119 | } else if (!isspace(status->buffer[c])) { | 121 | } else if (!isspace(status->buffer[c])) { |
120 | status_error(status, "[invalid json]"); | 122 | wlr_log(WLR_DEBUG, "Invalid i3bar json: expected '[' but encountered '%c'", |
123 | status->buffer[c]); | ||
124 | status_error(status, "[invalid i3bar json]"); | ||
121 | return true; | 125 | return true; |
122 | } | 126 | } |
123 | } | 127 | } |
@@ -155,6 +159,8 @@ bool i3bar_handle_readable(struct status_line *status) { | |||
155 | ++buffer_pos; | 159 | ++buffer_pos; |
156 | break; | 160 | break; |
157 | } else if (!isspace(status->buffer[buffer_pos])) { | 161 | } else if (!isspace(status->buffer[buffer_pos])) { |
162 | wlr_log(WLR_DEBUG, "Invalid i3bar json: expected ',' but encountered '%c'", | ||
163 | status->buffer[buffer_pos]); | ||
158 | status_error(status, "[invalid i3bar json]"); | 164 | status_error(status, "[invalid i3bar json]"); |
159 | return true; | 165 | return true; |
160 | } | 166 | } |
@@ -166,7 +172,8 @@ bool i3bar_handle_readable(struct status_line *status) { | |||
166 | } else { | 172 | } else { |
167 | test_object = json_tokener_parse_ex(status->tokener, | 173 | test_object = json_tokener_parse_ex(status->tokener, |
168 | &status->buffer[buffer_pos], status->buffer_index - buffer_pos); | 174 | &status->buffer[buffer_pos], status->buffer_index - buffer_pos); |
169 | if (json_tokener_get_error(status->tokener) == json_tokener_success) { | 175 | enum json_tokener_error err = json_tokener_get_error(status->tokener); |
176 | if (err == json_tokener_success) { | ||
170 | if (json_object_get_type(test_object) == json_type_array) { | 177 | if (json_object_get_type(test_object) == json_type_array) { |
171 | if (last_object) { | 178 | if (last_object) { |
172 | json_object_put(last_object); | 179 | json_object_put(last_object); |
@@ -198,12 +205,14 @@ bool i3bar_handle_readable(struct status_line *status) { | |||
198 | continue; // look for comma without reading more input | 205 | continue; // look for comma without reading more input |
199 | } | 206 | } |
200 | buffer_pos = status->buffer_index = 0; | 207 | buffer_pos = status->buffer_index = 0; |
201 | } else if (json_tokener_get_error(status->tokener) == json_tokener_continue) { | 208 | } else if (err == json_tokener_continue) { |
209 | json_tokener_reset(status->tokener); | ||
202 | if (status->buffer_index < status->buffer_size) { | 210 | if (status->buffer_index < status->buffer_size) { |
203 | // move the object to the start of the buffer | 211 | // move the object to the start of the buffer |
204 | status->buffer_index -= buffer_pos; | 212 | status->buffer_index -= buffer_pos; |
205 | memmove(status->buffer, &status->buffer[buffer_pos], | 213 | memmove(status->buffer, &status->buffer[buffer_pos], |
206 | status->buffer_index); | 214 | status->buffer_index); |
215 | buffer_pos = 0; | ||
207 | } else { | 216 | } else { |
208 | // expand buffer | 217 | // expand buffer |
209 | status->buffer_size *= 2; | 218 | status->buffer_size *= 2; |
@@ -217,6 +226,10 @@ bool i3bar_handle_readable(struct status_line *status) { | |||
217 | } | 226 | } |
218 | } | 227 | } |
219 | } else { | 228 | } else { |
229 | char last_char = status->buffer[status->buffer_index - 1]; | ||
230 | status->buffer[status->buffer_index - 1] = '\0'; | ||
231 | wlr_log(WLR_DEBUG, "Failed to parse i3bar json - %s: '%s%c'", | ||
232 | json_tokener_error_desc(err), &status->buffer[buffer_pos], last_char); | ||
220 | status_error(status, "[failed to parse i3bar json]"); | 233 | status_error(status, "[failed to parse i3bar json]"); |
221 | return true; | 234 | return true; |
222 | } | 235 | } |