Add config struct for illume-keyboard.

SVN revision: 43874
This commit is contained in:
Christopher Michael 2009-11-21 18:17:55 +00:00
parent 030a78e322
commit 48ce772fd9
8 changed files with 162 additions and 80 deletions

View File

@ -28,7 +28,9 @@ module_la_SOURCES = e_mod_main.c \
e_kbd_buf.c \
e_kbd_buf.h \
e_kbd_send.c \
e_kbd_send.h
e_kbd_send.h \
e_mod_config.c \
e_mod_config.h
module_la_LIBADD = @e_libs@ @dlopen_libs@
module_la_LDFLAGS = -module -avoid-version

View File

@ -542,7 +542,7 @@ _e_kbd_buf_cb_faket(void *data)
kb = data;
kb->lookup.faket = NULL;
kb->lookup.func(kb->lookup.data);
kb->lookup.func((void *)kb->lookup.data);
kb->lookup.func = NULL;
kb->lookup.data = NULL;
return 0;

View File

@ -7,8 +7,8 @@
#include <unistd.h>
#include <sys/mman.h>
#define MAXLATIN 0x100
static unsigned char _e_kbd_normalise_base[MAXLATIN];
static unsigned char _e_kbd_normalise_ready = 0;
@ -82,16 +82,15 @@ _e_kbd_normalise_init(void)
{"þ", "p"},
{"ÿ", "y"}
}; // 63 items
if (_e_kbd_normalise_ready) return;
_e_kbd_normalise_ready = 1;
for (i = 0; i < 128; i++)
_e_kbd_normalise_base[i] = tolower(i);
for (;i < MAXLATIN; i++)
{
int glyph;
int j;
int glyph, j;
for (j = 0; j < 63; j++)
{
evas_string_char_next_get(table[j][0], 0, &glyph);
@ -131,11 +130,9 @@ _e_kbd_dict_normalized_strcpy(char *dst, const char *src)
{
const char *p;
char *d;
for (p = src, d = dst; *p; p++, d++)
{
*d = _e_kbd_dict_letter_normalise(*p);
}
*d = _e_kbd_dict_letter_normalise(*p);
*d = 0;
}
@ -143,7 +140,7 @@ static int
_e_kbd_dict_matches_loolup_cb_sort(const void *d1, const void *d2)
{
const E_Kbd_Dict_Word *kw1, *kw2;
kw1 = d1;
kw2 = d2;
if (kw1->usage < kw2->usage) return 1;
@ -155,7 +152,7 @@ static int
_e_kbd_dict_writes_cb_sort(const void *d1, const void *d2)
{
const E_Kbd_Dict_Word *kw1, *kw2;
kw1 = d1;
kw2 = d2;
return _e_kbd_dict_normalized_strcmp(kw1->word, kw2->word);
@ -166,13 +163,10 @@ static const char *
_e_kbd_dict_line_next(E_Kbd_Dict *kd, const char *p)
{
const char *e, *pp;
e = kd->file.dict + kd->file.size;
for (pp = p; pp < e; pp++)
{
if (*pp == '\n')
return pp + 1;
}
if (*pp == '\n') return pp + 1;
return NULL;
}
@ -181,7 +175,7 @@ _e_kbd_dict_line_parse(E_Kbd_Dict *kd, const char *p, int *usage)
{
const char *ps;
char *wd = NULL;
for (ps = p; !isspace(*ps); ps++);
wd = malloc(ps - p + 1);
if (!wd) return NULL;
@ -197,12 +191,11 @@ _e_kbd_dict_line_parse(E_Kbd_Dict *kd, const char *p, int *usage)
}
static void
_e_kbd_dict_lookup_build_line(E_Kbd_Dict *kd, const char *p, const char *eol,
int *glyphs)
_e_kbd_dict_lookup_build_line(E_Kbd_Dict *kd, const char *p, const char *eol, int *glyphs)
{
char *s;
int p2;
s = alloca(eol - p + 1);
strncpy(s, p, eol - p);
s[eol - p] = 0;
@ -228,11 +221,10 @@ _e_kbd_dict_lookup_build(E_Kbd_Dict *kd)
{
glyphs[0] = glyphs[1] = 0;
_e_kbd_dict_lookup_build_line(kd, p, eol, glyphs);
if ((glyphs[1] != pglyphs[1]) ||
(glyphs[0] != pglyphs[0]))
if ((glyphs[1] != pglyphs[1]) || (glyphs[0] != pglyphs[0]))
{
int v1, v2;
if (isspace(glyphs[0]))
{
glyphs[0] = 0;
@ -262,10 +254,9 @@ static int
_e_kbd_dict_open(E_Kbd_Dict *kd)
{
struct stat st;
kd->file.fd = open(kd->file.file, O_RDONLY);
if (kd->file.fd < 0)
return 0;
if (kd->file.fd < 0) return 0;
if (fstat(kd->file.fd, &st) < 0)
{
close(kd->file.fd);
@ -334,11 +325,11 @@ static E_Kbd_Dict_Word *
_e_kbd_dict_changed_write_find(E_Kbd_Dict *kd, const char *word)
{
Eina_List *l;
for (l = kd->changed.writes; l; l = l->next)
{
E_Kbd_Dict_Word *kw;
kw = l->data;
if (!strcmp(kw->word, word)) return kw;
}
@ -349,7 +340,7 @@ EAPI void
e_kbd_dict_save(E_Kbd_Dict *kd)
{
FILE *f;
// save any changes (new words added, usage adjustments).
// all words MUST be sorted
if (!kd->changed.writes) return;
@ -366,13 +357,13 @@ e_kbd_dict_save(E_Kbd_Dict *kd)
if (f)
{
const char *p, *pn;
p = kd->file.dict;
while (p)
{
char *wd;
int usage = 0;
pn = _e_kbd_dict_line_next(kd, p);
if (!pn) return;
wd = _e_kbd_dict_line_parse(kd, p, &usage);
@ -380,14 +371,13 @@ e_kbd_dict_save(E_Kbd_Dict *kd)
{
if (kd->changed.writes)
{
int writeline;
writeline = 0;
int writeline = 0;
while (kd->changed.writes)
{
E_Kbd_Dict_Word *kw;
int cmp;
kw = kd->changed.writes->data;
cmp = _e_kbd_dict_normalized_strcmp(kw->word, wd);
if (cmp < 0)
@ -430,7 +420,7 @@ e_kbd_dict_save(E_Kbd_Dict *kd)
while (kd->changed.writes)
{
E_Kbd_Dict_Word *kw;
kw = kd->changed.writes->data;
fprintf(f, "%s %i\n", kw->word, kw->usage);
eina_stringshare_del(kw->word);
@ -440,19 +430,16 @@ e_kbd_dict_save(E_Kbd_Dict *kd)
fclose(f);
}
_e_kbd_dict_close(kd);
if (_e_kbd_dict_open(kd))
_e_kbd_dict_lookup_build(kd);
if (_e_kbd_dict_open(kd)) _e_kbd_dict_lookup_build(kd);
}
static int
_e_kbd_dict_cb_save_flush(void *data)
{
E_Kbd_Dict *kd;
kd = data;
if ((kd->matches.list) ||
(kd->word.letters) ||
(kd->matches.deadends) ||
if ((kd->matches.list) || (kd->word.letters) || (kd->matches.deadends) ||
(kd->matches.leads))
return 1;
kd->changed.flush_timer = NULL;
@ -464,20 +451,19 @@ static void
_e_kbd_dict_changed_write_add(E_Kbd_Dict *kd, const char *word, int usage)
{
E_Kbd_Dict_Word *kw;
kw = E_NEW(E_Kbd_Dict_Word, 1);
kw->word = eina_stringshare_add(word);
kw->usage = usage;
kd->changed.writes = eina_list_prepend(kd->changed.writes, kw);
if (eina_list_count(kd->changed.writes) > 64)
{
e_kbd_dict_save(kd);
}
e_kbd_dict_save(kd);
else
{
if (kd->changed.flush_timer)
ecore_timer_del(kd->changed.flush_timer);
kd->changed.flush_timer = ecore_timer_add(5.0, _e_kbd_dict_cb_save_flush, kd);
kd->changed.flush_timer =
ecore_timer_add(5.0, _e_kbd_dict_cb_save_flush, kd);
}
}
@ -563,7 +549,7 @@ _e_kbd_dict_find_full(E_Kbd_Dict *kd, const char *word)
{
const char *p;
int len;
p = _e_kbd_dict_find(kd, word);
if (!p) return NULL;
len = strlen(word);
@ -576,7 +562,7 @@ e_kbd_dict_word_usage_adjust(E_Kbd_Dict *kd, const char *word, int adjust)
{
// add "adjust" to word usage count
E_Kbd_Dict_Word *kw;
kw = _e_kbd_dict_changed_write_find(kd, word);
if (kw)
{
@ -609,7 +595,7 @@ e_kbd_dict_word_delete(E_Kbd_Dict *kd, const char *word)
{
// delete a word from the dictionary
E_Kbd_Dict_Word *kw;
kw = _e_kbd_dict_changed_write_find(kd, word);
if (kw)
kw->usage = -1;
@ -654,7 +640,7 @@ e_kbd_dict_word_letter_add(E_Kbd_Dict *kd, const char *letter, int dist)
// letter position - advance starts a new letter position
Eina_List *l, *list;
E_Kbd_Dict_Letter *kl;
l = eina_list_last(kd->word.letters);
if (!l) return;
list = l->data;
@ -678,14 +664,14 @@ e_kbd_dict_word_letter_delete(E_Kbd_Dict *kd)
{
// delete the current letter completely
Eina_List *l, *list;
l = eina_list_last(kd->word.letters);
if (!l) return;
list = l->data;
while (list)
{
E_Kbd_Dict_Letter *kl;
kl = list->data;
eina_stringshare_del(kl->letter);
free(kl);
@ -702,11 +688,9 @@ _e_kbd_dict_matches_lookup_iter(E_Kbd_Dict *kd, Eina_List *word,
const char *p, *pn;
char *base, *buf, *wd, *bufapp;
E_Kbd_Dict_Letter *kl;
int len, dist = 0, d, baselen, maxdist = 0, md;
int len = 0, dist = 0, d, baselen, maxdist = 0, md;
static int level = 0, lv;
len = 0;
level++;
for (l = word; l; l = l->next)
{
@ -763,7 +747,7 @@ _e_kbd_dict_matches_lookup_iter(E_Kbd_Dict *kd, Eina_List *word,
{
E_Kbd_Dict_Word *kw;
int usage = 0;
wd = _e_kbd_dict_line_parse(kd, p, &usage);
if (!wd) break;
if (_e_kbd_dict_normalized_strcmp(wd, buf))
@ -776,7 +760,7 @@ _e_kbd_dict_matches_lookup_iter(E_Kbd_Dict *kd, Eina_List *word,
{
int accuracy;
int w, b, w2, b2, wc, bc, upper;
// match any capitalisation
for (w = 0, b = 0; wd[w] && buf[b];)
{
@ -792,7 +776,7 @@ _e_kbd_dict_matches_lookup_iter(E_Kbd_Dict *kd, Eina_List *word,
// be tweaked
wc = eina_list_count(word);
if (md < 1) md = 1;
// basically a metric to see how far away teh keys that
// were actually pressed are away from the letters of
// this word in a physical on-screen sense
@ -832,7 +816,7 @@ e_kbd_dict_matches_lookup(E_Kbd_Dict *kd)
while (kd->matches.list)
{
E_Kbd_Dict_Word *kw;
kw = kd->matches.list->data;
eina_stringshare_del(kw->word);
free(kw);
@ -866,7 +850,7 @@ e_kbd_dict_matches_match_get(E_Kbd_Dict *kd, int *pri_ret)
if (kd->matches.list_ptr)
{
E_Kbd_Dict_Word *kw;
kw = kd->matches.list_ptr->data;
if (kw)
{

View File

@ -1,9 +1,8 @@
#include <Eina.h>
#include "e.h"
#include "e_kbd_buf.h"
#include "e_kbd_int.h"
#include "e_kbd_send.h"
#include "e_mod_config.h"
enum
{
@ -18,7 +17,7 @@ static Evas_Object *_theme_obj_new(Evas *e, const char *custom_dir, const char *
static void _e_kbd_int_layout_next(E_Kbd_Int *ki);
static void _e_kbd_int_zoomkey_down(E_Kbd_Int *ki);
static void _e_kbd_int_matches_update(E_Kbd_Int *ki);
static void _e_kbd_int_matches_update(void *data);
static void _e_kbd_int_dictlist_down(E_Kbd_Int *ki);
static void _e_kbd_int_matchlist_down(E_Kbd_Int *ki);
static void _e_kbd_int_layoutlist_down(E_Kbd_Int *ki);
@ -287,12 +286,14 @@ _e_kbd_int_matches_free(E_Kbd_Int *ki)
}
static void
_e_kbd_int_matches_update(E_Kbd_Int *ki)
_e_kbd_int_matches_update(void *data)
{
E_Kbd_Int *ki;
const Eina_List *l, *matches;
const char *actual;
Evas_Coord mw, mh, vw, vh;
if (!(ki = data)) return;
evas_event_freeze(ki->win->evas);
e_box_freeze(ki->box_obj);
_e_kbd_int_matches_free(ki);
@ -1337,9 +1338,9 @@ _e_kbd_int_cb_dictlist_item_sel(void *data)
_e_kbd_int_layout_state_update(ki);
}
//eina_stringshare_replace(&illume_cfg->kbd.dict, str);
//e_kbd_buf_dict_set(ki->kbuf, illume_cfg->kbd.dict);
//e_config_save_queue();
eina_stringshare_replace(&il_kbd_cfg->dict, str);
e_kbd_buf_dict_set(ki->kbuf, il_kbd_cfg->dict);
e_config_save_queue();
_e_kbd_int_dictlist_down(ki);
}
@ -1767,9 +1768,9 @@ e_kbd_int_new(const char *themedir, const char *syskbds, const char *sysdicts)
evas_object_show(o);
ki->box_obj = o;
// if (illume_cfg->kbd.dict)
// ki->kbuf = e_kbd_buf_new(ki->sysdicts, illume_cfg->kbd.dict);
// else
if (il_kbd_cfg->dict)
ki->kbuf = e_kbd_buf_new(ki->sysdicts, il_kbd_cfg->dict);
else
ki->kbuf = e_kbd_buf_new(ki->sysdicts, "English_(US).dic");
_e_kbd_int_layouts_list_update(ki);

View File

@ -5,7 +5,7 @@ static const char *
_string_to_keysym(const char *str)
{
int glyph, ok;
/* utf8 -> glyph id (unicode - ucs4) */
glyph = 0;
ok = evas_string_char_next_get(str, 0, &glyph);
@ -19,7 +19,7 @@ EAPI void
e_kbd_send_string_press(const char *str, Kbd_Mod mod)
{
const char *key = NULL;
key = _string_to_keysym(str);
if (!key) return;
e_kbd_send_keysym_press(key, mod);

View File

@ -0,0 +1,67 @@
#include "e.h"
#include "e_mod_main.h"
#include "e_mod_config.h"
EAPI Il_Kbd_Config *il_kbd_cfg = NULL;
static E_Config_DD *conf_edd = NULL;
/* public functions */
EAPI int
il_kbd_config_init(E_Module *m)
{
conf_edd = E_CONFIG_DD_NEW("Illume_Kbd_Cfg", Il_Kbd_Config);
#undef T
#undef D
#define T Il_Kbd_Config
#define D conf_edd
E_CONFIG_VAL(D, T, version, INT);
E_CONFIG_VAL(D, T, use_internal, INT);
E_CONFIG_VAL(D, T, run_keyboard, STR);
E_CONFIG_VAL(D, T, dict, STR);
il_kbd_cfg = e_config_domain_load("module.illume-keyboard", conf_edd);
if ((il_kbd_cfg) &&
((il_kbd_cfg->version >> 16) < IL_CONFIG_MAJ))
{
E_FREE(il_kbd_cfg);
il_kbd_cfg = NULL;
}
if (!il_kbd_cfg)
{
il_kbd_cfg = E_NEW(Il_Kbd_Config, 1);
il_kbd_cfg->version = 0;
il_kbd_cfg->use_internal = 1;
il_kbd_cfg->run_keyboard = NULL;
il_kbd_cfg->dict = eina_stringshare_add("English_(US).dic");
}
if (il_kbd_cfg)
{
/* Add new config variables here */
/* if ((il_kbd_cfg->version & 0xffff) < 1) */
il_kbd_cfg->version = (IL_CONFIG_MAJ << 16) | IL_CONFIG_MIN;
}
il_kbd_cfg->mod_dir = eina_stringshare_add(m->dir);
return 1;
}
EAPI int
il_kbd_config_shutdown(void)
{
if (il_kbd_cfg->mod_dir) eina_stringshare_del(il_kbd_cfg->mod_dir);
if (il_kbd_cfg->run_keyboard) eina_stringshare_del(il_kbd_cfg->run_keyboard);
if (il_kbd_cfg->dict) eina_stringshare_del(il_kbd_cfg->dict);
E_FREE(il_kbd_cfg);
il_kbd_cfg = NULL;
E_CONFIG_DD_FREE(conf_edd);
return 1;
}
EAPI int
il_kbd_config_save(void)
{
e_config_domain_save("module.illume-keyboard", conf_edd, il_kbd_cfg);
return 1;
}

View File

@ -0,0 +1,26 @@
#ifndef E_MOD_CONFIG_H
#define E_MOD_CONFIG_H
#define IL_CONFIG_MIN 0
#define IL_CONFIG_MAJ 0
typedef struct _Il_Kbd_Config Il_Kbd_Config;
struct _Il_Kbd_Config
{
int version;
int use_internal;
const char *dict, *run_keyboard;
// Not User Configurable. Placeholders
const char *mod_dir;
};
EAPI int il_kbd_config_init(E_Module *m);
EAPI int il_kbd_config_shutdown(void);
EAPI int il_kbd_config_save(void);
extern EAPI Il_Kbd_Config *il_kbd_cfg;
#endif

View File

@ -1,9 +1,9 @@
#include "e.h"
#include "e_mod_main.h"
#include "e_mod_config.h"
#include "e_kbd_int.h"
/* local variables */
const char *mod_dir = NULL;
static E_Kbd_Int *ki = NULL;
EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Illume Keyboard" };
@ -11,8 +11,10 @@ EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Illume Keyboard" };
EAPI void *
e_modapi_init(E_Module *m)
{
mod_dir = eina_stringshare_add(m->dir);
if (!il_kbd_config_init(m)) return NULL;
ki = e_kbd_int_new(mod_dir, mod_dir, mod_dir);
return m;
}
@ -24,12 +26,12 @@ e_modapi_shutdown(E_Module *m)
e_kbd_int_free(ki);
ki = NULL;
}
if (mod_dir) eina_stringshare_del(mod_dir);
il_kbd_config_shutdown();
return 1;
}
EAPI int
e_modapi_save(E_Module *m)
{
return 1;
return il_kbd_config_save();
}