commit e6d4f160537b96bd299f8975cfe3e0af22360d10 from: Tobias Heider date: Sat Feb 14 21:35:47 2026 UTC Fix cleanup in ondesc(). There still seems to be a problem with widgets allocation for non mono devices. commit - 41f5e3dc26832b5d8a7e55de9270815303879e9b commit + e6d4f160537b96bd299f8975cfe3e0af22360d10 blob - 5f3f825d0e7a4c9fa6585a849631da64e1881ec1 blob + dcc0c096eba1f44b44cb8e8fc415722d40534334 --- siomixer.c +++ siomixer.c @@ -102,13 +102,18 @@ ondesc(void *arg, struct sioctl_desc *d, int curval) if (d == NULL) return; + if (s.flowbox) + gtk_flow_box_remove_all(GTK_FLOW_BOX(s.flowbox)); + /* * delete control */ for (pi = &s.infolist; (i = *pi) != NULL; pi = &i->next) { if (d->addr == i->desc.addr) { *pi = i->next; - /* XXX: free removed widgets */ + if (i->widget) { + audiowidget_free(i->widget); + } free(i); break; } @@ -120,53 +125,44 @@ ondesc(void *arg, struct sioctl_desc *d, int curval) case SIOCTL_VEC: case SIOCTL_LIST: case SIOCTL_SEL: + /* + * find the right position to insert the new widget + */ + for (pi = &s.infolist; (i = *pi) != NULL; pi = &i->next) { + cmp = cmpdesc(d, &i->desc); + if (cmp <= 0) + break; + } + i = malloc(sizeof(struct info)); + if (i == NULL) { + perror("malloc"); + exit(1); + } + i->desc = *d; + printf("new node: %s %s %s %d\n", i->desc.group, i->desc.node0.name, i->desc.func, i->desc.node0.unit); + i->ctladdr = d->addr; + i->curval = i->newval = curval; + i->mode = MODE_IGNORE; + i->next = *pi; + i->timeout = 0; + i->widget = NULL; + if(s.flowbox && i->desc.node0.unit < 1) + i->widget = audiowidget_new(i); + *pi = i; break; - case SIOCTL_NONE: - gtk_flow_box_remove_all(GTK_FLOW_BOX(s.flowbox)); - /* XXX: free removed widgets */ + default: + break; + } + + /* Reconstruct flow_box */ + if (s.flowbox) { for (i = s.infolist; i != NULL; i = nextfunc(i)) { - i->widget = audiowidget_new(i); if (i->widget) { gtk_flow_box_append(GTK_FLOW_BOX(s.flowbox), audiowidget_get_gtkwidget(i->widget)); } } - /* fallthrough */ - default: - return; } - - /* - * find the right position to insert the new widget - */ - for (pi = &s.infolist; (i = *pi) != NULL; pi = &i->next) { - cmp = cmpdesc(d, &i->desc); - if (cmp <= 0) - break; - } - i = malloc(sizeof(struct info)); - if (i == NULL) { - perror("malloc"); - exit(1); - } - i->desc = *d; - i->ctladdr = d->addr; - i->curval = i->newval = curval; - i->mode = MODE_IGNORE; - i->next = *pi; - i->timeout = 0; - i->widget = NULL; - - /* Add widget and link to list */ - if (s.flowbox) { - i->widget = audiowidget_new(i); - if (i->widget) { - gtk_flow_box_append(GTK_FLOW_BOX(s.flowbox), - audiowidget_get_gtkwidget(i->widget)); - } - } - - *pi = i; } /*