From abb7c03c75500e8161de5b0a485beeb8cc84ffa8 Mon Sep 17 00:00:00 2001 From: Consus Date: Mon, 28 Aug 2023 18:55:29 +0300 Subject: [PATCH] view: introduce view_matches_query() Add new function view_matches_query() that will be required by If and ForEach actions in the future. --- include/view.h | 22 ++++++++++++++++++++++ src/view.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/include/view.h b/include/view.h index 4a408a84..7046c115 100644 --- a/include/view.h +++ b/include/view.h @@ -172,6 +172,12 @@ struct view { struct wl_listener set_title; }; +struct view_query { + struct wl_list link; + char *identifier; + char *title; +}; + struct xdg_toplevel_view { struct view base; struct wlr_xdg_surface *xdg_surface; @@ -194,6 +200,22 @@ enum lab_view_criteria { */ struct view *view_from_wlr_surface(struct wlr_surface *surface); +/** + * view_query_free() - Free a given view query + * @query: Query to be freed. + */ +void view_query_free(struct view_query *view); + +/** + * view_matches_query() - Check if view matches the given criteria + * @view: View to checked. + * @query: Criteria to match against. + * + * Returns true if %view matches all of the criteria given in %query, false + * otherwise. + */ +bool view_matches_query(struct view *view, struct view_query *query); + /** * for_each_view() - iterate over all views which match criteria * @view: Iterator. diff --git a/src/view.c b/src/view.c index 743c9290..6185d917 100644 --- a/src/view.c +++ b/src/view.c @@ -2,6 +2,7 @@ #include #include #include +#include "common/match.h" #include "common/mem.h" #include "common/scene-helpers.h" #include "labwc.h" @@ -51,6 +52,36 @@ view_from_wlr_surface(struct wlr_surface *surface) return NULL; } +void +view_query_free(struct view_query *query) +{ + wl_list_remove(&query->link); + free(query->identifier); + free(query->title); + free(query); +} + +bool +view_matches_query(struct view *view, struct view_query *query) +{ + bool match = true; + bool empty = true; + + const char *identifier = view_get_string_prop(view, "app_id"); + if (match && query->identifier) { + empty = false; + match &= match_glob(query->identifier, identifier); + } + + const char *title = view_get_string_prop(view, "title"); + if (match && query->title) { + empty = false; + match &= match_glob(query->title, title); + } + + return !empty && match; +} + static bool matches_criteria(struct view *view, enum lab_view_criteria criteria) {