static bool parsing_swallows;
static bool parsing_rect;
static bool parsing_window_rect;
+static bool parsing_geometry;
struct Match *current_swallow;
static int json_start_map(void *ctx) {
LOG("start of map, last_key = %s\n", last_key);
if (parsing_swallows) {
- LOG("TODO: create new swallow\n");
+ LOG("creating new swallow\n");
current_swallow = smalloc(sizeof(Match));
match_init(current_swallow);
TAILQ_INSERT_TAIL(&(json_node->swallow_head), current_swallow, matches);
} else {
- if (!parsing_rect && !parsing_window_rect) {
+ if (!parsing_rect && !parsing_window_rect && !parsing_geometry) {
if (last_key && strcasecmp(last_key, "floating_nodes") == 0) {
+ DLOG("New floating_node\n");
Con *ws = con_get_workspace(json_node);
json_node = con_new(NULL);
json_node->parent = ws;
- TAILQ_INSERT_TAIL(&(ws->floating_head), json_node, floating_windows);
- TAILQ_INSERT_TAIL(&(ws->focus_head), json_node, focused);
+ DLOG("Parent is workspace = %p\n", ws);
} else {
Con *parent = json_node;
json_node = con_new(NULL);
static int json_end_map(void *ctx) {
LOG("end of map\n");
- if (!parsing_swallows && !parsing_rect && !parsing_window_rect) {
+ if (!parsing_swallows && !parsing_rect && !parsing_window_rect && !parsing_geometry) {
LOG("attaching\n");
con_attach(json_node, json_node->parent, false);
json_node = json_node->parent;
parsing_rect = false;
if (parsing_window_rect)
parsing_window_rect = false;
+ if (parsing_geometry)
+ parsing_geometry = false;
return 1;
}
parsing_rect = true;
if (strcasecmp(last_key, "window_rect") == 0)
parsing_window_rect = true;
+ if (strcasecmp(last_key, "geometry") == 0)
+ parsing_geometry = true;
return 1;
}
json_node->sticky_group = scalloc((len+1) * sizeof(char));
memcpy(json_node->sticky_group, val, len);
LOG("sticky_group of this container is %s\n", json_node->sticky_group);
+ } else if (strcasecmp(last_key, "orientation") == 0) {
+ char *buf = NULL;
+ asprintf(&buf, "%.*s", len, val);
+ if (strcasecmp(buf, "none") == 0)
+ json_node->orientation = NO_ORIENTATION;
+ else if (strcasecmp(buf, "horizontal") == 0)
+ json_node->orientation = HORIZ;
+ else if (strcasecmp(buf, "vertical") == 0)
+ json_node->orientation = VERT;
+ else LOG("Unhandled orientation: %s\n", buf);
+ free(buf);
}
}
return 1;
static int json_int(void *ctx, long val) {
LOG("int %d for key %s\n", val, last_key);
- if (strcasecmp(last_key, "orientation") == 0) {
- json_node->orientation = val;
- }
if (strcasecmp(last_key, "layout") == 0) {
json_node->layout = val;
}
if (strcasecmp(last_key, "num") == 0)
json_node->num = val;
- if (parsing_rect || parsing_window_rect) {
- Rect *r = (parsing_rect ? &(json_node->rect) : &(json_node->window_rect));
+ if (parsing_rect || parsing_window_rect || parsing_geometry) {
+ Rect *r;
+ if (parsing_rect)
+ r = &(json_node->rect);
+ else if (parsing_window_rect)
+ r = &(json_node->window_rect);
+ else r = &(json_node->geometry);
if (strcasecmp(last_key, "x") == 0)
r->x = val;
else if (strcasecmp(last_key, "y") == 0)
current_swallow->id = val;
}
if (strcasecmp(last_key, "dock") == 0) {
- current_swallow->dock = true;
+ current_swallow->dock = val;
+ }
+ if (strcasecmp(last_key, "insert_where") == 0) {
+ current_swallow->insert_where = val;
}
}
to_focus = NULL;
parsing_rect = false;
parsing_window_rect = false;
+ parsing_geometry = false;
setlocale(LC_NUMERIC, "C");
stat = yajl_parse(hand, (const unsigned char*)buf, n);
if (stat != yajl_status_ok &&
stat != yajl_status_insufficient_data)
{
unsigned char * str = yajl_get_error(hand, 1, (const unsigned char*)buf, n);
- fprintf(stderr, (const char *) str);
+ fprintf(stderr, "%s\n", (const char *) str);
yajl_free_error(hand, str);
}