From 0510d971855a390d3b0a669e1da86a42b98ba8e9 Mon Sep 17 00:00:00 2001 From: Bastien Dejean Date: Thu, 10 Dec 2020 18:48:40 +0100 Subject: [PATCH] Use separate references in `cmd_query` Fixes #1235. --- src/messages.c | 43 ++++++++++++++++++++++--------------------- src/query.c | 10 +++++----- src/query.h | 4 ++-- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/messages.c b/src/messages.c index 9d9f467..c10feff 100644 --- a/src/messages.c +++ b/src/messages.c @@ -942,7 +942,9 @@ void cmd_monitor(char **args, int num, FILE *rsp) void cmd_query(char **args, int num, FILE *rsp) { - coordinates_t ref = {mon, mon->desk, mon->desk->focus}; + coordinates_t monitor_ref = {mon, NULL, NULL}; + coordinates_t desktop_ref = {mon, mon->desk, NULL}; + coordinates_t node_ref = {mon, mon->desk, mon->desk->focus}; coordinates_t trg = {NULL, NULL, NULL}; monitor_select_t *monitor_sel = NULL; desktop_select_t *desktop_sel = NULL; @@ -964,10 +966,10 @@ void cmd_query(char **args, int num, FILE *rsp) if (num > 1 && *(args + 1)[0] != OPT_CHR) { num--, args++; int ret; - coordinates_t tmp = ref; - ref.desktop = NULL; - ref.node = NULL; - if ((ret = monitor_from_desc(*args, &tmp, &ref)) != SELECTOR_OK) { + coordinates_t tmp = monitor_ref; + monitor_ref.desktop = NULL; + monitor_ref.node = NULL; + if ((ret = monitor_from_desc(*args, &tmp, &monitor_ref)) != SELECTOR_OK) { handle_failure(ret, "query -M", *args, rsp); goto end; } @@ -977,9 +979,9 @@ void cmd_query(char **args, int num, FILE *rsp) if (num > 1 && *(args + 1)[0] != OPT_CHR) { num--, args++; int ret; - coordinates_t tmp = ref; - ref.node = NULL; - if ((ret = desktop_from_desc(*args, &tmp, &ref)) != SELECTOR_OK) { + coordinates_t tmp = desktop_ref; + desktop_ref.node = NULL; + if ((ret = desktop_from_desc(*args, &tmp, &desktop_ref)) != SELECTOR_OK) { handle_failure(ret, "query -D", *args, rsp); goto end; } @@ -989,8 +991,8 @@ void cmd_query(char **args, int num, FILE *rsp) if (num > 1 && *(args + 1)[0] != OPT_CHR) { num--, args++; int ret; - coordinates_t tmp = ref; - if ((ret = node_from_desc(*args, &tmp, &ref)) != SELECTOR_OK) { + coordinates_t tmp = node_ref; + if ((ret = node_from_desc(*args, &tmp, &node_ref)) != SELECTOR_OK) { handle_failure(ret, "query -N", *args, rsp); goto end; } @@ -1010,12 +1012,12 @@ void cmd_query(char **args, int num, FILE *rsp) goto end; } free(desc); - } else if ((ret = monitor_from_desc(*args, &ref, &trg)) != SELECTOR_OK) { + } else if ((ret = monitor_from_desc(*args, &monitor_ref, &trg)) != SELECTOR_OK) { handle_failure(ret, "query -m", *args, rsp); goto end; } } else { - trg.monitor = ref.monitor; + trg = monitor_ref; } } else if (streq("-d", *args) || streq("--desktop", *args)) { if (num > 1 && *(args + 1)[0] != OPT_CHR) { @@ -1032,13 +1034,12 @@ void cmd_query(char **args, int num, FILE *rsp) goto end; } free(desc); - } else if ((ret = desktop_from_desc(*args, &ref, &trg)) != SELECTOR_OK) { + } else if ((ret = desktop_from_desc(*args, &desktop_ref, &trg)) != SELECTOR_OK) { handle_failure(ret, "query -d", *args, rsp); goto end; } } else { - trg.monitor = ref.monitor; - trg.desktop = ref.desktop; + trg = desktop_ref; } } else if (streq("-n", *args) || streq("--node", *args)) { if (num > 1 && *(args + 1)[0] != OPT_CHR) { @@ -1055,13 +1056,13 @@ void cmd_query(char **args, int num, FILE *rsp) goto end; } free(desc); - } else if ((ret = node_from_desc(*args, &ref, &trg)) != SELECTOR_OK) { + } else if ((ret = node_from_desc(*args, &node_ref, &trg)) != SELECTOR_OK) { handle_failure(ret, "query -n", *args, rsp); goto end; } } else { - trg = ref; - if (ref.node == NULL) { + trg = node_ref; + if (trg.node == NULL) { fail(rsp, ""); goto end; } @@ -1102,15 +1103,15 @@ void cmd_query(char **args, int num, FILE *rsp) } if (dom == DOMAIN_NODE) { - if (query_node_ids(&ref, &trg, monitor_sel, desktop_sel, node_sel, rsp) < 1) { + if (query_node_ids(&monitor_ref, &desktop_ref, &node_ref, &trg, monitor_sel, desktop_sel, node_sel, rsp) < 1) { fail(rsp, ""); } } else if (dom == DOMAIN_DESKTOP) { - if (query_desktop_ids(&ref, &trg, monitor_sel, desktop_sel, print_ids ? fprint_desktop_id : fprint_desktop_name, rsp) < 1) { + if (query_desktop_ids(&monitor_ref, &desktop_ref, &trg, monitor_sel, desktop_sel, print_ids ? fprint_desktop_id : fprint_desktop_name, rsp) < 1) { fail(rsp, ""); } } else if (dom == DOMAIN_MONITOR) { - if (query_monitor_ids(&ref, &trg, monitor_sel, print_ids ? fprint_monitor_id : fprint_monitor_name, rsp) < 1) { + if (query_monitor_ids(&monitor_ref, &trg, monitor_sel, print_ids ? fprint_monitor_id : fprint_monitor_name, rsp) < 1) { fail(rsp, ""); } } else { diff --git a/src/query.c b/src/query.c index 3c11068..d579715 100644 --- a/src/query.c +++ b/src/query.c @@ -242,19 +242,19 @@ void query_subscribers(FILE *rsp) fprintf(rsp, "]"); } -int query_node_ids(coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *desk_sel, node_select_t *sel, FILE *rsp) +int query_node_ids(coordinates_t *mon_ref, coordinates_t *desk_ref, coordinates_t* ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *desk_sel, node_select_t *sel, FILE *rsp) { int count = 0; for (monitor_t *m = mon_head; m != NULL; m = m->next) { coordinates_t loc = {m, NULL, NULL}; if ((trg->monitor != NULL && m != trg->monitor) || - (mon_sel != NULL && !monitor_matches(&loc, ref, mon_sel))) { + (mon_sel != NULL && !monitor_matches(&loc, mon_ref, mon_sel))) { continue; } for (desktop_t *d = m->desk_head; d != NULL; d = d->next) { coordinates_t loc = {m, d, NULL}; if ((trg->desktop != NULL && d != trg->desktop) || - (desk_sel != NULL && !desktop_matches(&loc, ref, desk_sel))) { + (desk_sel != NULL && !desktop_matches(&loc, desk_ref, desk_sel))) { continue; } count += query_node_ids_in(d->root, d, m, ref, trg, sel, rsp); @@ -281,13 +281,13 @@ int query_node_ids_in(node_t *n, desktop_t *d, monitor_t *m, coordinates_t *ref, return count; } -int query_desktop_ids(coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *sel, desktop_printer_t printer, FILE *rsp) +int query_desktop_ids(coordinates_t* mon_ref, coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *sel, desktop_printer_t printer, FILE *rsp) { int count = 0; for (monitor_t *m = mon_head; m != NULL; m = m->next) { coordinates_t loc = {m, NULL, NULL}; if ((trg->monitor != NULL && m != trg->monitor) || - (mon_sel != NULL && !monitor_matches(&loc, ref, mon_sel))) { + (mon_sel != NULL && !monitor_matches(&loc, mon_ref, mon_sel))) { continue; } for (desktop_t *d = m->desk_head; d != NULL; d = d->next) { diff --git a/src/query.h b/src/query.h index e98f03d..2499326 100644 --- a/src/query.h +++ b/src/query.h @@ -57,9 +57,9 @@ void query_history(FILE *rsp); void query_coordinates(coordinates_t *loc, FILE *rsp); void query_stack(FILE *rsp); void query_subscribers(FILE *rsp); -int query_node_ids(coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *desk_sel, node_select_t *sel, FILE *rsp); +int query_node_ids(coordinates_t *mon_ref, coordinates_t *desk_ref, coordinates_t* ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *desk_sel, node_select_t *sel, FILE *rsp); int query_node_ids_in(node_t *n, desktop_t *d, monitor_t *m, coordinates_t *ref, coordinates_t *trg, node_select_t *sel, FILE *rsp); -int query_desktop_ids(coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *sel, desktop_printer_t printer, FILE *rsp); +int query_desktop_ids(coordinates_t* mon_ref, coordinates_t *ref, coordinates_t *trg, monitor_select_t *mon_sel, desktop_select_t *sel, desktop_printer_t printer, FILE *rsp); int query_monitor_ids(coordinates_t *ref, coordinates_t *trg, monitor_select_t *sel, monitor_printer_t printer, FILE *rsp); void fprint_monitor_id(monitor_t *m, FILE *rsp); void fprint_monitor_name(monitor_t *m, FILE *rsp); -- 2.44.0