6 #include <yajl/yajl_parse.h>
12 struct outputs_json_params {
13 struct outputs_head *outputs;
14 i3_output *outputs_walk;
19 static int outputs_null_cb(void *params_) {
20 struct outputs_json_params *params = (struct outputs_json_params*) params_;
22 if (strcmp(params->cur_key, "current_workspace")) {
26 FREE(params->cur_key);
31 static int outputs_boolean_cb(void *params_, bool val) {
32 struct outputs_json_params *params = (struct outputs_json_params*) params_;
34 if (strcmp(params->cur_key, "active")) {
38 params->outputs_walk->active = val;
40 FREE(params->cur_key);
45 static int outputs_integer_cb(void *params_, long val) {
46 struct outputs_json_params *params = (struct outputs_json_params*) params_;
48 if (!strcmp(params->cur_key, "current_workspace")) {
49 params->outputs_walk->ws = (int) val;
50 FREE(params->cur_key);
54 if (!strcmp(params->cur_key, "x")) {
55 params->outputs_walk->rect.x = (int) val;
56 FREE(params->cur_key);
60 if (!strcmp(params->cur_key, "y")) {
61 params->outputs_walk->rect.y = (int) val;
62 FREE(params->cur_key);
66 if (!strcmp(params->cur_key, "width")) {
67 params->outputs_walk->rect.w = (int) val;
68 FREE(params->cur_key);
72 if (!strcmp(params->cur_key, "height")) {
73 params->outputs_walk->rect.h = (int) val;
74 FREE(params->cur_key);
81 static int outputs_string_cb(void *params_, const unsigned char *val, unsigned int len) {
82 struct outputs_json_params *params = (struct outputs_json_params*) params_;
84 if (strcmp(params->cur_key, "name")) {
88 params->outputs_walk->name = malloc(sizeof(const unsigned char) * (len + 1));
89 strncpy(params->outputs_walk->name, (const char*) val, len);
90 params->outputs_walk->name[len] = '\0';
92 FREE(params->cur_key);
97 static int outputs_start_map_cb(void *params_) {
98 struct outputs_json_params *params = (struct outputs_json_params*) params_;
99 i3_output *new_output = NULL;
101 if (params->cur_key == NULL) {
102 new_output = malloc(sizeof(i3_output));
103 new_output->name = NULL;
105 memset(&new_output->rect, 0, sizeof(rect));
106 new_output->bar = XCB_NONE;
108 new_output->workspaces = malloc(sizeof(struct ws_head));
109 TAILQ_INIT(new_output->workspaces);
111 SLIST_INSERT_HEAD(params->outputs, new_output, slist);
113 params->outputs_walk = SLIST_FIRST(params->outputs);
121 static int outputs_map_key_cb(void *params_, const unsigned char *keyVal, unsigned int keyLen) {
122 struct outputs_json_params *params = (struct outputs_json_params*) params_;
123 FREE(params->cur_key);
125 params->cur_key = malloc(sizeof(unsigned char) * (keyLen + 1));
126 strncpy(params->cur_key, (const char*) keyVal, keyLen);
127 params->cur_key[keyLen] = '\0';
132 yajl_callbacks outputs_callbacks = {
139 &outputs_start_map_cb,
146 void parse_outputs_json(char *json) {
147 /* FIXME: Fasciliate stream-processing, i.e. allow starting to interpret
149 struct outputs_json_params params;
151 params.outputs = malloc(sizeof(struct outputs_head));
152 SLIST_INIT(params.outputs);
154 params.outputs_walk = NULL;
155 params.cur_key = NULL;
159 yajl_parser_config parse_conf = { 0, 0 };
162 handle = yajl_alloc(&outputs_callbacks, &parse_conf, NULL, (void*) ¶ms);
164 state = yajl_parse(handle, (const unsigned char*) json, strlen(json));
166 /* FIXME: Propper errorhandling for JSON-parsing */
170 case yajl_status_client_canceled:
171 case yajl_status_insufficient_data:
172 case yajl_status_error:
173 printf("ERROR: Could not parse outputs-reply!\n");
180 if (outputs != NULL) {
181 FREE_SLIST(outputs, i3_output);
184 outputs = params.outputs;
187 i3_output *get_output_by_name(char *name) {
189 SLIST_FOREACH(walk, outputs, slist) {
190 if (!strcmp(walk->name, name)) {