discomfitor pushed a commit to branch master.
commit f4641152d0b67248c26c492b8a9c36621469eaeb
Author: Mike Blumenkrantz <[email protected]>
Date: Tue Jun 18 09:28:07 2013 +0100
add tmpfile caching for teamwork media and delete video objects more
reliably using a hack to work around stupid eo deletion bug
---
src/modules/teamwork/e_mod_main.h | 1 +
src/modules/teamwork/e_mod_tw.c | 97 +++++++++++++++++++++++++++++++++------
2 files changed, 83 insertions(+), 15 deletions(-)
diff --git a/src/modules/teamwork/e_mod_main.h
b/src/modules/teamwork/e_mod_main.h
index 5e6faba..3a70d7b 100644
--- a/src/modules/teamwork/e_mod_main.h
+++ b/src/modules/teamwork/e_mod_main.h
@@ -38,6 +38,7 @@ typedef struct Mod
E_Popup *pop;
Eina_Bool sticky : 1;
Eina_Bool force : 1;
+ Eina_Bool hidden : 1;
} Mod;
extern Teamwork_Config *tw_config;
diff --git a/src/modules/teamwork/e_mod_tw.c b/src/modules/teamwork/e_mod_tw.c
index 533bb81..3543af4 100644
--- a/src/modules/teamwork/e_mod_tw.c
+++ b/src/modules/teamwork/e_mod_tw.c
@@ -27,6 +27,7 @@ typedef struct Media
unsigned long long timestamp;
unsigned int tries;
Ecore_Thread *video_thread;
+ Eina_Stringshare *tmpfile;
Eina_Bool video;
Eina_Bool dummy : 1;
Eina_Bool valid : 1;
@@ -295,6 +296,8 @@ download_media_free(Media *i)
tw_mod->media_list = eina_inlist_remove(tw_mod->media_list,
EINA_INLIST_GET(i));
if (i->client) ecore_con_url_free(i->client);
if (i->buf) eina_binbuf_free(i->buf);
+ if (i->tmpfile) ecore_file_unlink(i->tmpfile);
+ eina_stringshare_del(i->tmpfile);
eina_stringshare_del(i->addr);
free(i);
}
@@ -440,7 +443,10 @@ dbus_link_mouse_in_cb(const Eldbus_Service_Interface
*iface EINA_UNUSED, const E
unsigned int t;
if (eldbus_message_arguments_get(msg, "suii", &uri, &t, &last_coords.x,
&last_coords.y))
- dbus_link_show_helper(uri, 0);
+ {
+ dbus_link_show_helper(uri, 0);
+ tw_mod->hidden = 0;
+ }
return eldbus_message_method_return_new(msg);
}
@@ -465,6 +471,9 @@ dbus_link_mouse_out_cb(const Eldbus_Service_Interface
*iface EINA_UNUSED, const
tw_hide(NULL);
tw_mod->force = 0;
}
+ else if (tw_tmpthread || tw_tmpfile)
+ tw_hide(NULL);
+ tw_mod->hidden = 1;
}
return eldbus_message_method_return_new(msg);
}
@@ -818,6 +827,24 @@ tw_show_helper(Evas_Object *o, int w, int h)
}
#ifdef HAVE_EMOTION
+
+static Eina_Bool
+stupid_obj_del_workaround_hack(void *data)
+{
+ evas_object_del(data);
+ return EINA_FALSE;
+}
+
+static void
+tw_video_closed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ evas_object_hide(obj);
+ evas_object_hide(data);
+ ecore_timer_add(3.0, stupid_obj_del_workaround_hack, data);
+ if (!tw_tmpfile) return;
+ eina_stringshare_replace(&tw_tmpfile, NULL);
+}
+
static void
tw_video_opened_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
@@ -825,6 +852,11 @@ tw_video_opened_cb(void *data, Evas_Object *obj, void
*event_info EINA_UNUSED)
double ratio = tw_config->popup_size / 100.;
E_Zone *zone;
+ if (tw_mod->hidden && (!tw_mod->sticky) && (!tw_mod->force))
+ {
+ tw_video_closed_cb(data, obj, NULL);
+ return;
+ }
emotion_object_size_get(obj, &iw, &ih);
zone = e_zone_current_get(e_util_container_current_get());
@@ -847,7 +879,6 @@ tw_video_del_cb(void *data EINA_UNUSED, Evas *e
EINA_UNUSED, Evas_Object *obj, v
{
if (emotion_object_file_get(obj) != tw_tmpfile) return;
if (!tw_tmpfile) return;
- ecore_file_unlink(tw_tmpfile);
eina_stringshare_replace(&tw_tmpfile, NULL);
}
@@ -857,6 +888,7 @@ tw_show_video(Evas_Object *prev, const char *uri)
Evas_Object *o;
o = emotion_object_add(e_widget_preview_evas_get(prev));
+ e_util_size_debug_set(o, 1);
#if (EMOTION_VERSION_MAJOR > 1) || (EMOTION_VERSION_MINOR >= 8)
emotion_object_init(o, "vlc");
#else
@@ -865,6 +897,7 @@ tw_show_video(Evas_Object *prev, const char *uri)
emotion_object_file_set(o, uri);
emotion_object_play_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "frame_decode", tw_video_opened_cb, prev);
+ evas_object_smart_callback_add(o, "decode_stop", tw_video_closed_cb, prev);
evas_object_resize(o, 1, 1);
if (uri == tw_tmpfile)
evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, tw_video_del_cb,
NULL);
@@ -896,6 +929,7 @@ tw_video_thread_done_cb(void *data, Ecore_Thread *eth)
tw_tmpthread_media = NULL;
close(tw_tmpfd);
tw_tmpfd = -1;
+ i->tmpfile = eina_stringshare_ref(tw_tmpfile);
prev = e_widget_preview_add(e_util_comp_current_get()->evas, 50, 50);
tw_show_video(prev, tw_tmpfile);
download_media_cleanup();
@@ -916,7 +950,7 @@ tw_video_thread_cb(void *data, Ecore_Thread *eth)
if (ftruncate(fd, 0))
{
ERR("TRUNCATE FAILED: %s", strerror(errno));
- ecore_thread_local_data_add(eth, "dead", (void*)1, NULL, 0);
+ ecore_thread_cancel(eth);
return; //fail if file can't be zeroed
}
tot = eina_binbuf_length_get(i->buf);
@@ -927,7 +961,12 @@ tw_video_thread_cb(void *data, Ecore_Thread *eth)
if (pos + num >= tot)
num = tot - pos;
- if (write(fd, buf + pos, num) < 0) break;
+ if (write(fd, buf + pos, num) < 0)
+ {
+ ERR("WRITE FAILED: %s", strerror(errno));
+ ecore_thread_cancel(eth);
+ return;
+ }
pos += num;
if (ecore_thread_local_data_find(eth, "dead")) break;
}
@@ -955,20 +994,35 @@ tw_show(Media *i)
const char *tmp;
if (tw_config->disable_video) return;
+ while (i->tmpfile)
+ {
+ if (!ecore_file_exists(i->tmpfile))
+ {
+ eina_stringshare_replace(&i->tmpfile, NULL);
+ break;
+ }
+ if (tw_tmpthread)
+ {
+ ecore_thread_local_data_add(tw_tmpthread, "dead", (void*)1,
NULL, 0);
+ E_FREE_FUNC(tw_tmpthread, ecore_thread_cancel);
+ tw_tmpthread_media->video_thread = NULL;
+ }
+ if (tw_tmpfd != -1)
+ {
+ close(tw_tmpfd);
+ tw_tmpfd = -1;
+ }
+ eina_stringshare_del(tw_tmpfile);
+ tw_tmpfile = eina_stringshare_ref(i->tmpfile);
+ prev = e_widget_preview_add(e_util_comp_current_get()->evas, 50,
50);
+ tw_show_video(prev, tw_tmpfile);
+ return;
+ }
tmp = getenv("XDG_RUNTIME_DIR");
if (!tmp) tmp = "/tmp";
snprintf(buf, sizeof(buf), "%s/teamwork-%s-XXXXXX", tmp,
ecore_file_file_get(i->addr));
if (tw_tmpfile)
{
- if (tw_tmpthread_media == i)
- {
- if (!tw_tmpthread)
- {
- prev =
e_widget_preview_add(e_util_comp_current_get()->evas, 50, 50);
- tw_show_video(prev, tw_tmpfile);
- }
- return;
- }
if (tw_tmpthread)
{
ecore_thread_local_data_add(tw_tmpthread, "dead", (void*)1,
NULL, 0);
@@ -976,7 +1030,6 @@ tw_show(Media *i)
tw_tmpthread_media->video_thread = NULL;
}
close(tw_tmpfd);
- ecore_file_unlink(tw_tmpfile);
}
tw_tmpfd = mkstemp(buf);
eina_stringshare_replace(&tw_tmpfile, buf);
@@ -1077,6 +1130,21 @@ focus_out(void *data EINA_UNUSED, int type EINA_UNUSED,
E_Event_Border_Focus_Out
EINTERN Eina_Bool
tw_hide(void *d EINA_UNUSED)
{
+ if (tw_tmpthread)
+ {
+ ecore_thread_local_data_add(tw_tmpthread, "dead", (void*)1, NULL, 0);
+ E_FREE_FUNC(tw_tmpthread, ecore_thread_cancel);
+ tw_tmpthread_media->video_thread = NULL;
+ }
+ if (tw_tmpfd != -1)
+ {
+ close(tw_tmpfd);
+ tw_tmpfd = -1;
+ }
+ if (tw_tmpfile)
+ {
+ eina_stringshare_replace(&tw_tmpfile, NULL);
+ }
E_FREE_FUNC(tw_mod->pop, e_object_del);
last_coords.x = last_coords.y = 0;
E_FREE_FUNC(tw_hide_timer, ecore_timer_del);
@@ -1168,7 +1236,6 @@ e_tw_shutdown(void)
{
close(tw_tmpfd);
tw_tmpfd = -1;
- ecore_file_unlink(tw_tmpfile);
}
eina_stringshare_replace(&tw_tmpfile, NULL);
E_FREE_FUNC(tw_tmpthread, ecore_thread_cancel);
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev