summaryrefslogtreecommitdiff
path: root/packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch')
-rw-r--r--packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch197
1 files changed, 197 insertions, 0 deletions
diff --git a/packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch b/packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch
new file mode 100644
index 0000000000..1480591930
--- /dev/null
+++ b/packages/matchbox-keyboard/files/5-Add-support-for-loading-multiple-independent-layouts.patch
@@ -0,0 +1,197 @@
+# HG changeset patch
+# User pfalcon@localhost
+# Date 1181567228 0
+# Node ID 869314ae90f46a8c2d34080005d4079cb0d0fcf4
+# Parent 38c3459f2e1a1c8dc7aacb486f201bdda638c7f2
+Add support for loading multiple independent layouts.
+All layouts found in ~/.matchbox/keyboard.d/ are loaded, realistically
+these will be symlinks to system-wide store. This directory has the highest
+priority of all other layout selection mechanism (except for
+$MB_KBD_CONFIG).
+
+diff -r 38c3459f2e1a -r 869314ae90f4 src/config-parser.c
+--- a/src/config-parser.c Mon Apr 09 00:08:07 2007 +0000
++++ b/src/config-parser.c Mon Jun 11 13:07:08 2007 +0000
+@@ -17,6 +17,7 @@
+ *
+ */
+
++#include <dirent.h>
+ #include "matchbox-keyboard.h"
+
+ /*
+@@ -57,6 +58,9 @@
+
+ </keyboard>
+ */
++
++int mb_kbd_config_parse_file(MBKeyboard *kbd, char *path);
++static int mb_kbd_config_parse_data(MBKeyboard *kbd, char *data);
+
+ struct _keysymlookup
+ {
+@@ -170,12 +174,9 @@ config_str_to_modtype(const char* str)
+ }
+
+
+-static char*
+-config_load_file(MBKeyboard *kbd, char *variant_in)
+-{
+- struct stat stat_info;
+- FILE* fp;
+- char *result;
++int
++mb_kbd_config_load(MBKeyboard *kbd, char *variant_in)
++{
+ char *country = NULL;
+ char *variant = NULL;
+ char *lang = NULL;
+@@ -195,7 +196,44 @@ config_load_file(MBKeyboard *kbd, char *
+ if (util_file_readable(path))
+ goto load;
+
+- return NULL;
++ return 0;
++ }
++
++ if (getenv("HOME"))
++ {
++ snprintf(path, 1024, "%s/.matchbox/keyboard.d", getenv("HOME"));
++
++ DBG("checking %s\n", path);
++
++ if (util_file_readable(path))
++ {
++ DIR *dir = opendir(path);
++ struct dirent *dirent;
++ if (!dir)
++ {
++ perror("matchbox-keyboard");
++ util_fatal_error("Cannot read keyboard.d.\n");
++ }
++ errno = 0;
++ while ((dirent = readdir(dir)))
++ {
++ if (dirent->d_name[0] == '.')
++ continue;
++ snprintf(path, 1024, "%s/.matchbox/keyboard.d/%s", getenv("HOME"), dirent->d_name);
++ if (!mb_kbd_config_parse_file(kbd, path))
++ {
++ util_fatal_error("Cannot read file in keyboard.d.\n");
++ }
++
++ }
++ if (errno)
++ {
++ perror("matchbox-keyboard");
++ util_fatal_error("Error reading keyboard.d.\n");
++ }
++ closedir(dir);
++ return 1;
++ }
+ }
+
+ lang = getenv("MB_KBD_LANG");
+@@ -268,29 +306,11 @@ config_load_file(MBKeyboard *kbd, char *
+ DBG("checking %s\n", path);
+
+ if (!util_file_readable(path))
+- return NULL;
++ return 0;
+
+ load:
+
+- if (stat(path, &stat_info))
+- return NULL;
+-
+- if ((fp = fopen(path, "rb")) == NULL)
+- return NULL;
+-
+- DBG("loading %s\n", path);
+-
+- kbd->config_file = strdup(path);
+-
+- result = malloc(stat_info.st_size + 1);
+-
+- n = fread(result, 1, stat_info.st_size, fp);
+-
+- if (n >= 0) result[n] = '\0';
+-
+- fclose(fp);
+-
+- return result;
++ return mb_kbd_config_parse_file(kbd, path);
+ }
+
+ static const char *
+@@ -567,25 +587,48 @@ config_xml_start_cb(void *data, const ch
+
+
+ int
+-mb_kbd_config_load(MBKeyboard *kbd, char *variant)
+-{
+- char *data;
++mb_kbd_config_parse_file(MBKeyboard *kbd, char *path)
++{
++ char *buffer;
++ struct stat stat_info;
++ FILE* fp;
++ int n;
++
++ if (stat(path, &stat_info))
++ return 0;
++
++ if ((fp = fopen(path, "rb")) == NULL)
++ return 0;
++
++ DBG("loading %s\n", path);
++
++ kbd->config_file = strdup(path);
++
++ buffer = malloc(stat_info.st_size + 1);
++
++ n = fread(buffer, 1, stat_info.st_size, fp);
++
++ if (n >= 0) buffer[n] = '\0';
++
++ fclose(fp);
++
++ mb_kbd_config_parse_data(kbd, buffer);
++
++ free(buffer);
++
++ return 1;
++}
++
++static int
++mb_kbd_config_parse_data(MBKeyboard *kbd, char *data)
++{
+ XML_Parser p;
+ MBKeyboardConfigState *state;
+
+- if ((data = config_load_file(kbd, variant)) == 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 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));
+
+@@ -607,6 +650,9 @@ mb_kbd_config_load(MBKeyboard *kbd, char
+ util_fatal_error("XML Parse failed.\n");
+ }
+
++ free(state);
++ XML_ParserFree(p);
++
+ return 1;
+ }
+