From 02b9f2ba8aabe7bf471920b497eb5741cb1daa81 Mon Sep 17 00:00:00 2001 From: cancel Date: Mon, 6 Jan 2020 01:50:44 +0900 Subject: [PATCH] Add better display of portmidi menu items --- term_util.c | 27 ++++++++++++++++++++++++++- term_util.h | 4 ++++ tui_main.c | 16 +++++++++++----- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/term_util.c b/term_util.c index 5a5c2f1..1077f85 100644 --- a/term_util.c +++ b/term_util.c @@ -248,8 +248,10 @@ void qmsg_printf_push(char const* title, char const* fmt, ...) { if (!buffer) exit(1); va_start(ap, fmt); - vsnprintf(buffer, (Usz)msgbytes + 1, fmt, ap); + int printedbytes = vsnprintf(buffer, (Usz)msgbytes + 1, fmt, ap); va_end(ap); + if (printedbytes != msgbytes) + exit(1); // todo better handling? int lines = 1; int curlinewidth = 0; int maxlinewidth = 0; @@ -375,6 +377,29 @@ void qmenu_add_choice(Qmenu* qm, int id, char const* text) { extras[0].owns_string = false; extras[0].is_spacer = false; } +void qmenu_add_printf(Qmenu* qm, int id, char const* fmt, ...) { + va_list ap; + va_start(ap, fmt); + int textsize = vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + char* buffer = malloc((Usz)textsize + 1); + if (!buffer) + exit(1); + va_start(ap, fmt); + int printedsize = vsnprintf(buffer, (Usz)textsize + 1, fmt, ap); + va_end(ap); + if (printedsize != textsize) + exit(1); // todo better handling? + Usz idx; + ITEM** items; + struct Qmenu_item_extra* extras; + qmenu_allocitems(qm, 1, &idx, &items, &extras); + items[0] = new_item(buffer, NULL); + set_item_userptr(items[0], (void*)(uintptr_t)idx); + extras[0].user_id = id; + extras[0].owns_string = true; + extras[0].is_spacer = false; +} void qmenu_add_spacer(Qmenu* qm) { Usz idx; ITEM** items; diff --git a/term_util.h b/term_util.h index c73166e..ee41810 100644 --- a/term_util.h +++ b/term_util.h @@ -134,6 +134,10 @@ void qmenu_destroy(Qmenu* qm); int qmenu_id(Qmenu const* qm); void qmenu_set_title(Qmenu* qm, char const* title); void qmenu_add_choice(Qmenu* qm, int id, char const* text); +#ifdef __GNUC__ +__attribute__((format(printf, 3, 4))) +#endif +void qmenu_add_printf(Qmenu* qm, int id, char const* fmt, ...); void qmenu_add_spacer(Qmenu* qm); void qmenu_set_current_item(Qmenu* qm, int id); void qmenu_set_displayed_active(Qmenu* qm, bool active); diff --git a/tui_main.c b/tui_main.c index 7be62de..ae4068b 100644 --- a/tui_main.c +++ b/tui_main.c @@ -2186,12 +2186,19 @@ void push_portmidi_output_device_menu(Midi_mode const* midi_mode) { } int num = Pm_CountDevices(); int output_devices = 0; + int cur_dev_id = 0; + bool has_cur_dev_id = false; + if (midi_mode->any.type == Midi_mode_type_portmidi) { + cur_dev_id = midi_mode->portmidi.device_id; + has_cur_dev_id = true; + } for (int i = 0; i < num; ++i) { PmDeviceInfo const* info = Pm_GetDeviceInfo(i); if (!info || !info->output) continue; - qmenu_add_choice(qm, i, info->name); - // printf("ID: %-4d Name: %s\n", i, info->name); + bool is_cur_dev_id = has_cur_dev_id && cur_dev_id == i; + qmenu_add_printf(qm, i, "[%c] #%d - %s", is_cur_dev_id ? '*' : ' ', i, + info->name); ++output_devices; } if (output_devices == 0) { @@ -2200,9 +2207,8 @@ void push_portmidi_output_device_menu(Midi_mode const* midi_mode) { "No PortMidi output devices found."); return; } - if (midi_mode->any.type == Midi_mode_type_portmidi) { - int dev_id = midi_mode->portmidi.device_id; - qmenu_set_current_item(qm, dev_id); + if (has_cur_dev_id) { + qmenu_set_current_item(qm, cur_dev_id); } qmenu_push_to_nav(qm); }