Upstream merge
[framework/uifw/ecore.git] / src / lib / ecore_evas / ecore_evas_wayland_egl.c
index 6237e59..b168d31 100644 (file)
@@ -2,7 +2,7 @@
 # include "config.h"
 #endif
 
-//#define LOGFNS 1
+#define LOGFNS 1
 
 #ifdef LOGFNS
 # include <stdio.h>
@@ -241,8 +241,9 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
    if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
      {
         einfo->info.display = ecore_wl_display_get();
-        einfo->info.destination_alpha = EINA_FALSE;
+        einfo->info.destination_alpha = ee->alpha;
         einfo->info.rotation = ee->rotation;
+        einfo->info.depth = 32;
         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
           {
              ERR("Failed to set Evas Engine Info for '%s'", ee->driver);
@@ -270,8 +271,8 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
         evas_object_move(ee->engine.wl.frame, 0, 0);
      }
 
-   ecore_evas_input_event_register(ee);
    _ecore_evas_register(ee);
+   ecore_evas_input_event_register(ee);
 
    ecore_event_window_register(ee->prop.window, ee, ee->evas, 
                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, 
@@ -279,7 +280,7 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in
                                (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, 
                                (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
 
-   evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
+   /* evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL); */
 
    return ee;
 }
@@ -430,10 +431,14 @@ _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y)
    if (!ee) return;
    ee->req.x = x;
    ee->req.y = y;
-   ee->x = x;
-   ee->y = y;
-   if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y);
-   if (ee->func.fn_move) ee->func.fn_move(ee);
+   if ((ee->x != x) || (ee->y != y))
+     {
+        ee->x = x;
+        ee->y = y;
+        if (ee->engine.wl.win) 
+          ecore_wl_window_update_location(ee->engine.wl.win, x, y);
+        if (ee->func.fn_move) ee->func.fn_move(ee);
+     }
 }
 
 static void 
@@ -444,7 +449,6 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
    if (!ee) return;
    if (w < 1) w = 1;
    if (h < 1) h = 1;
-//   if ((ee->w == w) && (ee->h == h)) return;
 
    if (ee->prop.min.w > w) w = ee->prop.min.w;
    else if (w > ee->prop.max.w) w = ee->prop.max.w;
@@ -456,25 +460,47 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
 
 //   ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h);
 
-   ee->w = w;
-   ee->h = h;
+   if ((ee->w != w) || (ee->h != h))
+     {
+        ee->w = w;
+        ee->h = h;
 
-   /* change evas output & viewport sizes */
-   evas_output_size_set(ee->evas, ee->w, ee->h);
-   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
-   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
-   if (ee->engine.wl.frame)
-     evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
+        if ((ee->rotation == 90) || (ee->rotation == 270))
+          {
+             evas_output_size_set(ee->evas, h, w);
+             evas_output_viewport_set(ee->evas, 0, 0, h, w);
+          }
+        else 
+          {
+             evas_output_size_set(ee->evas, w, h);
+             evas_output_viewport_set(ee->evas, 0, 0, w, h);
+          }
+
+        if (ee->prop.avoid_damage)
+          {
+             int pdam = 0;
+
+             pdam = ecore_evas_avoid_damage_get(ee);
+             ecore_evas_avoid_damage_set(ee, 0);
+             ecore_evas_avoid_damage_set(ee, pdam);
+          }
 
-   /* set new engine destination */
-   /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
+        if (ee->engine.wl.frame)
+          evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
 
-   /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */
-   ecore_wl_flush();
+        /* set new engine destination */
+        /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
 
-   ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */
 
-   if (ee->func.fn_resize) ee->func.fn_resize(ee);
+        // WAS ACTIVE
+        /* ecore_wl_flush(); */
+
+        if (ee->engine.wl.win)
+          ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+
+        if (ee->func.fn_resize) ee->func.fn_resize(ee);
+     }
 }
 
 static void 
@@ -489,25 +515,39 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
    if (ee->engine.wl.win)
      {
         ecore_wl_window_show(ee->engine.wl.win);
-        ecore_wl_flush();
-     }
-
-   einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
-   if (!einfo)
-     {
-        ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
-        return;
+        ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h);
+        /* ecore_wl_sync(); */
+
+        if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.clas);
+        if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
+          wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, 
+                                     ee->prop.title);
      }
 
-   einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win);
-   evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
-
    if (ee->engine.wl.frame)
      {
         evas_object_show(ee->engine.wl.frame);
         evas_object_resize(ee->engine.wl.frame, ee->w, ee->h);
      }
 
+   if (ee->engine.wl.win)
+     {
+        einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
+        if (!einfo)
+          {
+             ERR("Failed to get Evas Engine Info for '%s'", ee->driver);
+             return;
+          }
+
+        einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win);
+        /* if (einfo->info.surface) */
+        evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
+        /* else */
+        /*   printf("Failed to get a Surface from Ecore_Wl\n"); */
+     }
+
    /* ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); */
 
    ee->visible = 1;
@@ -523,12 +563,6 @@ _ecore_evas_wl_hide(Ecore_Evas *ee)
 
    if ((!ee) || (!ee->visible)) return;
 
-   if (ee->engine.wl.win) 
-     {
-        ecore_wl_window_hide(ee->engine.wl.win);
-        ecore_wl_flush();
-     }
-
    einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas);
    if (einfo)
      {
@@ -536,6 +570,9 @@ _ecore_evas_wl_hide(Ecore_Evas *ee)
         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
      }
 
+   if (ee->engine.wl.win) 
+     ecore_wl_window_hide(ee->engine.wl.win);
+
    ee->visible = 0;
    ee->should_be_visible = 0;
 
@@ -567,6 +604,10 @@ _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title)
         if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return;
         evas_object_text_text_set(sd->text, ee->prop.title);
      }
+
+   if ((ee->prop.title) && (ee->engine.wl.win->shell_surface))
+     wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, 
+                                ee->prop.title);
 }
 
 static void 
@@ -581,7 +622,10 @@ _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
    ee->prop.clas = NULL;
    if (n) ee->prop.name = strdup(n);
    if (c) ee->prop.clas = strdup(c);
-   /* FIXME: Forward these changes to Wayland somehow */
+
+   if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface))
+     wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, 
+                                ee->prop.clas);
 }
 
 static void