diff --git a/include/xkbrules.h b/include/xkbrules.h index 8832c01e2..ab5b4b266 100644 --- a/include/xkbrules.h +++ b/include/xkbrules.h @@ -98,6 +98,13 @@ extern _X_EXPORT Bool XkbRF_LoadRules(FILE * /* file */ , XkbRF_RulesPtr /* rules */ ); +extern _X_EXPORT Bool XkbRF_LoadRulesByName(char * /* base */ , + char * /* locale */ , + XkbRF_RulesPtr /* rules */ + ); + +/***====================================================================***/ + extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(void); extern _X_EXPORT void XkbRF_Free(XkbRF_RulesPtr /* rules */ , diff --git a/xkb/maprules.c b/xkb/maprules.c index a324c67a0..0b6c107ae 100644 --- a/xkb/maprules.c +++ b/xkb/maprules.c @@ -963,6 +963,37 @@ XkbRF_LoadRules(FILE * file, XkbRF_RulesPtr rules) return TRUE; } +Bool +XkbRF_LoadRulesByName(char *base, char *locale, XkbRF_RulesPtr rules) +{ + FILE *file; + char buf[PATH_MAX]; + Bool ok; + + if ((!base) || (!rules)) + return FALSE; + if (locale) { + if (snprintf(buf, PATH_MAX, "%s-%s", base, locale) >= PATH_MAX) + return FALSE; + } + else { + if (strlen(base) + 1 > PATH_MAX) + return FALSE; + strcpy(buf, base); + } + + file = fopen(buf, "r"); + if ((!file) && (locale)) { /* fallback if locale was specified */ + strcpy(buf, base); + file = fopen(buf, "r"); + } + if (!file) + return FALSE; + ok = XkbRF_LoadRules(file, rules); + fclose(file); + return ok; +} + /***====================================================================***/ XkbRF_RulesPtr