summaryrefslogtreecommitdiffstats
path: root/swaybar/i3bar.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar/i3bar.c')
-rw-r--r--swaybar/i3bar.c19
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
12void i3bar_block_unref(struct i3bar_block *block) { 14void 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 }