aboutsummaryrefslogtreecommitdiffstats
path: root/sway/criteria.c
diff options
context:
space:
mode:
authorLibravatar Tony Crisci <tony@dubstepdish.com>2018-01-21 09:17:51 -0500
committerLibravatar Tony Crisci <tony@dubstepdish.com>2018-01-21 09:17:51 -0500
commit6b03b1205d39d23ea1dee3beb0b533ef5426031e (patch)
tree4f30b793d698ee31efb2eba7023f1bcbff09779a /sway/criteria.c
parentview interface (diff)
downloadsway-6b03b1205d39d23ea1dee3beb0b533ef5426031e.tar.gz
sway-6b03b1205d39d23ea1dee3beb0b533ef5426031e.tar.zst
sway-6b03b1205d39d23ea1dee3beb0b533ef5426031e.zip
implement property criteria
Diffstat (limited to 'sway/criteria.c')
-rw-r--r--sway/criteria.c79
1 files changed, 55 insertions, 24 deletions
diff --git a/sway/criteria.c b/sway/criteria.c
index 21278a94..09733616 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -275,28 +275,39 @@ static bool criteria_test(swayc_t *cont, list_t *tokens) {
275 if (cont->type != C_VIEW) { 275 if (cont->type != C_VIEW) {
276 return false; 276 return false;
277 } 277 }
278 struct sway_view *view = cont->sway_view;
279
280 int matches = 0; 278 int matches = 0;
281 for (int i = 0; i < tokens->length; i++) { 279 for (int i = 0; i < tokens->length; i++) {
282 struct crit_token *crit = tokens->items[i]; 280 struct crit_token *crit = tokens->items[i];
283 switch (crit->type) { 281 switch (crit->type) {
284 case CRIT_CLASS: // TODO 282 case CRIT_CLASS:
285 break; 283 {
286 case CRIT_CON_ID: { 284 const char *class = view_get_class(cont->sway_view);
287 char *endptr; 285 if (!class) {
288 size_t crit_id = strtoul(crit->raw, &endptr, 10); 286 break;
287 }
288 if (crit->regex && regex_cmp(class, crit->regex) == 0) {
289 matches++;
290 }
291 break;
292 }
293 case CRIT_CON_ID:
294 {
295 char *endptr;
296 size_t crit_id = strtoul(crit->raw, &endptr, 10);
289 297
290 if (*endptr == 0 && cont->id == crit_id) { 298 if (*endptr == 0 && cont->id == crit_id) {
291 ++matches; 299 ++matches;
300 }
301 break;
292 } 302 }
303 case CRIT_CON_MARK:
304 // TODO
293 break; 305 break;
294 } 306 case CRIT_FLOATING:
295 case CRIT_CON_MARK: // TODO 307 // TODO
296 break;
297 case CRIT_FLOATING: // TODO
298 break; 308 break;
299 case CRIT_ID: // TODO 309 case CRIT_ID:
310 // TODO
300 break; 311 break;
301 case CRIT_APP_ID: 312 case CRIT_APP_ID:
302 { 313 {
@@ -310,24 +321,44 @@ static bool criteria_test(swayc_t *cont, list_t *tokens) {
310 } 321 }
311 break; 322 break;
312 } 323 }
313 case CRIT_INSTANCE: // TODO 324 case CRIT_INSTANCE:
314 break; 325 {
315 case CRIT_TILING: // TODO 326 const char *instance = view_get_instance(cont->sway_view);
327 if (!instance) {
328 break;
329 }
330
331 if (crit->regex && regex_cmp(instance, crit->regex) == 0) {
332 matches++;
333 }
334 break;
335 }
336 case CRIT_TILING:
337 // TODO
316 break; 338 break;
317 case CRIT_TITLE: 339 case CRIT_TITLE:
318 if (!cont->name) { 340 {
319 // ignore 341 const char *title = view_get_title(cont->sway_view);
320 } else if (crit->regex && regex_cmp(cont->name, crit->regex) == 0) { 342 if (!title) {
321 matches++; 343 break;
344 }
345
346 if (crit->regex && regex_cmp(title, crit->regex) == 0) {
347 matches++;
348 }
349 break;
322 } 350 }
323 break; 351 case CRIT_URGENT:
324 case CRIT_URGENT: // "latest" or "oldest" 352 // TODO "latest" or "oldest"
325 break; 353 break;
326 case CRIT_WINDOW_ROLE: 354 case CRIT_WINDOW_ROLE:
355 // TODO
327 break; 356 break;
328 case CRIT_WINDOW_TYPE: 357 case CRIT_WINDOW_TYPE:
358 // TODO
329 break; 359 break;
330 case CRIT_WORKSPACE: // TODO 360 case CRIT_WORKSPACE:
361 // TODO
331 break; 362 break;
332 default: 363 default:
333 sway_abort("Invalid criteria type (%i)", crit->type); 364 sway_abort("Invalid criteria type (%i)", crit->type);