diff --git a/linux/ibus-kmfl/src/kmflutil.c b/linux/ibus-kmfl/src/kmflutil.c index 415fe88198..a2c21bfae0 100644 --- a/linux/ibus-kmfl/src/kmflutil.c +++ b/linux/ibus-kmfl/src/kmflutil.c @@ -72,10 +72,9 @@ static gchar * get_dirname(const gchar * path) } } -GList * kmfl_get_keyboard_list( const gchar * path) +GList * kmfl_get_keyboard_fromdir( GList *keyboard_list, const gchar * path) { - GList * keyboard_list=NULL; - +// g_message("KMFL: getting from dir: %s", path); DIR *dir = opendir(path); if (dir != NULL) { @@ -85,14 +84,24 @@ GList * kmfl_get_keyboard_list( const gchar * path) gchar * absfn = g_strdup_printf("%s/%s", path, file->d_name); stat(absfn, &filestat); + if (S_ISDIR(filestat.st_mode)) + { + if(strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) + keyboard_list = kmfl_get_keyboard_fromdir(keyboard_list, absfn); + g_free(absfn); + } // Only .kmfl and .kmn extensions are valid keyboard files - if (S_ISREG(filestat.st_mode) + else if (S_ISREG(filestat.st_mode) && ((g_str_has_suffix(absfn, ".kmfl") && kmfl_check_keyboard(absfn) == 0) || g_str_has_suffix(absfn, ".kmn"))) { keyboard_list=g_list_append(keyboard_list, absfn); } + else + { + g_free(absfn); + } file = readdir(dir); } @@ -101,6 +110,13 @@ GList * kmfl_get_keyboard_list( const gchar * path) return keyboard_list; } +GList * kmfl_get_keyboard_list( const gchar * path) +{ + GList * keyboard_list=NULL; + keyboard_list = kmfl_get_keyboard_fromdir(keyboard_list, path); + return keyboard_list; +} + gchar * kmfl_get_icon_file(KInputMethod * im) { const char * icon_file = kmfl_icon_file(im->keyboard_number); @@ -242,21 +258,29 @@ ibus_kmfl_list_engines (void) gchar *local_keyboard_path; keyboard_list = kmfl_get_keyboard_list("/usr/share/kmfl"); - engines = ibus_kmfl_add_engines(engines, keyboard_list); + g_list_free(keyboard_list); + keyboard_list = kmfl_get_keyboard_list("/usr/share/keyman"); + engines = ibus_kmfl_add_engines(engines, keyboard_list); + g_list_free(keyboard_list); + + keyboard_list = kmfl_get_keyboard_list("/usr/local/share/keyman"); + engines = ibus_kmfl_add_engines(engines, keyboard_list); g_list_free(keyboard_list); local_keyboard_path= g_strdup_printf("%s/.kmfl", getenv("HOME")); - keyboard_list = kmfl_get_keyboard_list(local_keyboard_path); - engines = ibus_kmfl_add_engines(engines, keyboard_list); - g_free(local_keyboard_path); - g_list_free(keyboard_list); - + + local_keyboard_path= g_strdup_printf("%s/.local/share/keyman", getenv("HOME")); + keyboard_list = kmfl_get_keyboard_list(local_keyboard_path); + engines = ibus_kmfl_add_engines(engines, keyboard_list); + g_free(local_keyboard_path); + g_list_free(keyboard_list); + return engines; } diff --git a/linux/ibus-kmfl/src/kmflutil.h b/linux/ibus-kmfl/src/kmflutil.h index 1332cde33f..3937aa8aa2 100644 --- a/linux/ibus-kmfl/src/kmflutil.h +++ b/linux/ibus-kmfl/src/kmflutil.h @@ -75,6 +75,7 @@ typedef struct int keyboard_number; gchar * keyboard_filename; gchar * keyboard_icon_filename; + gchar * keyboard_id; gchar * keyboard_name; gchar * keyboard_language; gchar * keyboard_author;