view: introduce view_matches_query()

Add new function view_matches_query() that will be required by If and
ForEach actions in the future.
This commit is contained in:
Consus 2023-08-28 18:55:29 +03:00 committed by Johan Malm
parent 8988194785
commit abb7c03c75
2 changed files with 53 additions and 0 deletions

View file

@ -172,6 +172,12 @@ struct view {
struct wl_listener set_title; struct wl_listener set_title;
}; };
struct view_query {
struct wl_list link;
char *identifier;
char *title;
};
struct xdg_toplevel_view { struct xdg_toplevel_view {
struct view base; struct view base;
struct wlr_xdg_surface *xdg_surface; struct wlr_xdg_surface *xdg_surface;
@ -194,6 +200,22 @@ enum lab_view_criteria {
*/ */
struct view *view_from_wlr_surface(struct wlr_surface *surface); 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 * for_each_view() - iterate over all views which match criteria
* @view: Iterator. * @view: Iterator.

View file

@ -2,6 +2,7 @@
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <strings.h> #include <strings.h>
#include "common/match.h"
#include "common/mem.h" #include "common/mem.h"
#include "common/scene-helpers.h" #include "common/scene-helpers.h"
#include "labwc.h" #include "labwc.h"
@ -51,6 +52,36 @@ view_from_wlr_surface(struct wlr_surface *surface)
return NULL; 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 static bool
matches_criteria(struct view *view, enum lab_view_criteria criteria) matches_criteria(struct view *view, enum lab_view_criteria criteria)
{ {