void activate_action_string(GmpvApplication *app, const gchar *str) { GActionMap *map = G_ACTION_MAP(app); GAction *action = NULL; gchar *name = NULL; GVariant *param = NULL; gboolean param_match = FALSE; g_action_parse_detailed_name(str, &name, ¶m, NULL); if(name) { const GVariantType *action_ptype; const GVariantType *given_ptype; action = g_action_map_lookup_action(map, name); action_ptype = g_action_get_parameter_type(action); given_ptype = param?g_variant_get_type(param):NULL; param_match = (action_ptype == given_ptype) || g_variant_type_is_subtype_of (action_ptype, given_ptype); } if(action && param_match) { g_debug("Activating action %s", str); g_action_activate(action, param); } else { g_warning("Failed to activate action \"%s\"", str); } }
gboolean variantIsValidForCCSType (GVariant *gsettingsValue, CCSSettingType settingType) { gboolean valid = FALSE; switch (settingType) { case TypeString: case TypeMatch: case TypeColor: case TypeKey: case TypeButton: case TypeEdge: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_STRING, g_variant_get_type (gsettingsValue))); break; case TypeInt: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_INT32, g_variant_get_type (gsettingsValue))); break; case TypeBool: case TypeBell: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_BOOLEAN, g_variant_get_type (gsettingsValue))); break; case TypeFloat: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_DOUBLE, g_variant_get_type (gsettingsValue))); break; case TypeList: valid = (g_variant_type_is_array (g_variant_get_type (gsettingsValue))); break; default: break; } return valid; }
SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *value) { const struct sr_key_info *info; const GVariantType *type, *expected; char *expected_string, *type_string; info = sr_key_info_get(SR_KEY_CONFIG, key); if (!info) return SR_OK; expected = sr_variant_type_get(info->datatype); type = g_variant_get_type(value); if (!g_variant_type_equal(type, expected) && !g_variant_type_is_subtype_of(type, expected)) { expected_string = g_variant_type_dup_string(expected); type_string = g_variant_type_dup_string(type); sr_err("Wrong variant type for key '%s': expected '%s', got '%s'", info->name, expected_string, type_string); g_free(expected_string); g_free(type_string); return SR_ERR_ARG; } return SR_OK; }