From 2853f871ac9e7e20e9af97e58b68ab85c1bb78a7 Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Mon, 9 Jun 2025 03:36:22 +0800 Subject: [PATCH 17/19] trkproperties.c: blockless dispatch --- plugins/gtkui/trkproperties.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c index f084d70e3..eea067ce7 100644 --- a/plugins/gtkui/trkproperties.c +++ b/plugins/gtkui/trkproperties.c @@ -71,8 +71,9 @@ static trkproperties_delegate_t *_delegate; // If a string is longer -- it gets clipped, and appended with " (…)", like with linebreaks #define MAX_GUI_FIELD_LEN 500 +typedef void (*substring_callback_t)(const char *item, void *ctx); static void -_iterate_semicolon_separated_substrings(const char *svalue, void (^completion_block)(const char *item)); +_iterate_semicolon_separated_substrings(const char *svalue, substring_callback_t completion_func, void *ctx); static void _cleanup_track_list (void); @@ -181,15 +182,18 @@ on_closebtn_clicked (GtkButton *button, trkproperties_destroy (); } +static void _append_meta_cb(const char *item, void *ctx) { + struct { ddb_playItem_t *track; const char *key; } *args = ctx; + deadbeef->pl_append_meta(args->track, args->key, item); +} + static void _apply_field_to_track(ddb_playItem_t *track, const char *key, const char *new_text) { deadbeef->pl_delete_meta(track, key); - static const char *special_fields[] = { "comment", "lyrics", NULL }; - int should_split = 1; for (int n = 0; special_fields[n] != NULL; n++) { if (!strcasecmp(key, special_fields[n])) { @@ -197,15 +201,12 @@ static void _apply_field_to_track(ddb_playItem_t *track, const char *key, const break; } } - if (!should_split) { deadbeef->pl_append_meta(track, key, new_text); return; } - - _iterate_semicolon_separated_substrings(new_text, ^(const char *item) { - deadbeef->pl_append_meta(track, key, item); - }); + struct { ddb_playItem_t *track; const char *key; } cb_ctx = {track, key}; + _iterate_semicolon_separated_substrings(new_text, _append_meta_cb, &cb_ctx); } static void @@ -907,7 +908,7 @@ _semicolon_separated_string_for_meta(DB_metaInfo_t *meta) { } static void -_iterate_semicolon_separated_substrings(const char *svalue, void (^completion_block)(const char *item)) { +_iterate_semicolon_separated_substrings(const char *svalue, substring_callback_t completion_func, void *ctx) { while (*svalue) { char *semicolon = strchr(svalue, ';'); @@ -926,7 +927,7 @@ _iterate_semicolon_separated_substrings(const char *svalue, void (^completion_bl char *trimmed_item = gtkui_trim_whitespace(item, len); if (*trimmed_item) { - completion_block(trimmed_item); + completion_func(trimmed_item, ctx); } free (item); -- 2.49.0