discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=ab328c6512efb01129bbb0aedc65d5f14b9922ed

commit ab328c6512efb01129bbb0aedc65d5f14b9922ed
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jul 28 14:33:03 2017 -0400

    implement support for wl aux hints
    
    this is a direct copy of a feature from tizen git with no modifications 
other
    than what was required for compilation and functionality
    
    
https://git.tizen.org/cgit/platform/upstream/enlightenment/commit/?id=8ea090222cee86b57e54f1444c5b63252380fba5
    
https://git.tizen.org/cgit/platform/upstream/enlightenment/commit/?id=2c5593325c3f32efa92da3c371a780e434a30efd
    
    fix T5780
---
 src/bin/Makefile.mk                  |  15 +-
 src/bin/e_comp_wl.c                  |  11 ++
 src/bin/e_comp_wl.h                  |  28 +++-
 src/bin/e_comp_wl_extensions.c       |   5 +
 src/bin/e_comp_wl_extensions_tizen.c | 276 +++++++++++++++++++++++++++++++++++
 src/bin/e_hints.c                    | 224 ++++++++++++++++++++++++++++
 src/bin/e_hints.h                    |  16 ++
 src/bin/generated/meson.build        |   1 +
 src/bin/meson.build                  |   1 +
 src/protocol/efl-aux-hints.xml       |  39 +++++
 10 files changed, 606 insertions(+), 10 deletions(-)

diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk
index 0ca7eb354..7949c660c 100644
--- a/src/bin/Makefile.mk
+++ b/src/bin/Makefile.mk
@@ -431,7 +431,8 @@ src/bin/e_comp_wl_data.c \
 src/bin/e_comp_wl_input.c \
 src/bin/e_comp_wl_dmabuf.c \
 src/bin/e_comp_wl.c \
-src/bin/e_comp_wl_extensions.c
+src/bin/e_comp_wl_extensions.c \
+src/bin/e_comp_wl_extensions_tizen.c
 
 enlightenment_gen_src += \
 src/bin/generated/linux-dmabuf-unstable-v1-server-protocol.h \
@@ -445,16 +446,12 @@ 
src/bin/generated/xdg-foreign-unstable-v1-server-protocol.h \
 src/bin/generated/relative-pointer-unstable-v1-protocol.c \
 src/bin/generated/relative-pointer-unstable-v1-server-protocol.h \
 src/bin/generated/pointer-constraints-unstable-v1-protocol.c \
-src/bin/generated/pointer-constraints-unstable-v1-server-protocol.h
+src/bin/generated/pointer-constraints-unstable-v1-server-protocol.h \
+src/bin/generated/efl-aux-hints-protocol.c \
+src/bin/generated/efl-aux-hints-server-protocol.h
 
 src/bin/e_comp_wl_extensions.c: \
- src/bin/generated/session-recovery-server-protocol.h \
- src/bin/generated/xdg-foreign-unstable-v1-protocol.c \
- src/bin/generated/xdg-foreign-unstable-v1-server-protocol.h \
- src/bin/generated/relative-pointer-unstable-v1-protocol.c \
- src/bin/generated/relative-pointer-unstable-v1-server-protocol.h \
- src/bin/generated/pointer-constraints-unstable-v1-protocol.c \
- src/bin/generated/pointer-constraints-unstable-v1-server-protocol.h
+ $(enlightenment_gen_src)
 
 src/bin/e_comp_wl.c: \
  src/bin/generated/www-server-protocol.h
diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index 3cc272a49..fa0f336b1 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -2517,6 +2517,17 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, 
E_Client *ec)
           e_pointer_object_set(e_comp->pointer, NULL, 0, 0);
      }
 
+   if (ec->comp_data->aux_hint.hints)
+     {
+        E_Comp_Wl_Aux_Hint *hint;
+        EINA_LIST_FREE(ec->comp_data->aux_hint.hints, hint)
+          {
+             eina_stringshare_del(hint->hint);
+             eina_stringshare_del(hint->val);
+             E_FREE(hint);
+          }
+     }
+
    /* The resource destroy callback will walk the state->frames list,
     * so move the list to a temporary first.
     */
diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h
index e91a8a40e..646cfd48d 100644
--- a/src/bin/e_comp_wl.h
+++ b/src/bin/e_comp_wl.h
@@ -41,7 +41,7 @@
       const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
       (type *)(void *)( (char *)__mptr - offsetof(type,member) ); \
    })
-
+typedef struct _E_Comp_Wl_Aux_Hint  E_Comp_Wl_Aux_Hint;
 typedef struct _E_Comp_Wl_Buffer E_Comp_Wl_Buffer;
 typedef struct _E_Comp_Wl_Subsurf_Data E_Comp_Wl_Subsurf_Data;
 typedef struct _E_Comp_Wl_Surface_State E_Comp_Wl_Surface_State;
@@ -51,6 +51,15 @@ typedef struct _E_Comp_Wl_Output E_Comp_Wl_Output;
 typedef struct E_Shell_Data E_Shell_Data;
 typedef void (*E_Comp_Wl_Grab_End_Cb)(E_Client*);
 
+struct _E_Comp_Wl_Aux_Hint
+{
+   int           id;
+   const char   *hint;
+   const char   *val;
+   Eina_Bool     changed;
+   Eina_Bool     deleted;
+};
+
 struct _E_Comp_Wl_Buffer
 {
    struct wl_resource *resource;
@@ -126,6 +135,10 @@ typedef struct E_Comp_Wl_Extension_Data
         struct wl_global *global;
         Eina_Hash *constraints;
      } zwp_pointer_constraints_v1;
+   struct
+     {
+        struct wl_global *global;
+     } efl_aux_hints;
 } E_Comp_Wl_Extension_Data;
 
 struct _E_Comp_Wl_Data
@@ -327,6 +340,13 @@ struct _E_Comp_Wl_Client_Data
         int32_t x, y;
      } popup;
 
+   struct
+     {
+        Eina_Bool  changed : 1;
+        Eina_List *hints;
+        Eina_Bool  use_msg : 1;
+     } aux_hint;
+
    int32_t on_outputs; /* Bitfield of the outputs this client is present on */
 
    E_Maximize max;
@@ -400,6 +420,12 @@ E_API void 
e_comp_wl_extension_pointer_constraints_commit(E_Client *ec);
 E_API Eina_Bool e_comp_wl_extension_pointer_constraints_update(E_Client *ec, 
int x, int y);
 E_API void e_comp_wl_extension_pointer_unconstrain(E_Client *ec);
 
+E_API void
+e_policy_wl_aux_message_send(E_Client *ec,
+                             const char *key,
+                             const char *val,
+                             Eina_List *options);
+
 # ifndef HAVE_WAYLAND_ONLY
 EINTERN void e_comp_wl_xwayland_client_queue(E_Client *ec);
 static inline E_Comp_X_Client_Data *
diff --git a/src/bin/e_comp_wl_extensions.c b/src/bin/e_comp_wl_extensions.c
index 295d7c9ca..d66308bf0 100644
--- a/src/bin/e_comp_wl_extensions.c
+++ b/src/bin/e_comp_wl_extensions.c
@@ -9,6 +9,7 @@
 #include "relative-pointer-unstable-v1-server-protocol.h"
 #include "pointer-constraints-unstable-v1-server-protocol.h"
 
+
 /* mutter uses 32, seems reasonable */
 #define HANDLE_LEN 32
 
@@ -661,6 +662,8 @@ _dmabuf_add(void *data EINA_UNUSED, int type EINA_UNUSED, 
void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+EINTERN Eina_Bool e_comp_wl_extensions_tizen_init(void);
+
 EINTERN Eina_Bool
 e_comp_wl_extensions_init(void)
 {
@@ -681,6 +684,8 @@ e_comp_wl_extensions_init(void)
    e_client_hook_add(E_CLIENT_HOOK_MOVE_BEGIN, 
_e_comp_wl_extensions_client_move_begin, NULL);
    e_client_hook_add(E_CLIENT_HOOK_MOVE_END, 
_e_comp_wl_extensions_client_move_end, NULL);
 
+   e_comp_wl_extensions_tizen_init();
+
    return EINA_TRUE;
 }
 
diff --git a/src/bin/e_comp_wl_extensions_tizen.c 
b/src/bin/e_comp_wl_extensions_tizen.c
new file mode 100644
index 000000000..bdc78646f
--- /dev/null
+++ b/src/bin/e_comp_wl_extensions_tizen.c
@@ -0,0 +1,276 @@
+#define E_COMP_WL
+#include "e.h"
+
+#include "efl-aux-hints-server-protocol.h"
+
+
+enum _E_Policy_Hint_Type
+{
+   E_POLICY_HINT_MSG_USE = 0,
+};
+
+static const char *hint_names[] =
+{
+   "wm.policy.win.msg.use",
+};
+static Eina_List *aux_hints;
+
+static void
+_e_policy_wl_allowed_aux_hint_send(E_Client *ec, int id)
+{
+   Eina_List *l;
+   struct wl_client *wc;
+   struct wl_resource *res;
+
+   wc = wl_resource_get_client(ec->comp_data->surface);
+   EINA_LIST_FOREACH(aux_hints, l, res)
+     if (wl_resource_get_client(res) == wc) break;
+   if (!res) return;
+
+   efl_aux_hints_send_allowed_aux_hint(
+     res,
+      ec->comp_data->surface,
+      id);
+}
+
+static void
+_e_policy_wl_aux_hint_apply(E_Client *ec)
+{
+   E_Comp_Wl_Aux_Hint *hint;
+   Eina_List *l;
+   Eina_Bool send;
+
+   if (!ec->comp_data) return;
+   if (!ec->comp_data->aux_hint.changed) return;
+
+   EINA_LIST_FOREACH(ec->comp_data->aux_hint.hints, l, hint)
+     {
+        if (!hint->changed) continue;
+        send = EINA_FALSE;
+        if (!strcmp(hint->hint, hint_names[E_POLICY_HINT_MSG_USE]))
+          {
+             if ((hint->deleted) || (!strcmp(hint->val, "0")))
+               ec->comp_data->aux_hint.use_msg = EINA_FALSE;
+             else if (!strcmp(hint->val, "1"))
+               ec->comp_data->aux_hint.use_msg = EINA_TRUE;
+          }
+        if (send)
+          _e_policy_wl_allowed_aux_hint_send(ec, hint->id);
+     }
+}
+
+static void
+_tzpol_iface_cb_aux_hint_add(struct wl_client *client EINA_UNUSED, struct 
wl_resource *res_tzpol, struct wl_resource *surf, int32_t id, const char *name, 
const char *value)
+{
+   E_Client *ec;
+   Eina_Bool res = EINA_FALSE;
+
+
+   ec = wl_resource_get_user_data(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   res = e_hints_aux_hint_add(ec, id, name, value);
+
+   if (res)
+     {
+        _e_policy_wl_aux_hint_apply(ec);
+        efl_aux_hints_send_allowed_aux_hint(res_tzpol, surf, id);
+        EC_CHANGED(ec);
+     }
+}
+
+static void
+_tzpol_iface_cb_aux_hint_change(struct wl_client *client EINA_UNUSED, struct 
wl_resource *res_tzpol, struct wl_resource *surf, int32_t id, const char *value)
+{
+   E_Client *ec;
+   Eina_Bool res = EINA_FALSE;
+
+   ec = wl_resource_get_user_data(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   res = e_hints_aux_hint_change(ec, id, value);
+
+   if (res)
+     {
+        _e_policy_wl_aux_hint_apply(ec);
+        efl_aux_hints_send_allowed_aux_hint(res_tzpol, surf, id);
+        EC_CHANGED(ec);
+     }
+}
+
+static void
+_tzpol_iface_cb_aux_hint_del(struct wl_client *client EINA_UNUSED, struct 
wl_resource *res_tzpol EINA_UNUSED, struct wl_resource *surf, int32_t id)
+{
+   E_Client *ec;
+   unsigned int res = -1;
+
+   ec = wl_resource_get_user_data(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   res = e_hints_aux_hint_del(ec, id);
+
+   if (res)
+     {
+        _e_policy_wl_aux_hint_apply(ec);
+        EC_CHANGED(ec);
+     }
+}
+
+static void
+_tzpol_iface_cb_supported_aux_hints_get(struct wl_client *client EINA_UNUSED, 
struct wl_resource *res_tzpol, struct wl_resource *surf)
+{
+   E_Client *ec;
+   const Eina_List *hints_list;
+   const Eina_List *l;
+   struct wl_array hints;
+   const char *hint_name;
+   int len;
+   char *p;
+
+   ec = wl_resource_get_user_data(surf);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   hints_list = e_hints_aux_hint_supported_get();
+
+   wl_array_init(&hints);
+   EINA_LIST_FOREACH(hints_list, l, hint_name)
+     {
+        len = strlen(hint_name) + 1;
+        p = wl_array_add(&hints, len);
+
+        if (p == NULL)
+          break;
+        strncpy(p, hint_name, len);
+     }
+
+   efl_aux_hints_send_supported_aux_hints(res_tzpol, surf, &hints, 
eina_list_count(hints_list));
+   wl_array_release(&hints);
+}
+
+E_API void
+e_policy_wl_aux_message_send(E_Client *ec,
+                             const char *key,
+                             const char *val,
+                             Eina_List *options)
+{
+   Eina_List *l;
+   struct wl_client *wc;
+   struct wl_resource *res;
+   struct wl_array opt_array;
+   const char *option;
+   int len;
+   char *p;
+
+   if (!ec->comp_data) return;
+   if (!ec->comp_data->aux_hint.use_msg) return;
+   wc = wl_resource_get_client(ec->comp_data->surface);
+   EINA_LIST_FOREACH(aux_hints, l, res)
+     if (wl_resource_get_client(res) == wc) break;
+   if (!res) return;
+
+   wl_array_init(&opt_array);
+   EINA_LIST_FOREACH(options, l, option)
+     {
+        len = strlen(option) + 1;
+        p = wl_array_add(&opt_array, len);
+
+        if (p == NULL)
+          break;
+        strncpy(p, option, len);
+     }
+
+   efl_aux_hints_send_aux_message(res, ec->comp_data->surface,
+                                 key, val, &opt_array);
+   wl_array_release(&opt_array);
+}
+
+void
+e_policy_wl_aux_hint_init(void)
+{
+   int i, n;
+   //E_Config_Aux_Hint_Supported *auxhint;
+   //Eina_List *l;
+
+   n = (sizeof(hint_names) / sizeof(char *));
+
+   for (i = 0; i < n; i++)
+     {
+        e_hints_aux_hint_supported_add(hint_names[i]);
+     }
+
+   //EINA_LIST_FOREACH(e_config->aux_hint_supported, l, auxhint)
+     //{
+        //if (!auxhint->name) continue;
+        //e_hints_aux_hint_supported_add(auxhint->name);
+     //}
+
+   return;
+}
+
+#define GLOBAL_BIND_CB(NAME, IFACE, ...) \
+static void \
+_e_comp_wl_##NAME##_cb_bind(struct wl_client *client, void *data EINA_UNUSED, 
uint32_t version EINA_UNUSED, uint32_t id) \
+{ \
+   struct wl_resource *res; \
+\
+   if (!(res = wl_resource_create(client, &(IFACE), 1, id))) \
+     { \
+        ERR("Could not create %s interface", #NAME);\
+        wl_client_post_no_memory(client);\
+        return;\
+     }\
+\
+   wl_resource_set_implementation(res, &_e_##NAME##_interface, NULL, NULL);\
+}
+
+static const struct efl_aux_hints_interface _e_efl_aux_hints_interface =
+{
+   _tzpol_iface_cb_aux_hint_add,
+   _tzpol_iface_cb_aux_hint_change,
+   _tzpol_iface_cb_aux_hint_del,
+   _tzpol_iface_cb_supported_aux_hints_get,
+};
+
+static void
+_efl_aux_hints_destroy(struct wl_resource *res)
+{
+   aux_hints = eina_list_remove(aux_hints, res);
+}
+
+static void
+_e_comp_wl_efl_aux_hints_cb_bind(struct wl_client *client, void *data 
EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id)
+{
+   struct wl_resource *res;
+
+   if (!(res = wl_resource_create(client, &efl_aux_hints_interface, 1, id)))
+     {
+        ERR("Could not create %s interface", "efl-aux-hints");
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(res, &_e_efl_aux_hints_interface, NULL, 
_efl_aux_hints_destroy);
+   aux_hints = eina_list_append(aux_hints, res);
+}
+
+#define GLOBAL_CREATE_OR_RETURN(NAME, IFACE, VERSION) \
+   do { \
+      struct wl_global *global; \
+\
+      global = wl_global_create(e_comp_wl->wl.disp, &(IFACE), VERSION, \
+                                NULL, _e_comp_wl_##NAME##_cb_bind); \
+      if (!global) \
+        { \
+           ERR("Could not add %s to wayland globals", #IFACE); \
+           return EINA_FALSE; \
+        } \
+      e_comp_wl->extensions->NAME.global = global; \
+   } while (0)
+
+EINTERN Eina_Bool
+e_comp_wl_extensions_tizen_init(void)
+{
+   GLOBAL_CREATE_OR_RETURN(efl_aux_hints, efl_aux_hints_interface, 1);
+   e_policy_wl_aux_hint_init();
+   return EINA_TRUE;
+}
diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c
index 358bb95ea..6b1fff4c2 100644
--- a/src/bin/e_hints.c
+++ b/src/bin/e_hints.c
@@ -1668,3 +1668,227 @@ e_hints_scale_update(void)
 #endif
 }
 
+
+#ifdef HAVE_WAYLAND
+static Eina_List *aux_hints_supported = NULL;
+
+static E_Comp_Client_Data *
+e_pixmap_cdata_get(E_Pixmap *cp)
+{
+   return e_pixmap_client_get(cp)->comp_data;
+}
+
+E_API const Eina_List *
+e_hints_aux_hint_supported_add(const char *hint)
+{
+   Eina_List *l;
+   const char *supported;
+
+   EINA_LIST_FOREACH(aux_hints_supported, l, supported)
+     {
+        if (!strcmp(supported, hint))
+          return aux_hints_supported;
+     }
+
+   aux_hints_supported = eina_list_append(aux_hints_supported, hint);
+
+   return aux_hints_supported;
+}
+
+E_API const Eina_List *
+e_hints_aux_hint_supported_del(const char *hint)
+{
+   Eina_List *l;
+   const char *supported;
+
+   EINA_LIST_FOREACH(aux_hints_supported, l, supported)
+     {
+        if (!strcmp(supported, hint))
+          {
+             aux_hints_supported = eina_list_remove(aux_hints_supported, hint);
+             break;
+          }
+     }
+
+   return aux_hints_supported;
+}
+
+E_API const Eina_List *
+e_hints_aux_hint_supported_get(void)
+{
+   return aux_hints_supported;
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_add(E_Client *ec, int32_t id, const char *name, const char 
*val)
+{
+   if (!ec) return EINA_FALSE;
+   return e_hints_aux_hint_add_with_pixmap(ec->pixmap, id, name, val);
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_change(E_Client *ec, int32_t id, const char *val)
+{
+   if (!ec) return EINA_FALSE;
+   return e_hints_aux_hint_change_with_pixmap(ec->pixmap, id, val);
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_del(E_Client *ec, int32_t id)
+{
+   if (!ec) return EINA_FALSE;
+   return e_hints_aux_hint_del_with_pixmap(ec->pixmap, id);
+}
+
+E_API const char *
+e_hints_aux_hint_value_get(E_Client *ec, const char *name)
+{
+   if (!ec) return NULL;
+   return e_hints_aux_hint_value_get_with_pixmap(ec->pixmap, name);
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_add_with_pixmap(E_Pixmap *cp, int32_t id, const char *name, 
const char *val)
+{
+   E_Comp_Wl_Client_Data *cdata;
+   Eina_Bool found = EINA_FALSE;
+   E_Comp_Wl_Aux_Hint *hint;
+   Eina_List *l;
+
+   if (!cp) return EINA_FALSE;
+   cdata = (E_Comp_Wl_Client_Data*)e_pixmap_cdata_get(cp);
+   if (!cdata) return EINA_FALSE;
+
+   EINA_LIST_FOREACH(cdata->aux_hint.hints, l, hint)
+     {
+        if (hint->id == id)
+          {
+             if (strcmp(hint->val, val) != 0)
+               {
+                  eina_stringshare_del(hint->val);
+                  hint->val = eina_stringshare_add(val);
+                  hint->changed = EINA_TRUE;
+                  if (hint->deleted)
+                    hint->deleted = EINA_FALSE;
+                  cdata->aux_hint.changed = 1;
+               }
+             found = EINA_TRUE;
+             break;
+          }
+     }
+
+   if (!found)
+     {
+        hint = E_NEW(E_Comp_Wl_Aux_Hint, 1);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(hint, EINA_FALSE);
+
+        memset(hint, 0, sizeof(E_Comp_Wl_Aux_Hint));
+
+        hint->id = id;
+        hint->hint = eina_stringshare_add(name);
+        hint->val = eina_stringshare_add(val);
+        hint->changed = EINA_TRUE;
+        hint->deleted = EINA_FALSE;
+        cdata->aux_hint.hints = eina_list_append(cdata->aux_hint.hints, hint);
+        cdata->aux_hint.changed = 1;
+     }
+
+   if (!found)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_change_with_pixmap(E_Pixmap *cp, int32_t id, const char *val)
+{
+   E_Comp_Wl_Client_Data *cdata;
+   Eina_List *l;
+   E_Comp_Wl_Aux_Hint *hint;
+   Eina_Bool found = EINA_FALSE;
+
+   if (!cp) return EINA_FALSE;
+   cdata = (E_Comp_Wl_Client_Data*)e_pixmap_cdata_get(cp);
+   if (!cdata) return EINA_FALSE;
+
+   EINA_LIST_FOREACH(cdata->aux_hint.hints, l, hint)
+     {
+        if (hint->id == id)
+          {
+             if ((hint->val) && (strcmp(hint->val, val) != 0))
+               {
+                  eina_stringshare_del(hint->val);
+                  hint->val = eina_stringshare_add(val);
+                  hint->changed = EINA_TRUE;
+                  cdata->aux_hint.changed = 1;
+               }
+
+             if (hint->deleted)
+               hint->deleted = EINA_FALSE;
+
+             found = EINA_TRUE;
+             break;
+          }
+     }
+
+   if (found)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
+E_API Eina_Bool
+e_hints_aux_hint_del_with_pixmap(E_Pixmap *cp, int32_t id)
+{
+   E_Comp_Wl_Client_Data *cdata;
+   Eina_List *l, *ll;
+   E_Comp_Wl_Aux_Hint *hint;
+   int res = -1;
+
+   if (!cp) return EINA_FALSE;
+   cdata = (E_Comp_Wl_Client_Data*)e_pixmap_cdata_get(cp);
+   if (!cdata) return EINA_FALSE;
+
+   EINA_LIST_FOREACH_SAFE(cdata->aux_hint.hints, l, ll, hint)
+     {
+        if (hint->id == id)
+          {
+             hint->changed = EINA_TRUE;
+             hint->deleted = EINA_TRUE;
+             cdata->aux_hint.changed = 1;
+             res = hint->id;
+             break;
+          }
+     }
+
+   if (res == -1)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
+E_API const char *
+e_hints_aux_hint_value_get_with_pixmap(E_Pixmap *cp, const char *name)
+{
+   E_Comp_Wl_Client_Data *cdata;
+   Eina_List *l;
+   E_Comp_Wl_Aux_Hint *hint;
+   const char *res = NULL;
+
+   if (!cp) return NULL;
+   cdata = (E_Comp_Wl_Client_Data*)e_pixmap_cdata_get(cp);
+   if (!cdata) return NULL;
+
+   EINA_LIST_REVERSE_FOREACH(cdata->aux_hint.hints, l, hint)
+     {
+        if ((!hint->deleted) &&
+            (!strcmp(hint->hint, name)))
+          {
+             res =  hint->val;
+             break;
+          }
+     }
+
+   return res;
+}
+#endif
diff --git a/src/bin/e_hints.h b/src/bin/e_hints.h
index b4025419a..006fc9c26 100644
--- a/src/bin/e_hints.h
+++ b/src/bin/e_hints.h
@@ -59,5 +59,21 @@ extern E_API Ecore_X_Atom ATM_NETWM_SHOW_WINDOW_MENU;
 extern E_API Ecore_X_Atom ATM_NETWM_PERFORM_BUTTON_ACTION;
 extern E_API Ecore_X_Atom ATM_GTK_FRAME_EXTENTS;
 #endif
+
+#ifdef HAVE_WAYLAND
+E_API const Eina_List * e_hints_aux_hint_supported_add(const char *hint);
+E_API const Eina_List * e_hints_aux_hint_supported_del(const char *hint);
+E_API const Eina_List * e_hints_aux_hint_supported_get(void);
+
+E_API Eina_Bool e_hints_aux_hint_add(E_Client *ec, int32_t id, const char 
*name, const char *val);
+E_API Eina_Bool e_hints_aux_hint_change(E_Client *ec, int32_t id, const char 
*val);
+E_API Eina_Bool e_hints_aux_hint_del(E_Client *ec, int32_t id);
+E_API const char * e_hints_aux_hint_value_get(E_Client *ec, const char *name);
+
+E_API Eina_Bool e_hints_aux_hint_add_with_pixmap(E_Pixmap *cp, int32_t id, 
const char *name, const char *val);
+E_API Eina_Bool e_hints_aux_hint_change_with_pixmap(E_Pixmap *cp, int32_t id, 
const char *val);
+E_API Eina_Bool e_hints_aux_hint_del_with_pixmap(E_Pixmap *cp, int32_t id);
+E_API const char * e_hints_aux_hint_value_get_with_pixmap(E_Pixmap *cp, const 
char *name);
+#endif
 #endif
 #endif
diff --git a/src/bin/generated/meson.build b/src/bin/generated/meson.build
index e3ee230a0..72fd1975d 100644
--- a/src/bin/generated/meson.build
+++ b/src/bin/generated/meson.build
@@ -2,6 +2,7 @@ protos = [
        
'@0@/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml'.format(dir_wayland_protocols),
        '../../protocol/session-recovery.xml',
        '../../protocol/www.xml',
+       '../../protocol/efl-aux-hints.xml',
        
'@0@/unstable/xdg-foreign/xdg-foreign-unstable-v1.xml'.format(dir_wayland_protocols),
        
'@0@/unstable/relative-pointer/relative-pointer-unstable-v1.xml'.format(dir_wayland_protocols),
        
'@0@/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml'.format(dir_wayland_protocols),
diff --git a/src/bin/meson.build b/src/bin/meson.build
index f19555dcc..7ba73a14c 100644
--- a/src/bin/meson.build
+++ b/src/bin/meson.build
@@ -395,6 +395,7 @@ if config_h.has('HAVE_WAYLAND') == true
                'e_comp_wl_dmabuf.c',
                'e_comp_wl.c',
                'e_comp_wl_extensions.c',
+               'e_comp_wl_extensions_tizen.c',
                wayland_proto_c,
                wayland_proto_h
        ]
diff --git a/src/protocol/efl-aux-hints.xml b/src/protocol/efl-aux-hints.xml
new file mode 100644
index 000000000..442285a13
--- /dev/null
+++ b/src/protocol/efl-aux-hints.xml
@@ -0,0 +1,39 @@
+<protocol name="efl_aux_hints">
+
+  <interface name="efl_aux_hints" version="1">
+    <request name="add_aux_hint">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="id" type="int"/>
+      <arg name="hint" type="string"/>
+      <arg name="val" type="string"/>
+    </request>
+    <request name="change_aux_hint">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="id" type="int"/>
+      <arg name="val" type="string"/>
+    </request>
+    <request name="del_aux_hint">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="id" type="int"/>
+    </request>
+    <request name="get_supported_aux_hints">
+      <arg name="surface" type="object" interface="wl_surface"/>
+    </request>
+    <event name="supported_aux_hints">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="hints" type="array"/>
+      <arg name="num_hints" type="uint"/>
+    </event>
+    <event name="allowed_aux_hint">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="id" type="int"/>
+    </event>
+    <event name="aux_message">
+      <arg name="surface" type="object" interface="wl_surface"/>
+      <arg name="key" type="string"/>
+      <arg name="val" type="string"/>
+      <arg name="options" type="array"/>
+    </event>
+  </interface>
+
+</protocol>

-- 


Reply via email to