aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/view.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-05-05 18:18:54 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-05-05 22:29:37 +1000
commitda7d6642d3d970da5579066f26d83fbd0873c6f4 (patch)
tree466c7108f65d4edbbbf2f0272bb6dd963915a60d /sway/tree/view.c
parentFix memory leak in title_format command (diff)
downloadsway-da7d6642d3d970da5579066f26d83fbd0873c6f4.tar.gz
sway-da7d6642d3d970da5579066f26d83fbd0873c6f4.tar.zst
sway-da7d6642d3d970da5579066f26d83fbd0873c6f4.zip
Refactor parse_title_format()
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r--sway/tree/view.c93
1 files changed, 42 insertions, 51 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 4a01f096..386144f6 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -494,9 +494,17 @@ void view_child_destroy(struct sway_view_child *child) {
494 } 494 }
495} 495}
496 496
497static char *parse_title_format(struct sway_view *view) { 497/**
498 * Calculate and return the length of the formatted title.
499 * If buffer is not NULL, also populate the buffer with the formatted title.
500 */
501static size_t parse_title_format(struct sway_view *view, char *buffer) {
498 if (!view->title_format || strcmp(view->title_format, "%title") == 0) { 502 if (!view->title_format || strcmp(view->title_format, "%title") == 0) {
499 return strdup(view_get_title(view)); 503 const char *title = view_get_title(view);
504 if (buffer) {
505 strcpy(buffer, title);
506 }
507 return strlen(title);
500 } 508 }
501 const char *title = view_get_title(view); 509 const char *title = view_get_title(view);
502 const char *class = view_get_class(view); 510 const char *class = view_get_class(view);
@@ -507,74 +515,56 @@ static char *parse_title_format(struct sway_view *view) {
507 size_t instance_len = instance ? strlen(instance) : 0; 515 size_t instance_len = instance ? strlen(instance) : 0;
508 size_t shell_len = shell ? strlen(shell) : 0; 516 size_t shell_len = shell ? strlen(shell) : 0;
509 517
510 // First, determine the length
511 size_t len = 0; 518 size_t len = 0;
512 char *format = view->title_format; 519 char *format = view->title_format;
513 char *next = strchr(format, '%'); 520 char *next = strchr(format, '%');
514 while (next) { 521 while (next) {
515 len += next - format; 522 if (buffer) {
516 format = next; 523 // Copy everything up to the %
517 524 strncat(buffer, format, next - format);
518 if (strncmp(next, "%title", 6) == 0) {
519 len += title_len;
520 format += 6;
521 } else if (strncmp(next, "%class", 6) == 0) {
522 len += class_len;
523 format += 6;
524 } else if (strncmp(next, "%instance", 9) == 0) {
525 len += instance_len;
526 format += 9;
527 } else if (strncmp(next, "%shell", 6) == 0) {
528 len += shell_len;
529 format += 6;
530 } else {
531 ++format;
532 ++len;
533 } 525 }
534 next = strchr(format, '%'); 526 len += next - format;
535 }
536 len += strlen(format);
537
538 char *buffer = calloc(len + 1, 1);
539 if (!sway_assert(buffer, "Unable to allocate title string")) {
540 return NULL;
541 }
542
543 // Now build the title
544 format = view->title_format;
545 next = strchr(format, '%');
546 while (next) {
547 // Copy everything up to the %
548 strncat(buffer, format, next - format);
549 format = next; 527 format = next;
550 528
551 if (strncmp(next, "%title", 6) == 0) { 529 if (strncmp(next, "%title", 6) == 0) {
552 if (title) { 530 if (buffer && title) {
553 strcat(buffer, title); 531 strcat(buffer, title);
554 } 532 }
533 len += title_len;
555 format += 6; 534 format += 6;
556 } else if (strncmp(next, "%class", 6) == 0) { 535 } else if (strncmp(next, "%class", 6) == 0) {
557 if (class) { 536 if (buffer && class) {
558 strcat(buffer, class); 537 strcat(buffer, class);
559 } 538 }
539 len += class_len;
560 format += 6; 540 format += 6;
561 } else if (strncmp(next, "%instance", 9) == 0) { 541 } else if (strncmp(next, "%instance", 9) == 0) {
562 if (instance) { 542 if (buffer && instance) {
563 strcat(buffer, instance); 543 strcat(buffer, instance);
564 } 544 }
545 len += instance_len;
565 format += 9; 546 format += 9;
566 } else if (strncmp(next, "%shell", 6) == 0) { 547 } else if (strncmp(next, "%shell", 6) == 0) {
567 strcat(buffer, shell); 548 if (buffer) {
549 strcat(buffer, shell);
550 }
551 len += shell_len;
568 format += 6; 552 format += 6;
569 } else { 553 } else {
570 strcat(buffer, "%"); 554 if (buffer) {
555 strcat(buffer, "%");
556 }
571 ++format; 557 ++format;
558 ++len;
572 } 559 }
573 next = strchr(format, '%'); 560 next = strchr(format, '%');
574 } 561 }
575 strcat(buffer, format); 562 if (buffer) {
563 strcat(buffer, format);
564 }
565 len += strlen(format);
576 566
577 return buffer; 567 return len;
578} 568}
579 569
580void view_update_title(struct sway_view *view, bool force) { 570void view_update_title(struct sway_view *view, bool force) {
@@ -592,18 +582,19 @@ void view_update_title(struct sway_view *view, bool force) {
592 } 582 }
593 } 583 }
594 584
585 free(view->swayc->name);
586 free(view->swayc->formatted_title);
595 if (title) { 587 if (title) {
596 if (view->swayc->name) { 588 size_t len = parse_title_format(view, NULL);
597 free(view->swayc->name); 589 char *buffer = calloc(len + 1, 1);
598 } 590 if (!sway_assert(buffer, "Unable to allocate title string")) {
599 if (view->swayc->formatted_title) { 591 return;
600 free(view->swayc->formatted_title);
601 } 592 }
593 parse_title_format(view, buffer);
594
602 view->swayc->name = strdup(title); 595 view->swayc->name = strdup(title);
603 view->swayc->formatted_title = parse_title_format(view); 596 view->swayc->formatted_title = buffer;
604 } else { 597 } else {
605 free(view->swayc->name);
606 free(view->swayc->formatted_title);
607 view->swayc->name = NULL; 598 view->swayc->name = NULL;
608 view->swayc->formatted_title = NULL; 599 view->swayc->formatted_title = NULL;
609 } 600 }