rem: free(colors);
add: wfree(colors);
context: sliderChangeCallback(WMWidget *w, void *data){    TexturePanel *panel = (TexturePanel*)data;    RHSVColor hsv;    int row, rows;    WMListItem *item;    RColor **colors;    int i;    RImage *image;    WMScreen *scr = WMWidgetScreen(w);    hsv.hue = WMGetSliderValue(panel->ghueS);    hsv.saturation = WMGetSliderValue(panel->gsatS);    hsv.value = WMGetSliderValue(panel->gvalS);    row = WMGetListSelectedItemRow(panel->gcolL);    if (row >= 0) {	RColor *rgb;	item = WMGetListItem(panel->gcolL, row);	rgb = (RColor*)item->clientData;	RHSVtoRGB(&hsv, rgb);		sprintf(item->text, "%02x,%02x,%02x", rgb->red, rgb->green, rgb->blue);    }    if (w == panel->ghueS) {	updateSVSlider(panel->gsatS, True, panel->listFont, &hsv);	updateSVSlider(panel->gvalS, False, panel->listFont, &hsv);    } else if (w == panel->gsatS) {	updateHueSlider(panel->ghueS, panel->listFont, &hsv);	updateSVSlider(panel->gvalS, False, panel->listFont, &hsv);    } else {	updateHueSlider(panel->ghueS, panel->listFont, &hsv);	updateSVSlider(panel->gsatS, True, panel->listFont, &hsv);    }    rows = WMGetListNumberOfRows(panel->gcolL);    if (rows == 0)	return;    colors = wmalloc(sizeof(RColor*)*(rows+1));    for (i = 0; i < rows; i++) {	item = WMGetListItem(panel->gcolL, i);	colors[i] = (RColor*)item->clientData;    }    colors[i] = NULL;    if (panel->gimage != None) {	XFreePixmap(WMScreenDisplay(scr), panel->gimage);    }    image = RRenderMultiGradient(30, i*WMGetListItemHeight(panel->gcolL), 				 colors, RVerticalGradient);    RConvertImage(WMScreenRContext(scr), image, &panel->gimage);    RDestroyImage(image);    free(colors);    WMRedisplayWidget(panel->gcolL);    updateGradButtons(panel);}