discomfitor pushed a commit to branch master.
commit 12944d7afe41f0198f9f49003ca466562f96bdb9
Author: discomfitor <[email protected]>
Date: Sat May 18 13:52:06 2013 +0100
add e_exec_phony to create fake e_exec instances on e restart
---
ChangeLog | 1 +
NEWS | 1 +
src/bin/e_border.c | 9 +++++++--
src/bin/e_exec.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/bin/e_exec.h | 3 +++
5 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f6e395a..36d7d10 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
2013-05-18 Mike Blumenkrantz
* add e_exec_desktop_instances_find
+ * add e_exec_phony
2013-05-14 Mike Blumenkrantz
diff --git a/NEWS b/NEWS
index c326ce6..9c57530 100644
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,7 @@ Additions:
* added e_comp_win_effect* api
* added deskmirror
* add e_exec_desktop_instances_find
+ * add e_exec_phony
Config:
* Added option for disabling icons in menus
* Added option for disabling pointer warping when performing
directional focus changes using winlist
diff --git a/src/bin/e_border.c b/src/bin/e_border.c
index 91a0133..4bbebcf 100644
--- a/src/bin/e_border.c
+++ b/src/bin/e_border.c
@@ -4921,7 +4921,10 @@ _e_border_del(E_Border *bd)
if (bd->exe_inst)
{
- bd->exe_inst->bd = NULL;
+ if (bd->exe_inst->phony)
+ e_exec_phony_del(bd->exe_inst);
+ else
+ bd->exe_inst->bd = NULL;
bd->exe_inst = NULL;
}
@@ -7958,7 +7961,9 @@ _e_border_eval0(E_Border *bd)
bd->client.netwm.pid = -1;
}
- if (!bd->re_manage)
+ if (bd->re_manage)
+ e_exec_phony(bd);
+ else
{
inst =
e_exec_startup_id_pid_instance_find(bd->client.netwm.startup_id,
bd->client.netwm.pid);
diff --git a/src/bin/e_exec.c b/src/bin/e_exec.c
index 91ae023..75fec64 100644
--- a/src/bin/e_exec.c
+++ b/src/bin/e_exec.c
@@ -200,6 +200,64 @@ e_exec(E_Zone *zone, Efreet_Desktop *desktop, const char
*exec,
return inst;
}
+EAPI void
+e_exec_phony_del(E_Exec_Instance *inst)
+{
+ if (!inst) return;
+ EINA_SAFETY_ON_TRUE_RETURN(!inst->phony);
+ _e_exec_instance_free(inst);
+}
+
+EAPI E_Exec_Instance *
+e_exec_phony(E_Border *bd)
+{
+ E_Exec_Instance *inst;
+ Eina_List *l, *lnew;
+
+ inst = E_NEW(E_Exec_Instance, 1);
+ inst->phony = 1;
+ inst->desktop = bd->desktop;
+ if (bd->desktop)
+ {
+ efreet_desktop_ref(bd->desktop);
+ inst->key = eina_stringshare_add(bd->desktop->orig_path);
+ }
+ else if (bd->client.icccm.command.argc)
+ {
+ Eina_Strbuf *buf;
+ int x;
+
+ buf = eina_strbuf_new();
+ for (x = 0; x < bd->client.icccm.command.argc; x++)
+ {
+ eina_strbuf_append(buf, bd->client.icccm.command.argv[x]);
+ if (x + 1 < bd->client.icccm.command.argc)
+ eina_strbuf_append_char(buf, ' ');
+ }
+ inst->key = eina_stringshare_add(eina_strbuf_string_get(buf));
+ eina_strbuf_free(buf);
+ }
+ else
+ {
+ free(inst);
+ return NULL;
+ }
+ inst->used = 1;
+ bd->exe_inst = inst;
+ inst->bd = bd;
+ if (bd->zone) inst->screen = bd->zone->num;
+ if (bd->desk)
+ {
+ inst->desk_x = bd->desk->x;
+ inst->desk_y = bd->desk->y;
+ }
+ l = eina_hash_find(e_exec_instances, inst->key);
+ lnew = eina_list_append(l, inst);
+ if (l) eina_hash_modify(e_exec_instances, inst->key, lnew);
+ else eina_hash_add(e_exec_instances, inst->key, lnew);
+ return inst;
+}
+
EAPI E_Exec_Instance *
e_exec_startup_id_pid_instance_find(int id, pid_t pid)
{
diff --git a/src/bin/e_exec.h b/src/bin/e_exec.h
index 31e1952..89e1826 100644
--- a/src/bin/e_exec.h
+++ b/src/bin/e_exec.h
@@ -20,6 +20,7 @@ struct _E_Exec_Instance
int used;
int walking;
Eina_List *watchers;
+ Eina_Bool phony : 1;
};
typedef enum
@@ -33,6 +34,8 @@ EINTERN int e_exec_init(void);
EINTERN int e_exec_shutdown(void);
EAPI void e_exec_executor_set(E_Exec_Instance *(*func) (void *data, E_Zone
*zone, Efreet_Desktop *desktop, const char *exec, Eina_List *files, const char
*launch_method), const void *data);
EAPI E_Exec_Instance *e_exec(E_Zone *zone, Efreet_Desktop *desktop, const char
*exec, Eina_List *files, const char *launch_method);
+EAPI E_Exec_Instance *e_exec_phony(E_Border *bd);
+EAPI void e_exec_phony_del(E_Exec_Instance *inst);
EAPI E_Exec_Instance *e_exec_startup_id_pid_instance_find(int id, pid_t pid);
EAPI Efreet_Desktop *e_exec_startup_id_pid_find(int startup_id, pid_t pid);
EAPI E_Exec_Instance *e_exec_startup_desktop_instance_find(Efreet_Desktop
*desktop);
--
------------------------------------------------------------------------------
AlienVault Unified Security Management (USM) platform delivers complete
security visibility with the essential security capabilities. Easily and
efficiently configure, manage, and operate all of your security controls
from a single console and one unified framework. Download a free trial.
http://p.sf.net/sfu/alienvault_d2d