int mb_kbd_config_load(MBKeyboard *kbd, char *variant) { char *data; XML_Parser p; MBKeyboardConfigState *state; if (!(data = load_config_file ("keyboard", variant, 1, &kbd->config_file))) util_fatal_error("Couldn't find a keyboard config file\n"); p = XML_ParserCreate(NULL); if (!p) util_fatal_error("Couldn't allocate memory for XML parser\n"); if (variant && !strstr(kbd->config_file, variant)) fprintf(stderr, "matchbox-keyboard: *Warning* Unable to locate variant: %s\n" " falling back to %s\n", variant, kbd->config_file); state = util_malloc0(sizeof(MBKeyboardConfigState)); state->keyboard = kbd; state->parser = p; XML_SetElementHandler(p, config_xml_start_cb, NULL); /* XML_SetCharacterDataHandler(p, chars); */ XML_SetUserData(p, (void *)state); if (! XML_Parse(p, data, strlen(data), 1)) { fprintf(stderr, "matchbox-keyboard:%s:%d: XML Parse error:%s\n", kbd->config_file, (int)XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); util_fatal_error("XML Parse failed.\n"); } XML_ParserFree (p); return 1; }
static int load_include (MBKeyboardConfigState *state, const char *include, int autolocale) { XML_Parser p, old_p; char *data; if (!(data = load_config_file (include, NULL, autolocale, NULL))) util_fatal_error("Couldn't find a keyboard config file\n"); p = XML_ParserCreate(NULL); if (!p) util_fatal_error("Couldn't allocate memory for XML subparser\n"); old_p = state->parser; state->parser = p; XML_SetElementHandler(p, config_xml_start_cb, NULL); XML_SetUserData(p, (void *)state); if (! XML_Parse(p, data, strlen(data), 1)) { fprintf(stderr, "matchbox-keyboard:%s:%d: XML Parse error:%s\n", include, (int)XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); util_fatal_error("XML Parse failed.\n"); } state->parser = old_p; XML_ParserFree (p); return 1; }
static void config_xml_start_cb(void *data, const char *tag, const char **attr) { MBKeyboardConfigState *state = (MBKeyboardConfigState *)data; if (streq(tag, "layout")) { config_handle_layout_tag(state, attr); } else if (streq(tag, "row")) { config_handle_row_tag(state, attr); } else if (streq(tag, "key")) { config_handle_key_tag(state, attr); } else if (streq(tag, "space")) { config_handle_key_tag(state, attr); mb_kbd_key_set_blank(state->current_key, True); } else if (streq(tag, "normal") || streq(tag, "default") || streq(tag, "shifted") || streq(tag, "mod1") || streq(tag, "mod2") || streq(tag, "mod3")) { config_handle_key_subtag(state, tag, attr); } if (state->error) { fprintf(stderr, "matchbox-keyboard:%s:%d: %s\n", state->keyboard->config_file, state->error_lineno, state->error_msg); util_fatal_error("Error parsing\n"); } }
static void config_xml_start_cb(void *data, const char *tag, const char **attr) { MBKeyboardConfigState *state = (MBKeyboardConfigState *)data; if (streq(tag, "layout")) { config_handle_layout_tag(state, attr); } else if (streq(tag, "row")) { config_handle_row_tag(state, attr); } else if (streq(tag, "key")) { config_handle_key_tag(state, attr); } else if (streq(tag, "space")) { config_handle_key_tag(state, attr); mb_kbd_key_set_blank(state->current_key, True); } else if (streq(tag, "normal") || streq(tag, "default") || streq(tag, "shifted") || streq(tag, "caps") || streq(tag, "mod1") || streq(tag, "mod2") || streq(tag, "mod3")) { config_handle_key_subtag(state, tag, attr); } else if (streq(tag, "include")) { const char *val; const char *loc; char *inc; int autoloc = 1; if (!(val = attr_get_val("file", attr))) return; else { char *p; inc = strdup (val); if ((p = strstr (inc, ".xml"))) *p = 0; } if ((loc = attr_get_val("auto-locale", attr)) && streq(loc, "no")) autoloc = 0; load_include (state, inc, autoloc); } else if (streq(tag, "fragment")) { /* Do nothing; the fragment element is needed so that the fragments are a valid xml */ } if (state->error) { fprintf(stderr, "matchbox-keyboard:%s:%d: %s\n", state->keyboard->config_file, state->error_lineno, state->error_msg); util_fatal_error("Error parsing\n"); } }