devilhorns pushed a commit to branch master.

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

commit e591dff56dd36c6f45d28dbbaa05b290d2996113
Author: Srivardhan Hebbar <[email protected]>
Date:   Wed Aug 13 09:28:07 2014 -0400

    Added support for xdg-shell protocol in ecore-wayland.
    
    Summary: Signed-off-by: Srivardhan Hebbar <[email protected]>
    
    Reviewers: devilhorns
    
    Reviewed By: devilhorns
    
    Subscribers: cedric
    
    Projects: #efl
    
    Differential Revision: https://phab.enlightenment.org/D1328
---
 src/lib/ecore_wayland/ecore_wl_window.c | 211 +++++++++++++++++++++++---------
 1 file changed, 151 insertions(+), 60 deletions(-)

diff --git a/src/lib/ecore_wayland/ecore_wl_window.c 
b/src/lib/ecore_wayland/ecore_wl_window.c
index c9e0983..5a45a7c 100644
--- a/src/lib/ecore_wayland/ecore_wl_window.c
+++ b/src/lib/ecore_wayland/ecore_wl_window.c
@@ -130,6 +130,11 @@ ecore_wl_window_free(Ecore_Wl_Window *win)
 
    if (win->subsurfs) _ecore_wl_subsurfs_del_all(win);
 
+   if (win->xdg_surface) xdg_surface_destroy(win->xdg_surface);
+      win->xdg_surface = NULL;
+   if (win->xdg_popup) xdg_popup_destroy(win->xdg_popup);
+      win->xdg_popup = NULL;
+
    if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
    win->shell_surface = NULL;
    if (win->surface) wl_surface_destroy(win->surface);
@@ -151,25 +156,24 @@ ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y)
 
    ecore_wl_window_update_location(win, x, y);
 
-   if (win->shell_surface)
+   Ecore_Wl_Input *input = win->keyboard_device;
+
+   if ((!input) && (win->parent))
      {
-        Ecore_Wl_Input *input;
+        input = win->parent->keyboard_device;
+        if (!(input = win->parent->keyboard_device))
+          input = win->parent->pointer_device;
+     }
 
-        if (!(input = win->keyboard_device))
-          {
-             if (win->parent)
-               {
-                  if (!(input = win->parent->keyboard_device))
-                    input = win->parent->pointer_device;
-               }
-          }
+   if ((!input) || (!input->seat)) return;
 
-        if ((!input) || (!input->seat)) return;
+   _ecore_wl_input_grab_release(input, win);
 
-        _ecore_wl_input_grab_release(input, win);
-        wl_shell_surface_move(win->shell_surface, input->seat,
-                              input->display->serial);
-     }
+   if (win->xdg_surface)
+      xdg_surface_move(win->xdg_surface, input->seat, input->display->serial);
+   else if (win->shell_surface)
+      wl_shell_surface_move(win->shell_surface, input->seat,
+                            input->display->serial);
 }
 
 EAPI void 
@@ -181,23 +185,26 @@ ecore_wl_window_resize(Ecore_Wl_Window *win, int w, int 
h, int location)
 
    ecore_wl_window_update_size(win, w, h);
 
-   if (win->shell_surface)
+   Ecore_Wl_Input *input = win->keyboard_device;
+
+   if ((!input) && win->parent)
      {
-        Ecore_Wl_Input *input;
+        if (!(input = win->parent->keyboard_device))
+           input = win->parent->pointer_device;
+     }
 
-        if (!(input = win->keyboard_device))
-          {
-             if (win->parent)
-               {
-                  if (!(input = win->parent->keyboard_device))
-                    input = win->parent->pointer_device;
-               }
-          }
+   if ((!input) || (!input->seat)) return;
 
-        if ((!input) || (!input->seat)) return;
+   _ecore_wl_input_grab_release(input, win);
 
-        _ecore_wl_input_grab_release(input, win);
-        wl_shell_surface_resize(win->shell_surface, input->seat, 
+   if (win->xdg_surface)
+     {
+        xdg_surface_resize(win->xdg_surface, input->seat,
+                           input->display->serial, location);
+     }
+   else if (win->shell_surface)
+     {
+        wl_shell_surface_resize(win->shell_surface, input->seat,
                                 input->display->serial, location);
      }
 }
@@ -272,51 +279,91 @@ ecore_wl_window_show(Ecore_Wl_Window *win)
    if ((win->type != ECORE_WL_WINDOW_TYPE_DND) &&
        (win->type != ECORE_WL_WINDOW_TYPE_NONE))
      {
-        if ((!win->shell_surface) && (_ecore_wl_disp->wl.shell))
+        if ((!win->xdg_surface) && (_ecore_wl_disp->wl.xdg_shell))
+          {
+             win->xdg_surface =
+                        xdg_shell_get_xdg_surface(_ecore_wl_disp->wl.xdg_shell,
+                                                  win->surface);
+             if (!win->xdg_surface) return;
+                xdg_surface_set_user_data(win->xdg_surface, win);
+                xdg_surface_add_listener(win->xdg_surface,
+                                         &_ecore_xdg_surface_listener, win);
+          }
+        else if ((!win->shell_surface) && (_ecore_wl_disp->wl.shell))
           {
              win->shell_surface = 
-               wl_shell_get_shell_surface(_ecore_wl_disp->wl.shell, 
-                                          win->surface);
+                           wl_shell_get_shell_surface(_ecore_wl_disp->wl.shell,
+                                                      win->surface);
              if (!win->shell_surface) return;
 
              if (win->title)
-               wl_shell_surface_set_title(win->shell_surface, win->title);
+                wl_shell_surface_set_title(win->shell_surface, win->title);
+
              if (win->class_name)
-               wl_shell_surface_set_class(win->shell_surface, win->class_name);
-          }
+                wl_shell_surface_set_class(win->shell_surface, 
win->class_name);
+           }
 
-        if (win->shell_surface)
-          wl_shell_surface_add_listener(win->shell_surface, 
-                                        &_ecore_wl_shell_surface_listener, 
win);
+         if (win->shell_surface)
+            wl_shell_surface_add_listener(win->shell_surface,
+                                          &_ecore_wl_shell_surface_listener,
+                                          win);
      }
 
    /* trap for valid shell surface */
-   if (!win->shell_surface) return;
+   if ((!win->xdg_surface) && (!win->shell_surface)) return;
 
    switch (win->type)
      {
       case ECORE_WL_WINDOW_TYPE_FULLSCREEN:
-        wl_shell_surface_set_fullscreen(win->shell_surface, 
-                                        
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
-                                        0, NULL);
+        if (win->xdg_surface)
+           xdg_surface_set_fullscreen(win->xdg_surface, NULL);
+        else if (win->shell_surface)
+           wl_shell_surface_set_fullscreen(win->shell_surface,
+                                   WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
+                                   0, NULL);
         break;
       case ECORE_WL_WINDOW_TYPE_MAXIMIZED:
-        wl_shell_surface_set_maximized(win->shell_surface, NULL);
+        if (win->xdg_surface)
+           xdg_surface_set_maximized(win->xdg_surface);
+        else if (win->shell_surface)
+           wl_shell_surface_set_maximized(win->shell_surface, NULL);
         break;
       case ECORE_WL_WINDOW_TYPE_TRANSIENT:
-        wl_shell_surface_set_transient(win->shell_surface, 
-                                       win->parent->surface, 
-                                       win->allocation.x, win->allocation.y, 
0);
+        if (win->xdg_surface)
+           xdg_surface_set_parent(win->xdg_surface, win->parent->surface);
+        else if (win->shell_surface)
+           wl_shell_surface_set_transient(win->shell_surface,
+                                          win->parent->surface,
+                                          win->allocation.x,
+                                          win->allocation.y, 0);
         break;
       case ECORE_WL_WINDOW_TYPE_MENU:
-        wl_shell_surface_set_popup(win->shell_surface, 
-                                   _ecore_wl_disp->input->seat,
-                                   _ecore_wl_disp->serial,
-                                   win->parent->surface, 
-                                   win->allocation.x, win->allocation.y, 0);
+       if (win->xdg_surface)
+         {
+            win->xdg_popup = 
+                          xdg_shell_get_xdg_popup(_ecore_wl_disp->wl.xdg_shell,
+                                                  win->surface, 
+                                                  win->parent->surface,
+                                                  _ecore_wl_disp->input->seat,
+                                                  _ecore_wl_disp->serial,
+                                                  win->allocation.x,
+                                                  win->allocation.y, 0);
+            xdg_popup_set_user_data(win->xdg_popup, win);
+            xdg_popup_add_listener(win->xdg_popup, 
+                                   &_ecore_xdg_popup_listener, win);
+         }
+        else if (win->shell_surface)
+           wl_shell_surface_set_popup(win->shell_surface,
+                                      _ecore_wl_disp->input->seat,
+                                      _ecore_wl_disp->serial,
+                                      win->parent->surface,
+                                      win->allocation.x, win->allocation.y, 0);
         break;
       case ECORE_WL_WINDOW_TYPE_TOPLEVEL:
-        wl_shell_surface_set_toplevel(win->shell_surface);
+        if (win->xdg_surface)
+           xdg_surface_set_parent(win->xdg_surface, NULL);
+        else if (win->shell_surface)
+           wl_shell_surface_set_toplevel(win->shell_surface);
         break;
       default:
         break;
@@ -329,8 +376,16 @@ ecore_wl_window_hide(Ecore_Wl_Window *win)
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    if (!win) return;
+
+   if (win->xdg_surface) xdg_surface_destroy(win->xdg_surface);
+   win->xdg_surface = NULL;
+
+   if (win->xdg_popup) xdg_popup_destroy(win->xdg_popup);
+   win->xdg_popup = NULL;
+
    if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
    win->shell_surface = NULL;
+
    if (win->surface) wl_surface_destroy(win->surface);
    win->surface = NULL;
 }
@@ -353,20 +408,37 @@ ecore_wl_window_maximized_set(Ecore_Wl_Window *win, 
Eina_Bool maximized)
    if (!win) return;
 
    if ((win->type == ECORE_WL_WINDOW_TYPE_MAXIMIZED) == maximized) return;
+
    if (win->type == ECORE_WL_WINDOW_TYPE_TOPLEVEL)
      {
         win->saved.w = win->allocation.w;
         win->saved.h = win->allocation.h;
-        if (win->shell_surface) 
-          wl_shell_surface_set_maximized(win->shell_surface, NULL);
-        win->type = ECORE_WL_WINDOW_TYPE_MAXIMIZED;
+
+        if (win->xdg_surface)
+          {
+             xdg_surface_set_maximized(win->xdg_surface);
+             win->type = ECORE_WL_WINDOW_TYPE_MAXIMIZED;
+          }
+        else if (win->shell_surface)
+          {
+             wl_shell_surface_set_maximized(win->shell_surface, NULL);
+             win->type = ECORE_WL_WINDOW_TYPE_MAXIMIZED;
+          }
      }
    else if (win->type == ECORE_WL_WINDOW_TYPE_MAXIMIZED)
      {
-        if (win->shell_surface) 
-          wl_shell_surface_set_toplevel(win->shell_surface);
-        win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
-        _ecore_wl_window_configure_send(win, win->saved.w, win->saved.h, 0);
+        if (win->xdg_surface)
+          {
+             xdg_surface_unset_maximized(win->xdg_surface);
+             win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
+             _ecore_wl_window_configure_send(win, win->saved.w, win->saved.h, 
0);
+          }
+        else if (win->shell_surface)
+          {
+             wl_shell_surface_set_toplevel(win->shell_surface);
+             win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
+             _ecore_wl_window_configure_send(win, win->saved.w, win->saved.h, 
0);
+          }
      }
 }
 
@@ -395,6 +467,10 @@ ecore_wl_window_fullscreen_set(Ecore_Wl_Window *win, 
Eina_Bool fullscreen)
         win->type = ECORE_WL_WINDOW_TYPE_FULLSCREEN;
         win->saved.w = win->allocation.w;
         win->saved.h = win->allocation.h;
+
+       if (win->xdg_surface)
+          xdg_surface_set_fullscreen(win->xdg_surface, NULL);
+
         if (win->shell_surface)
           wl_shell_surface_set_fullscreen(win->shell_surface, 
                                           
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
@@ -402,8 +478,11 @@ ecore_wl_window_fullscreen_set(Ecore_Wl_Window *win, 
Eina_Bool fullscreen)
      }
    else 
      {
-        if (win->shell_surface)
+       if (win->xdg_surface)
+           xdg_surface_unset_fullscreen(win->xdg_surface);
+        else if (win->shell_surface)
           wl_shell_surface_set_toplevel(win->shell_surface);
+
         win->type = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
         _ecore_wl_window_configure_send(win, win->saved.w, win->saved.h, 0);
      }
@@ -509,6 +588,16 @@ ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win)
    return win->shell_surface;
 }
 
+/* @since 1.11 */
+EAPI struct xdg_surface *
+ecore_wl_window_xdg_surface_get(Ecore_Wl_Window *win)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!win) return NULL;
+   return win->xdg_surface;
+}
+
 EAPI Ecore_Wl_Window *
 ecore_wl_window_find(unsigned int id)
 {
@@ -746,7 +835,9 @@ ecore_wl_window_title_set(Ecore_Wl_Window *win, const char 
*title)
    if (!win) return;
    eina_stringshare_replace(&win->title, title);
 
-   if ((win->shell_surface) && (win->title))
+   if ((win->xdg_surface) && (win->title))
+     xdg_surface_set_title(win->xdg_surface, win->title);
+   else if ((win->shell_surface) && (win->title))
      wl_shell_surface_set_title(win->shell_surface, win->title);
 }
 

-- 


Reply via email to