fix long-standing bug in exe exit handling! ugh...
SVN revision: 46123
This commit is contained in:
parent
30b60b5bd3
commit
c42497848b
|
@ -119,12 +119,9 @@ e_exec(E_Zone *zone, Efreet_Desktop *desktop, const char *exec,
|
||||||
if (exec)
|
if (exec)
|
||||||
inst = _e_exec_cb_exec(launch, NULL, strdup(exec), 0);
|
inst = _e_exec_cb_exec(launch, NULL, strdup(exec), 0);
|
||||||
else
|
else
|
||||||
{
|
inst = efreet_desktop_command_get(desktop, files,
|
||||||
inst =
|
|
||||||
efreet_desktop_command_get(desktop, files,
|
|
||||||
_e_exec_cb_exec, launch);
|
_e_exec_cb_exec, launch);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
inst = _e_exec_cb_exec(launch, NULL, strdup(exec), 0);
|
inst = _e_exec_cb_exec(launch, NULL, strdup(exec), 0);
|
||||||
return inst;
|
return inst;
|
||||||
|
@ -245,6 +242,7 @@ _e_exec_cb_exec(void *data, Efreet_Desktop *desktop, char *exec, int remaining)
|
||||||
|
|
||||||
efreet_desktop_ref(desktop);
|
efreet_desktop_ref(desktop);
|
||||||
inst->desktop = desktop;
|
inst->desktop = desktop;
|
||||||
|
inst->key = eina_stringshare_add(desktop->orig_path);
|
||||||
inst->exe = exe;
|
inst->exe = exe;
|
||||||
inst->startup_id = startup_id;
|
inst->startup_id = startup_id;
|
||||||
inst->launch_time = ecore_time_get();
|
inst->launch_time = ecore_time_get();
|
||||||
|
@ -252,16 +250,11 @@ _e_exec_cb_exec(void *data, Efreet_Desktop *desktop, char *exec, int remaining)
|
||||||
_e_exec_cb_expire_timer, inst);
|
_e_exec_cb_expire_timer, inst);
|
||||||
|
|
||||||
l = eina_hash_find(e_exec_instances, desktop->orig_path);
|
l = eina_hash_find(e_exec_instances, desktop->orig_path);
|
||||||
|
l = eina_list_append(l, inst);
|
||||||
if (l)
|
if (l)
|
||||||
{
|
|
||||||
l = eina_list_append(l, inst);
|
|
||||||
eina_hash_modify(e_exec_instances, desktop->orig_path, l);
|
eina_hash_modify(e_exec_instances, desktop->orig_path, l);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
l = eina_list_append(l, inst);
|
|
||||||
eina_hash_add(e_exec_instances, desktop->orig_path, l);
|
eina_hash_add(e_exec_instances, desktop->orig_path, l);
|
||||||
}
|
|
||||||
e_exec_start_pending = eina_list_append(e_exec_start_pending, desktop);
|
e_exec_start_pending = eina_list_append(e_exec_start_pending, desktop);
|
||||||
|
|
||||||
e_exehist_add(launch->launch_method, desktop->exec);
|
e_exehist_add(launch->launch_method, desktop->exec);
|
||||||
|
@ -298,17 +291,18 @@ _e_exec_instance_free(E_Exec_Instance *inst)
|
||||||
{
|
{
|
||||||
Eina_List *instances;
|
Eina_List *instances;
|
||||||
|
|
||||||
if (inst->desktop)
|
if (inst->key)
|
||||||
{
|
{
|
||||||
instances = eina_hash_find(e_exec_instances, inst->desktop->orig_path);
|
instances = eina_hash_find(e_exec_instances, inst->key);
|
||||||
if (instances)
|
if (instances)
|
||||||
{
|
{
|
||||||
instances = eina_list_remove(instances, inst);
|
instances = eina_list_remove(instances, inst);
|
||||||
if (instances)
|
if (instances)
|
||||||
eina_hash_modify(e_exec_instances, inst->desktop->orig_path, instances);
|
eina_hash_modify(e_exec_instances, inst->key, instances);
|
||||||
else
|
else
|
||||||
eina_hash_del(e_exec_instances, inst->desktop->orig_path, NULL);
|
eina_hash_del(e_exec_instances, inst->key, NULL);
|
||||||
}
|
}
|
||||||
|
eina_stringshare_del(inst->key);
|
||||||
}
|
}
|
||||||
e_exec_start_pending = eina_list_remove(e_exec_start_pending, inst->desktop);
|
e_exec_start_pending = eina_list_remove(e_exec_start_pending, inst->desktop);
|
||||||
if (inst->expire_timer) ecore_timer_del(inst->expire_timer);
|
if (inst->expire_timer) ecore_timer_del(inst->expire_timer);
|
||||||
|
@ -322,7 +316,6 @@ static int
|
||||||
_e_exec_cb_instance_finish(void *data)
|
_e_exec_cb_instance_finish(void *data)
|
||||||
{
|
{
|
||||||
_e_exec_instance_free(data);
|
_e_exec_instance_free(data);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +330,8 @@ _e_exec_cb_exit(void *data, int type, void *event)
|
||||||
if (!ev->exe) return 1;
|
if (!ev->exe) return 1;
|
||||||
// if (ecore_exe_tag_get(ev->exe)) printf(" tag %s\n", ecore_exe_tag_get(ev->exe));
|
// if (ecore_exe_tag_get(ev->exe)) printf(" tag %s\n", ecore_exe_tag_get(ev->exe));
|
||||||
if (!(ecore_exe_tag_get(ev->exe) &&
|
if (!(ecore_exe_tag_get(ev->exe) &&
|
||||||
(!strcmp(ecore_exe_tag_get(ev->exe), "E/exec")))) return 1;
|
(!strcmp(ecore_exe_tag_get(ev->exe), "E/exec"))))
|
||||||
|
return 1;
|
||||||
inst = ecore_exe_data_get(ev->exe);
|
inst = ecore_exe_data_get(ev->exe);
|
||||||
if (!inst) return 1;
|
if (!inst) return 1;
|
||||||
|
|
||||||
|
@ -395,6 +389,7 @@ _e_exec_cb_exit(void *data, int type, void *event)
|
||||||
/* maybe better 1 minute? it might be openoffice */
|
/* maybe better 1 minute? it might be openoffice */
|
||||||
if (ecore_time_get() - inst->launch_time < 2.0)
|
if (ecore_time_get() - inst->launch_time < 2.0)
|
||||||
{
|
{
|
||||||
|
inst->exe = NULL;
|
||||||
if (inst->expire_timer) ecore_timer_del(inst->expire_timer);
|
if (inst->expire_timer) ecore_timer_del(inst->expire_timer);
|
||||||
inst->expire_timer = ecore_timer_add(e_config->exec.expire_timeout, _e_exec_cb_instance_finish, inst);
|
inst->expire_timer = ecore_timer_add(e_config->exec.expire_timeout, _e_exec_cb_instance_finish, inst);
|
||||||
}
|
}
|
||||||
|
@ -412,16 +407,17 @@ _e_exec_startup_id_pid_find(const Eina_Hash *hash __UNUSED__, const void *key __
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
search = data;
|
search = data;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(value, l, inst)
|
EINA_LIST_FOREACH(value, l, inst)
|
||||||
if (((search->startup_id > 0) && (search->startup_id == inst->startup_id)) ||
|
{
|
||||||
|
if (((search->startup_id > 0) &&
|
||||||
|
(search->startup_id == inst->startup_id)) ||
|
||||||
((inst->exe) && (search->pid > 1) &&
|
((inst->exe) && (search->pid > 1) &&
|
||||||
(search->pid == ecore_exe_pid_get(inst->exe))))
|
(search->pid == ecore_exe_pid_get(inst->exe))))
|
||||||
{
|
{
|
||||||
search->desktop = inst->desktop;
|
search->desktop = inst->desktop;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ typedef struct _E_Exec_Instance E_Exec_Instance;
|
||||||
struct _E_Exec_Instance
|
struct _E_Exec_Instance
|
||||||
{
|
{
|
||||||
Efreet_Desktop *desktop;
|
Efreet_Desktop *desktop;
|
||||||
|
const char *key;
|
||||||
Ecore_Exe *exe;
|
Ecore_Exe *exe;
|
||||||
int startup_id;
|
int startup_id;
|
||||||
double launch_time;
|
double launch_time;
|
||||||
|
|
Loading…
Reference in New Issue