Changed because of new ecore_file. Also fixed some potential bugs, and
maybe introduced some new :) SVN revision: 13985
This commit is contained in:
parent
78326c9ffa
commit
6baf133eef
184
src/bin/e_apps.c
184
src/bin/e_apps.c
|
@ -33,10 +33,10 @@ static void _e_app_free (E_App *a);
|
||||||
static void _e_app_fields_fill (E_App *a, const char *path);
|
static void _e_app_fields_fill (E_App *a, const char *path);
|
||||||
static void _e_app_fields_empty (E_App *a);
|
static void _e_app_fields_empty (E_App *a);
|
||||||
static Evas_List *_e_app_dir_file_list_get (E_App *a);
|
static Evas_List *_e_app_dir_file_list_get (E_App *a);
|
||||||
static E_App *_e_app_subapp_path_find (E_App *a, const char *subpath);
|
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);
|
||||||
static int _e_apps_cb_exit (void *data, int type, void *event);
|
static int _e_apps_cb_exit (void *data, int type, void *event);
|
||||||
static void _e_app_cb_monitor (void *data, Ecore_File_Monitor *em, Ecore_File_Type type, Ecore_File_Event event, const char *path);
|
static void _e_app_cb_monitor (void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path);
|
||||||
static void _e_app_subdir_rescan (E_App *app);
|
static void _e_app_subdir_rescan (E_App *app);
|
||||||
static int _e_app_is_eapp (const char *path);
|
static int _e_app_is_eapp (const char *path);
|
||||||
|
|
||||||
|
@ -106,7 +106,10 @@ e_app_new(const char *path, int scan_subdirs)
|
||||||
if (a)
|
if (a)
|
||||||
{
|
{
|
||||||
if (a->deleted)
|
if (a->deleted)
|
||||||
return NULL;
|
{
|
||||||
|
printf("BUG E_App: Deleted flag shouldn't be needed: %s\n", a->path);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
e_object_ref(E_OBJECT(a));
|
e_object_ref(E_OBJECT(a));
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
@ -225,6 +228,10 @@ e_app_subdir_scan(E_App *a, int scan_subdirs)
|
||||||
if (a2)
|
if (a2)
|
||||||
{
|
{
|
||||||
a2->references = evas_list_append(a2->references, a);
|
a2->references = evas_list_append(a2->references, a);
|
||||||
|
/* Don't add an extra ref when referencing,
|
||||||
|
* else the object won't be deleted after deleting from
|
||||||
|
* disk */
|
||||||
|
e_object_unref(E_OBJECT(a2));
|
||||||
a->subapps = evas_list_append(a->subapps, a2);
|
a->subapps = evas_list_append(a->subapps, a2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -363,13 +370,14 @@ _e_app_free(E_App *a)
|
||||||
{
|
{
|
||||||
/* If we are the parent, remove us */
|
/* If we are the parent, remove us */
|
||||||
a2->parent = NULL;
|
a2->parent = NULL;
|
||||||
|
/* unref the child so it will be deleted too */
|
||||||
|
e_object_unref(E_OBJECT(a2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We have a reference */
|
/* We have a reference */
|
||||||
a2->references = evas_list_remove(a2->references, a);
|
a2->references = evas_list_remove(a2->references, a);
|
||||||
}
|
}
|
||||||
e_object_unref(E_OBJECT(a2));
|
|
||||||
}
|
}
|
||||||
for (l = a->references; l; l = l->next)
|
for (l = a->references; l; l = l->next)
|
||||||
{
|
{
|
||||||
|
@ -603,7 +611,7 @@ _e_app_dir_file_list_get(E_App *a)
|
||||||
}
|
}
|
||||||
|
|
||||||
static E_App *
|
static E_App *
|
||||||
_e_app_subapp_path_find(E_App *a, const char *subpath)
|
_e_app_subapp_file_find(E_App *a, const char *file)
|
||||||
{
|
{
|
||||||
Evas_List *l;
|
Evas_List *l;
|
||||||
|
|
||||||
|
@ -612,7 +620,7 @@ _e_app_subapp_path_find(E_App *a, const char *subpath)
|
||||||
E_App *a2;
|
E_App *a2;
|
||||||
|
|
||||||
a2 = l->data;
|
a2 = l->data;
|
||||||
if ((!strcmp(a2->path, subpath)) && (!a2->deleted)) return a2;
|
if ((!strcmp(ecore_file_get_file(a2->path), file)) && (!a2->deleted)) return a2;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -623,6 +631,7 @@ _e_app_change(E_App *a, E_App_Change ch)
|
||||||
Evas_List *l;
|
Evas_List *l;
|
||||||
|
|
||||||
_e_apps_callbacks_walking = 1;
|
_e_apps_callbacks_walking = 1;
|
||||||
|
printf("Change: %d %s\n", ch, a->path);
|
||||||
for (l = _e_apps_change_callbacks; l; l = l->next)
|
for (l = _e_apps_change_callbacks; l; l = l->next)
|
||||||
{
|
{
|
||||||
E_App_Callback *cb;
|
E_App_Callback *cb;
|
||||||
|
@ -675,19 +684,13 @@ _e_apps_cb_exit(void *data, int type, void *event)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_app_cb_monitor(void *data, Ecore_File_Monitor *em,
|
_e_app_cb_monitor(void *data, Ecore_File_Monitor *em,
|
||||||
Ecore_File_Type type, Ecore_File_Event event, const char *path)
|
Ecore_File_Event event, const char *path)
|
||||||
{
|
{
|
||||||
E_App *app;
|
E_App *app;
|
||||||
Evas_List *l;
|
|
||||||
char *file;
|
char *file;
|
||||||
|
|
||||||
app = data;
|
app = data;
|
||||||
|
printf("Event: %d %s %s\n", event, path, app->path);
|
||||||
if (ecore_file_monitor_type_get(em) != ECORE_FILE_TYPE_DIRECTORY)
|
|
||||||
{
|
|
||||||
printf("BUG: E_App should only monitor directories!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If this dir isn't scanned yet, no need to report changes! */
|
/* If this dir isn't scanned yet, no need to report changes! */
|
||||||
if (!app->scanned)
|
if (!app->scanned)
|
||||||
|
@ -696,90 +699,74 @@ _e_app_cb_monitor(void *data, Ecore_File_Monitor *em,
|
||||||
file = ecore_file_get_file((char *)path);
|
file = ecore_file_get_file((char *)path);
|
||||||
if (!strcmp(file, ".order"))
|
if (!strcmp(file, ".order"))
|
||||||
{
|
{
|
||||||
switch (event)
|
if ((event == ECORE_FILE_EVENT_CREATED_FILE)
|
||||||
|
|| (event == ECORE_FILE_EVENT_DELETED_FILE)
|
||||||
|
|| (event == ECORE_FILE_EVENT_MODIFIED))
|
||||||
{
|
{
|
||||||
case ECORE_FILE_EVENT_NONE:
|
|
||||||
case ECORE_FILE_EVENT_EXISTS:
|
|
||||||
break;
|
|
||||||
case ECORE_FILE_EVENT_CREATED:
|
|
||||||
case ECORE_FILE_EVENT_DELETED:
|
|
||||||
case ECORE_FILE_EVENT_CHANGED:
|
|
||||||
_e_app_subdir_rescan(app);
|
_e_app_subdir_rescan(app);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strcmp(file, ".directory.eapp"))
|
else if (!strcmp(file, ".directory.eapp"))
|
||||||
{
|
{
|
||||||
switch (event)
|
if ((event == ECORE_FILE_EVENT_CREATED_FILE)
|
||||||
|
|| (event == ECORE_FILE_EVENT_MODIFIED))
|
||||||
{
|
{
|
||||||
case ECORE_FILE_EVENT_NONE:
|
_e_app_fields_empty(app);
|
||||||
case ECORE_FILE_EVENT_EXISTS:
|
_e_app_fields_fill(app, path);
|
||||||
break;
|
_e_app_change(app, E_APP_CHANGE);
|
||||||
case ECORE_FILE_EVENT_CREATED:
|
}
|
||||||
case ECORE_FILE_EVENT_CHANGED:
|
else if (event == ECORE_FILE_EVENT_DELETED_FILE)
|
||||||
_e_app_fields_empty(app);
|
{
|
||||||
_e_app_fields_fill(app, path);
|
_e_app_fields_empty(app);
|
||||||
_e_app_change(app, E_APP_CHANGE);
|
app->name = strdup(ecore_file_get_file(app->path));
|
||||||
break;
|
|
||||||
case ECORE_FILE_EVENT_DELETED:
|
|
||||||
_e_app_fields_empty(app);
|
|
||||||
app->name = strdup(ecore_file_get_file(app->path));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
E_App *a2;
|
if (event == ECORE_FILE_EVENT_MODIFIED)
|
||||||
|
|
||||||
switch (event)
|
|
||||||
{
|
{
|
||||||
case ECORE_FILE_EVENT_NONE:
|
E_App *a2;
|
||||||
case ECORE_FILE_EVENT_EXISTS:
|
|
||||||
break;
|
|
||||||
case ECORE_FILE_EVENT_CREATED:
|
|
||||||
/* If a file is created, wait for the directory change to update
|
|
||||||
* the eapp. */
|
|
||||||
/* FIXME: If in a main repository, check if someone else wants this
|
|
||||||
* file! */
|
|
||||||
break;
|
|
||||||
case ECORE_FILE_EVENT_DELETED:
|
|
||||||
/* If something is deleted, mark it as deleted
|
|
||||||
* and wait for the directory change to update
|
|
||||||
* the client. */
|
|
||||||
a2 = _e_app_subapp_path_find(app, path);
|
|
||||||
if (a2)
|
|
||||||
{
|
|
||||||
a2->deleted = 1;
|
|
||||||
/* If this app is in a main repository, tell all referencing
|
|
||||||
* apps to rescan. */
|
|
||||||
for (l = a2->references; l; l = l->next)
|
|
||||||
{
|
|
||||||
E_App *app;
|
|
||||||
|
|
||||||
app = l->data;
|
a2 = _e_app_subapp_file_find(app, file);
|
||||||
_e_app_subdir_rescan(app);
|
if (a2)
|
||||||
}
|
{
|
||||||
}
|
_e_app_fields_empty(a2);
|
||||||
break;
|
_e_app_fields_fill(a2, path);
|
||||||
case ECORE_FILE_EVENT_CHANGED:
|
_e_app_change(a2, E_APP_CHANGE);
|
||||||
if (type == ECORE_FILE_TYPE_FILE)
|
}
|
||||||
{
|
}
|
||||||
a2 = _e_app_subapp_path_find(app, path);
|
else if ((event == ECORE_FILE_EVENT_CREATED_FILE)
|
||||||
if (a2)
|
|| (event == ECORE_FILE_EVENT_CREATED_DIRECTORY))
|
||||||
{
|
{
|
||||||
_e_app_fields_empty(a2);
|
/* FIXME: Check if someone wants a reference to this
|
||||||
_e_app_fields_fill(a2, path);
|
* app */
|
||||||
_e_app_change(a2, E_APP_CHANGE);
|
_e_app_subdir_rescan(app);
|
||||||
}
|
}
|
||||||
}
|
else if ((event == ECORE_FILE_EVENT_DELETED_FILE)
|
||||||
/* If the current directory has changed, we must rescan
|
|| (event == ECORE_FILE_EVENT_DELETED_DIRECTORY))
|
||||||
* to check which files are here. */
|
{
|
||||||
if ((type == ECORE_FILE_TYPE_DIRECTORY) && !strcmp(path, app->path))
|
E_App *a;
|
||||||
{
|
|
||||||
/* We don't know why it's changed, better rescan... */
|
a = _e_app_subapp_file_find(app, file);
|
||||||
_e_app_subdir_rescan(app);
|
if (a)
|
||||||
}
|
{
|
||||||
break;
|
a->deleted = 1;
|
||||||
|
_e_app_subdir_rescan(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event == ECORE_FILE_EVENT_DELETED_SELF)
|
||||||
|
{
|
||||||
|
Evas_List *l;
|
||||||
|
|
||||||
|
app->deleted = 1;
|
||||||
|
for (l = app->references; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_App *a2;
|
||||||
|
|
||||||
|
a2 = l->data;
|
||||||
|
_e_app_subdir_rescan(a2);
|
||||||
|
}
|
||||||
|
_e_app_change(app, E_APP_DEL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -799,23 +786,7 @@ _e_app_subdir_rescan(E_App *app)
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
s = l->data;
|
s = l->data;
|
||||||
snprintf(buf, sizeof(buf), "%s/%s", app->path, s);
|
a2 = _e_app_subapp_file_find(app, s);
|
||||||
a2 = _e_app_subapp_path_find(app, buf);
|
|
||||||
if (!a2)
|
|
||||||
{
|
|
||||||
/* Do we have a reference? */
|
|
||||||
/* FIXME: Keep the reference, or check if a file
|
|
||||||
* has appeared locally? */
|
|
||||||
Evas_List *pl;
|
|
||||||
|
|
||||||
pl = _e_apps_repositories;
|
|
||||||
while ((!a2) && (pl))
|
|
||||||
{
|
|
||||||
snprintf(buf, sizeof(buf), "%s/%s", (char *)pl->data, s);
|
|
||||||
a2 = _e_app_subapp_path_find(app, buf);
|
|
||||||
pl = pl->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!a2)
|
if (!a2)
|
||||||
{
|
{
|
||||||
/* If we still haven't found it, it is new! */
|
/* If we still haven't found it, it is new! */
|
||||||
|
@ -848,7 +819,9 @@ _e_app_subdir_rescan(E_App *app)
|
||||||
ch = calloc(1, sizeof(E_App_Change_Info));
|
ch = calloc(1, sizeof(E_App_Change_Info));
|
||||||
ch->app = a2;
|
ch->app = a2;
|
||||||
ch->change = E_APP_ADD;
|
ch->change = E_APP_ADD;
|
||||||
|
/* Don't add an extra ref, already added by e_app_new
|
||||||
e_object_ref(E_OBJECT(ch->app));
|
e_object_ref(E_OBJECT(ch->app));
|
||||||
|
*/
|
||||||
changes = evas_list_append(changes, ch);
|
changes = evas_list_append(changes, ch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -872,6 +845,7 @@ _e_app_subdir_rescan(E_App *app)
|
||||||
}
|
}
|
||||||
if (a2)
|
if (a2)
|
||||||
{
|
{
|
||||||
|
a2->deleted = 1;
|
||||||
ch = calloc(1, sizeof(E_App_Change_Info));
|
ch = calloc(1, sizeof(E_App_Change_Info));
|
||||||
ch->app = a2;
|
ch->app = a2;
|
||||||
ch->change = E_APP_DEL;
|
ch->change = E_APP_DEL;
|
||||||
|
@ -885,6 +859,12 @@ _e_app_subdir_rescan(E_App *app)
|
||||||
/* FIXME: We only need to tell about order changes if there are! */
|
/* FIXME: We only need to tell about order changes if there are! */
|
||||||
evas_list_free(app->subapps);
|
evas_list_free(app->subapps);
|
||||||
app->subapps = subapps;
|
app->subapps = subapps;
|
||||||
|
for (l = subapps; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_App *a;
|
||||||
|
a = l->data;
|
||||||
|
printf("subapps: %s\n", a->path);
|
||||||
|
}
|
||||||
ch = calloc(1, sizeof(E_App_Change_Info));
|
ch = calloc(1, sizeof(E_App_Change_Info));
|
||||||
ch->app = app;
|
ch->app = app;
|
||||||
ch->change = E_APP_ORDER;
|
ch->change = E_APP_ORDER;
|
||||||
|
|
Loading…
Reference in New Issue