diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-05 18:18:54 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-05 22:29:37 +1000 |
commit | da7d6642d3d970da5579066f26d83fbd0873c6f4 (patch) | |
tree | 466c7108f65d4edbbbf2f0272bb6dd963915a60d | |
parent | Fix memory leak in title_format command (diff) | |
download | sway-da7d6642d3d970da5579066f26d83fbd0873c6f4.tar.gz sway-da7d6642d3d970da5579066f26d83fbd0873c6f4.tar.zst sway-da7d6642d3d970da5579066f26d83fbd0873c6f4.zip |
Refactor parse_title_format()
-rw-r--r-- | sway/tree/view.c | 93 |
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 | ||
497 | static 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 | */ | ||
501 | static 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 | ||
580 | void view_update_title(struct sway_view *view, bool force) { | 570 | void 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 | } |