summaryrefslogtreecommitdiff
path: root/src/lib/elc_fileselector.c
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-01-07 19:33:27 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-01-07 19:34:15 +0900
commit3c9cdb0cc1047743eb35e655375278cd00c615c8 (patch)
tree797f142052f2944183b186d89dc43e83d263fe9d /src/lib/elc_fileselector.c
parentd0bbe5f6cf6c43d2dca55fdc9a61fecfca091853 (diff)
downloadelementary-3c9cdb0cc1047743eb35e655375278cd00c615c8.tar.gz
elm filesel - fix eio access of widget data after de in eio threads
@fix
Diffstat (limited to 'src/lib/elc_fileselector.c')
-rw-r--r--src/lib/elc_fileselector.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c
index 9a70311a6..c5d9a19bb 100644
--- a/src/lib/elc_fileselector.c
+++ b/src/lib/elc_fileselector.c
@@ -376,18 +376,20 @@ _ls_filter_cb(void *data,
Eina_Bool dir = EINA_FALSE;
char *pch = NULL, *temp = NULL;
char temp_path[EINA_PATH_MAX];
+ ELM_FILESELECTOR_DATA_GET(lreq->obj, sd);
- if (!lreq->sd->hidden_visible && info->path[info->name_start] == '.')
+ if (!sd) return EINA_FALSE;
+ if (!sd->hidden_visible && info->path[info->name_start] == '.')
return EINA_FALSE;
if (info->type == EINA_FILE_DIR)
dir = EINA_TRUE;
- if (lreq->sd->only_folder && !dir)
+ if (sd->only_folder && !dir)
return EINA_FALSE;
//Search entry filter
- if ((lreq->sd->search_string) && (lreq->sd->search_string[0] != '\0'))
+ if ((sd->search_string) && (sd->search_string[0] != '\0'))
{
strcpy(temp_path, info->path);
pch = strchr(temp_path, '/');
@@ -397,11 +399,12 @@ _ls_filter_cb(void *data,
pch = strchr(pch + 1, '/');
}
temp++;
- if ((temp) && (lreq->sd->search_string) && (!strstr(temp, lreq->sd->search_string)))
+ if ((temp) && (sd->search_string) &&
+ (!strstr(temp, sd->search_string)))
return EINA_FALSE;
}
- cf = lreq->sd->current_filter;
+ cf = sd->current_filter;
if (!cf)
return EINA_TRUE;
@@ -528,13 +531,15 @@ _file_list_cmp(const void *a, const void *b)
static void
_signal_first(Listing_Request *lreq)
{
+ ELM_FILESELECTOR_DATA_GET(lreq->obj, sd);
+
if (!lreq->first) return;
+ if (!sd) return;
- if (lreq->sd->multi)
+ if (sd->multi)
{
char *path;
- EINA_LIST_FREE(lreq->sd->paths, path)
- free(path);
+ EINA_LIST_FREE(sd->paths, path) free(path);
}
evas_object_smart_callback_call
@@ -542,11 +547,11 @@ _signal_first(Listing_Request *lreq)
if (!lreq->parent_it)
{
- if (lreq->sd->mode == ELM_FILESELECTOR_LIST)
- elm_genlist_clear(lreq->sd->files_view);
+ if (sd->mode == ELM_FILESELECTOR_LIST)
+ elm_genlist_clear(sd->files_view);
else
- elm_gengrid_clear(lreq->sd->files_view);
- eina_stringshare_replace(&lreq->sd->path, lreq->path);
+ elm_gengrid_clear(sd->files_view);
+ eina_stringshare_replace(&sd->path, lreq->path);
_anchors_do(lreq->obj, lreq->path);
}
@@ -561,10 +566,12 @@ _ls_main_cb(void *data,
Listing_Request *lreq = data;
Elm_Object_Item *item;
int itcn = ELM_FILE_UNKNOW;
-
+ ELM_FILESELECTOR_DATA_GET(lreq->obj, sd);
+
if (eio_file_check(handler)) return;
+ if (!sd) return;
- if (!lreq->sd->files_view || lreq->sd->current != handler)
+ if (!sd->files_view || sd->current != handler)
{
eio_file_cancel(handler);
return;
@@ -581,31 +588,31 @@ _ls_main_cb(void *data,
itcn = ELM_FILE_IMAGE;
}
- if (lreq->sd->mode == ELM_FILESELECTOR_LIST)
+ if (sd->mode == ELM_FILESELECTOR_LIST)
{
- item = elm_genlist_item_sorted_insert(lreq->sd->files_view, list_itc[itcn],
+ item = elm_genlist_item_sorted_insert(sd->files_view, list_itc[itcn],
eina_stringshare_add(info->path),
lreq->parent_it,
- ((lreq->sd->expand) && (itcn == ELM_DIRECTORY))
+ ((sd->expand) && (itcn == ELM_DIRECTORY))
? ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE,
_file_list_cmp, NULL, NULL);
if (lreq->selected && !strcmp(info->path, lreq->selected))
{
elm_genlist_item_selected_set(item, EINA_TRUE);
- elm_object_text_set(lreq->sd->name_entry, ecore_file_file_get(info->path));
+ elm_object_text_set(sd->name_entry, ecore_file_file_get(info->path));
}
}
- else if (lreq->sd->mode == ELM_FILESELECTOR_GRID)
+ else if (sd->mode == ELM_FILESELECTOR_GRID)
{
- item = elm_gengrid_item_sorted_insert(lreq->sd->files_view, grid_itc[itcn],
+ item = elm_gengrid_item_sorted_insert(sd->files_view, grid_itc[itcn],
eina_stringshare_add(info->path),
_file_grid_cmp, NULL, NULL);
if (lreq->selected && !strcmp(info->path, lreq->selected))
{
elm_gengrid_item_selected_set(item, EINA_TRUE);
- elm_object_text_set(lreq->sd->name_entry, ecore_file_file_get(info->path));
+ elm_object_text_set(sd->name_entry, ecore_file_file_get(info->path));
}
}
}
@@ -613,8 +620,6 @@ _ls_main_cb(void *data,
static void
_listing_request_cleanup(Listing_Request *lreq)
{
- EINA_REFCOUNT_UNREF(lreq->sd) _elm_fileselector_smart_del_do(lreq->sd);
-
eina_stringshare_del(lreq->path);
eina_stringshare_del(lreq->selected);
free(lreq);
@@ -624,12 +629,16 @@ static void
_ls_done_cb(void *data, Eio_File *handler EINA_UNUSED)
{
Listing_Request *lreq = data;
+ ELM_FILESELECTOR_DATA_GET(lreq->obj, sd);
_signal_first(lreq);
- elm_progressbar_pulse(lreq->sd->spinner, EINA_FALSE);
- elm_layout_signal_emit(lreq->obj, "elm,action,spinner,hide", "elm");
+ if (sd)
+ {
+ elm_progressbar_pulse(sd->spinner, EINA_FALSE);
+ elm_layout_signal_emit(lreq->obj, "elm,action,spinner,hide", "elm");
+ sd->current = NULL;
+ }
- lreq->sd->current = NULL;
_listing_request_cleanup(lreq);
}
@@ -637,12 +646,14 @@ static void
_ls_error_cb(void *data, Eio_File *handler, int error EINA_UNUSED)
{
Listing_Request *lreq = data;
+ ELM_FILESELECTOR_DATA_GET(lreq->obj, sd);
- elm_progressbar_pulse(lreq->sd->spinner, EINA_FALSE);
- elm_layout_signal_emit(lreq->obj, "elm,action,spinner,hide", "elm");
-
- if (lreq->sd->current == handler)
- lreq->sd->current = NULL;
+ if (sd)
+ {
+ elm_progressbar_pulse(sd->spinner, EINA_FALSE);
+ elm_layout_signal_emit(lreq->obj, "elm,action,spinner,hide", "elm");
+ if (sd->current == handler) sd->current = NULL;
+ }
_listing_request_cleanup(lreq);
}
@@ -661,13 +672,12 @@ _populate(Evas_Object *obj,
if (sd->monitor) eio_monitor_del(sd->monitor);
if (sd->current) eio_file_cancel(sd->current);
+ sd->monitor = NULL;
+ sd->current = NULL;
lreq = malloc(sizeof (Listing_Request));
if (!lreq) return;
- lreq->sd = sd;
- EINA_REFCOUNT_REF(lreq->sd);
-
lreq->parent_it = parent_it; /* FIXME: should we refcount the parent_it ? */
lreq->obj = obj;
lreq->path = eina_stringshare_add(path);
@@ -1551,6 +1561,8 @@ _elm_fileselector_evas_object_smart_del(Eo *obj EINA_UNUSED, Elm_Fileselector_Da
if (sd->monitor) eio_monitor_del(sd->monitor);
if (sd->current) eio_file_cancel(sd->current);
+ sd->monitor = NULL;
+ sd->current = NULL;
EINA_LIST_FREE(sd->handlers, h)
{