Bool compSetOption(CompOption * option, CompOptionValue * value) { switch (option->type) { case CompOptionTypeBool: return compSetBoolOption(option, value); case CompOptionTypeInt: return compSetIntOption(option, value); case CompOptionTypeFloat: return compSetFloatOption(option, value); case CompOptionTypeString: return compSetStringOption(option, value); case CompOptionTypeColor: return compSetColorOption(option, value); case CompOptionTypeMatch: return compSetMatchOption(option, value); case CompOptionTypeAction: case CompOptionTypeKey: case CompOptionTypeButton: case CompOptionTypeEdge: case CompOptionTypeBell: return compSetActionOption(option, value); case CompOptionTypeList: return compSetOptionList(option, value); } return FALSE; }
static Bool videoSetDisplayOption(CompPlugin *plugin, CompDisplay *display, const char *name, CompOptionValue *value) { CompOption *o; int index; VIDEO_DISPLAY(display); o = compFindOption(vd->opt, NUM_OPTIONS(vd), name, &index); if (!o) return FALSE; switch (index) { case VIDEO_DISPLAY_OPTION_YV12: if (compSetBoolOption(o, value)) { CompScreen *s; for (s = display->screens; s; s = s->next) videoSetSupportedHint(s); } default: break; } return FALSE; }
Bool compSetOptionList(CompOption * option, CompOptionValue * value) { CompOption o; Bool status = FALSE; int i, min; if (value->list.nValue != option->value.list.nValue) { CompOptionValue *v; v = malloc(sizeof(CompOptionValue) * value->list.nValue); if (!v) return FALSE; min = MIN(value->list.nValue, option->value.list.nValue); for (i = min; i < option->value.list.nValue; i++) { switch (option->value.list.type) { case CompOptionTypeString: if (option->value.list.value[i].s) free(option->value.list.value[i].s); break; case CompOptionTypeMatch: matchFini(&option->value.list.value[i].match); default: break; } } memset(v, 0, sizeof(CompOptionValue) * value->list.nValue); if (min) memcpy(v, option->value.list.value, sizeof(CompOptionValue) * min); if (option->value.list.value) free(option->value.list.value); option->value.list.value = v; option->value.list.nValue = value->list.nValue; status = TRUE; } o = *option; o.type = option->value.list.type; for (i = 0; i < value->list.nValue; i++) { o.value = option->value.list.value[i]; switch (o.type) { case CompOptionTypeBool: status |= compSetBoolOption(&o, &value->list.value[i]); break; case CompOptionTypeInt: status |= compSetIntOption(&o, &value->list.value[i]); break; case CompOptionTypeFloat: status |= compSetFloatOption(&o, &value->list.value[i]); break; case CompOptionTypeString: status |= compSetStringOption(&o, &value->list.value[i]); break; case CompOptionTypeColor: status |= compSetColorOption(&o, &value->list.value[i]); break; case CompOptionTypeMatch: status |= compSetMatchOption(&o, &value->list.value[i]); default: break; } option->value.list.value[i] = o.value; } return status; }