5 #include <yajl/yajl_parse.h>
9 struct outputs_json_params {
10 struct outputs_head *outputs;
11 i3_output *outputs_walk;
16 static int outputs_null_cb(void *params_) {
17 struct outputs_json_params *params = (struct outputs_json_params*) params_;
19 if (strcmp(params->cur_key, "current_workspace")) {
23 FREE(params->cur_key);
28 static int outputs_boolean_cb(void *params_, bool val) {
29 struct outputs_json_params *params = (struct outputs_json_params*) params_;
31 if (strcmp(params->cur_key, "active")) {
35 params->outputs_walk->active = val;
37 FREE(params->cur_key);
42 static int outputs_integer_cb(void *params_, long val) {
43 struct outputs_json_params *params = (struct outputs_json_params*) params_;
45 if (!strcmp(params->cur_key, "current_workspace")) {
46 params->outputs_walk->ws = (int) val;
47 FREE(params->cur_key);
51 if (!strcmp(params->cur_key, "x")) {
52 params->outputs_walk->rect.x = (int) val;
53 FREE(params->cur_key);
57 if (!strcmp(params->cur_key, "y")) {
58 params->outputs_walk->rect.y = (int) val;
59 FREE(params->cur_key);
63 if (!strcmp(params->cur_key, "width")) {
64 params->outputs_walk->rect.w = (int) val;
65 FREE(params->cur_key);
69 if (!strcmp(params->cur_key, "height")) {
70 params->outputs_walk->rect.h = (int) val;
71 FREE(params->cur_key);
78 static int outputs_string_cb(void *params_, const unsigned char *val, unsigned int len) {
79 struct outputs_json_params *params = (struct outputs_json_params*) params_;
81 if (strcmp(params->cur_key, "name")) {
85 params->outputs_walk->name = malloc(sizeof(const unsigned char) * (len + 1));
86 strncpy(params->outputs_walk->name, (const char*) val, len);
87 params->outputs_walk->name[len] = '\0';
89 FREE(params->cur_key);
94 static int outputs_start_map_cb(void *params_) {
95 struct outputs_json_params *params = (struct outputs_json_params*) params_;
96 i3_output *new_output = NULL;
98 if (params->cur_key == NULL) {
99 new_output = malloc(sizeof(i3_output));
100 new_output->name = NULL;
102 memset(&new_output->rect, 0, sizeof(rect));
103 new_output->bar = XCB_NONE;
105 new_output->workspaces = malloc(sizeof(struct ws_head));
106 TAILQ_INIT(new_output->workspaces);
108 SLIST_INSERT_HEAD(params->outputs, new_output, slist);
110 params->outputs_walk = SLIST_FIRST(params->outputs);
118 static int outputs_map_key_cb(void *params_, const unsigned char *keyVal, unsigned int keyLen) {
119 struct outputs_json_params *params = (struct outputs_json_params*) params_;
120 FREE(params->cur_key);
122 params->cur_key = malloc(sizeof(unsigned char) * (keyLen + 1));
123 strncpy(params->cur_key, (const char*) keyVal, keyLen);
124 params->cur_key[keyLen] = '\0';
129 yajl_callbacks outputs_callbacks = {
136 &outputs_start_map_cb,
143 void parse_outputs_json(char *json) {
144 /* FIXME: Fasciliate stream-processing, i.e. allow starting to interpret
146 struct outputs_json_params params;
148 params.outputs = malloc(sizeof(struct outputs_head));
149 SLIST_INIT(params.outputs);
151 params.outputs_walk = NULL;
152 params.cur_key = NULL;
156 yajl_parser_config parse_conf = { 0, 0 };
159 handle = yajl_alloc(&outputs_callbacks, &parse_conf, NULL, (void*) ¶ms);
161 state = yajl_parse(handle, (const unsigned char*) json, strlen(json));
163 /* FIXME: Propper errorhandling for JSON-parsing */
167 case yajl_status_client_canceled:
168 case yajl_status_insufficient_data:
169 case yajl_status_error:
170 printf("ERROR: Could not parse outputs-reply!\n");
177 if (outputs != NULL) {
178 FREE_SLIST(outputs, i3_output);
181 outputs = params.outputs;
184 i3_output *get_output_by_name(char *name) {
186 SLIST_FOREACH(walk, outputs, slist) {
187 if (!strcmp(walk->name, name)) {