Ecore_Evas Merge Tizen changes to upstream EFL.
authorChristopher Michael <cpmichael1@comcast.net>
Tue, 3 Jul 2012 07:44:17 +0000 (07:44 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Tue, 3 Jul 2012 07:44:17 +0000 (07:44 +0000)
SVN revision: 73206

15 files changed:
legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h
legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_ews.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_extn.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h
legacy/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_sdl.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_win32.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_wince.c
legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c

index 248aedb..e0c351b 100644 (file)
@@ -662,6 +662,26 @@ EAPI void        ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on);
  */
 EAPI Eina_Bool   ecore_evas_maximized_get(const Ecore_Evas *ee);
 /**
+ * @brief Set Ecore_Evas's window profile list.
+ *
+ * @param ee The Ecore_Evas
+ * @param profiles The profile name list
+ * @param num_profiles The number of profile names
+ *
+ * @warning Support for this depends on the underlying windowing system.
+ * @since 1.3.0
+ */
+EAPI void        ecore_evas_profiles_set(Ecore_Evas *ee, const char **profiles, unsigned int num_profiles);
+/**
+ * @brief Get Ecore_Evas's window profile name.
+ *
+ * @param ee The Ecore_Evas
+ * @return The profile name
+ *
+ * @since 1.3.0
+ */
+EAPI const char *ecore_evas_profile_get(const Ecore_Evas *ee);
+/**
  * @brief Move an Ecore_Evas.
  *
  * @param ee The Ecore_Evas to move
index 9067adf..105021b 100644 (file)
@@ -515,6 +515,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
      NULL,
      _ecore_evas_buffer_alpha_set,
      NULL, //transparent
+     NULL, // profiles_set
 
      NULL,
      NULL,
index 0947b11..016e19e 100644 (file)
@@ -463,6 +463,7 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
     NULL,
     NULL,
     NULL, //transparent    
+    NULL, // profiles_set
      
      NULL,
      NULL,
index c11167e..074ce67 100644 (file)
@@ -489,6 +489,7 @@ static Ecore_Evas_Engine_Func _ecore_directfb_engine_func =
      NULL,                              /* ignore events */
      NULL,                              /* alpha */
      NULL, //transparent
+     NULL, // profiles_set
 
      NULL,
      NULL,
index 47d90f0..b612830 100644 (file)
@@ -683,6 +683,7 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
      _ecore_evas_ews_ignore_events_set,
      _ecore_evas_ews_alpha_set,
      _ecore_evas_ews_transparent_set,
+     NULL, // profiles_set
    
      NULL,
      NULL,
index 032484a..d80eca7 100644 (file)
@@ -2003,6 +2003,7 @@ static const Ecore_Evas_Engine_Func _ecore_extn_socket_engine_func =
    NULL,
    _ecore_evas_extn_socket_alpha_set,
    NULL, //transparent
+   NULL, // profiles_set
 
    NULL,
    NULL,
index 3fc8acf..f8b8b86 100644 (file)
@@ -551,6 +551,7 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
      NULL,
      NULL,
      NULL, //transparent
+     NULL, // profiles_set
 
      NULL,
      NULL,
index ba75e55..e478ad2 100644 (file)
@@ -177,6 +177,7 @@ struct _Ecore_Evas_Engine_Func
    void (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore);
    void (*fn_alpha_set) (Ecore_Evas *ee, int alpha);
    void (*fn_transparent_set) (Ecore_Evas *ee, int transparent);
+   void (*fn_profiles_set) (Ecore_Evas *ee, const char **profiles, int num_profiles);
 
    void (*fn_window_group_set) (Ecore_Evas *ee, const Ecore_Evas *ee_group);
    void (*fn_aspect_set) (Ecore_Evas *ee, double aspect);
@@ -330,6 +331,7 @@ struct _Ecore_Evas
       char           *title;
       char           *name;
       char           *clas;
+      char           *profile;
       struct {
         int          w, h;
       } min,
@@ -396,6 +398,7 @@ struct _Ecore_Evas
    unsigned char no_comp_sync  : 1;
    unsigned char semi_sync  : 1;
    unsigned char deleted : 1;
+   int           gl_sync_draw_done; // added by gl77.lee
 };
 
 void _ecore_evas_ref(Ecore_Evas *ee);
index 038654a..02c6a69 100644 (file)
@@ -395,6 +395,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
    NULL,
    NULL,
    NULL, //transparent
+   NULL, // profiles_set
 
    NULL,
    NULL,
index d2503fe..1ca6f2b 100644 (file)
@@ -431,6 +431,7 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
    NULL,
    NULL,
    NULL, //transparent
+   NULL, // profiles_set
 
    NULL,
    NULL,
index 46bbf0f..dd203b8 100644 (file)
@@ -2,7 +2,7 @@
 # include "config.h"
 #endif
 
-#define LOGFNS 1
+//#define LOGFNS 1
 
 #ifdef LOGFNS
 # include <stdio.h>
@@ -143,6 +143,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    _ecore_evas_wl_ignore_events_set,
    _ecore_evas_wl_alpha_set,
    _ecore_evas_wl_transparent_set,
+   NULL, // func profiles set
    NULL,
    NULL,
    NULL,
index a94c0f0..333c272 100644 (file)
@@ -148,6 +148,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    _ecore_evas_wl_ignore_events_set,
    _ecore_evas_wl_alpha_set,
    _ecore_evas_wl_transparent_set,
+   NULL, // func profiles set
    NULL, // window group set
    NULL, // aspect set
    NULL, // urgent set
index c0f70a2..ff3fe5c 100644 (file)
@@ -1072,6 +1072,7 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
      NULL, /* _ecore_evas_x_ignore_events_set */
      _ecore_evas_win32_alpha_set,
      NULL, //transparent
+     NULL, // profiles_set
 
      NULL,
      NULL,
index fecf26b..2bbd1bd 100644 (file)
@@ -772,6 +772,7 @@ static Ecore_Evas_Engine_Func _ecore_wince_engine_func =
    NULL, /* _ecore_evas_x_ignore_events_set */
    NULL, /* _ecore_evas_x_alpha_set */
    NULL, //transparent
+   NULL, // profiles_set
 
    NULL,
    NULL,
index c0ec2ba..feb812c 100644 (file)
@@ -102,6 +102,8 @@ _ecore_evas_x_protocols_set(Ecore_Evas *ee)
 static void
 _ecore_evas_x_sync_set(Ecore_Evas *ee)
 {
+   Ecore_X_Sync_Counter sync_counter = ee->engine.x.sync_counter;
+
    if (((ee->should_be_visible) || (ee->visible)) &&
        ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
            (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
@@ -112,9 +114,13 @@ _ecore_evas_x_sync_set(Ecore_Evas *ee)
    else
      {
         if (ee->engine.x.sync_counter)
+          {
            ecore_x_sync_counter_free(ee->engine.x.sync_counter);
+             ee->engine.x.sync_val = 0;
+          }
         ee->engine.x.sync_counter = 0;
      }
+   if (sync_counter != ee->engine.x.sync_counter)
    ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
 }
 
@@ -123,6 +129,7 @@ _ecore_evas_x_sync_clear(Ecore_Evas *ee)
 {
    if (!ee->engine.x.sync_counter) return;
    ecore_x_sync_counter_free(ee->engine.x.sync_counter);
+   ee->engine.x.sync_val = 0;
    ee->engine.x.sync_counter = 0;
 }
 
@@ -709,6 +716,34 @@ _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__,
              break;
           }
      }
+   else if (e->atom == ECORE_X_ATOM_E_PROFILE)
+     {
+        char *p = ecore_x_e_window_profile_get(e->win);
+        if ((p) && (ee->prop.profile))
+          {
+             if (strcmp(p, ee->prop.profile) != 0)
+               {
+                  free(ee->prop.profile);
+                  ee->prop.profile = strdup(p);
+                  state_change = 1;
+               }
+          }
+        else if ((!p) && (ee->prop.profile))
+          {
+             free(ee->prop.profile);
+             ee->prop.profile = NULL;
+             state_change = 1;
+          }
+        else if ((p) && (!ee->prop.profile))
+          {
+             ee->prop.profile = strdup(p);
+             state_change = 1;
+          }
+
+        if (p)
+          free(p);
+     }
+
    if (state_change)
      {
         if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
@@ -1115,6 +1150,17 @@ _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void
    ee = ecore_event_window_match(e->win);
    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   /* some GL drivers are doing buffer copy in a separate thread.
+    * we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying
+    * that are required in order to exactly render. - added by gl77.lee
+    */
+   if (ee->gl_sync_draw_done < 0)
+     {
+        if (getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"))
+           ee->gl_sync_draw_done = atoi(getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"));
+        else
+           ee->gl_sync_draw_done = 0;
+     }
    if (first_map_bug < 0)
      {
         char *bug = NULL;
@@ -1671,14 +1717,41 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
      }
 }
 
+#define _USE_WIN_ROT_EFFECT 1
+
+#if _USE_WIN_ROT_EFFECT
+static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
+
+typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
+struct _Ecore_Evas_X_Rotation_Effect
+{
+   Eina_Bool    wait_for_comp_reply;
+};
+
+static Ecore_Evas_X_Rotation_Effect _rot_effect =
+{
+   EINA_FALSE
+};
+
+static void
+_ecore_evas_x_rotation_effect_setup(void)
+{
+   _rot_effect.wait_for_comp_reply = EINA_TRUE;
+}
+#endif /* end of _USE_WIN_ROT_EFFECT */
+
 static void
 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
 {
+   if (ee->rotation == rotation) return;
+   if (!strcmp(ee->driver, "xrender_x11")) return;
+
+#if _USE_WIN_ROT_EFFECT
    int angles[2];
    angles[0] = rotation;
    angles[1] = ee->rotation;
+#endif /* end of _USE_WIN_ROT_EFFECT */
 
-   if (ee->rotation == rotation) return;
    if (!strcmp(ee->driver, "opengl_x11"))
      {
 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
@@ -1689,9 +1762,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         einfo->info.rotation = rotation;
         _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
                                             (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
         ecore_x_window_prop_property_set(ee->prop.window,
                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
      }
    else if (!strcmp(ee->driver, "software_x11"))
@@ -1704,9 +1783,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         einfo->info.rotation = rotation;
         _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
                                             (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
         ecore_x_window_prop_property_set(ee->prop.window,
                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
      }
    else if (!strcmp(ee->driver,  "software_16_x11"))
@@ -1719,9 +1804,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         einfo->info.rotation = rotation;
         _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
                                             (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
         ecore_x_window_prop_property_set(ee->prop.window,
                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
      }
    else if (!strcmp(ee->driver,  "software_8_x11"))
@@ -1734,11 +1825,29 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
         einfo->info.rotation = rotation;
         _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
                                             (Evas_Engine_Info *)einfo);
+# if _USE_WIN_ROT_EFFECT
         ecore_x_window_prop_property_set(ee->prop.window,
                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
+# else
+        ecore_x_window_prop_property_set(ee->prop.window,
+                                         ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
+                                         ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
+# endif
 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
      }
+
+#if _USE_WIN_ROT_EFFECT
+   if ((ee->visible) &&
+       ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
+        (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) &&
+        (ee->engine.x.sync_counter) &&
+        (ee->engine.x.sync_val > 0))
+     {
+        _ecore_evas_x_rotation_effect_setup();
+        _ecore_evas_x_flush_pre(ee, NULL, NULL);
+     }
+#endif /* end of _USE_WIN_ROT_EFFECT */
 }
 
 static void
@@ -2664,6 +2773,13 @@ _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
 }
 
 static void
+_ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
+{
+   /* Ecore_Evas's profile will be updated when WM sets the E_PROFILE. */
+   ecore_x_e_window_profile_list_set(ee->prop.window, plist, n);
+}
+
+static void
 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
 {
    if (ee->prop.avoid_damage == on) return;
@@ -2910,6 +3026,7 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func =
      _ecore_evas_x_ignore_events_set,
      _ecore_evas_x_alpha_set,
      _ecore_evas_x_transparent_set,
+     _ecore_evas_x_profiles_set,
    
      _ecore_evas_x_window_group_set,
      _ecore_evas_x_aspect_set,
@@ -2956,7 +3073,8 @@ _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUS
 {
    Ecore_Evas *ee = data;
 
-   if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync))
+   if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
+       (!ee->gl_sync_draw_done)) // added by gl77.lee
      {
         if (ee->engine.x.sync_counter)
           {
@@ -3326,14 +3444,20 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
 
    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
 
+   ee->gl_sync_draw_done = -1; // added by gl77.lee
+
    _ecore_evas_x_init();
 
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
 
    ee->driver = "opengl_x11";
+#if 1
+   ee->semi_sync = 0; // gl engine doesn't need to sync - its whole swaps
+#else
    if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC"))
       ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps
 //   ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps
+#endif
    if (disp_name) ee->name = strdup(disp_name);
 
    if (w < 1) w = 1;