Don't reallocate the Efreet_Desktop on re-read
SVN revision: 29204
This commit is contained in:
parent
af731bf780
commit
0c5a7e8872
|
@ -46,6 +46,8 @@ struct Efreet_Desktop_Type_Info
|
||||||
};
|
};
|
||||||
|
|
||||||
static Efreet_Desktop *efreet_desktop_new(const char *file);
|
static Efreet_Desktop *efreet_desktop_new(const char *file);
|
||||||
|
static int efreet_desktop_read(Efreet_Desktop *desktop);
|
||||||
|
static void efreet_desktop_clear(Efreet_Desktop *desktop);
|
||||||
static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str);
|
static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str);
|
||||||
static Ecore_List *efreet_desktop_string_list_parse(const char *string);
|
static Ecore_List *efreet_desktop_string_list_parse(const char *string);
|
||||||
static char *efreet_desktop_string_list_join(Ecore_List *list);
|
static char *efreet_desktop_string_list_join(Ecore_List *list);
|
||||||
|
@ -193,6 +195,10 @@ efreet_desktop_get(const char *file)
|
||||||
if (efreet_desktop_cache_check(desktop))
|
if (efreet_desktop_cache_check(desktop))
|
||||||
return desktop;
|
return desktop;
|
||||||
|
|
||||||
|
efreet_desktop_clear(desktop);
|
||||||
|
if (efreet_desktop_read(desktop))
|
||||||
|
return desktop;
|
||||||
|
|
||||||
ecore_hash_remove(efreet_desktop_cache, file);
|
ecore_hash_remove(efreet_desktop_cache, file);
|
||||||
efreet_desktop_free(desktop);
|
efreet_desktop_free(desktop);
|
||||||
}
|
}
|
||||||
|
@ -235,9 +241,6 @@ static Efreet_Desktop *
|
||||||
efreet_desktop_new(const char *file)
|
efreet_desktop_new(const char *file)
|
||||||
{
|
{
|
||||||
Efreet_Desktop *desktop;
|
Efreet_Desktop *desktop;
|
||||||
Efreet_Ini *ini;
|
|
||||||
int error = 0;
|
|
||||||
int ok;
|
|
||||||
|
|
||||||
desktop = NEW(Efreet_Desktop, 1);
|
desktop = NEW(Efreet_Desktop, 1);
|
||||||
if (!desktop) return NULL;
|
if (!desktop) return NULL;
|
||||||
|
@ -245,13 +248,32 @@ efreet_desktop_new(const char *file)
|
||||||
desktop->orig_path = strdup(file);
|
desktop->orig_path = strdup(file);
|
||||||
desktop->load_time = ecore_time_get();
|
desktop->load_time = ecore_time_get();
|
||||||
|
|
||||||
ini = efreet_ini_new(file);
|
if (!efreet_desktop_read(desktop))
|
||||||
|
{
|
||||||
|
efreet_desktop_free(desktop);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return desktop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @param desktop: The desktop to fill
|
||||||
|
* @return Returns 1 on success, 0 on failure
|
||||||
|
* @brief initialize an Efreet_Desktop from the contents of @a file
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
efreet_desktop_read(Efreet_Desktop *desktop)
|
||||||
|
{
|
||||||
|
Efreet_Ini *ini;
|
||||||
|
int error = 0;
|
||||||
|
int ok;
|
||||||
|
|
||||||
|
ini = efreet_ini_new(desktop->orig_path);
|
||||||
if (!ini->data)
|
if (!ini->data)
|
||||||
{
|
{
|
||||||
efreet_ini_free(ini);
|
efreet_ini_free(ini);
|
||||||
IF_FREE(desktop->orig_path);
|
return 0;
|
||||||
free(desktop);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = efreet_ini_section_set(ini, "Desktop Entry");
|
ok = efreet_ini_section_set(ini, "Desktop Entry");
|
||||||
|
@ -287,11 +309,45 @@ efreet_desktop_new(const char *file)
|
||||||
|
|
||||||
efreet_ini_free(ini);
|
efreet_ini_free(ini);
|
||||||
|
|
||||||
if (!error)
|
if (error) return 0;
|
||||||
return desktop;
|
|
||||||
|
|
||||||
efreet_desktop_free(desktop);
|
return 1;
|
||||||
return NULL;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @param desktop: The Efreet_Desktop to work with
|
||||||
|
* @return Returns no value
|
||||||
|
* @brief Frees the Efreet_Desktop's data
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
efreet_desktop_clear(Efreet_Desktop *desktop)
|
||||||
|
{
|
||||||
|
IF_FREE(desktop->name);
|
||||||
|
IF_FREE(desktop->generic_name);
|
||||||
|
IF_FREE(desktop->comment);
|
||||||
|
IF_FREE(desktop->icon);
|
||||||
|
IF_FREE(desktop->url);
|
||||||
|
|
||||||
|
IF_FREE(desktop->try_exec);
|
||||||
|
IF_FREE(desktop->exec);
|
||||||
|
IF_FREE(desktop->path);
|
||||||
|
IF_FREE(desktop->startup_wm_class);
|
||||||
|
|
||||||
|
IF_FREE_LIST(desktop->only_show_in);
|
||||||
|
IF_FREE_LIST(desktop->not_show_in);
|
||||||
|
IF_FREE_LIST(desktop->categories);
|
||||||
|
IF_FREE_LIST(desktop->mime_types);
|
||||||
|
|
||||||
|
IF_FREE_HASH(desktop->x);
|
||||||
|
|
||||||
|
if (desktop->type_data)
|
||||||
|
{
|
||||||
|
Efreet_Desktop_Type_Info *info;
|
||||||
|
info = ecore_list_goto_index(efreet_desktop_types, desktop->type);
|
||||||
|
if (info->free_func)
|
||||||
|
info->free_func(desktop->type_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue