forked from enlightenment/enventor
auto_comp: ++safe code
don't free auto comp instance if its internal thread is working.
This commit is contained in:
parent
86b9124e53
commit
13305c77af
|
@ -33,13 +33,16 @@ typedef struct autocomp_s
|
||||||
Evas_Object *anchor;
|
Evas_Object *anchor;
|
||||||
Evas_Object *list;
|
Evas_Object *list;
|
||||||
Evas_Object *event_rect;
|
Evas_Object *event_rect;
|
||||||
|
|
||||||
Ecore_Thread *init_thread;
|
Ecore_Thread *init_thread;
|
||||||
|
Ecore_Thread *cntx_lexem_thread;
|
||||||
|
|
||||||
Eina_Bool anchor_visible : 1;
|
Eina_Bool anchor_visible : 1;
|
||||||
Eina_Bool initialized : 1;
|
Eina_Bool initialized : 1;
|
||||||
Eina_Bool enabled : 1;
|
Eina_Bool enabled : 1;
|
||||||
Ecore_Thread *cntx_lexem_thread;
|
|
||||||
Eina_Bool dot_candidate : 1;
|
Eina_Bool dot_candidate : 1;
|
||||||
Eina_Bool on_keygrab : 1;
|
Eina_Bool on_keygrab : 1;
|
||||||
|
Eina_Bool term: 1;
|
||||||
} autocomp_data;
|
} autocomp_data;
|
||||||
|
|
||||||
typedef struct ctx_lexem_thread_data_s
|
typedef struct ctx_lexem_thread_data_s
|
||||||
|
@ -383,19 +386,20 @@ context_changed(autocomp_data *ad, Evas_Object *edit)
|
||||||
context_lexem_get(ad, edit, EINA_FALSE);
|
context_lexem_get(ad, edit, EINA_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
init_thread_end_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
|
|
||||||
{
|
|
||||||
autocomp_data *ad = data;
|
|
||||||
ad->initialized = EINA_TRUE;
|
|
||||||
ad->init_thread = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_thread_cancel_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
|
init_thread_cancel_cb(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
autocomp_data *ad = data;
|
autocomp_data *ad = data;
|
||||||
ad->init_thread = NULL;
|
ad->init_thread = NULL;
|
||||||
|
if (ad->term) autocomp_term();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_thread_end_cb(void *data, Ecore_Thread *thread)
|
||||||
|
{
|
||||||
|
autocomp_data *ad = data;
|
||||||
|
ad->initialized = EINA_TRUE;
|
||||||
|
init_thread_cancel_cb(data, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -973,9 +977,15 @@ autocomp_term(void)
|
||||||
autocomp_data *ad = g_ad;
|
autocomp_data *ad = g_ad;
|
||||||
autocomp_target_set(NULL);
|
autocomp_target_set(NULL);
|
||||||
|
|
||||||
|
if (ad->init_thread)
|
||||||
|
{
|
||||||
|
ecore_thread_cancel(ad->init_thread);
|
||||||
|
ad->term = EINA_TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
evas_object_del(ad->event_rect);
|
evas_object_del(ad->event_rect);
|
||||||
evas_object_del(ad->anchor);
|
evas_object_del(ad->anchor);
|
||||||
ecore_thread_cancel(ad->init_thread);
|
|
||||||
|
|
||||||
lexem_tree_free((lexem **)&ad->lexem_root);
|
lexem_tree_free((lexem **)&ad->lexem_root);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue