forked from enlightenment/enlightenment
parent
df56bb3761
commit
b7ff38a5b4
102
src/bin/e_apps.c
102
src/bin/e_apps.c
|
@ -42,13 +42,16 @@ struct _E_App_Callback
|
||||||
struct _E_App_Hash_Idler
|
struct _E_App_Hash_Idler
|
||||||
{
|
{
|
||||||
Ecore_Idler *idler;
|
Ecore_Idler *idler;
|
||||||
int all_done;
|
/* We keep a seperate list so that nothing external can change it between
|
||||||
double begin, pass;
|
* idler calls. Means we might miss some during the idler run, but since
|
||||||
|
* this is just an optimization pre load thing, then that's no problem.
|
||||||
|
*/
|
||||||
|
Evas_List *apps;
|
||||||
|
double begin, pass;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Evas_Bool _e_apps_hash_cb_init (Evas_Hash *hash, const char *key, void *data, void *fdata);
|
static Evas_Bool _e_apps_hash_cb_init (Evas_Hash *hash, const char *key, void *data, void *fdata);
|
||||||
static int _e_apps_hash_idler_cb (void *data);
|
static int _e_apps_hash_idler_cb (void *data);
|
||||||
static Evas_Bool _e_apps_hash_idler_cb_init(Evas_Hash *hash, const char *key, void *data, void *fdata);
|
|
||||||
static void _e_app_free (E_App *a);
|
static void _e_app_free (E_App *a);
|
||||||
static E_App *_e_app_subapp_file_find (E_App *a, const char *file);
|
static E_App *_e_app_subapp_file_find (E_App *a, const char *file);
|
||||||
static void _e_app_change (E_App *a, E_App_Change ch);
|
static void _e_app_change (E_App *a, E_App_Change ch);
|
||||||
|
@ -150,6 +153,7 @@ e_app_init(void)
|
||||||
_e_apps_every_app = evas_hash_direct_add(_e_apps_every_app, app->path, app);
|
_e_apps_every_app = evas_hash_direct_add(_e_apps_every_app, app->path, app);
|
||||||
app->parent = _e_apps_all;
|
app->parent = _e_apps_all;
|
||||||
_e_apps_all->subapps = evas_list_prepend(_e_apps_all->subapps, app);
|
_e_apps_all->subapps = evas_list_prepend(_e_apps_all->subapps, app);
|
||||||
|
_e_apps_hash_idler.apps = evas_list_append(_e_apps_hash_idler.apps, app);
|
||||||
e_object_ref(E_OBJECT(app));
|
e_object_ref(E_OBJECT(app));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,33 +162,52 @@ e_app_init(void)
|
||||||
printf("INITIAL APP SCAN %3.3f\n", ecore_time_get() - begin);
|
printf("INITIAL APP SCAN %3.3f\n", ecore_time_get() - begin);
|
||||||
ecore_desktop_instrumentation_print();
|
ecore_desktop_instrumentation_print();
|
||||||
ecore_desktop_instrumentation_reset();
|
ecore_desktop_instrumentation_reset();
|
||||||
_e_apps_hash_idler.all_done = 0;
|
|
||||||
_e_apps_hash_idler.begin = ecore_time_get();
|
_e_apps_hash_idler.begin = ecore_time_get();
|
||||||
_e_apps_hash_idler.idler = ecore_idler_add(_e_apps_hash_idler_cb, &_e_apps_hash_idler);
|
_e_apps_hash_idler.idler = ecore_idler_add(_e_apps_hash_idler_cb, &_e_apps_hash_idler);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_e_apps_hash_idler_cb(void *data)
|
_e_apps_hash_idler_cb(void *data)
|
||||||
{
|
{
|
||||||
struct _E_App_Hash_Idler *idler;
|
struct _E_App_Hash_Idler *idler;
|
||||||
|
|
||||||
idler = data;
|
idler = data;
|
||||||
idler->all_done = 1;
|
|
||||||
idler->pass = ecore_time_get();
|
idler->pass = ecore_time_get();
|
||||||
/* Even though we are only interested in the next one, the hash may have changed
|
while (idler->apps != NULL)
|
||||||
* since we last looked at it, so iterate through them again. Doesn't seem to
|
{
|
||||||
* slow the process down much.
|
E_App *a;
|
||||||
*/
|
double t;
|
||||||
/* FIXME: on a slow enough system this will never complete. the hash walk
|
|
||||||
* may abort before scanning anything t all (entries walked in hash all
|
a = idler->apps->data;
|
||||||
* already filled but further entries later in the hash walk will never
|
E_OBJECT_CHECK(a);
|
||||||
* be reashed as timeout happens before getting there)
|
E_OBJECT_TYPE_CHECK(a, E_APP_TYPE);
|
||||||
*/
|
if ((!a->idle_fill) && (!a->filled))
|
||||||
evas_hash_foreach(_e_apps_every_app, _e_apps_hash_idler_cb_init, idler);
|
{
|
||||||
printf("\nIDLE APP FILLING PASS %3.3f\n", ecore_time_get() - idler->pass);
|
struct stat st;
|
||||||
if (idler->all_done)
|
|
||||||
|
a->idle_fill = 1;
|
||||||
|
if (stat(a->path, &st) >= 0)
|
||||||
|
a->mtime = st.st_mtime;
|
||||||
|
e_app_fields_fill(a, a->path);
|
||||||
|
}
|
||||||
|
#if IDLE_ICONS
|
||||||
|
if ((!a->idle_icon) && (a->icon_type == E_APP_ICON_UNKNOWN))
|
||||||
|
{
|
||||||
|
int theme_match = 0;
|
||||||
|
|
||||||
|
a->idle_icon = 1;
|
||||||
|
_e_app_icon_type(a);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* FIXME: This time should be since the beginnig of all idler processing,
|
||||||
|
* and the time limit should be tied to the frame rate.
|
||||||
|
*/
|
||||||
|
idler->apps = evas_list_remove_list(idler->apps, idler->apps);
|
||||||
|
t = ecore_time_get() - idler->pass;
|
||||||
|
if (t > 0.02) break;
|
||||||
|
}
|
||||||
|
if (idler->apps == NULL)
|
||||||
{
|
{
|
||||||
printf("\nIDLE APP FILLING SCAN %3.3f\n", ecore_time_get() - idler->begin);
|
printf("\nIDLE APP FILLING SCAN %3.3f\n", ecore_time_get() - idler->begin);
|
||||||
#if CLEVER_BORDERS
|
#if CLEVER_BORDERS
|
||||||
|
@ -197,49 +220,6 @@ _e_apps_hash_idler_cb(void *data)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Evas_Bool
|
|
||||||
_e_apps_hash_idler_cb_init(Evas_Hash *hash, const char *key, void *data, void *fdata)
|
|
||||||
{
|
|
||||||
E_App *a;
|
|
||||||
struct _E_App_Hash_Idler *idler;
|
|
||||||
double t;
|
|
||||||
|
|
||||||
a = data;
|
|
||||||
idler = fdata;
|
|
||||||
E_OBJECT_CHECK(a);
|
|
||||||
E_OBJECT_TYPE_CHECK(a, E_APP_TYPE);
|
|
||||||
/* Either fill an E_App, or look for an icon of an already filled E_App.
|
|
||||||
* Icon searching can take a long time, so don't do both at once. */
|
|
||||||
if ((!a->idle_fill) && (!a->filled))
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
a->idle_fill = 1;
|
|
||||||
if (stat(a->path, &st) >= 0)
|
|
||||||
a->mtime = st.st_mtime;
|
|
||||||
/* FIXME: the main problem is this call - when it does get run it can
|
|
||||||
* sometimes take 0.2 or 0.3 seconds, causing much jerkiness */
|
|
||||||
e_app_fields_fill(a, a->path);
|
|
||||||
}
|
|
||||||
#if IDLE_ICONS
|
|
||||||
else if ((!a->idle_icon) && (a->icon_type == E_APP_ICON_UNKNOWN))
|
|
||||||
{
|
|
||||||
int theme_match = 0;
|
|
||||||
|
|
||||||
a->idle_icon = 1;
|
|
||||||
_e_app_icon_type(a);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* FIXME: This time should be since the beginnig of all idler processing,
|
|
||||||
* and the time limit should be tied to the frame rate.
|
|
||||||
*/
|
|
||||||
t = ecore_time_get() - idler->pass;
|
|
||||||
if (t < 0.02) return 1;
|
|
||||||
idler->all_done = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if CLEVER_BORDERS
|
#if CLEVER_BORDERS
|
||||||
static Evas_Bool
|
static Evas_Bool
|
||||||
|
|
Loading…
Reference in New Issue