Browse Source

Add better display of portmidi menu items

master
cancel 5 years ago
parent
commit
02b9f2ba8a
  1. 27
      term_util.c
  2. 4
      term_util.h
  3. 16
      tui_main.c

27
term_util.c

@ -248,8 +248,10 @@ void qmsg_printf_push(char const* title, char const* fmt, ...) {
if (!buffer) if (!buffer)
exit(1); exit(1);
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buffer, (Usz)msgbytes + 1, fmt, ap); int printedbytes = vsnprintf(buffer, (Usz)msgbytes + 1, fmt, ap);
va_end(ap); va_end(ap);
if (printedbytes != msgbytes)
exit(1); // todo better handling?
int lines = 1; int lines = 1;
int curlinewidth = 0; int curlinewidth = 0;
int maxlinewidth = 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].owns_string = false;
extras[0].is_spacer = 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) { void qmenu_add_spacer(Qmenu* qm) {
Usz idx; Usz idx;
ITEM** items; ITEM** items;

4
term_util.h

@ -134,6 +134,10 @@ void qmenu_destroy(Qmenu* qm);
int qmenu_id(Qmenu const* qm); int qmenu_id(Qmenu const* qm);
void qmenu_set_title(Qmenu* qm, char const* title); void qmenu_set_title(Qmenu* qm, char const* title);
void qmenu_add_choice(Qmenu* qm, int id, char const* text); 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_add_spacer(Qmenu* qm);
void qmenu_set_current_item(Qmenu* qm, int id); void qmenu_set_current_item(Qmenu* qm, int id);
void qmenu_set_displayed_active(Qmenu* qm, bool active); void qmenu_set_displayed_active(Qmenu* qm, bool active);

16
tui_main.c

@ -2186,12 +2186,19 @@ void push_portmidi_output_device_menu(Midi_mode const* midi_mode) {
} }
int num = Pm_CountDevices(); int num = Pm_CountDevices();
int output_devices = 0; 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) { for (int i = 0; i < num; ++i) {
PmDeviceInfo const* info = Pm_GetDeviceInfo(i); PmDeviceInfo const* info = Pm_GetDeviceInfo(i);
if (!info || !info->output) if (!info || !info->output)
continue; continue;
qmenu_add_choice(qm, i, info->name); bool is_cur_dev_id = has_cur_dev_id && cur_dev_id == i;
// printf("ID: %-4d Name: %s\n", i, info->name); qmenu_add_printf(qm, i, "[%c] #%d - %s", is_cur_dev_id ? '*' : ' ', i,
info->name);
++output_devices; ++output_devices;
} }
if (output_devices == 0) { if (output_devices == 0) {
@ -2200,9 +2207,8 @@ void push_portmidi_output_device_menu(Midi_mode const* midi_mode) {
"No PortMidi output devices found."); "No PortMidi output devices found.");
return; return;
} }
if (midi_mode->any.type == Midi_mode_type_portmidi) { if (has_cur_dev_id) {
int dev_id = midi_mode->portmidi.device_id; qmenu_set_current_item(qm, cur_dev_id);
qmenu_set_current_item(qm, dev_id);
} }
qmenu_push_to_nav(qm); qmenu_push_to_nav(qm);
} }

Loading…
Cancel
Save