QVariantList QGSettings::choices(const QString &key) const { Q_D(const QGSettings); QVariantList choices; if (!d->valid) return choices; gchar *keyName = Utils::fromCamelCase(key); GSettingsSchemaKey *schemaKey = g_settings_schema_get_key(d->schema, keyName); GVariant *range = g_settings_schema_key_get_range(schemaKey); g_settings_schema_key_unref(schemaKey); g_free(keyName); if (!range) return choices; const gchar *type; GVariant *value; g_variant_get(range, "(&sv)", &type, &value); if (g_str_equal(type, "enum")) { GVariantIter iter; g_variant_iter_init(&iter, value); GVariant *child; while ((child = g_variant_iter_next_value(&iter))) { choices.append(Utils::toQVariant(child)); g_variant_unref(child); } } g_variant_unref(value); g_variant_unref(range); return choices; }
static void ide_preferences_spin_button_connect (IdePreferencesBin *bin, GSettings *settings) { IdePreferencesSpinButton *self = (IdePreferencesSpinButton *)bin; GSettingsSchema *schema = NULL; GSettingsSchemaKey *key = NULL; GVariant *range = NULL; GVariant *values = NULL; GVariant *lower = NULL; GVariant *upper = NULL; gchar *type = NULL; gchar *signal_detail = NULL; GtkAdjustment *adj; GVariantIter iter; g_assert (IDE_IS_PREFERENCES_SPIN_BUTTON (self)); self->settings = g_object_ref (settings); g_object_get (self->settings, "settings-schema", &schema, NULL); adj = gtk_spin_button_get_adjustment (self->spin_button); key = g_settings_schema_get_key (schema, self->key); range = g_settings_schema_key_get_range (key); g_variant_get (range, "(sv)", &type, &values); if (!ide_str_equal0 (type, "range") || (2 != g_variant_iter_init (&iter, values))) { gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); goto cleanup; } lower = g_variant_iter_next_value (&iter); upper = g_variant_iter_next_value (&iter); self->type = g_variant_get_type (lower); apply_value (adj, lower, "lower"); apply_value (adj, upper, "upper"); signal_detail = g_strdup_printf ("changed::%s", self->key); self->handler = g_signal_connect_object (self->settings, signal_detail, G_CALLBACK (ide_preferences_spin_button_setting_changed), self, G_CONNECT_SWAPPED); ide_preferences_spin_button_setting_changed (self, self->key, self->settings); cleanup: g_clear_pointer (&key, g_settings_schema_key_unref); g_clear_pointer (&type, g_free); g_clear_pointer (&signal_detail, g_free); g_clear_pointer (&range, g_variant_unref); g_clear_pointer (&values, g_variant_unref); g_clear_pointer (&lower, g_variant_unref); g_clear_pointer (&upper, g_variant_unref); g_clear_pointer (&schema, g_settings_schema_unref); }