Elm: Patches from Rob Bradford <rob@linux.intel.com> to:
authorChristopher Michael <cpmichael1@comcast.net>
Wed, 6 Jun 2012 13:55:15 +0000 (13:55 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Wed, 6 Jun 2012 13:55:15 +0000 (13:55 +0000)
* Move X related window items into their own substruct of
_Elm_Win_Smart_Data to allow grouping based on engine.

* Move X related cursor items into their own substruct of Elm_Cursor
to make supporting cursors on other platforms cleaner.

* Add support for setting the cursor under Wayland:
* Introduce a configure option and #define to as per other engines
* Add always-built API function to allow identification of running
under Wayland (like for X11)
* Call into Ecore to set the cursor when the mouse enters the desired
widget.

SVN revision: 71754

ChangeLog
configure.ac
src/lib/elm_priv.h
src/lib/elm_win.c
src/lib/elm_win.h
src/lib/els_cursor.c

index f95a0d7..5633d7a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * Move X related window items into their own substruct of
        _Elm_Win_Smart_Data to allow grouping based on engine.
 
+2012-05-29 Rob Bradford
+       * Move X related cursor items into their own substruct of Elm_Cursor
+       to make supporting cursors on other platforms cleaner.
+
+2012-05-30 Rob Bradford
+       * Add support for setting the cursor under Wayland:
+       * Introduce a configure option and #define to as per other engines
+       * Add always-built API function to allow identification of running
+       under Wayland (like for X11)
+       * Call into Ecore to set the cursor when the mouse enters the desired
+       widget.
+
 2012-05-30 Mike Blumenkrantz
 
         * Fix even/odd signals for genlist items
index 7b5785a..27ca597 100644 (file)
@@ -444,6 +444,29 @@ if test "x$want_elementary_wince" = "xyes" -a "x$have_elementary_wince" = "xno";
     AC_MSG_ERROR([ecore-wince support requested, but not found by pkg-config.])
 fi
 
+have_elementary_wayland="no"
+want_elementary_wayland="auto"
+AC_ARG_ENABLE([ecore-x],
+   [AC_HELP_STRING([--disable-ecore-wayland], [disable ecore-wayland support. @<:@default=detect@:>@])],
+   [want_elementary_wayland=$enableval], [])
+
+if test "x$want_elementary_wayland" != "xno"; then
+   PKG_CHECK_MODULES([ELEMENTARY_WAYLAND],
+      [ecore-wayland],
+      [
+       AC_DEFINE(HAVE_ELEMENTARY_WAYLAND, 1, [Wayland support for Elementary])
+       have_elementary_wayland="yes"
+       requirement_elm="ecore-wayland ${requirement_elm}"
+      ],
+      [have_elementary_wayland="no"]
+   )
+else
+    have_elementary_wayland="no"
+fi
+if test "x$want_elementary_wayland" = "xyes" -a "x$have_elementary_wayland" = "xno"; then
+    AC_MSG_ERROR([ecore-x support requested, but not found by pkg-config.])
+fi
+
 ELM_EDBUS_DEF="#undef"
 have_elementary_edbus="no"
 want_elementary_edbus="auto"
@@ -752,6 +775,7 @@ echo "    SDL....................: ${have_elementary_sdl}"
 echo "    Cocoa..................: ${have_elementary_cocoa}"
 echo "    Windows XP.............: ${have_elementary_win32}"
 echo "    Windows CE.............: ${have_elementary_wince}"
+echo "    Wayland...............:. ${have_elementary_wayland}"
 echo
 echo "  Features:"
 echo "    Ecore_IMF..............: ${have_ecore_imf}"
index ae6c20c..d62ed1f 100644 (file)
@@ -12,6 +12,9 @@
 #ifdef HAVE_ELEMENTARY_WINCE
 #include <Ecore_WinCE.h>
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+#include <Ecore_Wayland.h>
+#endif
 
 #include "elm_widget.h"
 
index 7e4ece0..11b14a3 100644 (file)
@@ -50,6 +50,13 @@ struct _Elm_Win_Smart_Data
       Ecore_Event_Handler           *client_message_handler;
    } x;
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   struct
+   {
+     Ecore_Wl_Window             *win;
+   } wl;
+#endif
+
    Ecore_Job                     *deferred_resize_job;
    Ecore_Job                     *deferred_child_eval_job;
 
@@ -2146,6 +2153,10 @@ elm_win_add(Evas_Object *parent,
    _elm_win_xwindow_get(sd);
 #endif
 
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   sd->wl.win = ecore_evas_wayland_window_get(sd->ee);
+#endif
+
    if ((_elm_config->bgpixmap) && (!_elm_config->compositing))
      ecore_evas_avoid_damage_set(sd->ee, ECORE_EVAS_AVOID_DAMAGE_EXPOSE);
    // bg pixmap done by x - has other issues like can be redrawn by x before it
@@ -3384,3 +3395,24 @@ elm_win_xwindow_get(const Evas_Object *obj)
 #endif
    return 0;
 }
+
+EAPI Ecore_Wl_Window *
+elm_win_wl_window_get(const Evas_Object *obj)
+{
+   if (!obj) return NULL;
+
+   if (!evas_object_smart_type_check_ptr(obj, WIN_SMART_NAME))
+     {
+        Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
+        return ecore_evas_wayland_window_get(ee);
+     }
+
+   ELM_WIN_CHECK(obj) NULL;
+   ELM_WIN_DATA_GET_OR_RETURN_VAL(obj, sd, NULL);
+#if HAVE_ELEMENTARY_WAYLAND
+   if (sd->wl.win) return sd->wl.win;
+   if (sd->parent) return elm_win_wl_window_get(sd->parent);
+#endif
+   return NULL;
+}
+
index 1f48663..a968119 100644 (file)
@@ -1246,6 +1246,18 @@ EAPI Eina_Bool             elm_win_socket_listen(Evas_Object *obj, const char *s
  */
 EAPI Ecore_X_Window elm_win_xwindow_get(const Evas_Object *obj);
 
+/* Wayland specific call - returns NULL on non-Wayland engines */
+/**
+ * Get the Ecore_Wl_Window of and Evas_Object
+ *
+ * @param obj the object
+ *
+ * @return The Ecore_Wl_Window of @p obj
+ *
+ * @ingroup Win
+ */
+EAPI Ecore_Wl_Window *elm_win_wl_window_get(const Evas_Object *obj);
+
 /**
  * @}
  */
index 34c5ee2..c44b342 100644 (file)
@@ -135,9 +135,17 @@ struct _Elm_Cursor
    Ecore_Evas *ee;
    Evas *evas;
 #ifdef HAVE_ELEMENTARY_X
-   Ecore_X_Cursor cursor;
-   Ecore_X_Window win;
+   struct {
+     Ecore_X_Cursor cursor;
+     Ecore_X_Window win;
+   } x;
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   struct {
+     Ecore_Wl_Window *win;
+   } wl;
+#endif
+
    Eina_Bool visible:1;
    Eina_Bool use_engine:1;
    Eina_Bool engine_only:1;
@@ -215,8 +223,12 @@ _elm_cursor_mouse_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSE
    else
      {
 #ifdef HAVE_ELEMENTARY_X
-        if (cur->win)
-          ecore_x_window_cursor_set(cur->win, cur->cursor);
+        if (cur->x.win)
+          ecore_x_window_cursor_set(cur->x.win, cur->x.cursor);
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+        if (cur->wl.win)
+          ecore_wl_window_cursor_from_name_set(cur->wl.win, cur->cursor_name);
 #endif
      }
    evas_event_thaw(cur->evas);
@@ -255,8 +267,12 @@ _elm_cursor_mouse_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUS
    else
      {
 #ifdef HAVE_ELEMENTARY_X
-        if (cur->win)
-          ecore_x_window_cursor_set(cur->win, ECORE_X_CURSOR_X);
+        if (cur->x.win)
+          ecore_x_window_cursor_set(cur->x.win, ECORE_X_CURSOR_X);
+#endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+        if (cur->wl.win)
+          ecore_wl_window_cursor_default_restore(cur->wl.win);
 #endif
      }
    evas_event_thaw(cur->evas);
@@ -301,24 +317,27 @@ _elm_cursor_cur_set(Elm_Cursor *cur)
    if (cur->use_engine)
      {
 #ifdef HAVE_ELEMENTARY_X
-        struct _Cursor_Id *cur_id;
+        cur->x.win = elm_win_xwindow_get(cur->eventarea);
+        if (cur->x.win)
+          {
+             struct _Cursor_Id *cur_id;
 
-        cur_id = bsearch(&(cur->cursor_name), _cursors, _cursors_count,
-                         sizeof(struct _Cursor_Id), _elm_cursor_strcmp);
+             cur_id = bsearch(&(cur->cursor_name), _cursors, _cursors_count,
+                              sizeof(struct _Cursor_Id), _elm_cursor_strcmp);
 
-        cur->win = elm_win_xwindow_get(cur->eventarea);
-        if (cur->win)
-          {
              if (!cur_id)
                {
                   INF("X cursor couldn't be found: %s. Using default.",
                       cur->cursor_name);
-                  cur->cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_X);
+                  cur->x.cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_X);
                }
              else
-                cur->cursor = ecore_x_cursor_shape_get(cur_id->id);
+                cur->x.cursor = ecore_x_cursor_shape_get(cur_id->id);
           }
 #endif
+#ifdef HAVE_ELEMENTARY_WAYLAND
+        cur->wl.win = elm_win_wl_window_get(cur->eventarea);
+#endif
      }
 }
 
@@ -425,8 +444,8 @@ elm_object_cursor_unset(Evas_Object *obj)
           ecore_evas_object_cursor_set(cur->ee, NULL, ELM_OBJECT_LAYER_CURSOR,
                                        cur->hot_x, cur->hot_y);
 #ifdef HAVE_ELEMENTARY_X
-        else if (cur->win)
-          ecore_x_window_cursor_set(cur->win, ECORE_X_CURSOR_X);
+        else if (cur->x.win)
+          ecore_x_window_cursor_set(cur->x.win, ECORE_X_CURSOR_X);
 #endif
      }