discomfitor pushed a commit to branch master.
commit bdd0bc624dfec69513bf0b96169d6783135e5ed3
Author: Mike Blumenkrantz <[email protected]>
Date: Wed Sep 11 09:01:18 2013 +0100
add wl surface -> e_border mapping
---
src/bin/e_border.c | 10 ++++++++++
src/bin/e_comp_wl.c | 27 +++++++++++++++++++++++++++
src/bin/e_comp_wl.h | 5 +++++
src/modules/wl_desktop_shell/e_mod_main.c | 8 +++++++-
4 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/src/bin/e_border.c b/src/bin/e_border.c
index a98c009..8a082fe 100644
--- a/src/bin/e_border.c
+++ b/src/bin/e_border.c
@@ -1,4 +1,7 @@
#include "e.h"
+#ifdef HAVE_WAYLAND_CLIENTS
+#include "e_comp_wl.h"
+#endif
//#define INOUTDEBUG_MOUSE 1
//#define INOUTDEBUG_FOCUS 1
@@ -3207,6 +3210,10 @@ e_border_find_by_client_window(Ecore_X_Window win)
if ((bd) && (!e_object_is_del(E_OBJECT(bd))) &&
(bd->client.win == win))
return bd;
+#ifdef HAVE_WAYLAND_CLIENTS
+ bd = e_comp_wl_border_surface_find(win);
+ if (bd && (!e_object_is_del(E_OBJECT(bd)))) return bd;
+#endif
return NULL;
}
@@ -3218,6 +3225,9 @@ e_border_find_all_by_client_window(Ecore_X_Window win)
bd = eina_hash_find(borders_hash, e_util_winid_str_get(win));
if ((bd) && (bd->client.win == win))
return bd;
+#ifdef HAVE_WAYLAND_CLIENTS
+ return e_comp_wl_border_surface_find(win);
+#endif
return NULL;
}
diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index ad6e8c6..192902a 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -208,6 +208,8 @@ static const struct wl_pointer_grab_interface
_e_drag_grab_interface =
/* local variables */
static Ecore_Idler *_module_idler = NULL;
+static Eina_Hash *_e_wl_border_hash = NULL;
+
/* external variables */
EAPI E_Wayland_Compositor *_e_wl_comp;
@@ -433,6 +435,8 @@ e_comp_wl_shutdown(void)
E_FREE(_e_wl_comp);
}
+ E_FREE_FUNC(_e_wl_border_hash, eina_hash_free);
+
/* disable the loaded shell module */
/* TODO: we should have a config variable somewhere to store which
* shell we want to unload (tablet, mobile, etc) */
@@ -440,6 +444,28 @@ e_comp_wl_shutdown(void)
e_module_disable(mod);
}
+EAPI void
+e_comp_wl_border_surface_add(Ecore_Window win, const E_Border *bd)
+{
+ if (!_e_wl_border_hash)
+ _e_wl_border_hash = eina_hash_int32_new(NULL);
+ eina_hash_add(_e_wl_border_hash, &win, bd);
+}
+
+EAPI void
+e_comp_wl_border_surface_del(Ecore_Window win)
+{
+ if (!_e_wl_border_hash) return;
+ eina_hash_del_by_key(_e_wl_border_hash, &win);
+}
+
+EAPI E_Border *
+e_comp_wl_border_surface_find(Ecore_Window win)
+{
+ if (!_e_wl_border_hash) return NULL;
+ return eina_hash_find(_e_wl_border_hash, &win);
+}
+
EAPI void
wl_seat_init(struct wl_seat *seat)
{
@@ -1615,6 +1641,7 @@ _e_comp_wl_cb_surface_create(struct wl_client *client,
struct wl_resource *resou
wl_resource_post_no_memory(resource);
return;
}
+ ews->id = id;
/* initialize the destroy signal */
wl_signal_init(&ews->wl.destroy_signal);
diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h
index deccf22..05a4aac 100644
--- a/src/bin/e_comp_wl.h
+++ b/src/bin/e_comp_wl.h
@@ -279,6 +279,7 @@ struct _E_Wayland_Buffer_Reference
struct _E_Wayland_Surface
{
EINA_INLIST;
+ Ecore_Window id;
struct
{
struct wl_resource *surface;
@@ -588,6 +589,10 @@ extern EAPI E_Wayland_Compositor *_e_wl_comp;
EINTERN Eina_Bool e_comp_wl_init(void);
EINTERN void e_comp_wl_shutdown(void);
+EAPI void e_comp_wl_border_surface_add(Ecore_Window win, const E_Border *bd);
+EAPI void e_comp_wl_border_surface_del(Ecore_Window win);
+EAPI E_Border *e_comp_wl_border_surface_find(Ecore_Window win);
+
EAPI void wl_seat_init(struct wl_seat *seat);
EAPI void wl_seat_release(struct wl_seat *seat);
diff --git a/src/modules/wl_desktop_shell/e_mod_main.c
b/src/modules/wl_desktop_shell/e_mod_main.c
index 4182e61..9393754 100644
--- a/src/modules/wl_desktop_shell/e_mod_main.c
+++ b/src/modules/wl_desktop_shell/e_mod_main.c
@@ -910,6 +910,8 @@ _e_wl_shell_shell_surface_map(E_Wayland_Surface *ews,
Evas_Coord x, Evas_Coord y
default:
break;
}
+ if (ews->bd)
+ e_comp_wl_border_surface_add(ews->id, ews->bd);
}
static void
@@ -962,7 +964,11 @@ _e_wl_shell_shell_surface_unmap(E_Wayland_Surface *ews)
evas_object_del(ews->obj);
}
- if (ews->bd) e_object_del(E_OBJECT(ews->bd));
+ if (ews->bd)
+ {
+ e_comp_wl_border_surface_del(ews->id);
+ e_object_del(E_OBJECT(ews->bd));
+ }
ews->mapped = EINA_FALSE;
}
--
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk