Allow multiple marks on windows.

This patch allows multiple marks to be set on a single window. The restriction that a mark may
only be on one window at a time is still upheld as this is necessary for commands like
"move window to mark" to make sense.

relates to #2014
This commit is contained in:
Ingo Bürk
2015-10-19 18:10:20 +02:00
parent 0425f48835
commit 9bb2f038ab
12 changed files with 238 additions and 70 deletions

View File

@ -28,6 +28,7 @@ static bool parsing_deco_rect;
static bool parsing_window_rect;
static bool parsing_geometry;
static bool parsing_focus;
static bool parsing_marks;
struct Match *current_swallow;
/* This list is used for reordering the focus stack after parsing the 'focus'
@ -159,12 +160,16 @@ static int json_end_map(void *ctx) {
static int json_end_array(void *ctx) {
LOG("end of array\n");
if (!parsing_swallows && !parsing_focus) {
if (!parsing_swallows && !parsing_focus && !parsing_marks) {
con_fix_percent(json_node);
}
if (parsing_swallows) {
parsing_swallows = false;
}
if (parsing_marks) {
parsing_marks = false;
}
if (parsing_focus) {
/* Clear the list of focus mappings */
struct focus_mapping *mapping;
@ -214,6 +219,9 @@ static int json_key(void *ctx, const unsigned char *val, size_t len) {
if (strcasecmp(last_key, "focus") == 0)
parsing_focus = true;
if (strcasecmp(last_key, "marks") == 0)
parsing_marks = true;
return 1;
}
@ -234,6 +242,11 @@ static int json_string(void *ctx, const unsigned char *val, size_t len) {
ELOG("swallow key %s unknown\n", last_key);
}
free(sval);
} else if (parsing_marks) {
char *mark;
sasprintf(&mark, "%.*s", (int)len, val);
con_mark(json_node, mark);
} else {
if (strcasecmp(last_key, "name") == 0) {
json_node->name = scalloc(len + 1, 1);
@ -336,13 +349,12 @@ static int json_string(void *ctx, const unsigned char *val, size_t len) {
LOG("Unhandled \"last_splitlayout\": %s\n", buf);
free(buf);
} else if (strcasecmp(last_key, "mark") == 0) {
DLOG("Found deprecated key \"mark\".\n");
char *buf = NULL;
sasprintf(&buf, "%.*s", (int)len, val);
/* We unmark any containers using this mark to avoid duplicates. */
con_unmark(buf);
json_node->mark = buf;
con_mark(json_node, buf);
} else if (strcasecmp(last_key, "floating") == 0) {
char *buf = NULL;
sasprintf(&buf, "%.*s", (int)len, val);
@ -589,6 +601,7 @@ void tree_append_json(Con *con, const char *filename, char **errormsg) {
parsing_window_rect = false;
parsing_geometry = false;
parsing_focus = false;
parsing_marks = false;
setlocale(LC_NUMERIC, "C");
stat = yajl_parse(hand, (const unsigned char *)buf, n);
if (stat != yajl_status_ok) {