devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=02671a1a4bd5faef54c730f34d4c5f621d5cb378

commit 02671a1a4bd5faef54c730f34d4c5f621d5cb378
Author: Chris Michael <cp.mich...@samsung.com>
Date:   Wed Sep 9 11:19:24 2015 -0400

    ecore-wl2: Add API function for ecore_wl2_window_show
    
    Summary: This adds preliminary support for wl_shell and xdg_shell
    
    Signed-off-by: Chris Michael <cp.mich...@samsung.com>
---
 src/lib/ecore_wl2/Ecore_Wl2.h        |   9 ++
 src/lib/ecore_wl2/ecore_wl2_window.c | 213 +++++++++++++++++++++++++++++++++++
 2 files changed, 222 insertions(+)

diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h
index 0ac9c7f..1d28dd7 100644
--- a/src/lib/ecore_wl2/Ecore_Wl2.h
+++ b/src/lib/ecore_wl2/Ecore_Wl2.h
@@ -256,6 +256,15 @@ EAPI int ecore_wl2_window_id_get(Ecore_Wl2_Window *window);
  */
 EAPI struct wl_surface *ecore_wl2_window_surface_get(Ecore_Wl2_Window *window);
 
+/**
+ * Show a given Ecore_Wl2_Window
+ *
+ * @param window The Ecore_Wl2_Window to show
+ *
+ * @ingroup Ecore_Wl2_Window_Group
+ */
+EAPI void ecore_wl2_window_show(Ecore_Wl2_Window *window);
+
 /* # ifdef __cplusplus */
 /* } */
 /* # endif */
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c 
b/src/lib/ecore_wl2/ecore_wl2_window.c
index f0b96f7..060b729 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -4,6 +4,166 @@
 
 #include "ecore_wl2_private.h"
 
+static void
+_wl_shell_surface_cb_ping(void *data EINA_UNUSED, struct wl_shell_surface 
*shell_surface, unsigned int serial)
+{
+   wl_shell_surface_pong(shell_surface, serial);
+}
+
+static void
+_wl_shell_surface_cb_configure(void *data, struct wl_shell_surface 
*shell_surface EINA_UNUSED, unsigned int edges, int w, int h)
+{
+   Ecore_Wl2_Window *win;
+
+   win = data;
+   if (!win) return;
+
+   if ((w <= 0) || (h <= 0)) return;
+   if ((win->geometry.w != w) || (win->geometry.h != h))
+     {
+        /* TODO: send configure */
+     }
+}
+
+static void
+_wl_shell_surface_cb_popup_done(void *data EINA_UNUSED, struct 
wl_shell_surface *shell_surface EINA_UNUSED)
+{
+   /* TODO: input ungrab ? */
+}
+
+static const struct wl_shell_surface_listener _wl_shell_surface_listener =
+{
+   _wl_shell_surface_cb_ping,
+   _wl_shell_surface_cb_configure,
+   _wl_shell_surface_cb_popup_done
+};
+
+static void
+_xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface 
EINA_UNUSED, int32_t w, int32_t h, struct wl_array *states, uint32_t serial)
+{
+   Ecore_Wl2_Window *win;
+   uint32_t *s;
+
+   win = data;
+   if (!win) return;
+
+   win->minimized = EINA_FALSE;
+   win->maximized = EINA_FALSE;
+   win->fullscreen = EINA_FALSE;
+   win->focused = EINA_FALSE;
+   win->resizing = EINA_FALSE;
+
+   wl_array_for_each(s, states)
+     {
+        switch (*s)
+          {
+           case XDG_SURFACE_STATE_MAXIMIZED:
+             win->maximized = EINA_TRUE;
+             break;
+           case XDG_SURFACE_STATE_FULLSCREEN:
+             win->fullscreen = EINA_TRUE;
+             break;
+           case XDG_SURFACE_STATE_RESIZING:
+             win->resizing = EINA_TRUE;
+             break;
+           case XDG_SURFACE_STATE_ACTIVATED:
+             win->focused = EINA_TRUE;
+             win->minimized = EINA_FALSE;
+           default:
+             break;
+          }
+     }
+
+   if ((w > 0) && (h > 0))
+     {
+        /* TODO: send configure ?? */
+     }
+
+   xdg_surface_ack_configure(win->xdg_surface, serial);
+}
+
+static void
+_xdg_surface_cb_delete(void *data, struct xdg_surface *xdg_surface EINA_UNUSED)
+{
+   Ecore_Wl2_Window *win;
+
+   win = data;
+   if (!win) return;
+
+   /* TODO: Free window */
+}
+
+static const struct xdg_surface_listener _xdg_surface_listener =
+{
+   _xdg_surface_cb_configure,
+   _xdg_surface_cb_delete,
+};
+
+static void
+_ecore_wl2_window_type_set(Ecore_Wl2_Window *win)
+{
+   switch (win->type)
+     {
+      case ECORE_WL2_WINDOW_TYPE_FULLSCREEN:
+        if (win->xdg_surface)
+          xdg_surface_set_fullscreen(win->xdg_surface, NULL);
+        else if (win->wl_shell_surface)
+          wl_shell_surface_set_fullscreen(win->wl_shell_surface,
+                                          
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
+                                          0, NULL);
+        break;
+      case ECORE_WL2_WINDOW_TYPE_MAXIMIZED:
+        if (win->xdg_surface)
+          xdg_surface_set_maximized(win->xdg_surface);
+        else if (win->wl_shell_surface)
+          wl_shell_surface_set_maximized(win->wl_shell_surface, NULL);
+        break;
+      case ECORE_WL2_WINDOW_TYPE_TRANSIENT:
+        if (win->xdg_surface)
+          xdg_surface_set_parent(win->xdg_surface, win->parent->xdg_surface);
+        else if (win->wl_shell_surface)
+          wl_shell_surface_set_transient(win->wl_shell_surface,
+                                         win->parent->surface,
+                                         win->geometry.x, win->geometry.y, 0);
+        break;
+      case ECORE_WL2_WINDOW_TYPE_MENU:
+        /* TODO: Input and XDG Popup */
+        if (win->xdg_surface)
+          {
+             /* win->xdg_popup = */
+             /*   xdg_shell_get_xdg_popup(win->display->wl.xdg_shell, 
win->surface, */
+             /*                           win->display->input->seat, */
+             /*                           win->display->serial, */
+             /*                           win->geometry.x, win->geometry.y); */
+             /* if (!win->xdg_popup) */
+             /*   { */
+             /*      ERR("Could not create xdg popup: %m"); */
+             /*      return; */
+             /*   } */
+
+             /* xdg_popup_set_user_data(win->xdg_popup, win); */
+             /* xdg_popup_add_listener(win->xdg_popup, &_xdg_popup_listener, 
win); */
+          }
+        else if (win->wl_shell_surface)
+          {
+             /* wl_shell_surface_set_popup(win->wl_shell_surface, */
+             /*                            win->display->input->seat, */
+             /*                            win->display->serial, */
+             /*                            win->parent->surface, */
+             /*                            win->geometry.x, win->geometry.y, 
0); */
+          }
+        break;
+      case ECORE_WL2_WINDOW_TYPE_TOPLEVEL:
+        if (win->xdg_surface)
+          xdg_surface_set_parent(win->xdg_surface, NULL);
+        else if (win->wl_shell_surface)
+          wl_shell_surface_set_toplevel(win->wl_shell_surface);
+        break;
+      default:
+        break;
+     }
+}
+
 EAPI Ecore_Wl2_Window *
 ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int 
x, int y, int w, int h)
 {
@@ -50,3 +210,56 @@ ecore_wl2_window_surface_get(Ecore_Wl2_Window *window)
 
    return window->surface;
 }
+
+EAPI void
+ecore_wl2_window_show(Ecore_Wl2_Window *window)
+{
+   Ecore_Wl2_Display *disp;
+
+   EINA_SAFETY_ON_NULL_RETURN(window);
+
+   disp = window->display;
+
+   if (!window->surface)
+     {
+        window->surface =
+          wl_compositor_create_surface(window->display->wl.compositor);
+     }
+
+   if ((disp->wl.xdg_shell) && (!window->xdg_surface))
+     {
+        window->xdg_surface =
+          xdg_shell_get_xdg_surface(disp->wl.xdg_shell, window->surface);
+        if (!window->xdg_surface) goto surf_err;
+
+        if (window->title)
+          xdg_surface_set_title(window->xdg_surface, window->title);
+        if (window->class)
+          xdg_surface_set_app_id(window->xdg_surface, window->class);
+
+        xdg_surface_set_user_data(window->xdg_surface, window);
+        xdg_surface_add_listener(window->xdg_surface,
+                                 &_xdg_surface_listener, window);
+     }
+   else if ((disp->wl.wl_shell) && (!window->wl_shell_surface))
+     {
+        window->wl_shell_surface =
+          wl_shell_get_shell_surface(disp->wl.wl_shell, window->surface);
+        if (!window->wl_shell_surface) goto surf_err;
+
+        if (window->title)
+          wl_shell_surface_set_title(window->wl_shell_surface, window->title);
+        if (window->class)
+          wl_shell_surface_set_class(window->wl_shell_surface, window->class);
+
+        wl_shell_surface_add_listener(window->wl_shell_surface,
+                                      &_wl_shell_surface_listener, window);
+     }
+
+   _ecore_wl2_window_type_set(window);
+
+   return;
+
+surf_err:
+   ERR("Failed to create surface for window: %m");
+}

-- 


Reply via email to