diff options
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r-- | sway/tree/workspace.c | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 1c0e6515..b7090de6 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c | |||
@@ -244,8 +244,7 @@ struct sway_container *workspace_by_number(const char* name) { | |||
244 | if (wbnd.len <= 0) { | 244 | if (wbnd.len <= 0) { |
245 | return NULL; | 245 | return NULL; |
246 | } | 246 | } |
247 | return container_find(&root_container, | 247 | return root_find_workspace(_workspace_by_number, (void *) &wbnd); |
248 | _workspace_by_number, (void *) &wbnd); | ||
249 | } | 248 | } |
250 | 249 | ||
251 | static bool _workspace_by_name(struct sway_container *view, void *data) { | 250 | static bool _workspace_by_name(struct sway_container *view, void *data) { |
@@ -274,11 +273,11 @@ struct sway_container *workspace_by_name(const char *name) { | |||
274 | } else if (strcmp(name, "current") == 0) { | 273 | } else if (strcmp(name, "current") == 0) { |
275 | return current_workspace; | 274 | return current_workspace; |
276 | } else if (strcasecmp(name, "back_and_forth") == 0) { | 275 | } else if (strcasecmp(name, "back_and_forth") == 0) { |
277 | return prev_workspace_name ? container_find(&root_container, | 276 | return prev_workspace_name ? |
278 | _workspace_by_name, (void *)prev_workspace_name) : NULL; | 277 | root_find_workspace(_workspace_by_name, (void*)prev_workspace_name) |
278 | : NULL; | ||
279 | } else { | 279 | } else { |
280 | return container_find(&root_container, _workspace_by_name, | 280 | return root_find_workspace(_workspace_by_name, (void*)name); |
281 | (void *)name); | ||
282 | } | 281 | } |
283 | } | 282 | } |
284 | 283 | ||
@@ -518,8 +517,7 @@ struct sway_container *workspace_output_get_highest_available( | |||
518 | continue; | 517 | continue; |
519 | } | 518 | } |
520 | 519 | ||
521 | struct sway_container *output = container_find(&root_container, | 520 | struct sway_container *output = root_find_output(_output_by_name, name); |
522 | _output_by_name, name); | ||
523 | if (output) { | 521 | if (output) { |
524 | return output; | 522 | return output; |
525 | } | 523 | } |
@@ -528,8 +526,13 @@ struct sway_container *workspace_output_get_highest_available( | |||
528 | return NULL; | 526 | return NULL; |
529 | } | 527 | } |
530 | 528 | ||
529 | static bool find_urgent_iterator(struct sway_container *con, void *data) { | ||
530 | return con->type == C_VIEW && view_is_urgent(con->sway_view); | ||
531 | } | ||
532 | |||
531 | void workspace_detect_urgent(struct sway_container *workspace) { | 533 | void workspace_detect_urgent(struct sway_container *workspace) { |
532 | bool new_urgent = container_has_urgent_child(workspace); | 534 | bool new_urgent = (bool)workspace_find_container(workspace, |
535 | find_urgent_iterator, NULL); | ||
533 | 536 | ||
534 | if (workspace->sway_workspace->urgent != new_urgent) { | 537 | if (workspace->sway_workspace->urgent != new_urgent) { |
535 | workspace->sway_workspace->urgent = new_urgent; | 538 | workspace->sway_workspace->urgent = new_urgent; |
@@ -538,6 +541,56 @@ void workspace_detect_urgent(struct sway_container *workspace) { | |||
538 | } | 541 | } |
539 | } | 542 | } |
540 | 543 | ||
544 | void workspace_for_each_container(struct sway_container *ws, | ||
545 | void (*f)(struct sway_container *con, void *data), void *data) { | ||
546 | if (!sway_assert(ws->type == C_WORKSPACE, "Expected a workspace")) { | ||
547 | return; | ||
548 | } | ||
549 | // Tiling | ||
550 | for (int i = 0; i < ws->children->length; ++i) { | ||
551 | struct sway_container *container = ws->children->items[i]; | ||
552 | f(container, data); | ||
553 | container_for_each_child(container, f, data); | ||
554 | } | ||
555 | // Floating | ||
556 | for (int i = 0; i < ws->sway_workspace->floating->children->length; ++i) { | ||
557 | struct sway_container *container = | ||
558 | ws->sway_workspace->floating->children->items[i]; | ||
559 | f(container, data); | ||
560 | container_for_each_child(container, f, data); | ||
561 | } | ||
562 | } | ||
563 | |||
564 | struct sway_container *workspace_find_container(struct sway_container *ws, | ||
565 | bool (*test)(struct sway_container *con, void *data), void *data) { | ||
566 | if (!sway_assert(ws->type == C_WORKSPACE, "Expected a workspace")) { | ||
567 | return NULL; | ||
568 | } | ||
569 | struct sway_container *result = NULL; | ||
570 | // Tiling | ||
571 | for (int i = 0; i < ws->children->length; ++i) { | ||
572 | struct sway_container *child = ws->children->items[i]; | ||
573 | if (test(child, data)) { | ||
574 | return child; | ||
575 | } | ||
576 | if ((result = container_find_child(child, test, data))) { | ||
577 | return result; | ||
578 | } | ||
579 | } | ||
580 | // Floating | ||
581 | for (int i = 0; i < ws->sway_workspace->floating->children->length; ++i) { | ||
582 | struct sway_container *child = | ||
583 | ws->sway_workspace->floating->children->items[i]; | ||
584 | if (test(child, data)) { | ||
585 | return child; | ||
586 | } | ||
587 | if ((result = container_find_child(child, test, data))) { | ||
588 | return result; | ||
589 | } | ||
590 | } | ||
591 | return NULL; | ||
592 | } | ||
593 | |||
541 | struct sway_container *workspace_wrap_children(struct sway_container *ws) { | 594 | struct sway_container *workspace_wrap_children(struct sway_container *ws) { |
542 | struct sway_container *middle = container_create(C_CONTAINER); | 595 | struct sway_container *middle = container_create(C_CONTAINER); |
543 | middle->layout = ws->layout; | 596 | middle->layout = ws->layout; |