pc/ecore-imf-evas.pc \
pc/ecore-evas.pc \
pc/ecore-avahi.pc \
+pc/ecore-buffer.pc \
+ pc/ector.pc \
pc/embryo.pc \
pc/eio.pc \
pc/eldbus.pc \
[want_wayland="no"])
if test "${want_wayland}" = "yes"; then
- EFL_PKG_CHECK_STRICT([wayland-client >= 1.3.0])
- EFL_PKG_CHECK_STRICT([wayland-client >= 1.8.0])
++ EFL_PKG_CHECK_STRICT([wayland-client >= 1.7.0])
fi
# Wayland IVI-Shell
### Add Wayland server library if test is enabled
if test "x${want_tests}" = "xyes" -a "x${want_wayland}" = "xyes"; then
- EFL_DEPEND_PKG([ECORE_WAYLAND_SRV], [WAYLAND], [wayland-server >= 1.3.0])
- EFL_DEPEND_PKG([ECORE_WAYLAND_SRV], [WAYLAND], [wayland-server >= 1.8.0])
++ EFL_DEPEND_PKG([ECORE_WAYLAND_SRV], [WAYLAND], [wayland-server >= 1.7.0])
EFL_EVAL_PKGS([ECORE_WAYLAND_SRV])
fi
EFL_LIB_START_OPTIONAL([Ecore_Buffer], [test "${want_ecore_buffer}" = "yes"])
### Checks for libraries
EFL_INTERNAL_DEPEND_PKG([ECORE_BUFFER], [eina])
- EFL_INTERNAL_DEPEND_PKG([ECORE_BUFFER], [ecore])
EFL_INTERNAL_DEPEND_PKG([ECORE_BUFFER], [eo])
+ EFL_INTERNAL_DEPEND_PKG([ECORE_BUFFER], [ecore])
EFL_DEPEND_PKG([ECORE_BUFFER], [WAYLAND],
- [wayland-client >= 1.5.0])
- EFL_EVAL_PKGS([ECORE_BUFFER])
+ [wayland-server >= 1.5.0 wayland-client >= 1.5.0])
- tbm_version="1.1.0"
- PKG_CHECK_MODULES([TBM], [libtbm >= ${tbm_version}],
-PKG_CHECK_MODULES([X11_DRI_COMMON],
- [
- libtbm >= 1.1.0,
- libdrm >= 2.4.35,
- ],
- [have_x11_dri_common_pkgs="yes"],
- [have_x11_dri_common_pkgs="no"]
-)
++PKG_CHECK_MODULES([TBM], [libtbm >= "1.1.0"],
+ [have_tbm="yes"],
+ [have_tbm="no"])
-if test "x$have_x11_dri_common_pkgs" = "xyes" ; then
- EFL_INTERNAL_DEPEND_PKG([ECORE_BUFFER], [ecore_x])
+if test "x${have_tbm}" = "xyes" ; then
+ build_ecore_buffer_tbm="yes"
+ AC_DEFINE(BUILD_ECORE_BUFFER_TBM, 1, [Support for TBM Backend in Ecore_Buffer])
+fi
+EFL_ADD_FEATURE([ECORE_BUFFER], [tbm], [${build_ecore_buffer_tbm}])
- PKG_CHECK_MODULES([X11_DRI2], [libdri2],
- [have_x11_dri2_pkgs="yes"],
- [have_x11_dri2_pkgs="no"])
- PKG_CHECK_MODULES([X11_DRI3],
+if test "x$want_x11_any" = "xyes" ; then
+ drm_version="2.4.35"
+ PKG_CHECK_MODULES([X11_DRI_COMMON],
[
- xshmfence,
- xcb,
- x11-xcb,
- xcb-sync,
- xcb-dri3
+ libtbm >= ${tbm_version},
+ libdrm >= ${drm_version}
+ ecore-x
],
- [have_x11_dri3_pkgs="yes"],
- [have_x11_dri3_pkgs="no"])
-fi
+ [have_x11_dri_common_pkgs="yes"],
+ [have_x11_dri_common_pkgs="no"]
+ )
-if test "x${have_x11_dri2_pkgs}" = "xyes" ; then
- build_ecore_buffer_x11_dri2="yes"
- AC_DEFINE(BUILD_ECORE_BUFFER_X11_DRI2, 1, [Support for X11_DRI2 Backend in Ecore_Buffer])
-fi
+ if test "x$have_x11_dri_common_pkgs" = "xyes" ; then
+ PKG_CHECK_MODULES([X11_DRI2], [libdri2],
+ [have_x11_dri2_pkgs="yes"],
+ [have_x11_dri2_pkgs="no"])
-if test "x${have_x11_dri3_pkgs}" = "xyes" ; then
- build_ecore_buffer_x11_dri3="yes"
- AC_DEFINE(BUILD_ECORE_BUFFER_X11_DRI3, 1, [Support for X11_DRI3 Backend in Ecore_Buffer])
-fi
-EFL_EVAL_PKGS([ECORE_BUFFER])
+ PKG_CHECK_MODULES([X11_DRI3],
+ [
+ xshmfence,
+ xcb,
+ x11-xcb,
+ xcb-sync,
+ xcb-dri3
+ ],
+ [have_x11_dri3_pkgs="yes"],
+ [have_x11_dri3_pkgs="no"])
+ fi
-EFL_ADD_FEATURE([ECORE_BUFFER], [shm], ["yes"])
-EFL_ADD_FEATURE([ECORE_BUFFER], [x11_dri2], [${build_ecore_buffer_x11_dri2}])
-EFL_ADD_FEATURE([ECORE_BUFFER], [x11_dri3], [${build_ecore_buffer_x11_dri3}])
+ if test "x${have_x11_dri2_pkgs}" = "xyes" ; then
+ build_ecore_buffer_x11_dri2="yes"
+ AC_DEFINE(BUILD_ECORE_BUFFER_X11_DRI2, 1, [Support for X11_DRI2 Backend in Ecore_Buffer])
+ fi
+ EFL_ADD_FEATURE([ECORE_BUFFER], [x11_dri2], [${build_ecore_buffer_x11_dri2}])
+
+ if test "x${have_x11_dri3_pkgs}" = "xyes" ; then
+ build_ecore_buffer_x11_dri3="yes"
+ AC_DEFINE(BUILD_ECORE_BUFFER_X11_DRI3, 1, [Support for X11_DRI3 Backend in Ecore_Buffer])
+ fi
+ EFL_ADD_FEATURE([ECORE_BUFFER], [x11_dri3], [${build_ecore_buffer_x11_dri3}])
+fi
EFL_LIB_END_OPTIONAL([Ecore_Buffer])
#### End of Ecore_Buffer
-
+#### src/examples/ephysics/Makefile
AC_CONFIG_FILES([
Makefile
data/Makefile
--- /dev/null
- %{_bindir}/emotion_test
+%bcond_with wayland
+%bcond_with x
+
+Name: efl
+Version: 1.13.1
+Release: 0
+License: LGPL-2.1
+Summary: Enlightenment Foundation Libraries - set of libraries used (not only) by e
+Url: http://enlightenment.org/
+Group: Graphics & UI Framework/API
+Source: %{name}-%{version}.tar.bz2
+Source100: efl.conf
+Source1001: efl.manifest
+
+BuildRequires: pkgconfig(check)
+BuildRequires: pkgconfig(libinput)
+BuildRequires: zlib-devel
+BuildRequires: gettext-tools
+
+%if %{with wayland}
+BuildRequires: pkgconfig(gles20)
+BuildRequires: pkgconfig(wayland-client)
+BuildRequires: pkgconfig(wayland-cursor)
+BuildRequires: pkgconfig(wayland-egl)
+BuildRequires: pkgconfig(text-client)
+BuildRequires: pkgconfig(xdg-shell-client)
+BuildRequires: pkgconfig(tizen-extension-client)
+Requires: libwayland-extension-client
+%endif
+
+%if %{with x}
+BuildRequires: pkgconfig(glesv2)
+BuildRequires: pkgconfig(libdri2)
+BuildRequires: pkgconfig(x11)
+BuildRequires: pkgconfig(xcursor)
+BuildRequires: pkgconfig(xinerama)
+BuildRequires: pkgconfig(xpm)
+BuildRequires: pkgconfig(xrandr)
+BuildRequires: pkgconfig(xext)
+BuildRequires: pkgconfig(xcomposite)
+BuildRequires: pkgconfig(xdamage)
+BuildRequires: pkgconfig(xfixes)
+BuildRequires: pkgconfig(xrender)
+BuildRequires: pkgconfig(xscrnsaver)
+BuildRequires: libXtst-devel
+BuildRequires: pkgconfig(xi)
+BuildRequires: pkgconfig(ice)
+BuildRequires: pkgconfig(sm)
+BuildRequires: pkgconfig(ibus-1.0)
+%endif
+
+BuildRequires: glib2-devel
+BuildRequires: pkgconfig(bullet)
+BuildRequires: pkgconfig(openssl)
+BuildRequires: gnutls-devel
+BuildRequires: curl-devel
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(xkbcommon)
+BuildRequires: systemd-devel
+
+#eldbus
+BuildRequires: dbus-devel
+
+#edje
+BuildRequires: pkgconfig(lua)
+BuildRequires: pkgconfig(sndfile)
+BuildRequires: pkgconfig(libpulse)
+
+#emotion
+BuildRequires: pkgconfig(gstreamer-1.0)
+BuildRequires: pkgconfig(gstreamer-plugins-base-1.0)
+
+#evas
+BuildRequires: libexif-devel
+BuildRequires: giflib-devel
+BuildRequires: libtiff-devel
+BuildRequires: pkgconfig(libpng)
+BuildRequires: libjpeg-turbo-devel
+BuildRequires: pkgconfig(pixman-1)
+BuildRequires: pkgconfig(freetype2)
+BuildRequires: pkgconfig(fribidi)
+BuildRequires: pkgconfig(fontconfig)
+BuildRequires: pkgconfig(harfbuzz)
+BuildRequires: pkgconfig(libtbm)
+
+#eeze
+BuildRequires: libudev-devel
+BuildRequires: libmount-devel
+BuildRequires: pkgconfig(dlog)
+
+#ecore_buffer
+%if %{with x}
+BuildRequires: pkgconfig(libdri2)
+BuildRequires: pkgconfig(xshmfence)
+BuildRequires: pkgconfig(x11)
+BuildRequires: pkgconfig(xcb)
+BuildRequires: pkgconfig(xcb-sync)
+BuildRequires: pkgconfig(xcb-dri3)
+%endif
+BuildRequires: pkgconfig(libtbm)
+BuildRequires: pkgconfig(libdrm)
+BuildRequires: pkgconfig(wayland-client)
+BuildRequires: pkgconfig(wayland-server)
+
+############ efl
+Provides: efl-data
+Obsoletes: efl-data
+
+
+%description
+EFL is a library collection providing various functionality used (not only) by
+Enlightenment, Terminology, Tizen and more.
+
+############ efl-data
+
+%package devel
+Summary: Developer files for EFL package
+
+%description devel
+This package includes developer files common to all packages.
+
+############ Eina
+%package -n eina
+Summary: Data type library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eina
+Eina is a data type library.
+
++%package -n eina-tools
++Summary: Eina Tools
++Group: Graphics & UI Framework/Utilities
++Requires: eina = %{version}-%{release}
++Provides: eina-bin
++
++%description -n eina-tools
++The eina tools package the eina binary utility.
++
+#%package -n eina-examples
+#Summary: Examples for the eina package
+#Group: Graphics & UI Framework/Testing
+#Requires: eina = %{version}-%{release}
+
+#%description -n eina-examples
+#Example files for eina
+
+%package -n eina-devel
+Summary: Development components for the eina package
+Group: Graphics & UI Framework/Development
+Requires: eina = %{version}-%{release}
+
+%description -n eina-devel
+Development files for eina.
+
++############ Emile
++%package -n emile
++Summary: EFL serialization, compression and crypto library
++Requires: %{name}-data = %{version}-%{release}
++
++%description -n emile
++EFL serialization, compression and crypto library
++
++%package -n emile-devel
++Summary: Development components for the emile package
++Group: Graphics & UI Framework/Development
++Requires: emile = %{version}-%{release}
++
++%description -n emile-devel
++Development files for emile.
++
+############ Eet
+%package -n eet
+Summary: Library for speedy data storage, retrieval, and compression
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eet
+Eet is a tiny library designed to write an arbitrary set of chunks of
+data to a file and optionally compress each chunk (very much like a
+zip file) and allow fast random-access reading of the file later
+on. It does not do zip as a zip itself has more complexity than is
+needed, and it was much simpler to implement this once here.
+
+It also can encode and decode data structures in memory, as well as
+image data for saving to eet files or sending across the network to
+other machines, or just writing to arbitrary files on the system. All
+data is encoded in a platform independent way and can be written and
+read by any architecture.
+
+%package -n eet-tools
+Summary: Eet Tools
+Group: Graphics & UI Framework/Utilities
+Requires: eet = %{version}-%{release}
+Provides: eet-bin
+
+%description -n eet-tools
+The eet tools package the eet binary utility.
+
+#%package -n eet-examples
+#Summary: Examples for the eet package
+#Group: Graphics & UI Framework/Testing
+#Requires: eet = %{version}-%{release}
+
+#%description -n eet-examples
+#Example files for eet
+
+%package -n eet-devel
+Summary: Development components for the eet package
+Group: Graphics & UI Framework/Development
+Requires: eet = %{version}-%{release}
+
+%description -n eet-devel
+Development files for eet
+
+############ Eo
+%package -n eo
+Summary: EFL generic object system library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eo
+The Eo generic object system. It was designed to be the base object
+system for the EFL.
+
+#%package -n eo-examples
+#Summary: Examples for the eo package
+#Group: Graphics & UI Framework/Testing
+#Requires: eo = %{version}-%{release}
+
+#%description -n eo-examples
+#Example files for eo
+
+%package -n eo-devel
+Summary: Development components for the eo package
+Group: Graphics & UI Framework/Development
+Requires: eo = %{version}-%{release}
+
+%description -n eo-devel
+Development files for eo
+
+############ Ector
+%package -n ector
+Summary: vector graphics library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n ector
+vector graphics library.
+
+%package -n ector-devel
+Summary: Development components for the ector package
+Group: Graphics & UI Framework/Development
+Requires: ector = %{version}-%{release}
+
+%description -n ector-devel
+Development files for ector
+
+############ Evas
+%package -n evas
+Summary: Multi-platform canvas library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n evas
+Evas is a clean display canvas API for several target display systems
+that can draw anti-aliased text, smooth super and sub-sampled scaled
+images, alpha-blend objects much and more.
+
+#%package -n evas-examples
+#Summary: Examples for the evas package
+#Group: Graphics & UI Framework/Testing
+#Requires: evas = %{version}-%{release}
+
+#%description -n evas-examples
+#Example files for evas
+
+%package -n evas-devel
+Summary: Development components for the evas package
+Group: Graphics & UI Framework/Development
+Requires: evas = %{version}-%{release}
+
+%description -n evas-devel
+Development files for evas
+
+############ Ecore
+%package -n ecore
+Summary: Enlightened Core X interface library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n ecore
+Ecore is the event/X abstraction layer that makes doing selections,
+Xdnd, general X stuff, event loops, timeouts and idle handlers fast,
+optimized, and convenient.
+
+#%package -n ecore-examples
+#Summary: Examples for the ecore package
+#Group: Graphics & UI Framework/Testing
+#Requires: ecore = %{version}-%{release}
+
+#%description -n ecore-examples
+#Example files for ecore
+
+%package -n ecore-devel
+Summary: Development components for the ecore package
+Group: Graphics & UI Framework/Development
+Requires: ecore = %{version}-%{release}
+
+%description -n ecore-devel
+Development files for ecore
+
+############ Eldbus
+%package -n eldbus
+Summary: D-Bus bindings for EFL
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eldbus
+Eldbus allows connecting to both system and session buses acting as
+both client and service roles.
+
+This is a replacement for old library "edbus". Its main purpose is to
+fix some core bugs and completely encapsulating D-Bus without exposing
+libdbus to end-user. One day libdbus may be completely removed as a
+dependency.
+
+#%package -n eldbus-examples
+#Summary: Examples for the eldbus package
+#Group: Graphics & UI Framework/Testing
+#Requires: eldbus = %{version}-%{release}
+
+#%description -n eldbus-examples
+#Example files for eldbus
+
+%package -n eldbus-devel
+Summary: Development components for the eldbus package
+Group: Graphics & UI Framework/Development
+Requires: eldbus = %{version}-%{release}
+
+%description -n eldbus-devel
+Development files for eldbus
+
+############ Embryo
+%package -n embryo
+Summary: A small virtual machine engine (in a library) and bytecode compiler
+Requires: %{name}-data = %{version}-%{release}
+Provides: embryo-bin
+
+%description -n embryo
+Embryo is a tiny library designed as a virtual machine to interpret a
+limited set of small compiled programs.
+
+%package -n embryo-devel
+Summary: Development components for the embryo package
+Group: Graphics & UI Framework/Development
+Requires: embryo = %{version}-%{release}
+
+%description -n embryo-devel
+Development files for embryo
+
+############ Eio
+%package -n eio
+Summary: Enlightenment Input/Output Library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eio
+Enlightenment Input/Output Library
+
+#%package -n eio-examples
+#Summary: Examples for the eio package
+#Group: Graphics & UI Framework/Testing
+#Requires: eio = %{version}-%{release}
+
+#%description -n eio-examples
+#Example files for eio
+
+%package -n eio-devel
+Summary: Development components for the eio package
+Group: Graphics & UI Framework/Development
+Requires: eio = %{version}-%{release}
+
+%description -n eio-devel
+Development files for eio
+
+############ Ephysics
+%package -n ephysics
+Summary: EFL wrapper for the Bullet Physics library
+
+%description -n ephysics
+EPhysics is a library that makes it easy to use Ecore, Evas and Bullet
+Physics together. It's a kind of wrapper, a glue, between these libraries.
+It's not intended to be a physics library (we already have many out there).
+
+Enlightenment Input/Output Library
+
+#%package -n ephysics-examples
+#Summary: Examples for the ephysics package
+#Group: Graphics & UI Framework/Testing
+#Requires: ephysics = %{version}-%{release}
+
+#%description -n ephysics-examples
+#Example files for ephysics
+
+%package -n ephysics-devel
+Summary: Development components for the ephysics package
+Group: Graphics & UI Framework/Development
+Requires: ephysics = %{version}-%{release}
+
+%description -n ephysics-devel
+Development files for ephysics
+
+############ Edje
+%package -n edje
+Summary: Complex Graphical Design/Layout Engine
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n edje
+Edje is a complex graphical design and layout engine. It provides a
+mechanism for allowing configuration data to define visual elements in
+terms of layout, behavior, and appearance. Edje allows for multiple
+collections of layouts in one file, allowing a complete set of images,
+animations, and controls to exist as a unified whole.
+
+Edje separates the arrangement, appearance, and behavior logic into
+distinct independent entities. This allows visual objects to share
+image data and configuration information without requiring them to do
+so. This separation and simplistic event driven style of programming
+can produce almost any look and feel one could want for basic visual
+elements. Anything more complex is likely the domain of an application
+or widget set that may use Edje as a conveneient way of being able to
+configure parts of the display.
+
+%package -n edje-tools
+Summary: Edje tools
+Group: Graphics & UI Framework/Utilities
+Requires: edje = %{version}-%{release}
+Provides: edje-bin
+
+%description -n edje-tools
+The edje tools package include the compiler, decompiler, visualizer, code
+generator and more.
+
+#%package -n edje-examples
+#Summary: Examples for the edje package
+#Group: Graphics & UI Framework/Testing
+#Requires: edje = %{version}-%{release}
+
+#%description -n edje-examples
+#Example files for edje
+
+%package -n edje-devel
+Summary: Development components for the edje package
+Group: Graphics & UI Framework/Development
+Requires: edje-tools = %{version}-%{release}
+
+%description -n edje-devel
+Development files for edje
+
+############ Eeze
+%package -n eeze
+Summary: Device convenience library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eeze
+Eeze is a library for manipulating devices through udev with a simple
+and fast api. It interfaces directly with libudev, avoiding such
+middleman daemons as udisks/upower or hal, to immediately gather
+device information the instant it becomes known to the system. This
+can be used to determine such things as:
+ * If a cdrom has a disk inserted
+ * The temperature of a cpu core
+ * The remaining power left in a battery
+ * The current power consumption of various parts
+ * Monitor in realtime the status of peripheral devices
+
+Each of the above examples can be performed by using only a single
+eeze function, as one of the primary focuses of the library is to
+reduce the complexity of managing devices.
+
+%package -n eeze-devel
+Summary: Development components for the eeze package
+Group: Graphics & UI Framework/Development
+Requires: eeze = %{version}-%{release}
+
+%description -n eeze-devel
+Development files for eeze
+
+############ Efreet
+%package -n efreet
+Summary: FreeDesktop.Org standards implementation
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n efreet
+Efreet implements the FreeDesktop.Org application and MIME-handling
+standards.
+
+%package -n efreet-devel
+Summary: Development components for the efreet package
+Group: Graphics & UI Framework/Development
+Requires: efreet = %{version}-%{release}
+
+%description -n efreet-devel
+Development files for efreet
+
+############ Emotion
+%package -n emotion
+Summary: EFL Media Library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n emotion
+Emotion is a media library with support for different backends as plug-ins.
+
+#%package -n emotion-examples
+#Summary: Examples for the emotion package
+#Group: Graphics & UI Framework/Testing
+#Requires: emotion = %{version}-%{release}
+
+#%description -n emotion-examples
+#Example files for emotion
+
+%package -n emotion-devel
+Summary: Development components for the emotion package
+Group: Graphics & UI Framework/Development
+Requires: emotion = %{version}-%{release}
+
+%description -n emotion-devel
+Development files for emotion
+
+############ Ethumb
+%package -n ethumb
+Summary: EFL thumbnail generator library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n ethumb
+Enlightenment thumbnailing library
+
+#%package -n ethumb-examples
+#Summary: Examples for the ethumb package
+#Group: Graphics & UI Framework/Testing
+#Requires: ethumb = %{version}-%{release}
+
+#%description -n ethumb-examples
+#Example files for ethumb
+
+%package -n ethumb-devel
+Summary: Development components for the ethumb package
+Group: Graphics & UI Framework/Development
+Requires: ethumb = %{version}-%{release}
+
+%description -n ethumb-devel
+Development files for emotion
+
+############ Eolian
+%package -n eolian
+Summary: EO object parser and C code generator
+Group: Graphics & UI Framework/Development
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n eolian
+Tool that parses Enlightenment's meta-data (.eo) filesg
+and can then generate C code along with header files.
+
+%package -n eolian-devel
+Summary: Development components for the eolian package
+Group: Graphics & UI Framework/Development
+Requires: eolian = %{version}-%{release}
+
+%description -n eolian-devel
+Development files for eolian
+
+#%package -n eolian-examples
+#Summary: Examples for the eolian package
+#Group: Graphics & UI Framework/Testing
+#Requires: eolian = %{version}-%{release}
+
+#%description -n eolian-examples
+#Example files for eolian
+
+############ Elocation
+%package -n elocation
+Summary: EFL location library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n elocation
+Elocation is meant as a convenience library to ease application developers
+the usage of geo information in their apps. Adding a geo tag to a picture or
+translating an address to a GPS position and show it on a map widget are just
+some of the use cases.
+
+#%package -n elocation-examples
+#Summary: Examples for the elocation package
+#Group: Graphics & UI Framework/Testing
+#Requires: elocation = %{version}-%{release}
+#
+#%description -n elocation-examples
+#Example files for elocation
+
+%package -n elocation-devel
+Summary: Development components for the elocation package
+Group: Graphics & UI Framework/Development
+Requires: elocation = %{version}-%{release}
+
+%description -n elocation-devel
+Development files for elocation
+
+############ Elua
+%package -n elua
+Summary: EFL lua binding library
+Requires: %{name}-data = %{version}-%{release}
+
+%description -n elua
+The Elua library was created to ease integration of EFL Lua into other EFL
+libraries or applications. Using the Elua library you can easily create a
+Lua state that is fully set up for running EFL Lua bindings.
+
+%package -n elua-devel
+Summary: Development components for the elua package
+Group: Graphics & UI Framework/Development
+Requires: elua = %{version}-%{release}
+
+%description -n elua-devel
+Development files for elua
+
+
+%prep
+%setup -q
+cp %{SOURCE1001} .
+
+
+%build
+
+%if ! %{with x}
+CFLAGS+=" -DMESA_EGL_NO_X11_HEADERS "
+%endif
+
+%reconfigure \
+ --with-glib=always \
+ --disable-xim \
+ --disable-scim \
+ --disable-gesture \
+ --with-tests=regular \
+ --enable-fb \
+ --disable-tslib \
+%if %{with wayland}
+ --enable-wayland \
+ --enable-drm \
+ --enable-gl-drm \
+ --enable-egl \
+ --with-opengl=es \
+ --enable-tile-rotate \
+ --disable-rpath \
+ --disable-ibus \
+%endif
+%if %{with x}
+ --with-opengl=es \
+ --disable-gesture \
+%else
+ --with-x11=none \
+ --enable-tile-rotate \
+ --disable-rpath \
+%endif
+ --disable-cxx-bindings \
+ --enable-systemd \
+ --enable-lua-old \
+ --enable-ecore-buffer \
+ --enable-i-really-know-what-i-am-doing-and-that-this-will-probably-break-things-and-i-will-fix-them-myself-and-send-patches-aba
+
+
+%__make %{?_smp_mflags}
+
+
+%install
+%make_install
+#make datadir=%{buildroot}%{_datadir} install-examples
+rm -rf %{buildroot}%{_libdir}/ecore/system/upower
+
+mkdir -p %{buildroot}%{_tmpfilesdir}
+install -m 0644 %SOURCE100 %{buildroot}%{_tmpfilesdir}/efl.conf
+
+%post -n eina -p /sbin/ldconfig
+%postun -n eina -p /sbin/ldconfig
+
++%post -n emile -p /sbin/ldconfig
++%postun -n emile -p /sbin/ldconfig
++
+%post -n eet -p /sbin/ldconfig
+%postun -n eet -p /sbin/ldconfig
+
+%post -n eo -p /sbin/ldconfig
+%postun -n eo -p /sbin/ldconfig
+
+%post -n ector -p /sbin/ldconfig
+%postun -n ector -p /sbin/ldconfig
+
+%post -n evas -p /sbin/ldconfig
+%postun -n evas -p /sbin/ldconfig
+
+%post -n ecore
+/sbin/ldconfig
+
+%if %{with wayland}
+f="/etc/profile.d/ecore.sh"
+grep --silent EFL_WAYLAND_USE_XDG_SHELL "$f" \
+ || printf "\nEFL_WAYLAND_USE_XDG_SHELL='defined'\nexport EFL_WAYLAND_USE_XDG_SHELL\n" >> "$f"
+
+grep --silent ECORE_EVAS_ENGINE "$f" \
+ || printf "\nECORE_EVAS_ENGINE=wayland_shm\n[ ! -d /dev/dri ] || ECORE_EVAS_ENGINE=wayland_egl\nexport ECORE_EVAS_ENGINE" >> "$f"
+
+grep --silent ECORE_IMF_MODULE "$f" \
+ || printf "\nECORE_IMF_MODULE=wayland\nexport ECORE_IMF_MODULE\n" >> "$f"
+
+%endif
+
+%postun -n ecore -p /sbin/ldconfig
+
+%post -n eldbus -p /sbin/ldconfig
+%postun -n eldbus -p /sbin/ldconfig
+
+%post -n embryo -p /sbin/ldconfig
+%postun -n embryo -p /sbin/ldconfig
+
+%post -n eio -p /sbin/ldconfig
+%postun -n eio -p /sbin/ldconfig
+
+%post -n edje -p /sbin/ldconfig
+%postun -n edje -p /sbin/ldconfig
+
+%post -n eeze -p /sbin/ldconfig
+%postun -n eeze -p /sbin/ldconfig
+
+%post -n efreet -p /sbin/ldconfig
+%postun -n efreet -p /sbin/ldconfig
+
+%post -n emotion -p /sbin/ldconfig
+%postun -n emotion -p /sbin/ldconfig
+
+%post -n ethumb -p /sbin/ldconfig
+%postun -n ethumb -p /sbin/ldconfig
+
+%post -n ephysics -p /sbin/ldconfig
+%postun -n ephysics -p /sbin/ldconfig
+
+%post -n eolian -p /sbin/ldconfig
+%postun -n eolian -p /sbin/ldconfig
+
+%post -n elocation -p /sbin/ldconfig
+%postun -n elocation -p /sbin/ldconfig
+
+
+%files -n %{name}
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_datadir}/locale/*/*/*.mo
+%{_libdir}/libefl.so.*
++%{_bindir}/efl_debug*
+
+%files -n %{name}-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/efl-1/Efl*.h
+%{_includedir}/efl-1/interfaces/efl*.h
+#%{_includedir}/efl-cxx-1/*.hh
+%{_libdir}/cmake/Efl*/*.cmake
+%{_libdir}/libefl.so
+%{_libdir}/pkgconfig/efl*.pc
+
+%files -n eina
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libeina.so.*
+%{_bindir}/eina-bench-cmp
+
++%files -n eina-tools
++%manifest %{name}.manifest
++%{_bindir}/eina_btlog
++
+#%files -n eina-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/eina*/examples/*
+#%{_libdir}/eina/examples/*
+
+%files -n eina-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/eina-*1/*.h*
+%{_includedir}/eina-*1/eina*/*
+%{_libdir}/libeina.so
+%{_libdir}/pkgconfig/eina*.pc
+%{_libdir}/cmake/Eina*/*.cmake
+
++%files -n emile
++%manifest %{name}.manifest
++%defattr(-,root,root,-)
++%license COPYING
++%{_libdir}/libemile.so.*
++
++%files -n emile-devel
++%manifest %{name}.manifest
++%defattr(-,root,root,-)
++%{_includedir}/emile-*1/*.h*
++%{_libdir}/libemile.so
++%{_libdir}/pkgconfig/emile*.pc
++%{_libdir}/cmake/Emile*/*.cmake
++
+%files -n eet
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libeet*.so.*
+
+%files -n eet-tools
+%manifest %{name}.manifest
+%{_bindir}/eet
+%{_bindir}/vieet
+%{_bindir}/diffeet
++%{_bindir}/eetpack
+
+#%files -n eet-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/eet/examples/*
+#%{_libdir}/eet/examples/*
+
+%files -n eet-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/eet-*1/*.h*
+#%{_includedir}/eet-*1/*/*.h*
+%{_libdir}/libeet.so
+%{_libdir}/pkgconfig/eet*.pc
+%{_libdir}/cmake/Eet*/*.cmake
+
+%files -n eo
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libeo.so.*
+
+#%files -n eo-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/eo/examples/*
+#%{_libdir}/eo/examples/*
+
+%files -n eo-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/eo-*1/*.h*
+%{_libdir}/libeo.so
+%{_libdir}/pkgconfig/eo*.pc
+%{_datadir}/eo/gdb/eo_gdb.py
+%{_datadir}/gdb/auto-load/usr/lib*/*
+%{_libdir}/cmake/Eo/*.cmake
+%{_libdir}/cmake/EoCxx/*.cmake
++/usr/share/eolian/include/eo-*1/*.eot
+
+%files -n ector
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libector.so.*
+
+%files -n ector-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/ector-*1/*.h*
++%{_includedir}/ector-*1/*/*.h*
+%{_libdir}/libector.so
+%{_libdir}/pkgconfig/ector*.pc
+
+%files -n evas
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_bindir}/ecore_evas_*
+%{_bindir}/evas_cserve2_client
+%{_bindir}/evas_cserve2_debug
+%{_bindir}/evas_cserve2_shm_debug
+%{_bindir}/evas_cserve2_usage
+%{_libdir}/evas/modules/*/*/*/module.so
+%{_libdir}/libevas.so.*
+%{_libdir}/evas/cserve2
+%{_datadir}/evas/checkme
+
+#%files -n evas-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/evas/examples/*
+#%{_libdir}/evas/examples/*
+
+%files -n evas-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/evas-*1/*.h*
+%{_includedir}/evas-*1/*/*.h*
+%{_libdir}/libevas.so
+%{_libdir}/pkgconfig/evas*.pc
+%{_libdir}/cmake/Evas*/*.cmake
++/usr/share/eolian/include/evas-*1/*.eot
++/usr/share/evas/filters/lua/*.lua
+
+%files -n ecore
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libecore.so.*
+%{_libdir}/libecore_audio.so.*
+%{_libdir}/libecore_avahi.so.*
+%{_libdir}/libecore_con.so.*
+%{_libdir}/libecore_evas.so.*
+%{_libdir}/libecore_file.so.*
+%{_libdir}/libecore_imf.so.*
+%{_libdir}/libecore_imf_evas.so.*
+%{_libdir}/libecore_input.so.*
+%{_libdir}/libecore_input_evas.so.*
+%{_libdir}/libecore_ipc.so.*
+%{_libdir}/libecore_fb.so.*
+%{_libdir}/libecore_buffer.so.*
+%if %{with wayland}
+%{_libdir}/libecore_wayland.so.*
+%{_libdir}/libecore_drm.so.*
+%endif
+%if %{with x}
+%{_libdir}/libecore_x.so.*
+%{_libdir}/ecore_x/*/*/*
+%endif
+%{_libdir}/ecore_evas/engines/*/*/module.so
+%{_libdir}/ecore_imf/modules/*/*/module.so
+%{_libdir}/ecore/system/systemd/v-*/module.so
+%{_libdir}/ecore_buffer/modules/*/*/module.so
+%{_datadir}/ecore/checkme
+%{_datadir}/ecore_*/checkme
+%{_tmpfilesdir}/efl.conf
+
+#%files -n ecore-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/ecore*/examples/*
+#%{_libdir}/ecore*/examples/*
+
+
+%files -n ecore-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/ecore*/*.h
+#%{_includedir}/ecore*cxx*/*.hh
+%{_libdir}/libecore.so
+%{_libdir}/libecore_audio.so
+%{_libdir}/libecore_avahi.so
+%{_libdir}/libecore_con.so
+%{_libdir}/libecore_evas.so
+%{_libdir}/libecore_file.so
+%{_libdir}/libecore_imf.so
+%{_libdir}/libecore_imf_evas.so
+%{_libdir}/libecore_input.so
+%{_libdir}/libecore_input_evas.so
+%{_libdir}/libecore_ipc.so
+%{_libdir}/libecore_fb.so
+%{_libdir}/libecore_buffer.so
+%if %{with wayland}
+%{_libdir}/libecore_wayland.so
+%{_libdir}/libecore_drm.so
+%endif
+%if %{with x}
+%{_libdir}/libecore_x.so
+%endif
+%{_libdir}/pkgconfig/ecore*.pc
+%{_libdir}/cmake/Ecore*/*.cmake
+
+%files -n eldbus
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libeldbus.so.*
+%{_bindir}/eldbus*
+%license COPYING
+
+#%files -n eldbus-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/eldbus/examples/*
+#%{_libdir}/eldbus/examples/*
+
+%files -n eldbus-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libeldbus.so
+%{_libdir}/pkgconfig/eldbus*.pc
+%{_includedir}/eldbus*/*
+%{_libdir}/cmake/Eldbus/*.cmake
+
+%files -n embryo
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_bindir}/embryo_cc
+%{_libdir}/libembryo.so.*
+%{_datadir}/embryo/include/default.inc
+
+%files -n embryo-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/embryo-1/*.h
+%{_libdir}/libembryo.so
+%{_libdir}/pkgconfig/embryo*.pc
+
+%files -n eio
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libeio.so.*
+
+#%files -n eio-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/eio/examples/*
+#%{_libdir}/eio/examples/*
+
+%files -n eio-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/eio-1/*
+%{_libdir}/libeio.so
+%{_libdir}/pkgconfig/eio*.pc
++%{_libdir}/cmake/Eio*/*.cmake
+
+%files -n edje
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libedje.so.*
+%{_libdir}/edje/utils/*/*
+%{_datadir}/edje/include/edje.inc
+%{_datadir}/mime/packages/edje.xml
+
+%files -n edje-tools
+%manifest %{name}.manifest
+%{_bindir}/edje*
+%{_datadir}/edje/data/*
+
+#%files -n edje-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/edje/examples/*
+#%{_libdir}/edje/examples/*
+
+%files -n edje-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/edje*-1/*.h*
+%{_libdir}/libedje.so
+%{_libdir}/pkgconfig/edje*.pc
+%{_libdir}/cmake/Edje/*.cmake
++/usr/share/eolian/include/edje-*1/*.eot
+
+%files -n eeze
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libeeze.so.*
+%{_bindir}/eeze_disk_ls
+%{_bindir}/eeze_mount
+%{_bindir}/eeze_scanner
+%{_bindir}/eeze_umount
+%{_libdir}/eeze/modules/sensor/*/*/module.so
+%{_datadir}/eeze/checkme
+
+%files -n eeze-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/eeze-1/*.h
+%{_libdir}/libeeze.so
+%{_libdir}/pkgconfig/eeze*.pc
+%{_libdir}/cmake/Eeze/*.cmake
+
+%files -n efreet
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%exclude %{_datadir}/dbus-1/services/org.enlightenment.Efreet.service
+%exclude %{_userunitdir}/efreet.service
+%exclude %{_bindir}/efreetd
+%exclude /usr/lib/debug/usr/bin/efreetd.debug
+%exclude %{_libdir}/efreet/*/efreet_desktop_cache_create
+%exclude %{_libdir}/efreet/*/efreet_icon_cache_create
+%exclude /usr/lib/debug/%{_libdir}/efreet/*/efreet_desktop_cache_create.debug
+%exclude /usr/lib/debug/%{_libdir}/efreet/*/efreet_icon_cache_create.debug
+%exclude /usr/lib/debug/.build-id/*/*
+%{_libdir}/libefreet.so.*
+%{_libdir}/libefreet_mime.so.*
+%{_libdir}/libefreet_trash.so.*
+%{_datadir}/efreet/*
+
+%files -n efreet-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/efreet-1/*.h
+%{_libdir}/libefreet.so
+%{_libdir}/libefreet_mime.so
+%{_libdir}/libefreet_trash.so
+%{_libdir}/pkgconfig/efreet*.pc
+%{_libdir}/cmake/Efreet/*.cmake
+
+%files -n emotion
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libemotion.so.*
+%{_libdir}/edje/modules/emotion/*/module.so
+%{_libdir}/emotion/modules/*/*/module.so
+%{_datadir}/emotion/*
++%{_bindir}/emotion_test*
+
+#%files -n emotion-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/emotion/examples/*
+#%{_libdir}/emotion/examples/*
+
+%files -n emotion-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/emotion-1/*
+%{_libdir}/libemotion.so
+%{_libdir}/pkgconfig/emotion*.pc
+%{_libdir}/cmake/Emotion/*.cmake
+
+%files -n ethumb
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_libdir}/libethumb.so.*
+%{_libdir}/libethumb_client.so.*
+%exclude %{_datadir}/dbus-1/services/org.enlightenment.Ethumb.service
+%exclude %{_userunitdir}/ethumb.service
+%{_datadir}/ethumb/*
+%{_datadir}/ethumb_client/*
+#%{_datadir}/ethumb_client/*/*
+%{_libdir}/ethumb/modules/*/*/module.so
+%{_libdir}/ethumb/modules/*/*/template.edj
+%exclude %{_libdir}/ethumb_client/utils/*/ethumbd_slave
+%exclude /usr/lib/debug/%{_libdir}/ethumb_client/utils/*/ethumbd_slave.debug
+%exclude %{_bindir}/ethumb
+%exclude %{_bindir}/ethumbd
+%exclude %{_bindir}/ethumbd_client
+%exclude /usr/lib/debug/usr/bin/ethumb.debug
+%exclude /usr/lib/debug/usr/bin/ethumbd.debug
+%exclude /usr/lib/debug/usr/bin/ethumbd_client.debug
+%exclude /usr/lib/debug/.build-id/*/*
+
+#%files -n ethumb-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/ethumb_client/examples/*
+#%{_libdir}/ethumb_client/examples/*
+
+%files -n ethumb-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/ethumb-1/*.h
+%{_includedir}/ethumb-client-1/*.h
+%{_libdir}/libethumb.so
+%{_libdir}/libethumb_client.so
+%{_libdir}/pkgconfig/ethumb*.pc
+%{_libdir}/cmake/Ethumb/*.cmake
+%{_libdir}/cmake/EthumbClient/*.cmake
+
+%files -n ephysics
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libephysics.so.*
+
+%files -n ephysics-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libephysics.so
+%{_libdir}/pkgconfig/ephysics.pc
+%{_includedir}/ephysics-1/EPhysics.h
+
+#%files -n ephysics-examples
+#%{_datadir}/ephysics/examples/*
+
+
+%files -n eolian
+%{_bindir}/eolian*
+%{_libdir}/libeolian.so.*
+
+%files -n eolian-devel
+%{_includedir}/eolian-*1/*.h*
+#%{_includedir}/eolian-*1/*/*.h*
+%{_datadir}/eolian/include/*/*.eo
+%{_libdir}/libeolian.so*
+%{_libdir}/cmake/Eolian*/*.cmake
+
+#%files -n eolian-examples
+#%{_datadir}/eolian_*/examples/*
+
+%files -n elocation
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libelocation.so.*
+
+#%files -n elocation-examples
+#%manifest %{name}.manifest
+#%defattr(-,root,root,-)
+#%{_datadir}/elocation/examples/*
+
+%files -n elocation-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_includedir}/elocation-*1/*.h*
+%{_libdir}/pkgconfig/elocation.pc
+%{_libdir}/libelocation.so*
+
+%files -n elua
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_datadir}/elua/checkme
+
+%files -n elua-devel
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/cmake/Elua*/*.cmake
+
lib_ecore_buffer_libecore_buffer_la_DEPENDENCIES = @ECORE_BUFFER_INTERNAL_LIBS@
lib_ecore_buffer_libecore_buffer_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@
-### Binary
-bqmgr_bindir=$(libdir)/ecore_buffer/bin/$(MODULE_ARCH)
-bqmgr_bin_PROGRAMS = bin/ecore_buffer/bq_mgr
-
-bin_ecore_buffer_bq_mgr_SOURCES = \
-bin/ecore_buffer/bq_mgr_protocol.c \
-bin/ecore_buffer/bq_mgr.c
-
-bin_ecore_buffer_bq_mgr_CPPFLAGS = \
--I$(top_builddir)/src/lib/efl \
-@ECORE_BUFFER_CFLAGS@
-bin_ecore_buffer_bq_mgr_LDADD = @USE_ECORE_INTERNAL_LIBS@ @USE_ECORE_BUFFER_LIBS@
-bin_ecore_buffer_bq_mgr_DEPENDENCIES = @USE_ECORE_INTERNAL_LIBS@ @USE_ECORE_BUFFER_INTERNAL_LIBS@
-
### Backends
-ecorebuffershmdir = $(libdir)/ecore_buffer/modules/shm/$(MODULE_ARCH)
-ecorebuffershm_LTLIBRARIES = modules/ecore_buffer/shm/module.la
-
-modules_ecore_buffer_shm_module_la_SOURCES = \
- modules/ecore_buffer/shm/ecore_buffer_shm.c
-modules_ecore_buffer_shm_module_la_CPPFLAGS = \
- -I$(top_builddir)/src/lib/efl \
- @ECORE_BUFFER_CFLAGS@ \
- -I$(top_srcdir)/src/modules/ecore_buffer/shm
-modules_ecore_buffer_shm_module_la_LIBADD = \
- @ECORE_BUFFER_LIBS@ \
- @USE_ECORE_BUFFER_INTERNAL_LIBS@
-modules_ecore_buffer_shm_module_la_DEPENDENCIES = \
- @USE_ECORE_BUFFER_INTERNAL_LIBS@
-modules_ecore_buffer_shm_module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
-modules_ecore_buffer_shm_module_la_LIBTOOLFLAGS = --tag=disable-static
-
+
if BUILD_ECORE_BUFFER_X11_DRI2
ecorebufferx11dri2dir = $(libdir)/ecore_buffer/modules/x11_dri2/$(MODULE_ARCH)
ecorebufferx11dri2_LTLIBRARIES = modules/ecore_buffer/x11_dri2/module.la
bin_PROGRAMS += \
bin/ecore_evas/ecore_evas_convert \
- bin/ecore_evas/ecore_evas_svg
++bin/ecore_evas/ecore_evas_svg \
+ bin/ecore_evas/eetpack
bin_ecore_evas_ecore_evas_convert_SOURCES = bin/ecore_evas/ecore_evas_convert.c
-bin_ecore_evas_ecore_evas_convert_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_EVAS_CFLAGS@ @EINA_CFLAGS@ @ECORE_CFLAGS@ @EVAS_CFLAGS@
-bin_ecore_evas_ecore_evas_convert_LDADD = @USE_ECORE_EVAS_LIBS@ @USE_EINA_LIBS@ @USE_ECORE_LIBS@ @USE_EVAS_LIBS@
-bin_ecore_evas_ecore_evas_convert_DEPENDENCIES = @USE_ECORE_EVAS_INTERNAL_LIBS@ @USE_EINA_INTERNAL_LIBS@ @USE_ECORE_INTERNAL_LIBS@ @USE_EVAS_INTERNAL_LIBS@
+bin_ecore_evas_ecore_evas_convert_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_EVAS_CFLAGS@
+bin_ecore_evas_ecore_evas_convert_LDADD = @USE_ECORE_EVAS_LIBS@
+bin_ecore_evas_ecore_evas_convert_DEPENDENCIES = @USE_ECORE_EVAS_INTERNAL_LIBS@
+
+bin_ecore_evas_ecore_evas_svg_SOURCES = bin/ecore_evas/ecore_evas_svg.c
+bin_ecore_evas_ecore_evas_svg_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_EVAS_CFLAGS@
+bin_ecore_evas_ecore_evas_svg_LDADD = @USE_ECORE_EVAS_LIBS@
+bin_ecore_evas_ecore_evas_svg_DEPENDENCIES = @USE_ECORE_EVAS_INTERNAL_LIBS@
+
+ bin_ecore_evas_eetpack_SOURCES = bin/ecore_evas/eetpack.c
+ bin_ecore_evas_eetpack_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_EVAS_CFLAGS@ @EINA_CFLAGS@ @EET_CFLAGS@ @EVAS_CFLAGS@
+ bin_ecore_evas_eetpack_LDADD = @USE_ECORE_EVAS_LIBS@ @USE_EINA_LIBS@ @USE_EET_LIBS@ @USE_EVAS_LIBS@
+ bin_ecore_evas_eetpack_DEPENDENCIES = @USE_ECORE_EVAS_INTERNAL_LIBS@ @USE_EINA_INTERNAL_LIBS@ @USE_EET_INTERNAL_LIBS@ @USE_EVAS_INTERNAL_LIBS@
++
lib/ecore_wayland/ecore_wl_window.c \
lib/ecore_wayland/ecore_wl_subsurf.c \
lib/ecore_wayland/ecore_wl_private.h \
-lib/ecore_wayland/subsurface-protocol.c \
-lib/ecore_wayland/subsurface-client-protocol.h \
lib/ecore_wayland/ivi-application-protocol.c \
lib/ecore_wayland/ivi-application-client-protocol.h \
- lib/ecore_wayland/tizen-policy-ext-protocol.c
+lib/ecore_wayland/tizen-policy-ext-client-protocol.h \
++lib/ecore_wayland/tizen-policy-ext-protocol.c \
+ lib/ecore_wayland/xdg-shell-client-protocol.h \
+ lib/ecore_wayland/xdg-shell-protocol.c \
+ lib/ecore_wayland/session-recovery-client-protocol.h \
+ lib/ecore_wayland/session-recovery-protocol.c
lib_ecore_wayland_libecore_wayland_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WAYLAND_CFLAGS@
lib_ecore_wayland_libecore_wayland_la_LIBADD = @ECORE_WAYLAND_LIBS@
lib/ector/cairo/ector_renderer_cairo_base.c \
lib/ector/cairo/ector_cairo_surface.c
+# And now the software backend
+ installed_ectorcairoheadersdir = $(includedir)/ector-@VMAJ@/cairo
+ nodist_installed_ectorcairoheaders_DATA = $(ector_eolian_cairo_h)
+
+ # And the default software backend
lib_ector_libector_la_SOURCES += \
lib/ector/software/ector_renderer_software_gradient_linear.c \
lib/ector/software/ector_renderer_software_gradient_radial.c \
endif
EXTRA_DIST += \
- src/lib/ector/ector_private.h \
- src/lib/ector/cairo/ector_cairo_private.h \
- src/lib/ector/software/ector_drawhelper_private.h \
- src/lib/ector/software/ector_software_private.h \
- src/lib/ector/software/sw_ft_math.h \
- src/lib/ector/software/sw_ft_raster.h \
- src/lib/ector/software/sw_ft_stroker.h \
- src/lib/ector/software/sw_ft_types.h
+ lib/ector/ector_private.h \
+ lib/ector/cairo/ector_cairo_private.h \
+ lib/ector/software/ector_drawhelper_private.h \
+ lib/ector/software/ector_software_private.h \
+ lib/ector/software/sw_ft_math.h \
+ lib/ector/software/sw_ft_raster.h \
+ lib/ector/software/sw_ft_stroker.h \
+ lib/ector/software/sw_ft_types.h
++
/ecore_evas_convert
/ecore_evas_svg
+ /eetpack
++
{"collections.font", st_fonts_font}, /* dup */
FONT_STYLE_CC_STATEMENTS("collections.")
{"collections.base_scale", st_collections_base_scale},
+// TIZEN_ONLY(20150110): Add plugins keyword.
+#ifdef PLUGIN
+ {"collections.plugins.plugin.name", st_collections_plugins_plugin_name},
+ {"collections.plugins.plugin.source", st_collections_plugins_plugin_source},
+ {"collections.plugins.plugin.param", st_collections_plugins_plugin_param},
+ {"collections.group.plugins.plugin.name", st_collections_plugins_plugin_name}, /* dup */
+ {"collections.group.plugins.plugin.source", st_collections_plugins_plugin_source}, /* dup */
+ {"collections.group.plugins.plugin.param", st_collections_plugins_plugin_param}, /* dup */
+#endif
+//
+ {"collections.translation.file.locale", st_collections_group_translation_file_locale},
+ {"collections.translation.file.source", st_collections_group_translation_file_source},
+ {"collections.group.translation.file.locale", st_collections_group_translation_file_locale},
+ {"collections.group.translation.file.source", st_collections_group_translation_file_source},
+
{"collections.sounds.sample.name", st_collections_group_sound_sample_name},
{"collections.sounds.sample.source", st_collections_group_sound_sample_source},
{"collections.group.sounds.sample.name", st_collections_group_sound_sample_name}, /* dup */
ep->tween.v2 = ep2->tween.v2;
ep->tween.v3 = ep2->tween.v3;
ep->tween.v4 = ep2->tween.v4;
+ ep->tween.use_duration_factor = ep2->tween.use_duration_factor;
ep->sample_name = STRDUP(ep2->sample_name);
+// TIZEN_ONLY(20150110): Add plugins keyword.
+#ifdef PLUGIN
+ ep->plugin_name = STRDUP(ep2->plugin_name);
+#endif
+//
ep->tone_name = STRDUP(ep2->tone_name);
ep->duration = ep2->duration;
ep->speed = ep2->speed;
else if (ep->action == EDJE_ACTION_TYPE_SOUND_TONE)
{
ep->tone_name = parse_str(1);
- for (i = 0; i < (int)edje_file->sound_dir->tones_count; i++)
+ if (edje_file->sound_dir)
{
- if (!strcmp(edje_file->sound_dir->tones[i].name, ep->tone_name))
- break;
- if (i == (int)(edje_file->sound_dir->tones_count - 1))
+ for (i = 0; i < (int)edje_file->sound_dir->tones_count; i++)
{
- ERR("No Tone name %s exist.", ep->tone_name);
- exit(-1);
+ if (!strcmp(edje_file->sound_dir->tones[i].name, ep->tone_name))
+ {
+ found = EINA_TRUE;
+ break;
+ }
}
}
+ if (!found)
+ {
+ ERR("No Tone name %s exist.", ep->tone_name);
+ exit(-1);
+ }
ep->duration = parse_float_range(2, 0.1, 10.0);
}
+// TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ else if (ep->action == EDJE_ACTION_TYPE_RUN_PLUGIN)
+ {
+ ep->plugin_name = parse_str(1);
+ }
+#endif
+//
else if (ep->action == EDJE_ACTION_TYPE_VIBRATION_SAMPLE)
{
ep->vibration_name = parse_str(1);
-I$(top_srcdir)/src/lib/ecore_con \
-I$(top_srcdir)/src/lib/ecore_evas \
-I$(top_srcdir)/src/lib/ecore_audio \
+-I$(top_srcdir)/src/lib/ecore_buffer \
-I$(top_builddir)/src/lib/eina \
+ -I$(top_builddir)/src/lib/eet \
+ -I$(top_builddir)/src/lib/emile \
-I$(top_builddir)/src/lib/eo \
-I$(top_builddir)/src/lib/evas \
-I$(top_builddir)/src/lib/ecore \
-I$(top_builddir)/src/lib/ecore_evas \
-I$(top_builddir)/src/lib/ecore_audio \
-DPACKAGE_EXAMPLES_DIR=\".\" \
+-I$(top_builddir)/src/lib/ecore_buffer \
@ECORE_CFLAGS@
+ if HAVE_ECORE_BUFFER
+ AM_CPPFLAGS += -I$(top_srcdir)/src/lib/ecore_buffer
+ endif
+
EXTRA_PROGRAMS = \
ecore_animator_example \
ecore_client_bench \
ecore_time_functions_example \
ecore_timer_example \
ecore_getopt_example \
- ecore_buffer_example
++ecore_buffer_example \
+ ecore_con_eet_client_example \
+ ecore_con_eet_server_example
ECORE_COMMON_LDADD = \
$(top_builddir)/src/lib/ecore/libecore.la \
evas-vg-batman.c
DATA_FILES = \
- enlightenment.png \
- red.png \
- im1.png \
- cube1.png \
- Makefile.examples
+ resources/images/enlightenment.png \
+ resources/images/red.png \
+ resources/images/im1.png \
+ resources/images/cube1.png \
+ resources/images/normal_lego.png \
+ resources/images/sonic.png \
+ resources/images/sweet_home_reversed.png \
+ resources/images/wood.jpg \
+ resources/images/rocks.jpg \
+ resources/images/four_NM_height.tga \
+ resources/images/rocks_NM_height.tga \
+ resources/images/grid.png \
+ resources/images/grid_n.png \
+ resources/images/billboard.png \
+ resources/models/mesh_for_mmap.eet \
+ resources/models/mesh_for_mmap.md2 \
+ resources/models/mesh_for_mmap.obj \
+ resources/models/mesh_for_mmap.ply \
+ resources/models/Normal_UVs_Colors.ply \
+ resources/models/Normal_UVs_NoColors.ply \
+ resources/models/Normal_NoUVs_Colors.ply \
+ resources/models/Normal_NoUVs_NoColors.ply \
+ resources/models/NoNormal_UVs_Colors.ply \
+ resources/models/NoNormal_UVs_NoColors.ply \
+ resources/models/NoNormal_NoUVs_Colors.ply \
+ resources/models/NoNormal_NoUVs_NoColors.ply \
+ resources/models/sonic.md2 \
+ resources/models/sweet_home.obj \
+ resources/models/sweet_home_only_vertex_coords.obj \
+ resources/models/sweet_home_without_normals.obj \
+ resources/models/sweet_home_without_tex_coords.obj \
+ shooter/assets/images/brick-stone_n.jpg \
+ shooter/assets/images/brick-stone.jpg \
+ shooter/assets/images/bricks_n.jpg \
+ shooter/assets/images/eagle.png \
+ shooter/assets/images/snake.png \
+ shooter/assets/images/snake_n.png \
+ shooter/assets/images/bricks.jpg \
+ shooter/assets/images/soldier.png \
+ shooter/assets/images/gazebo.png \
+ shooter/assets/images/warrior.png \
+ shooter/assets/images/gazebo_t.png \
+ shooter/assets/images/gazebo_t_t.png \
+ shooter/assets/images/gazebo_t_n.png \
+ shooter/assets/images/gazebo_b_n.png \
+ shooter/assets/models/warrior.md2 \
+ shooter/assets/models/gazebo_b.md2 \
+ shooter/assets/models/gazebo_t.md2 \
+ shooter/assets/models/eagle.md2 \
+ shooter/assets/models/snake.md2 \
+ shooter/assets/models/soldier_jump.md2 \
+ shooter/assets/models/soldier.md2 \
+ shooter/assets/models/tommy.ply \
+ Makefile.examples \
+ evas-common.h
-examples: $(EXTRA_PROGRAMS) $(EDJS)
+examplesdir = $(libdir)/evas/examples
+examples_PROGRAMS = $(EXTRA_PROGRAMS)
+examples_DATA = $(EDJS)
clean-local:
rm -f $(EXTRA_PROGRAMS) $(EDJS)
/**
* @enum _Ecore_Export_Type
* Types for export buffer.
- * @since_tizen 2.4
+ * @since 1.15
*/
-enum _Ecore_Export_Type
+typedef enum _Ecore_Export_Type
{
EXPORT_TYPE_INVALID,
EXPORT_TYPE_ID,
*
* @return Newly allocated Ecore_Buffer instance, NULL otherwise.
*/
- EAPI Ecore_Buffer *ecore_buffer_new(const char* engine, unsigned int width, unsigned int height, Ecore_Buffer_Format format, unsigned int flags);
+ EAPI Ecore_Buffer *ecore_buffer_new(const char *engine, unsigned int width, unsigned int height, Ecore_Buffer_Format format, unsigned int flags);
/**
- * @since_tizen 2.4
+ * @brief Creates a new Ecore_Buffer based on given tbm surface.
+ *
++ * @since 1.15
+ *
+ * @param[in] engine the name of backend
+ * @param[in] tbm_surface the handle of tbm_surface_h
+ * @param[in] flags the flags for Ecore_Buffer
+ *
+ * @return Newly allocated Ecore_Buffer instance based on tbm surface, NULL otherwise.
+ */
+EAPI Ecore_Buffer *ecore_buffer_new_with_tbm_surface(const char *engine, void *tbm_surface, unsigned int flags);
+/**
* @brief Free the given Ecore_Buffer.
*
- * @since_tizen 2.4
+ * @since 1.15
*
* @param[in] buf The Ecore_Buffer to free
*/
*
* @see ecore_buffer_free_callback_add()
*/
- EAPI void ecore_buffer_free_callback_remove(Ecore_Buffer* buf, Ecore_Buffer_Cb func, void* data);
+ EAPI void ecore_buffer_free_callback_remove(Ecore_Buffer *buf, Ecore_Buffer_Cb func, void *data);
/**
- * @brief Get a pointer to the raw data of the given Ecore_Buffer.
- *
- * @param[in] buf The Ecore_Buffer.
- *
- * @return The pointer of raw data.
- */
-EAPI void *ecore_buffer_data_get(Ecore_Buffer *buf);
-/**
* @brief Return the Pixmap of given Ecore_Buffer.
*
- * @since_tizen 2.4
+ * @since 1.15
*
* @param[in] buf The Ecore_Buffer
*
*
* @see ecore_buffer_queue_shutdown()
*/
--EAPI int ecore_buffer_queue_init(void);
++EAPI int ecore_buffer_queue_init(void);
/**
* @brief Shut down the Ecore_Buffer_Queue system.
*
typedef struct _Ecore_Buffer_Module Ecore_Buffer_Module;
typedef struct _Ecore_Buffer_Cb_Data Ecore_Buffer_Cb_Data;
- struct _Ecore_Buffer_Module {
- Ecore_Buffer_Backend *be;
- Ecore_Buffer_Module_Data data;
+ struct _Ecore_Buffer_Module
+ {
- Ecore_Buffer_Backend *be;
- Ecore_Buffer_Module_Data data;
++ Ecore_Buffer_Backend *be;
++ Ecore_Buffer_Module_Data data;
};
struct _Ecore_Buffer
/* opaque structure to represent a drm sprite */
typedef struct _Ecore_Drm_Sprite Ecore_Drm_Sprite;
- /* sturcture to inform drm activation state */
+ /* structure to inform drm activation state */
typedef struct _Ecore_Drm_Event_Activate Ecore_Drm_Event_Activate;
- /* sturcture to inform drm page flip */
- typedef struct _Ecore_Drm_Event_Page_Flip Ecore_Drm_Event_Page_Flip;
-
- /* sturcture to inform drm vblank */
- typedef struct _Ecore_Drm_Event_Vblank Ecore_Drm_Event_Vblank;
-
+/* sturcture to inform new input device added */
+typedef struct _Ecore_Drm_Event_Input_Device_Add Ecore_Drm_Event_Input_Device_Add;
+
+/* sturcture to inform old input device deleted */
+typedef struct _Ecore_Drm_Event_Input_Device_Del Ecore_Drm_Event_Input_Device_Del;
+
/* structure to inform drm output plug events */
/** @since 1.14 */
typedef struct _Ecore_Drm_Event_Output Ecore_Drm_Event_Output;
+ /** @since 1.14 */
+ typedef void (*Ecore_Drm_Pageflip_Cb)(void *data);
+
EAPI extern int ECORE_DRM_EVENT_ACTIVATE;
- EAPI extern int ECORE_DRM_EVENT_PAGE_FLIP;
- EAPI extern int ECORE_DRM_EVENT_VBLANK;
+EAPI extern int ECORE_DRM_EVENT_INPUT_DEVICE_ADD;
+EAPI extern int ECORE_DRM_EVENT_INPUT_DEVICE_DEL;
EAPI extern int ECORE_DRM_EVENT_OUTPUT; /**< @since 1.14 */
EAPI Eina_Stringshare *ecore_drm_output_make_get(Ecore_Drm_Output *output);
/**
+ * Get the name of Ecore_Drm_Output
+ *
+ * This function will give the name of Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to get name for
+ * @return The name. Caller should free this return.
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI char *ecore_drm_output_name_get(Ecore_Drm_Output *output);
+
+ /**
+ * Set the dpms level of an Ecore_Drm_Output
+ *
+ * This function will set the DPMS level of an Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to set the dpms level on
+ * @param level The level to set
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.14
+ */
+ EAPI void ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level);
+
+ /**
+ * Set the gamma level of an Ecore_Drm_Output
+ *
+ * This function will set the gamma of an Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to set the gamma level on
+ * @param size The gamma table size to set
+ * @param r The amount to scale the red channel
+ * @param g The amount to scale the green channel
+ * @param b The amount to scale the blue channel
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.14
+ */
+ EAPI void ecore_drm_output_gamma_set(Ecore_Drm_Output *output, uint16_t size, uint16_t *r, uint16_t *g, uint16_t *b);
+
+ /**
+ * Get the pointer position of Ecore_Drm_Device
+ *
+ * This function will give the pointer position of Ecore_Drm_Device
+ *
+ * @param dev The Ecore_Drm_Device to get pointer position for
+ * @param *x The parameter in which output x co-ordinate is stored
+ * @param *y The parameter in which output y co-ordinate is stored
+ *
+ * @ingroup Ecore_Drm_Device_Group
+ * @since 1.14
+ */
+ EAPI void ecore_drm_device_pointer_xy_get(Ecore_Drm_Device *dev, int *x, int *y);
+
+ /**
+ * Get the list of drm devices which are allocated.
+ *
+ * @return Eina_List of drm devices, NULL otherwise
+ *
+ * @ingroup Ecore_Drm_Device_Group
+ * @since 1.14
+ */
+ EAPI const Eina_List *ecore_drm_devices_get(void);
+
+ /**
+ * Get the minimum and maximum screen size range
+ *
+ * @param dev The Ecore_Drm_Device to get screen size range from
+ * @param *minw The parameter in which smallest width is stored
+ * @param *minh The parameter in which smallest height is stored
+ * @param *maxw The parameter in which largest width is stored
+ * @param *maxh The parameter in which largest height is stored
+ *
+ * @ingroup Ecore_Drm_Device_Group
+ * @since 1.15
+ */
+ EAPI void ecore_drm_screen_size_range_get(Ecore_Drm_Device *dev, int *minw, int *minh, int *maxw, int *maxh);
+
+ /**
+ * Get if a given output is connected
+ *
+ * @param output The Ecore_Drm_Output to get the connected status of
+ *
+ * @return EINA_TRUE if output is connected, EINA_FALSE otherwise
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Eina_Bool ecore_drm_output_connected_get(Ecore_Drm_Output *output);
+
+ /**
+ * Get the connector type of a given Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to get the connector type of
+ *
+ * @return An unsigned integer representing the type of connector for this output
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI unsigned int ecore_drm_output_connector_type_get(Ecore_Drm_Output *output);
+
+ /**
+ * Get if a given output has a backlight
+ *
+ * @param output The Ecore_Drm_Output to get the backlight of
+ *
+ * @return EINA_TRUE if this output has a backlight, EINA_FALSE otherwise
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Eina_Bool ecore_drm_output_backlight_get(Ecore_Drm_Output *output);
+
+ /**
+ * Get the edid of a given output
+ *
+ * @param output The Ecore_Drm_Output to get the backlight of
+ *
+ * @return A string representing the edid
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI char *ecore_drm_output_edid_get(Ecore_Drm_Output *output);
+
+ /**
+ * Get a list of the modes supported on a given output
+ *
+ * @param output The Ecore_Drm_Output to get the modes for
+ *
+ * @return An Eina_List of the modes supported for this output
+ *
+ * @note The returned list should not be freed
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Eina_List *ecore_drm_output_modes_get(Ecore_Drm_Output *output);
+
+ /**
+ * Get the output which is marked as primary
+ *
+ * @param dev The Ecore_Drm_Device to get the primary output from
+ *
+ * @return The primary Ecore_Drm_Output or NULL if no primary output is set
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Ecore_Drm_Output *ecore_drm_output_primary_get(Ecore_Drm_Device *dev);
+
+ /**
+ * Set a given output as primary
+ *
+ * @param output The Ecore_Drm_Output to set as primary
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI void ecore_drm_output_primary_set(Ecore_Drm_Output *output);
+
+ /**
+ * Get the size of the crtc for a given output
+ *
+ * @param output The Ecore_Drm_Output to get the crtc size of
+ * @param *width The parameter in which width is stored
+ * @param *height The parameter in which height is stored
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI void ecore_drm_output_crtc_size_get(Ecore_Drm_Output *output, int *width, int *height);
+
+ /**
+ * Find an Ecore_Drm_Output which has the given name
+ *
+ * This function will loop all the existing outputs in Ecore_Drm_Device and
+ * return an output if one exists that matches the given name.
+ *
+ * @param dev The Ecore_Drm_Device to search
+ * @param name The Ecore_Drm_Output matching this name
+ *
+ * @return An Ecore_Drm_Output if one exists at these coordinates or NULL
+ *
+ * @ingroup Ecore_Drm_Device_Group
+ * @since 1.15
+ */
+ EAPI Ecore_Drm_Output *ecore_drm_device_output_name_find(Ecore_Drm_Device *dev, const char *name);
+
+ /**
+ * Get if an Ecore_Drm_Output can be used on a given crtc
+ *
+ * This function will loop the possible crtcs of an encoder to determine if
+ * a given output can be assigned to a given crtc
+ *
+ * @param output The Ecore_Drm_Output to test if can be used on crtc
+ * @param crtc The crtc to test an Ecore_Drm_Output against
+ *
+ * @return EINA_TRUE if the output can be assigned to given crtc, EINA_FALSE otherwise
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Eina_Bool ecore_drm_output_possible_crtc_get(Ecore_Drm_Output *output, unsigned int crtc);
+
+ /**
+ * Set a given mode to be used on an Ecore_Drm_Output
+ *
+ * This function will set the given mode to be used on a given Ecore_Drm_Output
+ *
+ * @param output The Ecore_Drm_Output to set the mode on
+ * @param mode A valid Ecore_Drm_Output_Mode to set or NULL to disable the output
+ * @param X The X position to set this output to
+ * @param Y The Y position to set this output to
+ *
+ * @return EINA_TRUE on success, EINA_FALSE on failure
+ *
+ * @ingroup Ecore_Drm_Output_Group
+ * @since 1.15
+ */
+ EAPI Eina_Bool ecore_drm_output_mode_set(Ecore_Drm_Output *output, Ecore_Drm_Output_Mode *mode, int x, int y);
+
++/**
+ * @since tizen 3.0
+ */
+EAPI Eina_List *ecore_drm_seat_evdev_list_get(Ecore_Drm_Seat *seat);
+EAPI const char *ecore_drm_evdev_name_get(Ecore_Drm_Evdev *evdev);
+EAPI const char *ecore_drm_evdev_sysname_get(Ecore_Drm_Evdev *evdev);
+
++/* This is ugly, will remove after rebaseing on 1.14 */
++EAPI unsigned int ecore_drm_output_crtc_id_get(Ecore_Drm_Output *output);
++EAPI void ecore_drm_output_current_fb_info_set(Ecore_Drm_Output *output, unsigned int handle, int w, int h, unsigned int format);
++EAPI void ecore_drm_output_current_fb_info_get(Ecore_Drm_Output *output, unsigned int *handle, int *w, int *h, unsigned int *format);
++
+ # ifdef __cplusplus
+ }
+ # endif
+
+ # undef EAPI
+ # define EAPI
+
#endif
int _ecore_drm_log_dom = -1;
EAPI int ECORE_DRM_EVENT_ACTIVATE = 0;
- EAPI int ECORE_DRM_EVENT_PAGE_FLIP = 0;
- EAPI int ECORE_DRM_EVENT_VBLANK = 0;
+EAPI int ECORE_DRM_EVENT_INPUT_DEVICE_ADD = 0;
+EAPI int ECORE_DRM_EVENT_INPUT_DEVICE_DEL = 0;
static void
_ecore_drm_event_activate_free(void *data EINA_UNUSED, void *event)
if (!eeze_init()) goto eeze_err;
ECORE_DRM_EVENT_ACTIVATE = ecore_event_type_new();
- ECORE_DRM_EVENT_PAGE_FLIP = ecore_event_type_new();
- ECORE_DRM_EVENT_VBLANK = ecore_event_type_new();
ECORE_DRM_EVENT_OUTPUT = ecore_event_type_new();
+ ECORE_DRM_EVENT_SEAT_ADD = ecore_event_type_new();
+ ECORE_DRM_EVENT_INPUT_DEVICE_ADD = ecore_event_type_new();
+ ECORE_DRM_EVENT_INPUT_DEVICE_DEL = ecore_event_type_new();
/* return init count */
return _ecore_drm_init_count;
drmIoctl(fb->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &darg);
free(fb);
}
+
+ EAPI void
+ ecore_drm_fb_dirty(Ecore_Drm_Fb *fb, Eina_Rectangle *rects, unsigned int count)
+ {
+ EINA_SAFETY_ON_NULL_RETURN(fb);
+
+ if ((!rects) || (!count)) return;
+
+ #ifdef DRM_MODE_FEATURE_DIRTYFB
+ drmModeClip *clip;
+ unsigned int i = 0;
+ int ret;
+
+ clip = alloca(count * sizeof(drmModeClip));
+ for (i = 0; i < count; i++)
+ {
+ clip[i].x1 = rects[i].x;
+ clip[i].y1 = rects[i].y;
+ clip[i].x2 = rects[i].w;
+ clip[i].y2 = rects[i].h;
+ }
+
+ ret = drmModeDirtyFB(fb->fd, fb->id, clip, count);
+ if (ret)
+ {
+ if (ret == -EINVAL)
+ ERR("Could not mark FB as Dirty: %m");
+ }
+ #endif
+ }
+
+ EAPI void
+ ecore_drm_fb_set(Ecore_Drm_Device *dev, Ecore_Drm_Fb *fb)
+ {
+ Ecore_Drm_Output *output;
+ Eina_List *l;
+
+ EINA_SAFETY_ON_NULL_RETURN(dev);
+ EINA_SAFETY_ON_NULL_RETURN(fb);
+
+ if (dev->dumb[0])
+ {
+ if ((fb->w != dev->dumb[0]->w) || (fb->h != dev->dumb[0]->h))
+ {
+ /* we need to copy from fb to dev->dumb */
+ WRN("Trying to set a Framebuffer of improper size !!");
+ return;
+ }
+ }
+
+ if (!dev->next) dev->next = fb;
+ if (!dev->next) return;
+
+ EINA_LIST_FOREACH(dev->outputs, l, output)
+ {
+ int x = 0, y = 0;
+
+ if ((!output->enabled) || (!output->current_mode)) continue;
+
+ if (!output->cloned)
+ {
+ x = output->x;
+ y = output->y;
+ }
+
+ if ((!dev->current) ||
+ (dev->current->stride != dev->next->stride))
+ {
+ if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, dev->next->id,
+ x, y, &output->conn_id, 1,
+ &output->current_mode->info))
+ {
+ ERR("Failed to set Mode %dx%d for Output %s: %m",
+ output->current_mode->width, output->current_mode->height,
+ output->name);
+ }
+
+ /* TODO: set dpms on ?? */
+ }
+ }
+ }
+
+ EAPI void
+ ecore_drm_fb_send(Ecore_Drm_Device *dev, Ecore_Drm_Fb *fb, Ecore_Drm_Pageflip_Cb func, void *data)
+ {
+ Ecore_Drm_Output *output;
+ Eina_List *l;
+ Ecore_Drm_Pageflip_Callback *cb;
+
+ EINA_SAFETY_ON_NULL_RETURN(dev);
+ EINA_SAFETY_ON_NULL_RETURN(fb);
+ EINA_SAFETY_ON_NULL_RETURN(func);
+
+ if (eina_list_count(dev->outputs) < 1) return;
+
+ if (fb->pending_flip) return;
+
+ if (!(cb = calloc(1, sizeof(Ecore_Drm_Pageflip_Callback))))
+ return;
+
+ cb->dev = dev;
+ cb->func = func;
+ cb->data = data;
+
+ EINA_LIST_FOREACH(dev->outputs, l, output)
+ if (output->enabled) cb->count++;
+
+ EINA_LIST_FOREACH(dev->outputs, l, output)
+ {
+ if ((!output->enabled) || (!output->current_mode)) continue;
+
++ ecore_drm_output_current_fb_info_set(output, fb->hdl, fb->w, fb->h,
++ DRM_FORMAT_ARGB8888);
++
+ if (drmModePageFlip(dev->drm.fd, output->crtc_id, fb->id,
+ DRM_MODE_PAGE_FLIP_EVENT, cb) < 0)
+ {
+ ERR("Cannot flip crtc %u for connector %u: %m",
+ output->crtc_id, output->conn_id);
+ continue;
+ }
+
+ fb->pending_flip = EINA_TRUE;
+ }
+
+ while (fb->pending_flip)
+ {
+ int ret = 0;
+
+ ret = drmHandleEvent(dev->drm.fd, &dev->drm_ctx);
+ if (ret < 0)
+ {
+ ERR("drmHandleEvent Failed: %m");
+ free(cb);
+ break;
+ }
+ }
+ }
return s;
}
+static void
+_ecore_drm_event_input_device_add_free(void *data EINA_UNUSED, void *ev)
+{
+ Ecore_Drm_Event_Input_Device_Add *e;
+
+ e = ev;
+ eina_stringshare_del(e->name);
+ eina_stringshare_del(e->sysname);
+ eina_stringshare_del(e->seatname);
+
+ free(e);
+}
+
+static void
+_ecore_drm_event_input_device_del_free(void *data EINA_UNUSED, void *ev)
+{
+ Ecore_Drm_Event_Input_Device_Del *e;
+
+ e = ev;
+ eina_stringshare_del(e->name);
+ eina_stringshare_del(e->sysname);
+ eina_stringshare_del(e->seatname);
+
+ free(e);
+}
+
+ static Ecore_Drm_Seat *
+ _seat_get(Ecore_Drm_Input *input, const char *seat)
+ {
+ Ecore_Drm_Seat *s;
+ Eina_List *l;
+
+ /* search for this name in existing seats */
+ EINA_LIST_FOREACH(input->dev->seats, l, s)
+ if (!strcmp(s->name, seat)) return s;
+
+ return _seat_create(input, seat);
+ }
+
static void
_device_added(Ecore_Drm_Input *input, struct libinput_device *device)
{
return output->crtc_id;
}
- }
+ EAPI unsigned int
+ ecore_drm_output_crtc_buffer_get(Ecore_Drm_Output *output)
+ {
+ drmModeCrtc *crtc;
+ unsigned int id = 0;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, 0);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->dev, 0);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->crtc, 0);
+
+ if (!(crtc = drmModeGetCrtc(output->dev->drm.fd, output->crtc_id)))
+ return 0;
+
+ id = crtc->buffer_id;
+ drmModeFreeCrtc(crtc);
+
+ return id;
+ }
+
+ EAPI unsigned int
+ ecore_drm_output_connector_id_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, 0);
+
+ return output->conn_id;
+ }
+
+ EAPI char *
+ ecore_drm_output_name_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, NULL);
+
+ return strdup(output->name);
+ }
+
+ EAPI Eina_Bool
+ ecore_drm_output_connected_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+
+ return output->connected;
+ }
+
+ EAPI unsigned int
+ ecore_drm_output_connector_type_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, 0);
+
+ return output->conn_type;
+ }
+
+ EAPI Eina_Bool
+ ecore_drm_output_backlight_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+ return (output->backlight != NULL);
+ }
+
+ EAPI char *
+ ecore_drm_output_edid_get(Ecore_Drm_Output *output)
+ {
+ char *edid_str = NULL;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->edid_blob, NULL);
+
+ edid_str = malloc((128 * 2) + 1);
+ if (edid_str)
+ {
+ unsigned int k, kk;
+ const char *hexch = "0123456789abcdef";
+
+ for (kk = 0, k = 0; k < 128; k++)
+ {
+ edid_str[kk] = hexch[(output->edid_blob[k] >> 4) & 0xf];
+ edid_str[kk + 1] = hexch[output->edid_blob[k] & 0xf];
+ kk += 2;
+ }
+ edid_str[kk] = 0;
+ }
+
+ return edid_str;
+ }
+
+ EAPI Eina_List *
+ ecore_drm_output_modes_get(Ecore_Drm_Output *output)
+ {
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->modes, NULL);
+
+ return output->modes;
+ }
+
+ EAPI Ecore_Drm_Output *
+ ecore_drm_output_primary_get(Ecore_Drm_Device *dev)
+ {
+ Ecore_Drm_Output *ret;
+ const Eina_List *l;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(dev, NULL);
+
+ EINA_LIST_FOREACH(dev->outputs, l, ret)
+ if (ret->primary) return ret;
+
+ return NULL;
+ }
+
+ EAPI void
+ ecore_drm_output_primary_set(Ecore_Drm_Output *output)
+ {
+ const Eina_List *l;
+ Ecore_Drm_Output *out;
+
+ EINA_SAFETY_ON_NULL_RETURN(output);
+
+ /* unmark all outputs as primary */
+ EINA_LIST_FOREACH(output->dev->outputs, l, out)
+ out->primary = EINA_FALSE;
+
+ /* mark this output as primary */
+ output->primary = EINA_TRUE;
+ }
+
+ EAPI void
+ ecore_drm_output_crtc_size_get(Ecore_Drm_Output *output, int *width, int *height)
+ {
+ if (width) *width = 0;
+ if (height) *height = 0;
+
+ EINA_SAFETY_ON_NULL_RETURN(output);
+
+ if (width) *width = output->crtc->width;
+ if (height) *height = output->crtc->height;
+ }
+
+ EAPI Eina_Bool
+ ecore_drm_output_possible_crtc_get(Ecore_Drm_Output *output, unsigned int crtc)
+ {
+ Ecore_Drm_Device *dev;
+ drmModeRes *res;
+ drmModeConnector *conn;
+ drmModeEncoder *enc;
+ int i, j, k;
+ unsigned int p;
+ Eina_Bool ret = EINA_FALSE;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->dev, EINA_FALSE);
+
+ dev = output->dev;
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(dev->drm.fd < 0, EINA_FALSE);
+
+ /* get the resources */
+ if (!(res = drmModeGetResources(dev->drm.fd)))
+ {
+ ERR("Could not get resources for drm card: %m");
+ return EINA_FALSE;
+ }
+
+ for (i = 0; i < res->count_connectors; i++)
+ {
+ /* get the connector */
+ if (!(conn = drmModeGetConnector(dev->drm.fd, res->connectors[i])))
+ continue;
+
+ for (j = 0; j < conn->count_encoders; j++)
+ {
+ /* get the encoder on this connector */
+ if (!(enc = drmModeGetEncoder(dev->drm.fd, conn->encoders[j])))
+ {
+ WRN("Failed to get encoder: %m");
+ continue;
+ }
+
+ /* get the encoder for given crtc */
+ if (enc->crtc_id != crtc) goto next;
+
+ p = enc->possible_crtcs;
+
+ for (k = 0; k < res->count_crtcs; k++)
+ {
+ if (res->crtcs[k] != output->crtc_id) continue;
+ if (p & (1 << k))
+ {
+ ret = EINA_TRUE;
+ break;
+ }
+ }
+
+ next:
+ drmModeFreeEncoder(enc);
+ if (ret) break;
+ }
+
+ /* free the connector */
+ drmModeFreeConnector(conn);
+ if (ret) break;
+ }
+
+ /* free resources */
+ drmModeFreeResources(res);
+
+ return ret;
+ }
+
+ EAPI Eina_Bool
+ ecore_drm_output_mode_set(Ecore_Drm_Output *output, Ecore_Drm_Output_Mode *mode, int x, int y)
+ {
+ Ecore_Drm_Device *dev;
+ Eina_Bool ret = EINA_TRUE;
+ unsigned int buffer = 0;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output->dev, EINA_FALSE);
+
+ dev = output->dev;
+
+ output->x = x;
+ output->y = y;
+ output->current_mode = mode;
+
+ if (mode)
+ {
+ if (dev->current)
+ buffer = dev->current->id;
+ else if (dev->next)
+ buffer = dev->next->id;
+ else
+ buffer = output->crtc->buffer_id;
+
+ if (drmModeSetCrtc(dev->drm.fd, output->crtc_id, buffer,
+ output->x, output->y,
+ &output->conn_id, 1, &mode->info) < 0)
+ {
+ ERR("Failed to set Mode %dx%d for Output %s: %m",
+ mode->width, mode->height, output->name);
+ ret = EINA_FALSE;
+ }
+ }
+ else
+ {
+ if (drmModeSetCrtc(dev->drm.fd, output->crtc_id,
+ 0, 0, 0, 0, 0, NULL) < 0)
+ {
+ ERR("Failed to set Mode %dx%d for Output %s: %m",
+ mode->width, mode->height, output->name);
+ ret = EINA_FALSE;
+ }
+ }
+
+ return ret;
+ }
++
+EAPI void
+ecore_drm_output_current_fb_info_set(Ecore_Drm_Output *output, unsigned int handle, int w, int h, unsigned int format)
+{
+ EINA_SAFETY_ON_NULL_RETURN(output);
+
+ output->curr_fb_handle = handle;
+ output->curr_fb_w = w;
+ output->curr_fb_h = h;
+ output->curr_fb_format = format;
+}
+
+EAPI void
+ecore_drm_output_current_fb_info_get(Ecore_Drm_Output *output, unsigned int *handle, int *w, int *h, unsigned int *format)
+{
+ EINA_SAFETY_ON_NULL_RETURN(output);
+
+ if (handle)
+ *handle = output->curr_fb_handle;
+ if (w)
+ *w = output->curr_fb_w;
+ if (h)
+ *h = output->curr_fb_h;
+ if (format)
+ *format = output->curr_fb_format;
++}
Ecore_Drm_Output_Mode *current_mode;
Eina_List *modes;
- Ecore_Drm_Fb *current, *next;
- Ecore_Drm_Fb *dumb[NUM_FRAME_BUFFERS];
+ unsigned char *edid_blob;
+
+ struct
+ {
+ char eisa[13];
+ char monitor[13];
+ char pnp[5];
+ char serial[13];
+ } edid;
+
Ecore_Drm_Backlight *backlight;
+ Eina_Bool primary : 1;
+ Eina_Bool connected : 1;
+ Eina_Bool enabled : 1;
+ Eina_Bool cloned : 1;
+ Eina_Bool need_repaint : 1;
+ Eina_Bool repaint_scheduled : 1;
+ Eina_Bool pending_destroy : 1;
+ Eina_Bool pending_flip : 1;
+ Eina_Bool pending_vblank : 1;
++
+ /* this is ugly */
+ unsigned int curr_fb_handle;
+ int curr_fb_w;
+ int curr_fb_h;
+ int curr_fb_format;
};
struct _Ecore_Drm_Seat
# include <wayland-client.h>
# include <wayland-cursor.h>
# include <xkbcommon/xkbcommon.h>
- # include <xdg-shell-client-protocol.h>
++# include "xdg-shell-client-protocol.h"
# ifdef EAPI
# undef EAPI
_ecore_wl_animator_callback
};
-static void
+// TIZEN_ONLY(20150722): Add ecore_wl_window_keygrab_* APIs
+static const struct tizen_keyrouter_listener _ecore_tizen_keyrouter_listener =
+{
+ _ecore_wl_cb_keygrab_notify
+};
+//
+
+static const struct tizen_policy_listener _ecore_tizen_policy_listener =
+{
+ _ecore_wl_cb_conformant,
+ _ecore_wl_cb_conformant_area,
+ _ecore_wl_cb_notification_done,
+ _ecore_wl_cb_transient_for_done,
+ _ecore_wl_cb_scr_mode_done,
+ _ecore_wl_cb_supported_aux_hints,
+ _ecore_wl_cb_allowed_aux_hint,
+};
++
+static void
xdg_shell_ping(void *data EINA_UNUSED, struct xdg_shell *shell, uint32_t serial)
{
xdg_shell_pong(shell, serial);
ECORE_WL_EVENT_SELECTION_DATA_READY = ecore_event_type_new();
ECORE_WL_EVENT_DATA_SOURCE_CANCELLED = ecore_event_type_new();
ECORE_WL_EVENT_INTERFACES_BOUND = ecore_event_type_new();
+ ECORE_WL_EVENT_CONFORMANT_CHANGE = ecore_event_type_new();
+ ECORE_WL_EVENT_AUX_HINT_ALLOWED = ecore_event_type_new();
}
- if (!(_ecore_wl_disp = malloc(sizeof(Ecore_Wl_Display))))
+ if (!(_ecore_wl_disp = calloc(1, sizeof(Ecore_Wl_Display))))
{
ERR("Could not allocate memory for Ecore_Wl_Display structure");
goto exit_ecore_disp;
EAPI void
ecore_wl_sync(void)
{
- int ret = 0;
++
+ int ret;
if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return;
_ecore_wl_sync_wait(_ecore_wl_disp);
- while (_ecore_wl_disp->sync_ref_count > 0 && ret != -1)
+ while (_ecore_wl_disp->sync_ref_count > 0)
{
ret = wl_display_dispatch(_ecore_wl_disp->wl.display);
- if (ret == -1)
- CRI("dispatch failed: %s(%d)", strerror(errno), errno);
+ if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
+ {
+ /* raise exit signal */
+ ERR("Wayland socket error: %s", strerror(errno));
+ abort();
+ break;
+ }
}
}
wl_compositor_destroy(_ecore_wl_disp->wl.compositor);
if (_ecore_wl_disp->wl.subcompositor)
wl_subcompositor_destroy(_ecore_wl_disp->wl.subcompositor);
+// TIZEN_ONLY(20150722): Add ecore_wl_window_keygrab_* APIs
+ if (_ecore_wl_disp->wl.keyrouter)
+ tizen_keyrouter_destroy(_ecore_wl_disp->wl.keyrouter);
+//
+ if (_ecore_wl_disp->cursor_theme)
+ wl_cursor_theme_destroy(_ecore_wl_disp->cursor_theme);
if (_ecore_wl_disp->wl.display)
{
wl_registry_destroy(_ecore_wl_disp->wl.registry);
EINA_SAFETY_ON_NULL_RETURN(input->display->wl.shm);
+ if (input->display->cursor_theme)
+ wl_cursor_theme_destroy(input->display->cursor_theme);
++
input->display->cursor_theme =
wl_cursor_theme_load(NULL, input->cursor_size, input->display->wl.shm);
}
cursor_theme_name = getenv("ECORE_WL_CURSOR_THEME_NAME");
ecore_wl_input_cursor_theme_name_set(input, cursor_theme_name);
+ }
+
+ void
+ _ecore_wl_input_add(Ecore_Wl_Display *ewd, unsigned int id)
+ {
+ Ecore_Wl_Input *input;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!(input = calloc(1, sizeof(Ecore_Wl_Input)))) return;
+
+ input->display = ewd;
+ input->pointer_focus = NULL;
+ input->keyboard_focus = NULL;
+ input->touch_focus = NULL;
+
+ input->repeat.enabled = EINA_TRUE;
+ input->repeat.rate = 0.025;
+ input->repeat.delay = 0.4;
+
+ if (ewd->wl.shm)
+ _ecore_wl_input_setup(input);
+
input->seat =
wl_registry_bind(ewd->wl.registry, id, &wl_seat_interface, 1);
ewd->inputs = eina_inlist_append(ewd->inputs, EINA_INLIST_GET(input));
strcpy((char *)e->key, key);
if (strlen(compose)) strcpy((char *)e->compose, compose);
- e->window = win->id;
- e->event_window = win->id;
+ // TIZEN_ONLY(20150911): Deal with key event if window is not exist.
+ if (win)
+ {
+ //
+ e->window = win->id;
+ e->event_window = win->id;
+ // TIZEN_ONLY(20150911): Deal with key event if window is not exist.
+ }
+ else
+ {
+ e->window = NULL;
+ e->event_window = NULL;
+ }
+ //
e->timestamp = timestamp;
e->modifiers = input->modifiers;
+ e->keycode = code;
if (state)
ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
# define IVI_SURFACE_ID 6000
# endif
- # include <xdg-shell-client-protocol.h>
++# include "xdg-shell-client-protocol.h"
+# include <tizen-extension-client-protocol.h>
+# include "tizen-policy-ext-client-protocol.h"
+
//# define LOGFNS 1
# ifdef LOGFNS
struct ivi_surface *ivi_surface;
int ivi_surface_id;
# endif
+ struct tizen_visibility *tz_visibility;
+ struct tizen_position *tz_position;
+ struct tizen_rotation *tz_rotation;
+ struct tizen_resource *tz_resource;
+ unsigned int resource_id;
+ unsigned int tz_rotation_serial;
- struct wl_region *opaque_region;
- struct wl_region *input_region;
-
struct xdg_surface *xdg_surface;
struct xdg_popup *xdg_popup;
+ Eina_Bool visible : 1;
Eina_Bool focused : 1;
Eina_Bool resizing : 1;
void _ecore_wl_window_init(void);
void _ecore_wl_window_shutdown(void);
Eina_Hash *_ecore_wl_window_hash_get(void);
++// TIZEN_ONLY(20150722): Add ecore_wl_window_keygrab_* APIs
+Eina_Hash *_ecore_wl_keygrab_hash_get(void);
++//
+ void _ecore_wl_window_shell_surface_init(Ecore_Wl_Window *win);
void _ecore_wl_output_add(Ecore_Wl_Display *ewd, unsigned int id);
void _ecore_wl_output_del(Ecore_Wl_Output *output);
#endif
#include "ecore_wl_private.h"
- #include <xdg-shell-client-protocol.h>
+ #include "xdg-shell-client-protocol.h"
+ #include "session-recovery-client-protocol.h"
+#include <tizen-extension-client-protocol.h>
/* local function prototypes */
static void _ecore_wl_window_cb_ping(void *data EINA_UNUSED, struct wl_shell_surface *shell_surface, unsigned int serial);
static void _ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface EINA_UNUSED, unsigned int edges, int w, int h);
static void _ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surface EINA_UNUSED);
- static void _ecore_wl_window_cb_surface_enter(void *data, struct wl_surface *surface, struct wl_output *output EINA_UNUSED);
- static void _ecore_wl_window_cb_surface_leave(void *data, struct wl_surface *surface, struct wl_output *output EINA_UNUSED);
- static void _ecore_wl_window_configure_send(Ecore_Wl_Window *win, int x, int y, int w, int h, int edges);
+ static void _ecore_wl_window_configure_send(Ecore_Wl_Window *win, int w, int h, int edges);
+static void _ecore_wl_window_show_send(Ecore_Wl_Window *win);
+static void _ecore_wl_window_hide_send(Ecore_Wl_Window *win);
static char *_ecore_wl_window_id_str_get(unsigned int win_id);
static void _ecore_xdg_handle_surface_configure(void *data, struct xdg_surface *xdg_surface, int32_t width, int32_t height,struct wl_array *states, uint32_t serial);
static void _ecore_xdg_handle_surface_delete(void *data, struct xdg_surface *xdg_surface);
- static void _ecore_xdg_handle_popup_done(void *data, struct xdg_popup *xdg_popup, unsigned int serial);
++static void _ecore_xdg_handle_surface_delete(void *data, struct xdg_surface *xdg_surface);
+ static void _ecore_xdg_handle_popup_done(void *data, struct xdg_popup *xdg_popup);
+ static void _ecore_session_recovery_uuid(void *data, struct session_recovery *session_recovery, const char *uuid);
+static void _ecore_wl_window_cb_visibility_change(void *data, struct tizen_visibility *tizen_visibility, uint32_t visibility);
+static void _ecore_wl_window_cb_position_change(void *data, struct tizen_position *tizen_position, int32_t x, int32_t y);
+static void _ecore_wl_window_cb_available_angles_done(void *data, struct tizen_rotation *tizen_rotation, uint32_t angles);
+static void _ecore_wl_window_cb_preferred_angle_done(void *data, struct tizen_rotation *tizen_rotation, uint32_t angle);
+static void _ecore_wl_window_cb_angle_change(void *data, struct tizen_rotation *tizen_rotation, uint32_t angle, uint32_t serial);
+static void _ecore_wl_window_cb_resource_id(void *data, struct tizen_resource *tizen_resource, uint32_t id);
/* local variables */
static Eina_Hash *_windows = NULL;
_ecore_xdg_handle_popup_done,
};
+static const struct tizen_visibility_listener _ecore_tizen_visibility_listener =
+{
+ _ecore_wl_window_cb_visibility_change,
+};
+
+static const struct tizen_position_listener _ecore_tizen_position_listener =
+{
+ _ecore_wl_window_cb_position_change,
+};
+static const struct tizen_rotation_listener _ecore_tizen_rotation_listener =
+{
+ _ecore_wl_window_cb_available_angles_done,
+ _ecore_wl_window_cb_preferred_angle_done,
+ _ecore_wl_window_cb_angle_change,
+};
+
+static const struct tizen_resource_listener _ecore_tizen_resource_listener =
+{
+ _ecore_wl_window_cb_resource_id,
+};
+
+ static const struct session_recovery_listener _ecore_session_recovery_listener =
+ {
+ _ecore_session_recovery_uuid,
+ };
+
/* internal functions */
- void
+ void
_ecore_wl_window_init(void)
{
- if (!_windows)
+ if (!_windows)
_windows = eina_hash_string_superfast_new(NULL);
}
return _windows;
}
+ void
+ _ecore_wl_window_shell_surface_init(Ecore_Wl_Window *win)
+ {
+ #ifdef USE_IVI_SHELL
+ char *env;
+ #endif
+
+ if ((win->type == ECORE_WL_WINDOW_TYPE_DND) ||
+ (win->type == ECORE_WL_WINDOW_TYPE_NONE)) return;
+ #ifdef USE_IVI_SHELL
+ if ((!win->ivi_surface) && (_ecore_wl_disp->wl.ivi_application))
+ {
+ if (win->parent && win->parent->ivi_surface)
+ win->ivi_surface_id = win->parent->ivi_surface_id + 1;
+ else if ((env = getenv("ECORE_IVI_SURFACE_ID")))
+ win->ivi_surface_id = atoi(env);
+ else
+ win->ivi_surface_id = IVI_SURFACE_ID + getpid();
+
+ win->ivi_surface =
+ ivi_application_surface_create(_ecore_wl_disp->wl.ivi_application,
+ win->ivi_surface_id, win->surface);
+ }
+
+ if (!win->ivi_surface)
+ {
+ #endif
+ if (_ecore_wl_disp->wl.xdg_shell)
+ {
+ if (win->xdg_surface) return;
+ win->xdg_surface =
+ xdg_shell_get_xdg_surface(_ecore_wl_disp->wl.xdg_shell,
+ win->surface);
+ if (!win->xdg_surface) return;
+ if (win->title)
+ xdg_surface_set_title(win->xdg_surface, win->title);
+ if (win->class_name)
+ xdg_surface_set_app_id(win->xdg_surface, win->class_name);
+ xdg_surface_set_user_data(win->xdg_surface, win);
+ xdg_surface_add_listener(win->xdg_surface,
+ &_ecore_xdg_surface_listener, win);
+ }
+ else if (_ecore_wl_disp->wl.shell)
+ {
+ if (win->shell_surface) return;
+ win->shell_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);
+
+ if (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);
+ #ifdef USE_IVI_SHELL
+ }
+ #endif
+
++ if (_ecore_wl_disp->wl.tz_policy)
++ {
++ if (!win->tz_visibility)
++ {
++ win->tz_visibility =
++ tizen_policy_get_visibility(_ecore_wl_disp->wl.tz_policy,
++ win->surface);
++ if (!win->tz_visibility) return;
++ tizen_visibility_add_listener(win->tz_visibility,
++ &_ecore_tizen_visibility_listener,
++ win);
++ }
++ if (!win->tz_position)
++ {
++
++ win->tz_position =
++ tizen_policy_get_position(_ecore_wl_disp->wl.tz_policy,
++ win->surface);
++
++ if (!win->tz_position) return;
++ tizen_position_add_listener(win->tz_position,
++ &_ecore_tizen_position_listener, win);
++ if (win->surface)
++ tizen_position_set(win->tz_position,
++ win->allocation.x, win->allocation.y);
++ }
++ if (win->role)
++ {
++ if (win->surface)
++ tizen_policy_set_role(_ecore_wl_disp->wl.tz_policy,
++ win->surface,
++ win->role);
++ }
++ if (win->focus_skip)
++ {
++ if (win->surface)
++ tizen_policy_set_focus_skip(_ecore_wl_disp->wl.tz_policy, win->surface);
++ }
++ else
++ {
++ if (win->surface)
++ tizen_policy_unset_focus_skip(_ecore_wl_disp->wl.tz_policy, win->surface);
++ }
++ }
++ if ((!win->tz_rotation) && (_ecore_wl_disp->wl.tz_policy_ext))
++ {
++ int i = 0, w, h, rot;
++ win->tz_rotation =
++ tizen_policy_ext_get_rotation(_ecore_wl_disp->wl.tz_policy_ext,
++ win->surface);
++ if (!win->tz_rotation) return;
++ tizen_rotation_add_listener(win->tz_rotation,
++ &_ecore_tizen_rotation_listener, win);
++
++ rot = ecore_wl_window_rotation_get(win);
++ if ((rot % 90 == 0) && (rot / 90 <= 3) && (rot >= 0))
++ {
++ i = rot / 90;
++ w = win->rotation_geometry_hints[i].w;
++ h = win->rotation_geometry_hints[i].h;
++
++ if ((win->rotation_geometry_hints[i].valid) &&
++ ((win->allocation.w != w) || (win->allocation.h != h)))
++ {
++ _ecore_wl_window_configure_send(win,
++ w, h, 0);
++ }
++ }
++ }
++
++ if ((!win->tz_resource) && (_ecore_wl_disp->wl.tz_surf))
++ {
++ win->tz_resource =
++ tizen_surface_get_tizen_resource(_ecore_wl_disp->wl.tz_surf, win->surface);
++ if (!win->tz_resource) return;
++ tizen_resource_add_listener(win->tz_resource,
++ &_ecore_tizen_resource_listener, win);
++ }
++
+ /* trap for valid shell surface */
+ if ((!win->xdg_surface) && (!win->shell_surface)) return;
+
+ switch (win->type)
+ {
+ case ECORE_WL_WINDOW_TYPE_FULLSCREEN:
+ 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:
+ 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:
+ if (win->xdg_surface)
+ xdg_surface_set_parent(win->xdg_surface, win->parent->xdg_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:
+ 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);
+ if (!win->xdg_popup) return;
+ 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:
+ 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;
+ }
++
++ if (!win->visible)
++ {
++ _ecore_wl_window_show_send(win);
++ win->visible = EINA_TRUE;
++ }
+ }
+
EAPI Ecore_Wl_Window *
ecore_wl_window_new(Ecore_Wl_Window *parent, int x, int y, int w, int h, int buffer_type)
{
win->opaque.w = w;
win->opaque.h = h;
- wlcomp = _ecore_wl_compositor_get();
- if (!wlcomp)
- {
- ERR("Failed to get wl_compositor");
- free(win);
- return NULL;
- }
-
- win->opaque_region =
- wl_compositor_create_region(wlcomp);
-
- win->input_region =
- wl_compositor_create_region(wlcomp);
-
win->title = NULL;
win->class_name = NULL;
+ win->role = NULL;
+ win->focus_skip = EINA_FALSE;
eina_hash_add(_windows, _ecore_wl_window_id_str_get(win->id), win);
return win;
if (!win) return NULL;
if (win->surface) return win->surface;
- win->surface = wl_compositor_create_surface(_ecore_wl_compositor_get());
++
+ if (_ecore_wl_disp->wl.session_recovery)
+ session_recovery_add_listener(_ecore_wl_disp->wl.session_recovery, &_ecore_session_recovery_listener, win);
- if (wlcomp) win->surface = wl_compositor_create_surface(wlcomp);
+ wlcomp = _ecore_wl_compositor_get();
++ if (wlcomp)
++ win->surface = wl_compositor_create_surface(wlcomp);
if (!win->surface) return NULL;
win->surface_id = wl_proxy_get_id((struct wl_proxy *)win->surface);
return win->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);
+ _ecore_wl_window_configure_send(win,
- win->allocation.x,
- win->allocation.y,
+ 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);
+ _ecore_wl_window_configure_send(win,
- win->allocation.x,
- win->allocation.y,
+ win->saved.w,
+ win->saved.h,
+ 0);
}
}
}
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);
+ _ecore_wl_window_configure_send(win,
- win->allocation.x, win->allocation.y,
+ win->saved.w, win->saved.h, 0);
}
}
if (!win) return;
win->alpha = alpha;
if (!win->alpha)
- ecore_wl_window_opaque_region_set(win, win->opaque.x, win->opaque.y,
+ ecore_wl_window_opaque_region_set(win, win->opaque.x, win->opaque.y,
win->opaque.w, win->opaque.h);
else
- ecore_wl_window_opaque_region_set(win, win->opaque.x, win->opaque.y, 0, 0);
+ {
+ ecore_wl_window_opaque_region_set(win, win->opaque.x, win->opaque.y, 0, 0);
+ if (win->surface)
+ wl_surface_set_opaque_region(win->surface, NULL);
+ }
}
EAPI Eina_Bool
win->parent = parent;
}
+EAPI void
+ecore_wl_window_position_set(Ecore_Wl_Window *win, int x EINA_UNUSED, int y EINA_UNUSED)
+{
+ if ((win->surface) && (win->tz_position))
+ {
+ tizen_position_set(win->tz_position, win->allocation.x, win->allocation.y);
+ }
+}
+
+EAPI void
+ecore_wl_window_focus_skip_set(Ecore_Wl_Window *win, Eina_Bool focus_skip)
+{
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!win) return;
+ if (win->focus_skip == focus_skip) return;
+
+ win->focus_skip = focus_skip;
+
+ if (focus_skip)
+ {
+ if ((win->surface) && (_ecore_wl_disp->wl.tz_policy))
+ tizen_policy_set_focus_skip(_ecore_wl_disp->wl.tz_policy, win->surface);
+ }
+ else
+ {
+ if ((win->surface) && (_ecore_wl_disp->wl.tz_policy))
+ tizen_policy_unset_focus_skip(_ecore_wl_disp->wl.tz_policy, win->surface);
+ }
+ }
+
+EAPI void
+ecore_wl_window_role_set(Ecore_Wl_Window *win, const char *role)
+{
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!win) return;
+ eina_stringshare_replace(&win->role, role);
+
+ if ((win->surface) && (_ecore_wl_disp->wl.tz_policy))
+ tizen_policy_set_role(_ecore_wl_disp->wl.tz_policy, win->surface, win->role);
+}
+
/* @since 1.12 */
- EAPI void
+ EAPI void
ecore_wl_window_iconified_set(Ecore_Wl_Window *win, Eina_Bool iconified)
{
struct wl_array states;
{
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);
+ _ecore_wl_window_configure_send(win,
- win->allocation.x, win->allocation.y,
+ win->saved.w, win->saved.h, 0);
}
}
}
return win->keyboard_device;
}
- win->allocation.x, win->allocation.y,
+EAPI void
+ecore_wl_window_rotation_preferred_rotation_set(Ecore_Wl_Window *win, int rot)
+{
+ enum tizen_rotation_angle angle = TIZEN_ROTATION_ANGLE_NONE;
+
+ if (!win) return;
+ if (!win->tz_rotation) return;
+
+ switch (rot)
+ {
+ case 0:
+ angle = TIZEN_ROTATION_ANGLE_0;
+ break;
+ case 90:
+ angle = TIZEN_ROTATION_ANGLE_90;
+ break;
+ case 180:
+ angle = TIZEN_ROTATION_ANGLE_180;
+ break;
+ case 270:
+ angle = TIZEN_ROTATION_ANGLE_270;
+ break;
+ default:
+ break;
+ }
+
+ tizen_rotation_set_preferred_angle(win->tz_rotation, (uint32_t)angle);
+}
+
+EAPI void
+ecore_wl_window_rotation_available_rotations_set(Ecore_Wl_Window *win, const int *rots, unsigned int count)
+{
+ uint32_t angles = 0;
+ unsigned int i = 0;
+
+ if (!win) return;
+ if (!win->tz_rotation) return;
+
+
+ for (i = 0; i < count ; i++)
+ {
+ switch (rots[i])
+ {
+ case 0:
+ angles |= (uint32_t)TIZEN_ROTATION_ANGLE_0;
+ break;
+ case 90:
+ angles |= (uint32_t)TIZEN_ROTATION_ANGLE_90;
+ break;
+ case 180:
+ angles |= (uint32_t)TIZEN_ROTATION_ANGLE_180;
+ break;
+ case 270:
+ angles |= (uint32_t)TIZEN_ROTATION_ANGLE_270;
+ break;
+ default:
+ break;
+ }
+ }
+
+ tizen_rotation_set_available_angles(win->tz_rotation, angles);
+}
+
+EAPI void
+ecore_wl_window_rotation_change_done_send(Ecore_Wl_Window *win)
+{
+ if (!win) return;
+ if (!win->tz_rotation) return;
+
+ tizen_rotation_ack_angle_change(win->tz_rotation, win->tz_rotation_serial);
+}
+
+
+EAPI void
+ecore_wl_window_rotation_geometry_set(Ecore_Wl_Window *win, int rot, int x, int y, int w, int h)
+{
+ int i = 0;
+ int rotation = 0;
+ if (!win) return;
+
+ if ((rot % 90 != 0) || (rot / 90 > 3) || (rot < 0)) return;
+
+ i = rot / 90;
+ win->rotation_geometry_hints[i].x = x;
+ win->rotation_geometry_hints[i].y = y;
+ win->rotation_geometry_hints[i].w = w;
+ win->rotation_geometry_hints[i].h = h;
+ win->rotation_geometry_hints[i].valid = EINA_TRUE;
+
+ if (!win->tz_rotation) return;
+ rotation = ecore_wl_window_rotation_get(win);
+ if ((rotation % 90 != 0) || (rotation / 90 > 3) || (rotation < 0)) return;
+ if ((i == (rotation / 90)) &&
+ ((win->allocation.w != w) || (win->allocation.h != h)))
+ {
+ _ecore_wl_window_configure_send(win,
+ w, h, 0);
+ }
+}
/* local functions */
- static void
+ static void
_ecore_wl_window_cb_ping(void *data EINA_UNUSED, struct wl_shell_surface *shell_surface, unsigned int serial)
{
if (!shell_surface) return;
if ((w <= 0) || (h <= 0)) return;
if ((win->allocation.w != w) || (win->allocation.h != h))
- _ecore_wl_window_configure_send(win, w, h, edges);
+ {
+ _ecore_wl_window_configure_send(win,
- win->allocation.x, win->allocation.y,
+ w, h, edges);
+ }
}
static void
xdg_surface_ack_configure(win->xdg_surface, serial);
}
- //static void
- //_ecore_wl_window_cb_xdg_surface_activate(void *data, struct xdg_surface *xdg_surface)
- //{
- // Ecore_Wl_Window *win;
- // Ecore_Wl_Event_Window_Activate *ev;
- //
- // LOGFN(__FILE__, __LINE__, __FUNCTION__);
- //
- // if (!xdg_surface) return;
- // if (!(win = data)) return;
- //
- // if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Activate)))) return;
- // ev->win = win->id;
- // if (win->parent)
- // ev->parent_win = win->parent->id;
- // else
- // ev->parent_win = 0;
- // ev->event_win = win->id;
- // ev->fobscured = EINA_FALSE;
- // ecore_event_add(ECORE_WL_EVENT_WINDOW_ACTIVATE, ev, NULL, NULL);
- //}
- //
- //static void
- //_ecore_wl_window_cb_xdg_surface_deactivate(void *data, struct xdg_surface *xdg_surface)
- //{
- // Ecore_Wl_Window *win;
- // Ecore_Wl_Event_Window_Deactivate *ev;
- //
- // LOGFN(__FILE__, __LINE__, __FUNCTION__);
- //
- // if (!xdg_surface) return;
- // if (!(win = data)) return;
- //
- // if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Deactivate)))) return;
- // ev->win = win->id;
- // if (win->parent)
- // ev->parent_win = win->parent->id;
- // else
- // ev->parent_win = 0;
- // ev->event_win = win->id;
- // ev->fobscured = EINA_FALSE;
- // ecore_event_add(ECORE_WL_EVENT_WINDOW_DEACTIVATE, ev, NULL, NULL);
- //}
-
static void
- x,
- y,
+_ecore_wl_window_cb_position_change(void *data, struct tizen_position *tizen_position EINA_UNUSED, int32_t x, int32_t y)
+{
+ Ecore_Wl_Window *win;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!(win = data)) return;
+
+ if ((x != win->allocation.x) || (y != win->allocation.y))
+ {
+ ecore_wl_window_update_location(win, x, y);
+ _ecore_wl_window_configure_send(win,
- //static void
- //_ecore_wl_window_cb_xdg_surface_delete(void *data EINA_UNUSED, struct xdg_surface *xdg_surface EINA_UNUSED)
- //{
- //}
-
+ win->allocation.w,
+ win->allocation.h,
+ 0);
+ }
+}
+
+static void
+_ecore_wl_window_cb_visibility_change(void *data, struct tizen_visibility *tizen_visibility EINA_UNUSED, uint32_t visibility)
+{
+ Ecore_Wl_Window *win;
+ Ecore_Wl_Event_Window_Visibility_Change *ev;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!(win = data)) return;
+ if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Visibility_Change)))) return;
+
+ ev->win = win->id;
+ if (visibility == TIZEN_VISIBILITY_VISIBILITY_FULLY_OBSCURED)
+ ev->fully_obscured = 1;
+ else
+ ev->fully_obscured = 0;
+
+ ecore_event_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, ev, NULL, NULL);
+}
+
+static void
+_ecore_wl_window_cb_available_angles_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angles EINA_UNUSED)
+{
+ return;
+}
+
+static void
+_ecore_wl_window_cb_preferred_angle_done(void *data EINA_UNUSED, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle EINA_UNUSED)
+{
+ return;
+}
+
+static void
+_ecore_wl_window_cb_angle_change(void *data, struct tizen_rotation *tizen_rotation EINA_UNUSED, uint32_t angle, uint32_t serial)
+{
+ Ecore_Wl_Window *win;
+ Ecore_Wl_Event_Window_Rotate *ev;
+ int i = 0;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!(win = data)) return;
+ if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Rotate)))) return;
+
+ win->tz_rotation_serial = serial;
+
+ ev->win = win->id;
+ ev->w = win->allocation.w;
+ ev->h = win->allocation.h;
+
+ switch (angle)
+ {
+ case TIZEN_ROTATION_ANGLE_0:
+ ev->angle = 0;
+ break;
+ case TIZEN_ROTATION_ANGLE_90:
+ ev->angle = 90;
+ break;
+ case TIZEN_ROTATION_ANGLE_180:
+ ev->angle = 180;
+ break;
+ case TIZEN_ROTATION_ANGLE_270:
+ ev->angle = 270;
+ break;
+ default:
+ ev->angle = 0;
+ break;
+ }
+
+ i = ev->angle / 90;
+ if (win->rotation_geometry_hints[i].valid)
+ {
+ ev->w = win->rotation_geometry_hints[i].w;
+ ev->h = win->rotation_geometry_hints[i].h;
+ }
+
+ ecore_event_add(ECORE_WL_EVENT_WINDOW_ROTATE, ev, NULL, NULL);
+ ecore_wl_window_rotation_set(win, ev->angle);
+}
+
+static void
+_ecore_wl_window_cb_resource_id(void *data, struct tizen_resource *tizen_resource EINA_UNUSED, uint32_t id)
+{
+ Ecore_Wl_Window *win;
+ Ecore_Wl_Event_Window_Show *ev;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!(win = data)) return;
+ if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Show)))) return;
+ ev->win = win->id;
+ if (win->parent)
+ ev->parent_win = win->parent->id;
+ else
+ ev->parent_win = 0;
+ ev->event_win = win->id;
+ ev->data[0] = (unsigned int)id;
+ win->resource_id = (unsigned int)id;
+ ecore_event_add(ECORE_WL_EVENT_WINDOW_SHOW, ev, NULL, NULL);
+}
+
+static void
_ecore_xdg_handle_surface_delete(void *data, struct xdg_surface *xdg_surface EINA_UNUSED)
{
Ecore_Wl_Window *win;
--- /dev/null
++#if 0
++
+ #ifdef HAVE_CONFIG_H
+ #include "config.h"
+ #endif
+
+ #include <Ector.h>
+ #include "ector_drawhelper_private.h"
+
+ #ifdef BUILD_NEON
+ #include <arm_neon.h>
+
+ static void
+ comp_func_solid_source_over_neon(uint * __restrict dest, int length, uint color, uint const_alpha)
+ {
+ uint16x8_t temp00_16x8;
+ uint16x8_t temp01_16x8;
+ uint16x8_t temp10_16x8;
+ uint16x8_t temp11_16x8;
+ uint32x4_t temp0_32x4;
+ uint32x4_t temp1_32x4;
+ uint32x4_t c_32x4;
+ uint32x4_t d0_32x4;
+ uint32x4_t d1_32x4;
+ uint8x16_t d0_8x16;
+ uint8x16_t d1_8x16;
+ uint8x16_t temp0_8x16;
+ uint8x16_t temp1_8x16;
+ uint8x8_t alpha_8x8;
+ uint8x8_t d00_8x8;
+ uint8x8_t d01_8x8;
+ uint8x8_t d10_8x8;
+ uint8x8_t d11_8x8;
+ uint8x8_t temp00_8x8;
+ uint8x8_t temp01_8x8;
+ uint8x8_t temp10_8x8;
+ uint8x8_t temp11_8x8;
+
+ if (const_alpha != 255)
+ color = BYTE_MUL(color, const_alpha);
+
+ // alpha can only be 0 if color is 0x0. In that case we can just return.
+ // Otherwise we can assume alpha != 0. This allows more optimization in
+ // NEON code.
+ if (!color)
+ return;
+
+ DATA32 *start = dest;
+ int size = length;
+ DATA32 *end = start + (size & ~7);
+
+ unsigned char alpha;
+ alpha = ~(color >> 24) + 1;
+ alpha_8x8 = vdup_n_u8(alpha);
+
+ c_32x4 = vdupq_n_u32(color);
+
+ while (start < end)
+ {
+ d0_32x4 = vld1q_u32(start);
+ d1_32x4 = vld1q_u32(start+4);
+ d0_8x16 = vreinterpretq_u8_u32(d0_32x4);
+ d1_8x16 = vreinterpretq_u8_u32(d1_32x4);
+
+ d00_8x8 = vget_low_u8(d0_8x16);
+ d01_8x8 = vget_high_u8(d0_8x16);
+ d10_8x8 = vget_low_u8(d1_8x16);
+ d11_8x8 = vget_high_u8(d1_8x16);
+
+ temp00_16x8 = vmull_u8(alpha_8x8, d00_8x8);
+ temp01_16x8 = vmull_u8(alpha_8x8, d01_8x8);
+ temp10_16x8 = vmull_u8(alpha_8x8, d10_8x8);
+ temp11_16x8 = vmull_u8(alpha_8x8, d11_8x8);
+
+ temp00_8x8 = vshrn_n_u16(temp00_16x8,8);
+ temp01_8x8 = vshrn_n_u16(temp01_16x8,8);
+ temp10_8x8 = vshrn_n_u16(temp10_16x8,8);
+ temp11_8x8 = vshrn_n_u16(temp11_16x8,8);
+
+ temp0_8x16 = vcombine_u8(temp00_8x8, temp01_8x8);
+ temp1_8x16 = vcombine_u8(temp10_8x8, temp11_8x8);
+
+ temp0_32x4 = vreinterpretq_u32_u8(temp0_8x16);
+ temp1_32x4 = vreinterpretq_u32_u8(temp1_8x16);
+
+ d0_32x4 = vaddq_u32(c_32x4, temp0_32x4);
+ d1_32x4 = vaddq_u32(c_32x4, temp1_32x4);
+
+ vst1q_u32(start, d0_32x4);
+ vst1q_u32(start+4, d1_32x4);
+ start+=8;
+ }
+
+ end += (size & 7);
+ while (start < end)
+ {
+ *start = color + MUL_256(alpha, *start);
+ start++;
+ }
+ }
+
+ /* Note: Optimisation is based on keeping _dest_ aligned: else it's a pair of
+ * reads, then two writes, a miss on read is 'just' two reads */
+ static void
+ comp_func_source_over_sse2(uint * __restrict dest, const uint * __restrict src, int length, uint color, uint const_alpha)
+ {
+ uint16x8_t ad0_16x8;
+ uint16x8_t ad1_16x8;
+ uint16x8_t sc0_16x8;
+ uint16x8_t sc1_16x8;
+ uint16x8_t x255_16x8;
+ uint32x2_t c_32x2;
+ uint32x4_t ad_32x4;
+ uint32x4_t alpha_32x4;
+ uint32x4_t cond_32x4;
+ uint32x4_t d_32x4;
+ uint32x4_t s_32x4;
+ uint32x4_t sc_32x4;
+ uint32x4_t x0_32x4;
+ uint32x4_t x1_32x4;
+ uint8x16_t ad_8x16;
+ uint8x16_t alpha_8x16;
+ uint8x16_t d_8x16;
+ uint8x16_t s_8x16;
+ uint8x16_t sc_8x16;
+ uint8x16_t x0_8x16;
+ uint8x16_t x1_8x16;
+ uint8x8_t ad0_8x8;
+ uint8x8_t ad1_8x8;
+ uint8x8_t alpha0_8x8;
+ uint8x8_t alpha1_8x8;
+ uint8x8_t c_8x8;
+ uint8x8_t d0_8x8;
+ uint8x8_t d1_8x8;
+ uint8x8_t s0_8x8;
+ uint8x8_t s1_8x8;
+ uint8x8_t sc0_8x8;
+ uint8x8_t sc1_8x8;
+ int size;
+ DATA32 *start;
+ DATA32 *end;
+
+ if (const_alpha != 255)
+ color = BYTE_MUL(color, const_alpha);
+
+ c_32x2 = vdup_n_u32(color);
+ c_8x8 = vreinterpret_u8_u32(c_32x2);
+ x255_16x8 = vdupq_n_u16(0xff);
+ x0_8x16 = vdupq_n_u8(0x0);
+ x0_32x4 = vreinterpretq_u32_u8(x0_8x16);
+ x1_8x16 = vdupq_n_u8(0x1);
+ x1_32x4 = vreinterpretq_u32_u8(x1_8x16);
+ start = dest;
+ size = l;
+ end = start + (size & ~3);
+
+ while (start < end)
+ {
+ s_32x4 = vld1q_u32(src);
+ s_8x16 = vreinterpretq_u8_u32(s_32x4);
+
+ d_32x4 = vld1q_u32(start);
+ d_8x16 = vreinterpretq_u8_u32(d_32x4);
+ d0_8x8 = vget_low_u8(d_8x16);
+ d1_8x8 = vget_high_u8(d_8x16);
+
+ s0_8x8 = vget_low_u8(s_8x16);
+ s1_8x8 = vget_high_u8(s_8x16);
+
+ sc0_16x8 = vmull_u8(s0_8x8, c_8x8);
+ sc1_16x8 = vmull_u8(s1_8x8, c_8x8);
+ sc0_16x8 = vaddq_u16(sc0_16x8, x255_16x8);
+ sc1_16x8 = vaddq_u16(sc1_16x8, x255_16x8);
+ sc0_8x8 = vshrn_n_u16(sc0_16x8, 8);
+ sc1_8x8 = vshrn_n_u16(sc1_16x8, 8);
+ sc_8x16 = vcombine_u8(sc0_8x8, sc1_8x8);
+
+ alpha_32x4 = vreinterpretq_u32_u8(sc_8x16);
+ alpha_32x4 = vshrq_n_u32(alpha_32x4, 24);
+ alpha_32x4 = vmulq_u32(x1_32x4, alpha_32x4);
+ alpha_8x16 = vreinterpretq_u8_u32(alpha_32x4);
+ alpha_8x16 = vsubq_u8(x0_8x16, alpha_8x16);
+ alpha0_8x8 = vget_low_u8(alpha_8x16);
+ alpha1_8x8 = vget_high_u8(alpha_8x16);
+
+ ad0_16x8 = vmull_u8(alpha0_8x8, d0_8x8);
+ ad1_16x8 = vmull_u8(alpha1_8x8, d1_8x8);
+ ad0_8x8 = vshrn_n_u16(ad0_16x8,8);
+ ad1_8x8 = vshrn_n_u16(ad1_16x8,8);
+ ad_8x16 = vcombine_u8(ad0_8x8, ad1_8x8);
+ ad_32x4 = vreinterpretq_u32_u8(ad_8x16);
+
+ alpha_32x4 = vreinterpretq_u32_u8(alpha_8x16);
+ cond_32x4 = vceqq_u32(alpha_32x4, x0_32x4);
+ ad_32x4 = vbslq_u32(cond_32x4, d_32x4 , ad_32x4);
+
+ sc_32x4 = vreinterpretq_u32_u8(sc_8x16);
+ d_32x4 = vaddq_u32(sc_32x4, ad_32x4);
+
+ vst1q_u32(start, d_32x4);
+
+ src+=4;
+ start+=4;
+ }
+
+ end += (size & 3);
+ while (start < end)
+ {
+ DATA32 sc = MUL4_SYM(color, *s);
+ DATA32 alpha = 256 - (sc >> 24);
+ *start = sc + MUL_256(alpha, *start);
+ start++;
+ src++;
+ }
+ }
+ #endif
++#endif
+
+ void
+ init_draw_helper_neon()
+ {
++#if 0
+ #ifdef BUILD_NEON
+ if (eina_cpu_features_get() & EINA_CPU_NEON)
+ {
+ // update the comp_function table for solid color
+ //func_for_mode_solid[ECTOR_ROP_COPY] = comp_func_solid_source_sse2;
+ func_for_mode_solid[ECTOR_ROP_BLEND] = comp_func_solid_source_over_neon;
+
+ // update the comp_function table for source data
+ //func_for_mode[ECTOR_ROP_COPY] = comp_func_source_sse2;
+ func_for_mode[ECTOR_ROP_BLEND] = comp_func_source_over_neon;
+ }
+ #endif
++#endif
+ }
++
}Outline;
-#define TO_FT_COORD(x) ((x) * 64); // to freetype 26.6 coordinate.
++#define TO_FT_COORD(x) ((x) * 64) // to freetype 26.6 coordinate.
+
static inline void
_grow_outline_contour(Outline *outline, int num)
{
static void _outline_transform(Outline *outline, Eina_Matrix3 *m)
{
int i;
+ double x, y;
SW_FT_Outline *ft_outline = &outline->ft_outline;
-- if (m)
++ if (m && (eina_matrix3_type_get(m) != EINA_MATRIX_TYPE_IDENTITY))
{
- double x, y;
for (i = 0; i < ft_outline->n_points; i++)
{
- eina_matrix3_point_transform(m, ft_outline->points[i].x, ft_outline->points[i].y, &x, &y);
- ft_outline->points[i].x = (int)(x * 64);// to freetype 26.6 coordinate.
- ft_outline->points[i].y = (int)(y * 64);
- }
- }
- else
- {
- for (i = 0; i < ft_outline->n_points; i++)
- {
- ft_outline->points[i].x = ft_outline->points[i].x <<6;// to freetype 26.6 coordinate.
- ft_outline->points[i].y = ft_outline->points[i].y <<6;
+ eina_matrix3_point_transform(m,
- ft_outline->points[i].x/64,/* convert back to normal coord.*/
- ft_outline->points[i].y/64,/* convert back to normal coord.*/
++ ft_outline->points[i].x/64.0,/* convert back to normal coord.*/
++ ft_outline->points[i].y/64.0,/* convert back to normal coord.*/
+ &x, &y);
+ ft_outline->points[i].x = TO_FT_COORD(x);
+ ft_outline->points[i].y = TO_FT_COORD(y);
}
}
}
EDJE_ACTION_TYPE_PHYSICS_STOP = 22, /**< @since 1.8 @brief Physics stop action value */
EDJE_ACTION_TYPE_PHYSICS_ROT_SET = 23, /**< @since 1.8 @brief Physics rotation set action value */
EDJE_ACTION_TYPE_VIBRATION_SAMPLE = 24, /**< @since 1.10 @brief vibration sample action value */
- EDJE_ACTION_TYPE_LAST = 26
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ EDJE_ACTION_TYPE_RUN_PLUGIN = 25,
- EDJE_ACTION_TYPE_LAST = 25 /**< Last action value */
++ EDJE_ACTION_TYPE_MO = 26, /**< @since 1.15 @brief Mo action value */
++ EDJE_ACTION_TYPE_LAST = 27
+#else
- //
- //EDJE_ACTION_TYPE_LAST = 25 /**< Last action value */
+ EDJE_ACTION_TYPE_MO = 25, /**< @since 1.15 @brief Mo action value */
+ EDJE_ACTION_TYPE_LAST = 26 /**< Last action value */
+#endif
} Edje_Action_Type;
/**
#include "edje_private.h"
- EAPI Eet_Data_Descriptor *_edje_edd_edje_file = NULL;
- EAPI Eet_Data_Descriptor *_edje_edd_edje_part_collection = NULL;
+ EAPI Eet_Data_Descriptor * _edje_edd_edje_file = NULL;
+ EAPI Eet_Data_Descriptor * _edje_edd_edje_part_collection = NULL;
Eet_Data_Descriptor *_edje_edd_edje_string = NULL;
+// TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+Eet_Data_Descriptor *_edje_edd_edje_plugin = NULL;
+#endif
+//
Eet_Data_Descriptor *_edje_edd_edje_style = NULL;
Eet_Data_Descriptor *_edje_edd_edje_style_tag = NULL;
Eet_Data_Descriptor *_edje_edd_edje_color_class = NULL;
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Edje_File, "base_scale", base_scale, EDJE_T_FLOAT);
EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "external_dir", external_dir, _edje_edd_edje_external_directory);
EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "image_dir", image_dir, _edje_edd_edje_image_directory);
+ EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "model_dir", model_dir, _edje_edd_edje_model_directory);
EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "sound_dir", sound_dir, _edje_edd_edje_sound_directory);
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "plugins", plugins, _edje_edd_edje_plugin);
+#endif
+ //
+ EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "mo_dir", mo_dir, _edje_edd_edje_mo_directory);
+ EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "filter_dir", filter_dir, _edje_edd_edje_filter_directory);
+
EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "vibration_dir", vibration_dir, _edje_edd_edje_vibration_directory);
EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "styles", styles, _edje_edd_edje_style);
EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "color_classes", color_classes, _edje_edd_edje_color_class);
if (rp->part->type == EDJE_PART_TYPE_TEXT
|| rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
{
- Edje_Part_Description_Text *txt;
+ Edje_Part_Description_Text *txt;
+
+ txt = (Edje_Part_Description_Text *)pd;
+
+ if (txt->text.color3.r != 0 || txt->text.color3.g != 0 ||
+ txt->text.color3.b != 0 || txt->text.color3.a != 128)
+ BUF_APPENDF(I5 "color3: %d %d %d %d;\n",
+ txt->text.color3.r, txt->text.color3.g, txt->text.color3.b, txt->text.color3.a);
+ }
+
+ if (rp->part->type == EDJE_PART_TYPE_BOX)
+ {
+ Edje_Part_Description_Box *box;
+
+ box = (Edje_Part_Description_Box *)pd;
+
+ if ((box->box.layout && box->box.alt_layout) ||
+ box->box.align.x != 0.5 || box->box.align.y != 0.5 ||
+ box->box.padding.x != 0 || box->box.padding.y != 0 ||
+ !box->box.min.h || !box->box.min.v)
+ {
+ BUF_APPEND(I5 "box {\n");
+
+ if (box->box.layout && box->box.alt_layout)
+ BUF_APPENDF(I6 "layout: \"%s\" \"%s\";\n", box->box.layout, box->box.alt_layout);
+ else if (!box->box.layout && box->box.alt_layout)
+ BUF_APPENDF(I6 "layout: \"horizontal\" \"%s\";\n", box->box.alt_layout);
+ else if (box->box.layout && !box->box.alt_layout)
+ BUF_APPENDF(I6 "layout: \"%s\";\n", box->box.layout);
+
+ if (box->box.align.x != 0.5 || box->box.align.y != 0.5)
+ _edje_source_with_double_values_append(I6 "align", 2,
+ TO_DOUBLE(box->box.align.x),
+ TO_DOUBLE(box->box.align.y),
+ buf, &ret);
+
+ if (box->box.padding.x != 0 || box->box.padding.y != 0)
+ BUF_APPENDF(I6 "padding: %d %d;\n", box->box.padding.x, box->box.padding.y);
+
+ if (box->box.min.h || box->box.min.v)
+ BUF_APPENDF(I6 "min: %d %d;\n", box->box.min.h, box->box.min.v);
+
+ BUF_APPEND(I5 "}\n");
+ }
+ }
+
+ if (rp->part->type == EDJE_PART_TYPE_TABLE)
+ {
+ Edje_Part_Description_Table *table;
+
+ table = (Edje_Part_Description_Table *)pd;
+
+ if ((table->table.homogeneous != EDJE_OBJECT_TABLE_HOMOGENEOUS_NONE) ||
+ table->table.align.x != 0.5 || table->table.align.y != 0.5 ||
+ table->table.padding.x != 0 || table->table.padding.y != 0 ||
+ !table->table.min.h || !table->table.min.v)
+ {
+ BUF_APPEND(I5 "table {\n");
+
+ switch (table->table.homogeneous)
+ {
+ case EDJE_OBJECT_TABLE_HOMOGENEOUS_TABLE:
+ {
+ BUF_APPENDF(I6 "homogeneous: TABLE;\n");
+ break;
+ }
+
+ case EDJE_OBJECT_TABLE_HOMOGENEOUS_ITEM:
+ {
+ BUF_APPENDF(I6 "homogeneous: ITEM;\n");
+ break;
+ }
+ }
+
+ if (table->table.align.x != 0.5 || table->table.align.y != 0.5)
+ _edje_source_with_double_values_append(I6 "align", 2,
+ TO_DOUBLE(table->table.align.x),
+ TO_DOUBLE(table->table.align.y),
+ buf, &ret);
+
+ if (table->table.padding.x != 0 || table->table.padding.y != 0)
+ BUF_APPENDF(I6 "padding: %d %d;\n", table->table.padding.x, table->table.padding.y);
- txt = (Edje_Part_Description_Text *) pd;
+ if (table->table.min.h || table->table.min.v)
+ BUF_APPENDF(I6 "min: %d %d;\n", table->table.min.h, table->table.min.v);
- if (txt->text.color3.r != 0 || txt->text.color3.g != 0 ||
- txt->text.color3.b != 0 || txt->text.color3.a != 128)
- BUF_APPENDF(I5"color3: %d %d %d %d;\n",
- txt->text.color3.r, txt->text.color3.g, txt->text.color3.b, txt->text.color3.a);
+ BUF_APPEND(I5 "}\n");
+ }
+ }
+
+ if (rp->part->type == EDJE_PART_TYPE_BOX)
+ {
+ Edje_Part_Description_Box *box;
+
+ box = (Edje_Part_Description_Box *) pd;
+
+ if ((box->box.layout && box->box.alt_layout) ||
+ box->box.align.x != 0.5 || box->box.align.y != 0.5 ||
+ box->box.padding.x != 0 || box->box.padding.y != 0 ||
+ !box->box.min.h || !box->box.min.v)
+ {
+ BUF_APPEND(I5"box {\n");
+
+ if (box->box.layout && box->box.alt_layout)
+ BUF_APPENDF(I6"layout: \"%s\" \"%s\";\n", box->box.layout, box->box.alt_layout);
+ else if (!box->box.layout && box->box.alt_layout)
+ BUF_APPENDF(I6"layout: \"horizontal\" \"%s\";\n", box->box.alt_layout);
+ else if (box->box.layout && !box->box.alt_layout)
+ BUF_APPENDF(I6"layout: \"%s\";\n", box->box.layout);
+
+ if (box->box.align.x != 0.5 || box->box.align.y != 0.5)
+ _edje_source_with_double_values_append(I6"align", 2,
+ TO_DOUBLE(box->box.align.x),
+ TO_DOUBLE(box->box.align.y),
+ buf, &ret);
+
+ if (box->box.padding.x != 0 || box->box.padding.y != 0)
+ BUF_APPENDF(I6"padding: %d %d;\n", box->box.padding.y, box->box.padding.y);
+
+ if (box->box.min.h || box->box.min.v)
+ BUF_APPENDF(I6"min: %d %d;\n", box->box.min.h, box->box.min.v);
+
+ BUF_APPEND(I5"}\n");
+ }
}
//Rel1
free(edf->vibration_dir);
}
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ Edje_Plugin *plugin;
+ EINA_LIST_FREE(edf->plugins, plugin)
+ {
+ if (edf->free_strings)
+ {
+ if (plugin->name) eina_stringshare_del(plugin->name);
+ if (plugin->source) eina_stringshare_del(plugin->source);
+ if (plugin->param)eina_stringshare_del(plugin->param);
+ }
+ free(plugin);
+ }
+#endif
+ //
+ if (edf->mo_dir)
+ {
+ unsigned int i;
+ if (edf->free_strings)
+ {
+ for (i = 0; i < edf->mo_dir->mo_entries_count; ++i)
+ {
+ eina_stringshare_del(edf->mo_dir->mo_entries[i].locale);
+ eina_stringshare_del(edf->mo_dir->mo_entries[i].mo_src);
+ }
+ }
+ free(edf->mo_dir->mo_entries);
+ free(edf->mo_dir);
+ }
if (edf->external_dir)
{
if (pr->state2) eina_stringshare_del(pr->state2);
if (pr->sample_name) eina_stringshare_del(pr->sample_name);
if (pr->tone_name) eina_stringshare_del(pr->tone_name);
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ if (pr->plugin_name) eina_stringshare_del(pr->plugin_name);
+#endif
+ //
}
EINA_LIST_FREE(pr->targets, prt)
- free(prt);
+ free(prt);
EINA_LIST_FREE(pr->after, pa)
- free(pa);
+ free(pa);
free(pr);
}
Edje_Model_Directory *model_dir;
Edje_Sound_Directory *sound_dir;
Edje_Vibration_Directory *vibration_dir;
+ Edje_Mo_Directory *mo_dir;
+ Edje_Gfx_Filter_Directory *filter_dir;
Eina_List *styles;
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ Eina_List *plugins;
+#endif
+ //
Eina_List *color_classes;
Eina_Hash *color_hash;
void edje_signal_init(void);
void edje_signal_shutdown(void);
+// TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+typedef Eina_Bool (*Edje_Module_Plugin_Run) (const Evas_Object *obj, const char *name, const char *param);
+#endif
+//
+
+ Eina_Bool _edje_part_mouse_events_get(Edje *ed, Edje_Real_Part *rp);
+ void _edje_part_mouse_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool mouse_events);
+ Eina_Bool _edje_part_repeat_events_get(Edje *ed, Edje_Real_Part *rp);
+ void _edje_part_repeat_events_set(Edje *ed, Edje_Real_Part *rp, Eina_Bool repeat_events);
+ Evas_Event_Flags _edje_part_ignore_flags_get(Edje *ed, Edje_Real_Part *rp);
+ void _edje_part_ignore_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags ignore_flags);
+ Evas_Event_Flags _edje_part_mask_flags_get(Edje *ed, Edje_Real_Part *rp);
+ void _edje_part_mask_flags_set(Edje *ed, Edje_Real_Part *rp, Evas_Event_Flags mask_flags);
+
#ifdef HAVE_LIBREMIX
#include <remix/remix.h>
#endif
switch (pr->action)
{
case EDJE_ACTION_TYPE_STATE_SET:
- if ((pr->tween.time > ZERO) && (!ed->no_anim))
- {
- Edje_Running_Program *runp;
-
- runp = calloc(1, sizeof(Edje_Running_Program));
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if (rp)
- {
- if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
- {
- Edje_Calc_Params *tmp;
-
- tmp = calloc(1, sizeof(Edje_Calc_Params));
- if (!tmp) goto low_mem_current;
- tmp->map = eina_cow_alloc(_edje_calc_params_map_cow);
+ if ((pr->tween.time > ZERO) && (!ed->no_anim))
+ {
+ Edje_Running_Program *runp;
+
+ runp = calloc(1, sizeof(Edje_Running_Program));
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if (rp)
+ {
+ if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
+ {
+ Edje_Calc_Params *tmp;
+
+ tmp = calloc(1, sizeof(Edje_Calc_Params));
+ if (!tmp) goto low_mem_current;
+ tmp->map = eina_cow_alloc(_edje_calc_params_map_cow);
#ifdef HAVE_EPHYSICS
- tmp->physics = eina_cow_alloc(_edje_calc_params_physics_cow);
+ tmp->physics = eina_cow_alloc(_edje_calc_params_physics_cow);
#endif
- _edje_part_recalc(ed, rp, FLAG_XY, tmp);
+ _edje_part_recalc(ed, rp, FLAG_XY, tmp);
- if (rp->current)
- {
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **) &rp->current->map);
+ if (rp->current)
+ {
+ eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->current->map);
#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **) &rp->current->physics);
+ eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->current->physics);
#endif
- free(rp->current);
- }
- rp->current = tmp;
- }
- else
- {
+ free(rp->current);
+ }
+ rp->current = tmp;
+ }
+ else
+ {
low_mem_current:
- if (rp->current)
- {
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **) &rp->current->map);
+ if (rp->current)
+ {
+ eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->current->map);
#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **) &rp->current->physics);
+ eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->current->physics);
#endif
- free(rp->current);
- }
- rp->current = NULL;
- }
-
- if (rp->program)
- _edje_program_end(ed, rp->program);
- _edje_part_description_apply(ed, rp,
- rp->param1.description->state.name,
- rp->param1.description->state.value,
- pr->state,
- pr->value);
- _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
- pr->tween.v1,
- pr->tween.v2,
- pr->tween.v3,
- pr->tween.v4);
- rp->program = runp;
- }
- }
- }
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed))
- {
- ed->actions = eina_list_append(ed->actions, runp);
- goto break_prog;
- }
- if (!ed->actions)
- _edje_animators = eina_list_append(_edje_animators, ed);
- ed->actions = eina_list_append(ed->actions, runp);
- runp->start_time = ecore_loop_time_get();
- runp->edje = ed;
- runp->program = pr;
- if (!_edje_timer)
- _edje_timer = ecore_animator_add(_edje_timer_cb, NULL);
- _edje_anim_count++;
- }
- else
- {
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if (rp)
- {
- if (rp->program)
- _edje_program_end(ed, rp->program);
- _edje_part_description_apply(ed, rp,
- pr->state,
- pr->value,
- NULL,
- 0.0);
- _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
- pr->tween.v1,
- pr->tween.v2,
- pr->tween.v3,
- pr->tween.v4);
- }
- }
- }
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
-
- EINA_LIST_FOREACH(pr->after, l, pa)
- {
- if (pa->id >= 0)
- {
- pr2 = ed->collection->patterns.table_programs[pa->id % ed->collection->patterns.table_programs_size];
- if (pr2) _edje_program_run(ed, pr2, 0, "", "");
- if (_edje_block_break(ed)) goto break_prog;
- }
- }
- _edje_recalc(ed);
- }
- break;
+ free(rp->current);
+ }
+ rp->current = NULL;
+ }
+
+ if (rp->program)
+ _edje_program_end(ed, rp->program);
+ _edje_part_description_apply(ed, rp,
+ rp->param1.description->state.name,
+ rp->param1.description->state.value,
+ pr->state,
+ pr->value);
+ _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
+ pr->tween.v1,
+ pr->tween.v2,
+ pr->tween.v3,
+ pr->tween.v4);
+ rp->program = runp;
+ }
+ }
+ }
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed))
+ {
+ ed->actions = eina_list_append(ed->actions, runp);
+ goto break_prog;
+ }
+ if (!ed->actions)
+ _edje_animators = eina_list_append(_edje_animators, ed);
+ ed->actions = eina_list_append(ed->actions, runp);
+ runp->start_time = ecore_loop_time_get();
+ runp->edje = ed;
+ runp->program = pr;
+ if (!_edje_timer)
+ _edje_timer = ecore_animator_add(_edje_timer_cb, NULL);
+ _edje_anim_count++;
+ }
+ else
+ {
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if (rp)
+ {
+ if (rp->program)
+ _edje_program_end(ed, rp->program);
+ _edje_part_description_apply(ed, rp,
+ pr->state,
+ pr->value,
+ NULL,
+ 0.0);
+ _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO,
+ pr->tween.v1,
+ pr->tween.v2,
+ pr->tween.v3,
+ pr->tween.v4);
+ }
+ }
+ }
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+
+ EINA_LIST_FOREACH(pr->after, l, pa)
+ {
+ if (pa->id >= 0)
+ {
+ pr2 = ed->collection->patterns.table_programs[pa->id % ed->collection->patterns.table_programs_size];
+ if (pr2) _edje_program_run(ed, pr2, 0, "", "");
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ }
+ _edje_recalc(ed);
+ }
+ break;
+
case EDJE_ACTION_TYPE_ACTION_STOP:
- // _edje_emit(ed, "program,start", pr->name);
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- Eina_List *ll;
- Edje_Running_Program *runp;
- Edje_Pending_Program *pp;
-
- for (ll = ed->actions; ll; )
- {
- runp = ll->data;
- ll = ll->next;
- if (pt->id == runp->program->id)
- {
- _edje_program_end(ed, runp);
- // goto done;
- }
- }
- for (ll = ed->pending_actions; ll; )
- {
- pp = ll->data;
- ll = ll->next;
- if (pt->id == pp->program->id)
- {
- ed->pending_actions = eina_list_remove(ed->pending_actions, pp);
- ecore_timer_del(pp->timer);
- free(pp);
- // goto done;
- }
- }
- // done:
- // continue;
- }
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- break;
+ // _edje_emit(ed, "program,start", pr->name);
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ Eina_List *ll;
+ Edje_Running_Program *runp;
+ Edje_Pending_Program *pp;
+
+ for (ll = ed->actions; ll; )
+ {
+ runp = ll->data;
+ ll = ll->next;
+ if (pt->id == runp->program->id)
+ {
+ _edje_program_end(ed, runp);
+ // goto done;
+ }
+ }
+ for (ll = ed->pending_actions; ll; )
+ {
+ pp = ll->data;
+ ll = ll->next;
+ if (pt->id == pp->program->id)
+ {
+ ed->pending_actions = eina_list_remove(ed->pending_actions, pp);
+ ecore_timer_del(pp->timer);
+ free(pp);
+ // goto done;
+ }
+ }
+ // done:
+ // continue;
+ }
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_SIGNAL_EMIT:
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- if (pr->targets)
- {
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id < 0) continue;
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if (!rp) continue;
- if (!_edje_emit_aliased(ed, rp->part->name, pr->state, pr->state2))
- {
- Eina_Bool broadcast;
-
- broadcast = _edje_emit_child(ed, rp, rp->part->name, pr->state, pr->state2);
- _edje_emit_send(ed, broadcast, pr->state, pr->state2, NULL, NULL);
- }
- }
- }
- else
- _edje_emit(ed, pr->state, pr->state2);
- if (_edje_block_break(ed)) goto break_prog;
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- break;
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ if (pr->targets)
+ {
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id < 0) continue;
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if (!rp) continue;
+ if (!_edje_emit_aliased(ed, rp->part->name, pr->state, pr->state2))
+ {
+ Eina_Bool broadcast;
+
+ broadcast = _edje_emit_child(ed, rp, rp->part->name, pr->state, pr->state2);
+ _edje_emit_send(ed, broadcast, pr->state, pr->state2, NULL, NULL);
+ }
+ }
+ }
+ else
+ _edje_emit(ed, pr->state, pr->state2);
+ if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_DRAG_VAL_SET:
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
- {
- rp->drag->val.x = pr->value;
- rp->drag->val.y = pr->value2;
- if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
- else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
- if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
- else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
- _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
- _edje_emit(ed, "drag,set", rp->part->name);
- if (_edje_block_break(ed)) goto break_prog;
- }
- }
- }
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- break;
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
+ {
+ rp->drag->val.x = pr->value;
+ rp->drag->val.y = pr->value2;
+ if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+ else if (rp->drag->val.x > 1.0)
+ rp->drag->val.x = 1.0;
+ if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+ else if (rp->drag->val.y > 1.0)
+ rp->drag->val.y = 1.0;
+ _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
+ _edje_emit(ed, "drag,set", rp->part->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ }
+ }
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_DRAG_VAL_STEP:
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
- {
- rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
- rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
- if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
- else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
- if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
- else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
- _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
- _edje_emit(ed, "drag,step", rp->part->name);
- if (_edje_block_break(ed)) goto break_prog;
- }
- }
- }
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- break;
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
+ {
+ rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
+ rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
+ if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+ else if (rp->drag->val.x > 1.0)
+ rp->drag->val.x = 1.0;
+ if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+ else if (rp->drag->val.y > 1.0)
+ rp->drag->val.y = 1.0;
+ _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
+ _edje_emit(ed, "drag,step", rp->part->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ }
+ }
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_DRAG_VAL_PAGE:
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
+ {
+ rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
+ rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
+ if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+ else if (rp->drag->val.x > 1.0)
+ rp->drag->val.x = 1.0;
+ if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+ else if (rp->drag->val.y > 1.0)
+ rp->drag->val.y = 1.0;
+ _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
+ _edje_emit(ed, "drag,page", rp->part->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ }
+ }
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ break;
+
+ case EDJE_ACTION_TYPE_SCRIPT:
+ {
+ char fname[128];
+
// _edje_emit(ed, "program,start", pr->name);
if (_edje_block_break(ed)) goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
- {
- rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
- rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
- if (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
- else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
- if (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
- else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
- _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
- _edje_emit(ed, "drag,page", rp->part->name);
- if (_edje_block_break(ed)) goto break_prog;
- }
- }
- }
+ snprintf(fname, sizeof(fname), "_p%i", pr->id);
+ _edje_embryo_test_run(ed, fname, ssig, ssrc);
// _edje_emit(ed, "program,stop", pr->name);
if (_edje_block_break(ed)) goto break_prog;
- break;
- case EDJE_ACTION_TYPE_SCRIPT:
- {
- char fname[128];
-
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- snprintf(fname, sizeof(fname), "_p%i", pr->id);
- _edje_embryo_test_run(ed, fname, ssig, ssrc);
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- _edje_recalc_do(ed);
- }
- break;
+ _edje_recalc_do(ed);
+ }
+ break;
+
case EDJE_ACTION_TYPE_FOCUS_SET:
- if (!pr->targets)
- {
- if (ed->focused_part)
- _edje_emit(ed, "focus,part,out",
- ed->focused_part->part->name);
- ed->focused_part = NULL;
- }
- else
- {
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if (rp)
- {
- if (ed->focused_part != rp)
- {
- if (ed->focused_part)
- _edje_emit(ed, "focus,part,out",
- ed->focused_part->part->name);
- ed->focused_part = rp;
- _edje_emit(ed, "focus,part,in",
- ed->focused_part->part->name);
- }
- }
- }
- }
- }
- break;
+ if (!pr->targets)
+ {
+ if (ed->focused_part)
+ _edje_emit(ed, "focus,part,out",
+ ed->focused_part->part->name);
+ ed->focused_part = NULL;
+ }
+ else
+ {
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if (rp)
+ {
+ if (ed->focused_part != rp)
+ {
+ if (ed->focused_part)
+ _edje_emit(ed, "focus,part,out",
+ ed->focused_part->part->name);
+ ed->focused_part = rp;
+ _edje_emit(ed, "focus,part,in",
+ ed->focused_part->part->name);
+ }
+ }
+ }
+ }
+ }
+ break;
+
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
- if (!pr->targets)
- {
- Evas_Object *focused;
-
- focused = evas_focus_get(evas_object_evas_get(ed->obj));
- if (focused)
- {
- unsigned int i;
-
- /* Check if the current swallowed object is one of my child. */
- for (i = 0; i < ed->table_parts_size; ++i)
- {
- rp = ed->table_parts[i];
- if ((rp) &&
- ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
- (rp->typedata.swallow)) &&
- (rp->typedata.swallow->swallowed_object == focused))
- {
- evas_object_focus_set(focused, EINA_FALSE);
- break;
- }
- }
- }
- }
- else
- {
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if (rp &&
- ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
- (rp->typedata.swallow)) &&
- (rp->typedata.swallow->swallowed_object))
- evas_object_focus_set(rp->typedata.swallow->swallowed_object, EINA_TRUE);
- }
- }
- }
- break;
+ if (!pr->targets)
+ {
+ Evas_Object *focused;
+
+ focused = evas_focus_get(evas_object_evas_get(ed->obj));
+ if (focused)
+ {
+ unsigned int i;
+
+ /* Check if the current swallowed object is one of my child. */
+ for (i = 0; i < ed->table_parts_size; ++i)
+ {
+ rp = ed->table_parts[i];
+ if ((rp) &&
+ ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
+ (rp->typedata.swallow)) &&
+ (rp->typedata.swallow->swallowed_object == focused))
+ {
+ evas_object_focus_set(focused, EINA_FALSE);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if (rp &&
+ ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
+ (rp->typedata.swallow)) &&
+ (rp->typedata.swallow->swallowed_object))
+ evas_object_focus_set(rp->typedata.swallow->swallowed_object, EINA_TRUE);
+ }
+ }
+ }
+ break;
+
case EDJE_ACTION_TYPE_SOUND_SAMPLE:
- if (_edje_block_break(ed))
- goto break_prog;
- _edje_multisense_internal_sound_sample_play(ed, pr->sample_name, pr->speed, pr->channel);
- break;
+ if (_edje_block_break(ed))
+ goto break_prog;
+ _edje_multisense_internal_sound_sample_play(ed, pr->sample_name, pr->speed, pr->channel);
+ break;
+
case EDJE_ACTION_TYPE_SOUND_TONE:
- if (_edje_block_break(ed))
- goto break_prog;
- _edje_multisense_internal_sound_tone_play(ed, pr->tone_name, pr->duration, pr->channel);
+ if (_edje_block_break(ed))
+ goto break_prog;
+ _edje_multisense_internal_sound_tone_play(ed, pr->tone_name, pr->duration, pr->channel);
+ break;
+ // TIZEN_ONLY(20150110): Add plugin keyword.
+#ifdef PLUGIN
+ case EDJE_ACTION_TYPE_RUN_PLUGIN:
+ // DO NOTHING!
break;
-
+#endif
+ //
case EDJE_ACTION_TYPE_VIBRATION_SAMPLE:
- if (_edje_block_break(ed))
- goto break_prog;
- _edje_multisense_internal_vibration_sample_play(ed, pr->vibration_name, pr->vibration_repeat);
- break;
+ if (_edje_block_break(ed))
+ goto break_prog;
+ _edje_multisense_internal_vibration_sample_play(ed, pr->vibration_name, pr->vibration_repeat);
+ break;
+
case EDJE_ACTION_TYPE_PARAM_COPY:
- {
- Edje_Real_Part *src_part, *dst_part;
+ {
+ Edje_Real_Part *src_part, *dst_part;
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
- src_part = ed->table_parts[pr->param.src % ed->table_parts_size];
- dst_part = ed->table_parts[pr->param.dst % ed->table_parts_size];
- _edje_param_copy(ed, src_part, pr->state, dst_part, pr->state2);
+ src_part = ed->table_parts[pr->param.src % ed->table_parts_size];
+ dst_part = ed->table_parts[pr->param.dst % ed->table_parts_size];
+ _edje_param_copy(ed, src_part, pr->state, dst_part, pr->state2);
+
+ if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ break;
- if (_edje_block_break(ed)) goto break_prog;
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- }
- break;
case EDJE_ACTION_TYPE_PARAM_SET:
- {
- Edje_Real_Part *part;
+ {
+ Edje_Real_Part *part;
- // _edje_emit(ed, "program,start", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,start", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
- part = ed->table_parts[pr->param.dst % ed->table_parts_size];
- _edje_param_set(ed, part, pr->state, pr->state2);
+ part = ed->table_parts[pr->param.dst % ed->table_parts_size];
+ _edje_param_set(ed, part, pr->state, pr->state2);
+
+ if (_edje_block_break(ed)) goto break_prog;
+ // _edje_emit(ed, "program,stop", pr->name);
+ if (_edje_block_break(ed)) goto break_prog;
+ }
+ break;
- if (_edje_block_break(ed)) goto break_prog;
- // _edje_emit(ed, "program,stop", pr->name);
- if (_edje_block_break(ed)) goto break_prog;
- }
- break;
#ifdef HAVE_EPHYSICS
case EDJE_ACTION_TYPE_PHYSICS_IMPULSE:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_central_impulse_apply))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_central_impulse_apply))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_TORQUE_IMPULSE:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_impulse_apply))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_impulse_apply))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_FORCE:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_central_force_apply))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_central_force_apply))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_TORQUE:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_apply))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_torque_apply))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
- if (_edje_block_break(ed))
- goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->body))
- ephysics_body_forces_clear(rp->body);
- }
- }
- break;
+ if (_edje_block_break(ed))
+ goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->body))
+ ephysics_body_forces_clear(rp->body);
+ }
+ }
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_VEL_SET:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_linear_velocity_set))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_linear_velocity_set))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_ANG_VEL_SET:
- if (!_edje_physics_action_set(ed, pr, ephysics_body_angular_velocity_set))
- goto break_prog;
- break;
+ if (!_edje_physics_action_set(ed, pr, ephysics_body_angular_velocity_set))
+ goto break_prog;
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_STOP:
- if (_edje_block_break(ed))
- goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->body))
- ephysics_body_stop(rp->body);
- }
- }
- break;
+ if (_edje_block_break(ed))
+ goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->body))
+ ephysics_body_stop(rp->body);
+ }
+ }
+ break;
+
case EDJE_ACTION_TYPE_PHYSICS_ROT_SET:
- if (_edje_block_break(ed))
- goto break_prog;
- EINA_LIST_FOREACH(pr->targets, l, pt)
- {
- if (pt->id >= 0)
- {
- rp = ed->table_parts[pt->id % ed->table_parts_size];
- if ((rp) && (rp->body))
- {
- EPhysics_Quaternion quat;
- ephysics_quaternion_set(&quat, pr->physics.x,
- pr->physics.y, pr->physics.z,
- pr->physics.w);
- ephysics_quaternion_normalize(&quat);
- ephysics_body_rotation_set(rp->body, &quat);
- }
- }
- }
- break;
+ if (_edje_block_break(ed))
+ goto break_prog;
+ EINA_LIST_FOREACH(pr->targets, l, pt)
+ {
+ if (pt->id >= 0)
+ {
+ rp = ed->table_parts[pt->id % ed->table_parts_size];
+ if ((rp) && (rp->body))
+ {
+ EPhysics_Quaternion quat;
+ ephysics_quaternion_set(&quat, pr->physics.x,
+ pr->physics.y, pr->physics.z,
+ pr->physics.w);
+ ephysics_quaternion_normalize(&quat);
+ ephysics_body_rotation_set(rp->body, &quat);
+ }
+ }
+ }
+ break;
+
#endif
default:
- // _edje_emit(ed, "program,start", pr->name);
- // _edje_emit(ed, "program,stop", pr->name);
- break;
+ // _edje_emit(ed, "program,start", pr->name);
+ // _edje_emit(ed, "program,stop", pr->name);
+ break;
}
if (!((pr->action == EDJE_ACTION_TYPE_STATE_SET)
/* hmm this fucks somethgin up. must look into it later */
_efl_gfx_shape_append_circle(Eo *obj, Efl_Gfx_Shape_Data *pd,
double xc, double yc, double radius)
{
+ _efl_gfx_shape_append_arc(obj, pd, xc - radius, yc - radius, 2*radius, 2*radius, 0, 360);
++#if 0
+ _efl_gfx_shape_append_move_to(obj, pd, xc - radius, yc);
+ _efl_gfx_shape_append_arc_to(obj, pd, xc + radius, yc, radius, radius, 0, EINA_TRUE, EINA_TRUE);
+ _efl_gfx_shape_append_arc_to(obj, pd, xc - radius, yc, radius, radius, 0, EINA_TRUE, EINA_TRUE);
++#endif
}
static void
double x, double y, double w, double h,
double rx, double ry)
{
+ // clamp the rx and ry radius value.
+ rx = 2*rx;
+ ry = 2*ry;
+ if (rx > w) rx = w;
+ if (ry > h) ry = h;
+
+ _efl_gfx_shape_append_move_to(obj, pd, x, y + h/2);
+ _efl_gfx_shape_append_arc(obj, pd, x, y, rx, ry, 180, -90);
+ _efl_gfx_shape_append_arc(obj, pd, x + w - rx, y, rx, ry, 90, -90);
+ _efl_gfx_shape_append_arc(obj, pd, x + w - rx, y + h - ry, rx, ry, 0, -90);
+ _efl_gfx_shape_append_arc(obj, pd, x, y + h - ry, rx, ry, 270, -90);
++#if 0
+ // clamp the x and y radius value.
+ if (rx > w/2) rx = w/2;
+ if (ry > h/2) ry = h/2;
+
+ _efl_gfx_shape_append_move_to(obj, pd, x, y + ry);
+ // Top left corner
+ _efl_gfx_shape_append_arc_to(obj, pd, x + rx, y, rx, ry, 0, EINA_FALSE, EINA_TRUE);
+ _efl_gfx_shape_append_line_to(obj, pd, x + w - rx, y);
+ // Top right corner
+ _efl_gfx_shape_append_arc_to(obj, pd, x + w, y + ry, rx, ry, 0, EINA_FALSE, EINA_TRUE);
+ _efl_gfx_shape_append_line_to(obj, pd, x + w, y + h - ry);
+ // Bottom right corner
+ _efl_gfx_shape_append_arc_to(obj, pd, x + w - rx, y + h, rx, ry, 0, EINA_FALSE, EINA_TRUE);
+ _efl_gfx_shape_append_line_to(obj, pd, x + rx, y + h);
+ // Bottom left corner
+ _efl_gfx_shape_append_arc_to(obj, pd, x, y + h - ry, rx, ry, 0, EINA_FALSE, EINA_TRUE);
++#endif
_efl_gfx_shape_append_close(obj, pd);
}
}
}
append_arc_to {
- /*@
- Append an arc that connects from the current point int the point list
+ [[Append an arc that connects from the current point int the point list
to the given point (x,y). The arc is defined by the given radius in
- x-direction (rx) and radius in y direction (ry) .
+ x-direction (rx) and radius in y direction (ry).
- @note Use this api if you know the end point's of the arc otherwise
- use more convenient function efl_gfx_path_append_arc()
+ Use this api if you know the end point's of the arc otherwise use
+ more convenient function @.append_arc_to.
- @see efl_gfx_path_append_arc()
@since 1.14
- */
+ ]]
params {
- @in double x; /*@ X co-ordinate of end point of the arc.*/
- @in double y; /*@ Y co-ordinate of end point of the arc.*/
- @in double rx; /*@ radius of arc in x direction.*/
- @in double ry; /*@ radius of arc in y direction.*/
- @in double angle; /*@ x-axis rotation , normally 0.*/
- @in bool large_arc; /*@ Defines whether to draw the larger arc or smaller arc joining two point.*/
- @in bool sweep; /*@ Defines whether the arc will be drawn counter-clockwise or clockwise from current point to the end point taking into account the large_arc property.*/
+ @in x: double; [[X co-ordinate of end point of the arc.]]
+ @in y: double; [[Y co-ordinate of end point of the arc.]]
+ @in rx: double; [[radius of arc in x direction.]]
+ @in ry: double; [[radius of arc in y direction.]]
+ @in angle: double; [[x-axis rotation , normally 0.]]
+ @in large_arc: bool; [[Defines whether to draw the larger arc or
+ smaller arc joining two point.]]
+ @in sweep: bool; [[Defines whether the arc will be drawn
+ counter-clockwise or clockwise from current point
+ to the end point taking into account the large_arc
+ property.]]
}
}
- /*@
- Append an arc that enclosed in the given rectangle (x, y, w, h).
+ append_arc {
- */
++ [[Append an arc that enclosed in the given rectangle (x, y, w, h).
+ The angle is defined in counter clock wise , use -ve angle for clockwise arc.
+
+ @since 1.14
- @in double x; /*@ X co-ordinate of the rect.*/
- @in double y; /*@ Y co-ordinate of the rect.*/
- @in double w; /*@ width of the rect.*/
- @in double h; /*@ height of the rect.*/
- @in double start_angle; /*@ Angle at which the arc will start*/
- @in double sweep_length; /*@ Length of the arc.*/
++ ]]
+ params {
-
++ @in x: double; [[@ X co-ordinate of the rect.]]
++ @in y: double; [[@ Y co-ordinate of the rect.]]
++ @in w: double; [[@ width of the rect.]]
++ @in h: double; [[@ height of the rect.]]
++ @in start_angle: double; [[@ Angle at which the arc will start]]
++ @in sweep_length: double; [[@ Length of the arc.]]
+ }
+ }
append_close {
- /*@
- Closes the current subpath by drawing a line to the beginning of the subpath,
- automatically starting a new path. The current point of the new path is
- (0, 0).
+ [[Closes the current subpath by drawing a line to the beginning of the
+ subpath, automatically starting a new path. The current point of the
+ new path is (0, 0).
- @note If the subpath does not contain any points, this function does nothing.
+ If the subpath does not contain any points, this function does nothing.
@since 1.14
- */
+ ]]
}
append_circle {
- /*@
- Append a circle with given center and radius.
+ [[Append a circle with given center and radius.
@since 1.14
- */
+ ]]
params {
- @in double x; /*@ X co-ordinate of the center of the circle.*/
- @in double y; /*@ Y co-ordinate of the center of the circle.*/
- @in double radius; /*@ radius of the circle.*/
+ @in x: double; [[X co-ordinate of the center of the circle.]]
+ @in y: double; [[Y co-ordinate of the center of the circle.]]
+ @in radius: double; [[radius of the circle.]]
}
}
append_rect {
EVAS_NATIVE_SURFACE_X11, /**< X Window system based type. pixmap id or visual of the pixmap */
EVAS_NATIVE_SURFACE_OPENGL, /**< OpenGL system based type. texture or framebuffer id*/
EVAS_NATIVE_SURFACE_WL, /**< Wayland system based type. buffer of surface */
- // TIZEN ONLY (20150112) : NOT FIXED
- EVAS_NATIVE_SURFACE_TIZEN,
- EVAS_NATIVE_SURFACE_TBM, /**< Tizen system based type. This is used for tizen buffer manager. */
- EVAS_NATIVE_SURFACE_EVASGL, /**< Evas GL based type. evas gl surface */
- //
++ EVAS_NATIVE_SURFACE_TIZEN, /**< @deprecated Kept for ABI compatibility. DO NOT USE. */
+ EVAS_NATIVE_SURFACE_TBM, /**< Tizen system based type. tbm surface @since 1.14 */
+ EVAS_NATIVE_SURFACE_EVASGL, /**< Evas GL based type. evas gl surface @since 1.14 */
} Evas_Native_Surface_Type;
/**
*/
EAPI void evas_object_hide(Evas_Object *obj) EINA_ARG_NONNULL(1);
+ /**
+ *
+ * Sets the general/main color of the given Evas object to the given
+ * one.
+ *
+ * @see evas_object_color_get() (for an example)
+ * @note These color values are expected to be premultiplied by @p a.
+ *
+ * @ingroup Evas_Object_Group_Basic
+ *
+ * @param[in] r The red component of the given color.
+ * @param[in] g The green component of the given color.
+ * @param[in] b The blue component of the given color.
+ * @param[in] a The alpha component of the given color.
+ */
+ EAPI void evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
+
+ /**
+ *
+ * Retrieves the general/main color of the given Evas object.
+ *
+ * Retrieves the “main” color's RGB component (and alpha channel)
+ * values, <b>which range from 0 to 255</b>. For the alpha channel,
+ * which defines the object's transparency level, 0 means totally
+ * transparent, while 255 means opaque. These color values are
+ * premultiplied by the alpha value.
+ *
+ * Usually you’ll use this attribute for text and rectangle objects,
+ * where the “main” color is their unique one. If set for objects
+ * which themselves have colors, like the images one, those colors get
+ * modulated by this one.
+ *
+ * @note All newly created Evas rectangles get the default color
+ * values of <code>255 255 255 255</code> (opaque white).
+ *
+ * @note Use @c NULL pointers on the components you're not interested
+ * in: they'll be ignored by the function.
+ *
+ * Example:
+ * @dontinclude evas-object-manipulation.c
+ * @skip int alpha, r, g, b;
+ * @until return
+ *
+ * See the full @ref Example_Evas_Object_Manipulation "example".
+ *
+ * @ingroup Evas_Object_Group_Basic
+ *
+ * @param[out] r The red component of the given color.
+ * @param[out] g The green component of the given color.
+ * @param[out] b The blue component of the given color.
+ * @param[out] a The alpha component of the given color.
+ */
+ EAPI void evas_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
+
+ /**
+ *
+ * Move the given Evas object to the given location inside its canvas' viewport.
+ *
+ * @param[in] x in
+ * @param[in] y in
+ */
+ EAPI void evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+
+ /**
+ *
+ * Changes the size of the given Evas object.
+ *
+ * @param[in] w in
+ * @param[in] h in
+ */
+ EAPI void evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
+
+ /**
+ *
+ * Retrieves whether or not the given Evas object is visible.
+ *
+ */
+ EAPI Eina_Bool evas_object_visible_get(const Evas_Object *obj);
+
+ /**
+ *
+ * Sets the layer of its canvas that the given object will be part of.
+ *
+ * If you don't use this function, you'll be dealing with an @b unique
+ * layer of objects, the default one. Additional layers are handy when
+ * you don't want a set of objects to interfere with another set with
+ * regard to @b stacking. Two layers are completely disjoint in that
+ * matter.
+ *
+ * This is a low-level function, which you'd be using when something
+ * should be always on top, for example.
+ *
+ * @warning Be careful, it doesn't make sense to change the layer of
+ * smart objects' children. Smart objects have a layer of their own,
+ * which should contain all their children objects.
+ *
+ * @see evas_object_layer_get()
+ *
+ * @param[in] l The number of the layer to place the object on.
+ Must be between #EVAS_LAYER_MIN and #EVAS_LAYER_MAX.
+ */
+ EAPI void evas_object_layer_set(Evas_Object *obj, short l);
+
+ /**
+ *
+ * Retrieves the layer of its canvas that the given object is part of.
+ *
+ * @return Number of its layer
+ *
+ * @see evas_object_layer_set()
+ *
+ */
+ EAPI short evas_object_layer_get(const Evas_Object *obj);
+
+ /**
+ *
+ * Get the Evas object stacked right below @p obj
+ *
+ * @return the #Evas_Object directly below @p obj, if any, or @c NULL,
+ * if none
+ *
+ * This function will traverse layers in its search, if there are
+ * objects on layers below the one @p obj is placed at.
+ *
+ * @see evas_object_layer_get()
+ * @see evas_object_layer_set()
+ * @see evas_object_below_get()
+ *
+ */
+ EAPI Evas_Object *evas_object_below_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT;
+
+ /**
+ *
+ * Get the Evas object stacked right above @p obj
+ *
+ * @return the #Evas_Object directly above @p obj, if any, or @c NULL,
+ * if none
+ *
+ * This function will traverse layers in its search, if there are
+ * objects on layers above the one @p obj is placed at.
+ *
+ * @see evas_object_layer_get()
+ * @see evas_object_layer_set()
+ * @see evas_object_below_get()
+ *
+ */
+ EAPI Evas_Object *evas_object_above_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT;
+
+ /**
+ *
+ * Stack @p obj immediately below @p below
+ *
+ * Objects, in a given canvas, are stacked in the order they get added
+ * to it. This means that, if they overlap, the highest ones will
+ * cover the lowest ones, in that order. This function is a way to
+ * change the stacking order for the objects.
+ *
+ * This function is intended to be used with <b>objects belonging to
+ * the same layer</b> in a given canvas, otherwise it will fail (and
+ * accomplish nothing).
+ *
+ * If you have smart objects on your canvas and @p obj is a member of
+ * one of them, then @p below must also be a member of the same
+ * smart object.
+ *
+ * Similarly, if @p obj is not a member of a smart object, @p below
+ * must not be either.
+ *
+ * @see evas_object_layer_get()
+ * @see evas_object_layer_set()
+ * @see evas_object_stack_below()
+ *
+ *
+ * @param[in] below the object below which to stack
+ */
+ EAPI void evas_object_stack_below(Evas_Object *obj, Evas_Object *below) EINA_ARG_NONNULL(2);
+
+ /**
+ *
+ * Raise @p obj to the top of its layer.
+ *
+ * @p obj will, then, be the highest one in the layer it belongs
+ * to. Object on other layers won't get touched.
+ *
+ * @see evas_object_stack_above()
+ * @see evas_object_stack_below()
+ * @see evas_object_lower()
+ *
+ *
+ */
+ EAPI void evas_object_raise(Evas_Object *obj);
+
+ /**
+ *
+ * Stack @p obj immediately above @p above
+ *
+ * Objects, in a given canvas, are stacked in the order they get added
+ * to it. This means that, if they overlap, the highest ones will
+ * cover the lowest ones, in that order. This function is a way to
+ * change the stacking order for the objects.
+ *
+ * This function is intended to be used with <b>objects belonging to
+ * the same layer</b> in a given canvas, otherwise it will fail (and
+ * accomplish nothing).
+ *
+ * If you have smart objects on your canvas and @p obj is a member of
+ * one of them, then @p above must also be a member of the same
+ * smart object.
+ *
+ * Similarly, if @p obj is not a member of a smart object, @p above
+ * must not be either.
+ *
+ * @see evas_object_layer_get()
+ * @see evas_object_layer_set()
+ * @see evas_object_stack_below()
+ *
+ *
+ * @param[in] above the object above which to stack
+ */
+ EAPI void evas_object_stack_above(Evas_Object *obj, Evas_Object *above) EINA_ARG_NONNULL(2);
+
+ /**
+ *
+ * Lower @p obj to the bottom of its layer.
+ *
+ * @p obj will, then, be the lowest one in the layer it belongs
+ * to. Objects on other layers won't get touched.
+ *
+ * @see evas_object_stack_above()
+ * @see evas_object_stack_below()
+ * @see evas_object_raise()
+ *
+ *
+ */
+ EAPI void evas_object_lower(Evas_Object *obj);
+/**
+ *
+ * Sets the general/main color of the given Evas object to the given
+ * one.
+ *
+ * @see evas_object_color_get() (for an example)
+ * @note These color values are expected to be premultiplied by @p a.
+ *
+ * @ingroup Evas_Object_Group_Basic
+ *
+ * @param[in] r The red component of the given color.
+ * @param[in] g The green component of the given color.
+ * @param[in] b The blue component of the given color.
+ * @param[in] a The alpha component of the given color.
+ */
+EAPI void evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
+
+/**
+ *
+ * Retrieves the general/main color of the given Evas object.
+ *
+ * Retrieves the “main” color's RGB component (and alpha channel)
+ * values, <b>which range from 0 to 255</b>. For the alpha channel,
+ * which defines the object's transparency level, 0 means totally
+ * transparent, while 255 means opaque. These color values are
+ * premultiplied by the alpha value.
+ *
+ * Usually you’ll use this attribute for text and rectangle objects,
+ * where the “main” color is their unique one. If set for objects
+ * which themselves have colors, like the images one, those colors get
+ * modulated by this one.
+ *
+ * @note All newly created Evas rectangles get the default color
+ * values of <code>255 255 255 255</code> (opaque white).
+ *
+ * @note Use @c NULL pointers on the components you're not interested
+ * in: they'll be ignored by the function.
+ *
+ * Example:
+ * @dontinclude evas-object-manipulation.c
+ * @skip int alpha, r, g, b;
+ * @until return
+ *
+ * See the full @ref Example_Evas_Object_Manipulation "example".
+ *
+ * @ingroup Evas_Object_Group_Basic
+ *
+ * @param[out] r The red component of the given color.
+ * @param[out] g The green component of the given color.
+ * @param[out] b The blue component of the given color.
+ * @param[out] a The alpha component of the given color.
+ */
+EAPI void evas_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
+
+/**
+ *
+ * Move the given Evas object to the given location inside its canvas' viewport.
+ *
+ * @param[in] x in
+ * @param[in] y in
+ */
+EAPI void evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
+
+/**
+ *
+ * Changes the size of the given Evas object.
+ *
+ * @param[in] w in
+ * @param[in] h in
+ */
+EAPI void evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
+
+/**
+ *
+ * Retrieves whether or not the given Evas object is visible.
+ *
+ */
+EAPI Eina_Bool evas_object_visible_get(const Evas_Object *obj);
+
+
#include "canvas/evas_common_interface.eo.legacy.h"
#include "canvas/evas_object.eo.legacy.h"
}
}
render_dump {
- /*@
- Make the canvas discard as much data as possible used by the engine at
- runtime.
-
- This function will unload images, delete textures and much more, where
- possible. You may also want to call evas_render_idle_flush() immediately
- prior to this to perhaps discard a little more, though evas_render_dump()
- should implicitly delete most of what evas_render_idle_flush() might
- discard too.
-
- @ingroup Evas_Canvas */
+ [[Make the canvas discard as much data as possible used by the
+ engine at runtime.
+ This function will unload images, delete textures and much more,
+ where possible. You may also want to call @.render_idle_flush
+ immediately prior to this to perhaps discard a little more,
+ though this function should implicitly delete most of what
+ @.render_idle_flush might discard too.
+ ]]
}
- /*@
- Get a image from evas
-
- @ingroup Evas_Canvas */
-
+ render_copy {
- @in void *buffer;
- @in int stride;
- @in int width;
- @in int height;
- @in uint format;
- @in int sx;
- @in int sy;
- @in int sw;
- @in int sh;
- @in int dx;
- @in int dy;
- @in int dw;
- @in int dh;
++ [[Get a image from evas]]
+ params {
++ @in buffer: void *;
++ @in stride: int;
++ @in width: int;
++ @in height: int;
++ @in format: uint;
++ @in sx: int;
++ @in sy: int;
++ @in sw: int;
++ @in sh: int;
++ @in dx: int;
++ @in dy: int;
++ @in dw: int;
++ @in dh: int;
+ }
+ }
event_feed_mouse_in {
- /*@
- Mouse in event feed.
-
- This function will set some evas properties that is necessary when
- the mouse in event happens. It prepares information to be treated
- by the callback function. */
+ [[Mouse in event feed.
+ This function will set some evas properties that is necessary
+ when the mouse in event happens. It prepares information to be
+ treated by the callback function.
+ ]]
params {
- @in uint timestamp; /*@ The timestamp of the mouse up event. */
- @in const(void)* data; /*@ The data for canvas. */
+ @in timestamp: uint; [[The timestamp of the mouse up event.]]
+ @in data: const(void)*; [[The data for canvas.]]
}
}
object_top_in_rectangle_get @const {
// Check if we can do direct rendering...
if (ENFN->gl_direct_override_get)
- ENFN->gl_direct_override_get(output, &direct_override, &direct_force_off);
+ ENFN->gl_direct_override_get(output, NULL /*&direct_override*/, &direct_force_off);
if (ENFN->gl_surface_direct_renderable_get)
- direct_renderable = ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override);
+ direct_renderable = ENFN->gl_surface_direct_renderable_get(output, ns, &direct_override, surface);
if ( ((direct_override) ||
((direct_renderable) &&
unsigned int width, height;
+ Eina_Array cleanup;
++ Eina_Bool content_changed;
+ void *backing_store;
};
static void evas_object_vg_render(Evas_Object *eo_obj,
void
_evas_vg_eo_base_destructor(Eo *eo_obj, Evas_VG_Data *pd)
{
+ if (pd->backing_store) {
+ Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
+ obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
+ pd->backing_store);
+ }
+ Evas *e = evas_object_evas_get(eo_obj);
+
+ eo_do(e, eo_event_callback_del(EVAS_CANVAS_EVENT_RENDER_POST, _cleanup_reference, pd));
+
eo_unref(pd->root);
+ pd->root = NULL;
eo_do_super(eo_obj, MY_CLASS, eo_destructor());
}
int x, int y, Eina_Bool do_async)
{
Evas_VG_Data *vd = type_private_data;
-
- vd->backing_store = obj->layer->evas->engine.func->ector_surface_create(output,
- vd->backing_store,
- obj->cur->geometry.w,
- obj->cur->geometry.h);
+ Ector_Surface *ector = evas_ector_get(obj->layer->evas);
++ if (vd->content_changed || !vd->backing_store)
++ vd->backing_store = obj->layer->evas->engine.func->ector_surface_create(output,
++ vd->backing_store,
++ obj->cur->geometry.w,
++ obj->cur->geometry.h);
// FIXME: Set context (that should affect Ector_Surface) and
// then call Ector_Renderer render from bottom to top. Get the
// Ector_Surface that match the output from Evas engine API.
obj->cur->anti_alias);
obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur->render_op);
- obj->layer->evas->engine.func->ector_begin(output, context,
- ector, surface,
- obj->cur->geometry.x + x, obj->cur->geometry.y + y,
- do_async);
- _evas_vg_render(obj, vd,
- output, context, surface,
- vd->root, NULL,
- do_async);
- obj->layer->evas->engine.func->ector_end(output, context, ector, surface, do_async);
+ if (!vd->backing_store)
+ {
- obj->layer->evas->engine.func->ector_begin(output, context, surface,
++ obj->layer->evas->engine.func->ector_begin(output, context, ector, surface,
+ obj->cur->geometry.x + x, obj->cur->geometry.y + y,
+ do_async);
- _evas_vg_render(obj, output, context, surface, vd->root, NULL, do_async);
- obj->layer->evas->engine.func->ector_end(output, context, surface, do_async);
++ _evas_vg_render(obj, vd, output, context, surface, vd->root, NULL, do_async);
++ obj->layer->evas->engine.func->ector_end(output, context, ector, surface, do_async);
+ }
+ else
+ {
+ if (vd->content_changed)
+ {
- obj->layer->evas->engine.func->ector_begin(output, context, vd->backing_store, 0, 0, do_async);
- _evas_vg_render(obj, output, context, vd->backing_store, vd->root, NULL,do_async);
++ obj->layer->evas->engine.func->ector_begin(output, context, ector, vd->backing_store, 0, 0, do_async);
++ _evas_vg_render(obj, vd, output, context, vd->backing_store, vd->root, NULL,do_async);
+ obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, vd->backing_store,
+ 0, 0, 0, 0);
- obj->layer->evas->engine.func->ector_end(output, context, surface, do_async);
++ obj->layer->evas->engine.func->ector_end(output, context, ector, surface, do_async);
+ }
+ obj->layer->evas->engine.func->image_draw(output, context, surface,
+ vd->backing_store, 0, 0,
+ obj->cur->geometry.w, obj->cur->geometry.h, obj->cur->geometry.x + x,
+ obj->cur->geometry.y + y, obj->cur->geometry.w, obj->cur->geometry.h,
+ EINA_TRUE, do_async);
+ }
++ // reset the content change flag
++ // don't move this to render_pre as there is no guarentee that
++ // each render_pre() will be followed by a render() call.
++ vd->content_changed = EINA_FALSE;
}
static void
obj->cur->clipper,
obj->cur->clipper->private_data);
}
- /* now figure what changed and add draw rects */
- /* if it just became visible or invisible */
- is_v = evas_object_is_visible(eo_obj, obj);
- was_v = evas_object_was_visible(eo_obj,obj);
- if (!(is_v | was_v)) goto done;
-- // FIXME: handle damage only on changed renderer.
- s = e->engine.func->ector_get(e->engine.data.output);
- s = evas_ector_get(obj->layer->evas);
-- if (vd->root && s)
-- _evas_vg_render_pre(vd->root, s, NULL);
++ // handle the vg root node tree.
++ if (vd->root)
++ {
++ // FIXME: handle damage only on changed renderer.
++ s = evas_ector_get(obj->layer->evas);
++ if (s)
++ _evas_vg_render_pre(vd->root, s, NULL);
+
- // FIXME: for now the walking Evas_VG_Node tree doesn't trigger any damage
- // So just forcing it here if necessary
- rnd = eo_data_scope_get(vd->root, EFL_VG_BASE_CLASS);
++ // FIXME: for now the walking Evas_VG_Node tree doesn't trigger any damage
++ // So just forcing it here if necessary
++ rnd = eo_data_scope_get(vd->root, EFL_VG_BASE_CLASS);
+
- //FIXME find the reason for NULL Base Class in some case?
- if (!rnd) return;
++ //FIXME find the reason for NULL Base Class in some case?
++ if (!rnd) return;
+
- if (rnd->changed)
- {
- vd->content_changed = EINA_TRUE;
- rnd->changed = EINA_FALSE;
- evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
- goto done;
- }
- else
- {
- // if size got changed , force a redraw.
- if ((obj->cur->geometry.w != obj->prev->geometry.w) ||
- (obj->cur->geometry.h != obj->prev->geometry.h))
- vd->content_changed = EINA_TRUE;
- else
- vd->content_changed = EINA_FALSE;
++ if (rnd->changed)
++ {
++ vd->content_changed = EINA_TRUE;
++ rnd->changed = EINA_FALSE;
++ evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
++ goto done;
++ }
++ else
++ {
++ // if size got changed , force a redraw.
++ if ((obj->cur->geometry.w != obj->prev->geometry.w) ||
++ (obj->cur->geometry.h != obj->prev->geometry.h))
++ vd->content_changed = EINA_TRUE;
++ }
+ }
- // FIXME: for now the walking Evas_VG_Node tree doesn't trigger any damage
- // So just forcing it here if necessary
- rnd = eo_data_scope_get(vd->root, EFL_VG_BASE_CLASS);
-
- // Once the destructor has been called, root node will be zero
- // and a full redraw is still necessary.
- if (!rnd)
- {
- evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
- goto done;
- }
- else if (rnd->changed)
- {
- rnd->changed = EINA_FALSE;
- evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
- goto done;
- }
-
+ /* now figure what changed and add draw rects */
+ /* if it just became visible or invisible */
+ is_v = evas_object_is_visible(eo_obj, obj);
+ was_v = evas_object_was_visible(eo_obj,obj);
+ if (!(is_v | was_v)) goto done;
+
if (is_v != was_v)
{
evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v);
else
_evas_font_image_draw
(dc, dst, fg->ext_dat, 0, 0, w, h,
- chr_x, y - (chr_y - y), draw_w, draw_h, EINA_TRUE);
+ chr_x, y - (chr_y - y), w, h, EINA_TRUE);
+ */
+ int draw_w = w * fg->fi->scale_factor;
+ int draw_h = h * fg->fi->scale_factor;
+
+ if (dc->font_ext.func.gl_image_draw)
+ dc->font_ext.func.gl_image_draw
+ (dc->font_ext.data, fg->ext_dat, 0, 0, w, h,
+ chr_x, y - (chr_y - y), draw_w, draw_h, EINA_TRUE);
+ else
+ _evas_font_image_draw
+ (dc, dst, fg->ext_dat, 0, 0, w, h,
+ chr_x, y - (chr_y - y), draw_w, draw_h, EINA_TRUE);
+ //
}
}
}
void *(*image_drawable_set) (void *data, void *image, void *drawable);
void (*drawable_scene_render) (void *data, void *drawable, void *scene_data);
+ Eina_Bool (*drawable_scene_render_to_texture) (void *data, void *drawable, void *scene_data);
- void *(*texture_new) (void *data);
+ int (*drawable_texture_color_pick_id_get) (void *drawable);
+ void (*drawable_texture_pixel_color_get) (unsigned int tex EINA_UNUSED, int x, int y, Evas_Color *color, void *drawable);
+
+ void *(*texture_new) (void *data, Eina_Bool use_atlas);
void (*texture_free) (void *data, void *texture);
- void (*texture_data_set) (void *data, void *texture, Evas_3D_Color_Format format, Evas_3D_Pixel_Format pixel_format, int w, int h, const void *pixels);
- void (*texture_file_set) (void *data, void *texture, const char *file, const char *key);
- void (*texture_color_format_get) (void *data, void *texture, Evas_3D_Color_Format *format);
void (*texture_size_get) (void *data, void *texture, int *w, int *h);
- void (*texture_wrap_set) (void *data, void *texture, Evas_3D_Wrap_Mode s, Evas_3D_Wrap_Mode t);
- void (*texture_wrap_get) (void *data, void *texture, Evas_3D_Wrap_Mode *s, Evas_3D_Wrap_Mode *t);
- void (*texture_filter_set) (void *data, void *texture, Evas_3D_Texture_Filter min, Evas_3D_Texture_Filter mag);
- void (*texture_filter_get) (void *data, void *texture, Evas_3D_Texture_Filter *min, Evas_3D_Texture_Filter *mag);
+ void (*texture_wrap_set) (void *data, void *texture, Evas_Canvas3D_Wrap_Mode s, Evas_Canvas3D_Wrap_Mode t);
+ void (*texture_wrap_get) (void *data, void *texture, Evas_Canvas3D_Wrap_Mode *s, Evas_Canvas3D_Wrap_Mode *t);
+ void (*texture_filter_set) (void *data, void *texture, Evas_Canvas3D_Texture_Filter min, Evas_Canvas3D_Texture_Filter mag);
+ void (*texture_filter_get) (void *data, void *texture, Evas_Canvas3D_Texture_Filter *min, Evas_Canvas3D_Texture_Filter *mag);
void (*texture_image_set) (void *data, void *texture, void *image);
+ void *(*texture_image_get) (void *data, void *texture);
- Ector_Surface *(*ector_get) (void *data);
- void (*ector_begin) (void *data, void *context, void *surface, int x, int y, Eina_Bool do_async);
+ void (*output_copy) (void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh);
+ Ector_Surface *(*ector_create) (void *data);
+ void (*ector_destroy) (void *data, Ector_Surface *surface);
+ void (*ector_begin) (void *data, void *context, Ector_Surface *ector, void *surface, int x, int y, Eina_Bool do_async);
void (*ector_renderer_draw) (void *data, void *context, void *surface, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async);
- void *(*ector_end) (void *data, void *context, void *surface, Eina_Bool do_async);
- void *(*ector_surface_create) (void *data, void *surface, int w, int h);
+ void (*ector_end) (void *data, void *context, Ector_Surface *ector, void *surface, Eina_Bool do_async);
++ void *(*ector_surface_create) (void *data, void *surface, int w, int h);
};
struct _Evas_Image_Save_Func
}
static Ecore_Buffer_Data
-
+_ecore_buffer_x11_dri3_buffer_alloc_with_tbm_surface(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, void *tbm_surface, int *ret_w, int *ret_h, Ecore_Buffer_Format *ret_format, unsigned int flags)
+{
+ Ecore_Buffer_X11_Dri3_Data *buf;
+
+ buf = calloc(1, sizeof(Ecore_Buffer_X11_Dri3_Data));
+ if (!buf)
+ return NULL;
+
+ buf->w = tbm_surface_get_width(tbm_surface);
+ buf->h = tbm_surface_get_height(tbm_surface);
+ buf->format = tbm_surface_get_format(tbm_surface);
+ buf->flags = flags;
+ buf->is_imported = EINA_FALSE;
+ buf->tbm_surface = tbm_surface;
+
+ if (ret_w) *ret_w = buf->w;
+ if (ret_h) *ret_h = buf->h;
+ if (ret_format) *ret_format = buf->format;
+
+ return buf;
+}
+
static void
- _ecore_buffer_x11_dri3_buffer_free(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data data)
+ _ecore_buffer_x11_dri3_buffer_free(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata)
{
- Ecore_Buffer_X11_Dri3_Data *buf = data;
+ Ecore_Buffer_X11_Dri3_Data *buf = bdata;
if (!buf)
return;
static int
_ecore_evas_drm_shutdown(void)
{
- unsigned int i;
- if (--_ecore_evas_init_count != 0) return _ecore_evas_init_count;
--
- ecore_drm_inputs_destroy(dev);
- /* NB: No need to free outputs here. Is done in device free */
- ecore_drm_sprites_destroy(dev);
- ecore_drm_device_close(dev);
- ecore_drm_launcher_disconnect(dev);
- ecore_drm_device_free(dev);
- ecore_drm_shutdown();
+ _ecore_evas_init_count--;
+ if (_ecore_evas_init_count == 0)
+ {
- for (i = 0; i < sizeof(_ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
- {
- if (_ecore_evas_event_handlers[i])
- ecore_event_handler_del(_ecore_evas_event_handlers[i]);
- }
-
+ ecore_drm_inputs_destroy(dev);
+ /* NB: No need to free outputs here. Is done in device free */
+ ecore_drm_sprites_destroy(dev);
+ ecore_drm_device_close(dev);
+ ecore_drm_launcher_disconnect(dev);
+ ecore_drm_device_free(dev);
+ ecore_drm_shutdown();
+
+ ecore_event_evas_shutdown();
-
+ dev = NULL;
+ }
- if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
- return _ecore_evas_init_count;
- }
-
- static Eina_Bool
- _ecore_evas_drm_event_page_flip(void *data, int type EINA_UNUSED, void *event)
- {
- Ecore_Evas *ee;
- Ecore_Drm_Event_Page_Flip *e;
- Ecore_Evas_Engine_Drm_Data *edata;
-
- e = event;
- ee = data;
- edata = ee->engine.data;
-
- if (edata->func.flip)
- edata->func.flip(e->fd, e->sequence, e->sec, e->usec, e->data);
-
- if (edata->wait_for_flip_done)
- {
- if (edata->flip_done_timer)
- {
- ecore_timer_del(edata->flip_done_timer);
- edata->flip_done_timer = NULL;
- }
-
- edata->wait_for_flip_done = 0;
- if (edata->need_render)
- {
- _ecore_evas_drm_render(ee);
- edata->need_render = 0;
- }
- }
- return ECORE_CALLBACK_PASS_ON;
- }
-
- static Eina_Bool
- _ecore_evas_drm_event_vblank(void *data, int type EINA_UNUSED, void *event)
- {
- Ecore_Evas *ee;
- Ecore_Drm_Event_Vblank *e;
- Ecore_Evas_Engine_Drm_Data *edata;
-
- e = event;
- ee = data;
- edata = ee->engine.data;
-
- if (edata->func.vblank)
- edata->func.vblank(e->fd, e->sequence, e->sec, e->usec, e->data);
- ecore_event_evas_shutdown();
++ if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
- return ECORE_CALLBACK_PASS_ON;
+ return _ecore_evas_init_count;
}
static Ecore_Evas_Interface_Drm *
snprintf(file, sizeof(file), "/%s-%i.%i", base, id, num);
b->file = eina_stringshare_add(file);
if (!b->file) goto err;
-
- if (sys) mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-
+
+
+ if (sys) mode |= S_IRGRP | S_IROTH;
+
+ if (owner)
+ {
+ mode |= S_IWUSR;
+ prot |= PROT_WRITE;
+ }
+
if (b->am_owner)
{
- const char *s = NULL;
-
- #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
- if (getuid() == geteuid())
- #endif
- {
- s = getenv("XDG_RUNTIME_DIR");
- if (!s) s = getenv("TMPDIR");
- }
- b->lockfd = eina_file_mkstemp("ee-lock-XXXXXX", &tmp);
+ //TIZEN ONLY (150908): security issue. To access any application, it needs smack rule.
- //if (!s) s = "/tmp";
- s = "/run/.efl";
++ //b->lockfd = eina_file_mkstemp("ee-lock-XXXXXX", &tmp);
++ b->lockfd = mkstemp("/run/.efl/ee-lock-XXXXXX");
+ //
- snprintf(file, sizeof(file), "%s/ee-lock-XXXXXX", s);
- b->lockfd = mkstemp(file);
if (b->lockfd < 0) goto err;
b->lock = eina_stringshare_add(file);
if (!b->lock) goto err;
static void _ecore_evas_wayland_alpha_do(Ecore_Evas *ee, int alpha);
static void _ecore_evas_wayland_transparent_do(Ecore_Evas *ee, int transparent);
static void _ecore_evas_wl_common_border_update(Ecore_Evas *ee);
+static Eina_Bool _ecore_evas_wl_common_wm_rot_manual_rotation_done_timeout(void *data);
+static void _ecore_evas_wl_common_wm_rot_manual_rotation_done_timeout_update(Ecore_Evas *ee);
- /* Frame listener */
- static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
-
- /* Frame listener */
- static const struct wl_callback_listener frame_listener =
- {
- _ecore_evas_wl_frame_complete,
- };
-
/* local functions */
static void
_ecore_evas_wl_common_state_update(Ecore_Evas *ee)
return rend;
}
- ecore_evas_manual_render_set(ee, 0);
+ static void
+ _anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED)
+ {
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ wdata = ee->engine.data;
+ wl_callback_destroy(callback);
+ wdata->anim_callback = NULL;
- ecore_evas_manual_render_set(ee, 1);
++// ecore_evas_manual_render_set(ee, 0);
+ }
+
+ static const struct wl_callback_listener _anim_listener =
+ {
+ _anim_cb_animate
+ };
+
+ void
+ _ecore_evas_wl_common_render_pre(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED)
+ {
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ wdata = ee->engine.data;
+ wdata->anim_callback =
+ wl_surface_frame(ecore_wl_window_surface_get(wdata->win));
+ wl_callback_add_listener(wdata->anim_callback, &_anim_listener, ee);
++// ecore_evas_manual_render_set(ee, 1);
+ }
+
void
_ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event)
{
#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
struct wl_egl_window *egl_win;
#endif
- #ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
- struct
- {
- Eina_Bool (*busy_check) (void *data);
- } func;
- Eina_Bool wait_buffer_release : 1;
- #endif
- Eina_Bool frame_pending : 1;
- struct wl_callback *frame_callback;
+ struct
+ {
+ unsigned char supported: 1;
+ unsigned char request : 1;
+ unsigned char done : 1;
+ Ecore_Job *manual_mode_job;
+ } wm_rot;
+ struct wl_callback *anim_callback;
};
Ecore_Evas_Interface_Wayland *_ecore_evas_wl_interface_new(void);
void _ecore_evas_wayland_shm_resize_edge_set(Ecore_Evas *ee, int edge);
void _ecore_evas_wayland_shm_transparent_do(Ecore_Evas *ee, int transparent);
void _ecore_evas_wayland_shm_alpha_do(Ecore_Evas *ee, int transparent);
- void _ecore_evas_wayland_shm_buffer_released(void *data);
+void _ecore_evas_wayland_shm_window_rotate(Ecore_Evas *ee, int rotation, int resize);
#endif
#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL
einfo->info.edges = edge;
}
- _ecore_evas_wayland_shm_buffer_released(void *data)
- {
- Ecore_Evas_Engine_Wl_Data *wdata;
- Ecore_Evas *ee = data;
-
- if (!ee) return;
- wdata = ee->engine.data;
-
- if (!wdata->wait_buffer_release)
- return;
- else
- wdata->wait_buffer_release = EINA_FALSE;
-
- /* reset previous render time - the delay for buffer release does NOT
- * have to be considered as stuck of async
- */
- if (!ee->in_async_render)
- ee->async_render_start = ecore_loop_time_get();
-
- _ecore_evas_wl_common_render(ee);
- }
-
- void
+void
+_ecore_evas_wayland_shm_window_rotate(Ecore_Evas *ee, int rotation, int resize)
+{
+ if (!ee) return;
+ _ecore_evas_wl_rotation_set(ee, rotation, resize);
+ if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
+}
+
#endif
_ecore_imf_wayland_log_dom =
eina_log_domain_register("ecore_imf_wayland", EINA_COLOR_YELLOW);
+ if (!getenv("WAYLAND_DISPLAY")) return EINA_FALSE;
+ if ((s = getenv("ELM_DISPLAY")))
+ {
+ if (strcmp(s, "wl")) return EINA_FALSE;
+ }
+
+ if (!ecore_wl_init(NULL))
+ return EINA_FALSE;
+
ecore_imf_module_register(&wayland_im_info, im_module_create,
im_module_exit);
+
+ // TIZEN_ONLY(20150708): Support back key
+ register_key_handler();
+ //
EINA_LOG_DOM_INFO(_ecore_imf_wayland_log_dom, "im module initalized");
return EINA_TRUE;
static void
im_module_shutdown(void)
{
+ // TIZEN_ONLY(20150708): Support back key
+ unregister_key_handler();
+ //
EINA_LOG_DOM_INFO(_ecore_imf_wayland_log_dom, "im module shutdown");
+ ecore_wl_shutdown();
}
EINA_MODULE_INIT(im_module_init);
static void
eng_output_free(void *data)
{
- Render_Engine *re = data;
+ Render_Engine *re;
- evas_render_engine_software_generic_clean(&re->generic);
- free(re);
+ if ((re = data))
+ {
+ evas_render_engine_software_generic_clean(&re->generic);
+ free(re);
+ }
- evas_common_font_shutdown();
- evas_common_image_shutdown();
+ evas_common_shutdown();
}
+static void
+eng_output_copy(void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
+ Render_Engine *re = (Render_Engine *)data;
+ Outbuf *ob;
+
+ EINA_SAFETY_ON_NULL_RETURN(re);
+
+ ob = eng_get_ob(re);
+ EINA_SAFETY_ON_NULL_RETURN(ob);
+
+ evas_outbuf_copy(ob, buffer, stride, width, height, format, sx, sy, sw, sh, dx, dy, dw, dh);
+}
+
/* module api functions */
static int
module_open(Evas_Module *em)
void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
--
+void evas_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh);
-
- Eina_Bool evas_drm_outbuf_setup(Outbuf *ob);
- void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer);
- Eina_Bool evas_drm_framebuffer_create(int fd, Buffer *buffer, int depth);
- void evas_drm_framebuffer_destroy(int fd, Buffer *buffer);
- Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer);
-
#endif
}
int
- evas_outbuf_get_rot(Outbuf *ob)
+ evas_outbuf_rot_get(Outbuf *ob)
{
- return ob->info->info.rotation;
+ return ob->rotation;
}
- Buffer *buff = &(ob->priv.buffer[ob->priv.last]);
+
+void
+evas_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
- memcpy (buffer, buff->data, stride * height);
- }
++ Ecore_Drm_Fb *buff = ob->priv.buffer[ob->priv.last];
+
++ memcpy (buffer, buff->mmap, stride * height);
++}
if (!gw->gl_context)
{
- free(gw);
- return NULL;
+ free(gw);
+ return NULL;
}
evas_gl_common_context_use(gw->gl_context);
- evas_gl_common_context_resize(gw->gl_context, w, h, 0);
+ evas_gl_common_context_resize(gw->gl_context, w, h, 0,1);
return gw;
}
return 0;
}
+//Tizen Only : when multi window are shown, latest window does not show. so force call glviewport when window resizing occur
+//static void _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc)
static void
-_evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc)
+_evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc, int force_update)
{
- GLfloat proj[16];
unsigned int i;
int w = 1, h = 1, m = 1, rot = 1, foc = 0;
if (gc->state.current.cur_prog == PRG_INVALID)
glUseProgram(gc->shared->shader[0].prog);
else glUseProgram(gc->state.current.cur_prog);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glActiveTexture(GL_TEXTURE0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- _evas_gl_common_viewport_set(gc);
+ _evas_gl_common_viewport_set(gc,1);
}
+//Tizen Only : when multi window are shown, latest window does not show. so force call glviewport when window resizing occur
+//EAPI void evas_gl_common_context_resize(Evas_Engine_GL_Context *gc, int w, int h, int rot)
EAPI void
-evas_gl_common_context_resize(Evas_Engine_GL_Context *gc, int w, int h, int rot)
+evas_gl_common_context_resize(Evas_Engine_GL_Context *gc, int w, int h, int rot, int force_update)
{
- if ((gc->w == w) && (gc->h == h) && (gc->rot == rot)) return;
+ if (!gc) return;
+ if ((!force_update) && (gc->w == w) && (gc->h == h) && (gc->rot == rot)) return;
evas_gl_common_context_flush(gc);
gc->change.size = 1;
gc->rot = rot;
# endif
#endif
if (gc->pipe[0].shader.surface == gc->def_surface)
- {
- glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- }
+ glsym_glBindFramebuffer(GL_FRAMEBUFFER, 0);
else
- {
- glsym_glBindFramebuffer(GL_FRAMEBUFFER, surface->tex->pt->fb);
- _evas_gl_common_viewport_set(gc);
+ glsym_glBindFramebuffer(GL_FRAMEBUFFER, surface->tex->pt->fb);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- }
+ _evas_gl_common_viewport_set(gc,0);
}
+ #define VERTEX_CNT 3
+ #define COLOR_CNT 4
+ #define TEX_CNT 2
+ #define SAM_CNT 2
+ #define MASK_CNT 4
+
#define PUSH_VERTEX(n, x, y, z) do { \
gc->pipe[n].array.vertex[nv++] = x; \
gc->pipe[n].array.vertex[nv++] = y; \
gc->px = p[0].px >> FP;
gc->py = p[0].py >> FP;
gc->change.size = 1;
- _evas_gl_common_viewport_set(gc);
+ _evas_gl_common_viewport_set(gc,0);
}
- pn = _evas_gl_common_context_push(RTYPE_MAP,
+ pn = _evas_gl_common_context_push(SHD_MAP,
gc, tex, mtex,
prog,
x, y, w, h,
_eng_fn (*glsym_eglGetProcAddress)(const char *a) = NULL;
void *(*glsym_eglCreateImage)(EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
void (*glsym_eglDestroyImage)(EGLDisplay a, void *b) = NULL;
- void (*glsym_glEGLImageTargetTexture2DOES)(int a, void *b) = NULL;
+ void (*glsym_glEGLImageTargetTexture2DOES)(int a, void *b) = NULL;
unsigned int (*glsym_eglSwapBuffersWithDamage)(EGLDisplay a, void *b, const EGLint *d, EGLint c) = NULL;
+
+unsigned int (*glsym_eglBindWaylandDisplayWL)(EGLDisplay dpy, struct wl_display *display) = NULL;
+unsigned int (*glsym_eglUnbindWaylandDisplayWL)(EGLDisplay dpy, struct wl_display *display) = NULL;
unsigned int (*glsym_eglQueryWaylandBufferWL)(EGLDisplay a, struct wl_resource *b, EGLint c, EGLint *d) = NULL;
+ unsigned int (*glsym_eglSetDamageRegionKHR)(EGLDisplay a, EGLSurface b, EGLint *c, EGLint d) = NULL;
/* local function prototypes */
static void gl_symbols(void);
FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamage",
glsym_func_uint);
+ FINDSYM(glsym_eglBindWaylandDisplayWL, "eglBindWaylandDisplayWL",
+ glsym_func_uint);
+ FINDSYM(glsym_eglUnbindWaylandDisplayWL, "eglUnbindWaylandDisplayWL",
+ glsym_func_uint);
+ FINDSYM(glsym_eglSetDamageRegionKHR, "eglSetDamageRegionKHR",
+ glsym_func_uint);
+
FINDSYM(glsym_eglQueryWaylandBufferWL, "eglQueryWaylandBufferWL",
glsym_func_uint);
_re_winfree(re);
}
- static void
- _native_cb_bind(void *data EINA_UNUSED, void *image)
- {
- Evas_GL_Image *img;
- Native *n;
-
- if (!(img = image)) return;
- if (!(n = img->native.data)) return;
-
- if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
- {
- if (n->egl_surface)
- {
- if (glsym_glEGLImageTargetTexture2DOES)
- {
- glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
- if (eglGetError() != EGL_SUCCESS)
- ERR("glEGLImageTargetTexture2DOES() failed.");
- }
- else
- ERR("Try glEGLImageTargetTexture2DOES on EGL with no support");
- }
- }
- else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
- {
- glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- }
- }
-
- static void
- _native_cb_unbind(void *data EINA_UNUSED, void *image)
- {
- Evas_GL_Image *img;
- Native *n;
-
- if (!(img = image)) return;
- if (!(n = img->native.data)) return;
-
- if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
- {
- //glBindTexture(GL_TEXTURE_2D, 0); //really need?
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- }
- else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
- {
- glBindTexture(GL_TEXTURE_2D, 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
- }
- }
-
- static void
- _native_cb_free(void *data, void *image)
- {
- Render_Engine *re;
- Outbuf *ob;
- Evas_GL_Image *img;
- Native *n;
- uint32_t texid;
- void *wlid;
-
- if (!(re = (Render_Engine *)data)) return;
- if (!(img = image)) return;
- if (!(n = img->native.data)) return;
- if (!(ob = eng_get_ob(re))) return;
-
- if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
- {
- wlid = (void*)n->wl_buf;
- eina_hash_del(ob->gl_context->shared->native_wl_hash, &wlid, img);
- if (n->egl_surface)
- {
- if (glsym_eglDestroyImage)
- {
- glsym_eglDestroyImage(eng_get_ob(re)->egl_disp,
- n->egl_surface);
- if (eglGetError() != EGL_SUCCESS)
- ERR("eglDestroyImage() failed.");
- }
- else
- ERR("Try eglDestroyImage on EGL with no support");
- }
- }
- else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
- {
- texid = n->ns.data.opengl.texture_id;
- eina_hash_del(ob->gl_context->shared->native_tex_hash, &texid, img);
- }
-
- img->native.data = NULL;
- img->native.func.data = NULL;
- img->native.func.bind = NULL;
- img->native.func.unbind = NULL;
- img->native.func.free = NULL;
-
- free(n);
- }
-
+static void
+eng_output_copy(void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh)
+{
+ Render_Engine *re;
+ Outbuf *ob;
+
+ if (!(re = (Render_Engine *)data)) return;
+
+ ob = eng_get_ob(re);
+ EINA_SAFETY_ON_NULL_RETURN(ob);
+
+ eng_outbuf_copy(ob, buffer, stride, width, height, format, sx, sy, sw, sh, dx, dy, dw, dh);
+}
+
static void *
eng_image_native_set(void *data, void *image, void *native)
{
return NULL;
}
- attribs[0] = EGL_WAYLAND_PLANE_WL;
+ attribs[0] = EVAS_GL_WAYLAND_PLANE_WL;
attribs[1] = 0; //if plane is 1 then 0, if plane is 2 then 1
- attribs[2] = EGL_NONE;
+ attribs[2] = EVAS_GL_NONE;
memcpy(&(n->ns), ns, sizeof(Evas_Native_Surface));
- glsym_eglQueryWaylandBufferWL(ob->egl_disp, wl_buf, EVAS_GL_WAYLAND_Y_INVERTED_WL, &yinvert);
- eina_hash_add(ob->gl_context->shared->native_wl_hash, &wlid, img);
+ if (glsym_eglQueryWaylandBufferWL(ob->egl.disp, wl_buf,
- EGL_WAYLAND_Y_INVERTED_WL,
++ EVAS_GL_WAYLAND_Y_INVERTED_WL,
+ &yinvert) == EGL_FALSE)
+ yinvert = 1;
+ eina_hash_add(ob->gl_context->shared->native_wl_hash,
+ &wlid, img);
n->wl_buf = wl_buf;
if (glsym_eglCreateImage)
- n->egl_surface = glsym_eglCreateImage(ob->egl_disp,
+ n->egl_surface = glsym_eglCreateImage(ob->egl.disp,
NULL,
- EGL_WAYLAND_BUFFER_WL,
- wl_buf, attribs);
+ EVAS_GL_WAYLAND_BUFFER_WL,
+ wl_buf,
+ attribs);
else
{
ERR("Try eglCreateImage on EGL with no support");
func = pfunc;
/* now to override methods */
- #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
- ORD(info);
- ORD(info_free);
- ORD(setup);
- ORD(canvas_alpha_get);
- ORD(output_free);
- ORD(output_dump);
- ORD(image_native_set);
- ORD(output_copy);
+ EVAS_API_OVERRIDE(info, &func, eng_);
+ EVAS_API_OVERRIDE(info_free, &func, eng_);
+ EVAS_API_OVERRIDE(setup, &func, eng_);
+ EVAS_API_OVERRIDE(canvas_alpha_get, &func, eng_);
+ EVAS_API_OVERRIDE(output_free, &func, eng_);
+ EVAS_API_OVERRIDE(output_dump, &func, eng_);
+ EVAS_API_OVERRIDE(image_native_set, &func, eng_);
++ EVAS_API_OVERRIDE(output_copy, &func, eng_);
/* Mesa's EGL driver loads wayland egl by default. (called by eglGetProcaddr() )
* implicit env set (EGL_PLATFORM=drm) prevent that. */
setenv("EGL_PLATFORM", "drm", 1);
+
gl_symbols();
+ if (!((glsym_eglBindWaylandDisplayWL) &&
+ (glsym_eglUnbindWaylandDisplayWL) &&
+ (glsym_eglQueryWaylandBufferWL)))
+ {
+ EINA_LOG_ERR("GLES driver doesn't support EGL_WL_bind_wayland_display extension.");
+ eina_log_domain_unregister(_evas_engine_gl_drm_log_dom);
+ /* TODO: unload gl_generic engine too */
+ return 0;
+ }
+
/* now advertise out own api */
em->functions = (void *)(&func);
+
return 1;
}
struct _Outbuf
{
- EGLContext egl_context[1];
- EGLSurface egl_surface[1];
- EGLConfig egl_config;
- EGLDisplay egl_disp;
- struct gbm_device *gbm;
- struct gbm_surface *surface;
- Evas *evas;
- uint32_t format;
- uint32_t flags;
- Evas_Engine_GL_Context *gl_context;
Evas_Engine_Info_GL_Drm *info;
- Render_Engine_Swap_Mode swap_mode;
+ Evas_Engine_GL_Context *gl_context;
+
+ Evas *evas; // used for pre_swap, post_swap
+
int w, h;
- int depth, rot, screen, alpha;
- int prev_age;
- int frame_cnt;
- int vsync;
- Eina_Bool lost_back : 1;
- Eina_Bool surf : 1;
+ unsigned int rotation, depth;
+ Render_Engine_Swap_Mode swap_mode;
+
+ /* struct gbm_device *gbm; */
+ struct gbm_surface *surface;
- struct
+ struct
{
- Eina_Bool drew : 1;
- } draw;
+ EGLContext context[1];
+ EGLSurface surface[1];
+ EGLConfig config;
+ EGLDisplay disp;
+ } egl;
- struct
+ struct
{
- int fd;
- unsigned int conn, crtc, fb;
- Buffer buffer[NUM_BUFFERS];
- int curr, num;
- drmModeModeInfo mode;
- Eina_List *pending_writes;
- Eina_List *planes;
- Eina_Bool pending_flip : 1;
+ int prev_age, frame_cnt;
+ int curr, last, num;
+ struct gbm_bo *bo[4];
+ Eina_List *pending_writes;
} priv;
- Ecore_Drm_Output *output;
- };
-
- struct _Context_3D
- {
- EGLDisplay display;
- EGLContext context;
- EGLSurface surface;
+ Eina_Bool destination_alpha : 1;
+ Eina_Bool vsync : 1;
+ Eina_Bool lost_back : 1;
+ Eina_Bool surf : 1;
+ Eina_Bool drew : 1;
};
- Outbuf *eng_window_new(Evas_Engine_Info_GL_Drm *info, Evas *e, struct gbm_device *gbm, struct gbm_surface *surface, int screen, int depth, int w, int h, int indirect, int alpha, int rot, Render_Engine_Swap_Mode swap_mode);
- void eng_window_free(Outbuf *gw);
- void eng_window_use(Outbuf *gw);
- void eng_window_unsurf(Outbuf *gw);
- void eng_window_resurf(Outbuf *gw);
-
- void eng_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
- int eng_outbuf_get_rot(Outbuf *ob);
- Render_Engine_Swap_Mode eng_outbuf_swap_mode(Outbuf *ob);
- Eina_Bool eng_outbuf_region_first_rect(Outbuf *ob);
- void *eng_outbuf_new_region_for_update(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
- void eng_outbuf_push_free_region_for_update(Outbuf *ob, RGBA_Image *update);
- void eng_outbuf_push_updated_region(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
- void eng_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
- Evas_Engine_GL_Context* eng_outbuf_gl_context_get(Outbuf *ob);
- void *eng_outbuf_egl_display_get(Outbuf *ob);
-
- void eng_gl_context_free(Context_3D *context);
- void eng_gl_context_use(Context_3D *context);
-
- Eina_Bool eng_preload_make_current(void *data, void *doit);
-
- Context_3D *eng_gl_context_new(Outbuf *win);
+ Eina_Bool eng_gbm_init(Evas_Engine_Info_GL_Drm *info);
+ Eina_Bool eng_gbm_shutdown(Evas_Engine_Info_GL_Drm *info);
+
+ Outbuf *evas_outbuf_new(Evas_Engine_Info_GL_Drm *info, int w, int h, Render_Engine_Swap_Mode swap_mode);
+ void evas_outbuf_free(Outbuf *ob);
+ void evas_outbuf_use(Outbuf *ob);
+ void evas_outbuf_resurf(Outbuf *ob);
+ void evas_outbuf_unsurf(Outbuf *ob);
+ void evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
+ Render_Engine_Swap_Mode evas_outbuf_buffer_state_get(Outbuf *ob);
+ int evas_outbuf_rot_get(Outbuf *ob);
+ Eina_Bool evas_outbuf_update_region_first_rect(Outbuf *ob);
+ void *evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
+ void evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
+ void evas_outbuf_update_region_free(Outbuf *ob, RGBA_Image *update);
+ void evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode);
+ Evas_Engine_GL_Context* evas_outbuf_gl_context_get(Outbuf *ob);
+ void *evas_outbuf_egl_display_get(Outbuf *ob);
+ Context_3D *evas_outbuf_gl_context_new(Outbuf *ob);
+ void evas_outbuf_gl_context_use(Context_3D *ctx);
++void eng_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh);
static inline Eina_Bool
_re_wincheck(Outbuf *ob)
--- /dev/null
-#ifdef EGL_MESA_platform_gbm
-static PFNEGLGETPLATFORMDISPLAYEXTPROC dlsym_eglGetPlatformDisplayEXT = NULL;
-static PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC dlsym_eglCreatePlatformWindowSurfaceEXT = NULL;
-#endif
+ #include "evas_engine.h"
++#include <sys/mman.h>
+ #include "../gl_common/evas_gl_define.h"
+
+ /* local variables */
+ static Outbuf *_evas_gl_drm_window = NULL;
+ static EGLContext context = EGL_NO_CONTEXT;
+ static int win_count = 0;
+
-#ifdef EGL_MESA_platform_gbm
- dlsym_eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
- eglGetProcAddress("eglGetPlatformDisplayEXT");
- EINA_SAFETY_ON_NULL_RETURN_VAL(dlsym_eglGetPlatformDisplayEXT, EINA_FALSE);
- dlsym_eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
- eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
- EINA_SAFETY_ON_NULL_RETURN_VAL(dlsym_eglCreatePlatformWindowSurfaceEXT, EINA_FALSE);
-#endif
++//#ifdef EGL_MESA_platform_gbm
++//static PFNEGLGETPLATFORMDISPLAYEXTPROC dlsym_eglGetPlatformDisplayEXT = NULL;
++//static PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC dlsym_eglCreatePlatformWindowSurfaceEXT = NULL;
++//#endif
+
+ static void
+ _evas_outbuf_gbm_surface_destroy(Outbuf *ob)
+ {
+ if (!ob) return;
+ if (ob->surface)
+ {
+ gbm_surface_destroy(ob->surface);
+ ob->surface = NULL;
+ }
+ }
+
+ static void
+ _evas_outbuf_gbm_surface_create(Outbuf *ob, int w, int h)
+ {
+ if (!ob) return;
+
+ ob->surface =
+ gbm_surface_create(ob->info->info.gbm, w, h,
+ ob->info->info.format, ob->info->info.flags);
+
+ if (!ob->surface) ERR("Failed to create gbm surface: %m");
+ }
+
+ static void
+ _evas_outbuf_fb_cb_destroy(struct gbm_bo *bo, void *data)
+ {
+ Ecore_Drm_Fb *fb;
+
+ fb = data;
+ if (fb)
+ {
+ struct gbm_device *gbm;
+
+ gbm = gbm_bo_get_device(bo);
+ drmModeRmFB(gbm_device_get_fd(gbm), fb->id);
+ free(fb);
+ }
+ }
+
+ static Ecore_Drm_Fb *
+ _evas_outbuf_fb_get(Ecore_Drm_Device *dev, struct gbm_bo *bo)
+ {
+ int ret;
+ Ecore_Drm_Fb *fb;
+ uint32_t format;
+ uint32_t handles[4], pitches[4], offsets[4];
+
+ fb = gbm_bo_get_user_data(bo);
+ if (fb) return fb;
+
+ if (!(fb = calloc(1, sizeof(Ecore_Drm_Fb)))) return NULL;
+
+ format = gbm_bo_get_format(bo);
+
+ fb->w = gbm_bo_get_width(bo);
+ fb->h = gbm_bo_get_height(bo);
+ fb->hdl = gbm_bo_get_handle(bo).u32;
+ fb->stride = gbm_bo_get_stride(bo);
+ fb->size = fb->stride * fb->h;
+
+ handles[0] = fb->hdl;
+ pitches[0] = fb->stride;
+ offsets[0] = 0;
+
+ ret = drmModeAddFB2(dev->drm.fd, fb->w, fb->h, format,
+ handles, pitches, offsets, &(fb->id), 0);
+ if (ret)
+ ret = drmModeAddFB(dev->drm.fd, fb->w, fb->h, 24, 32,
+ fb->stride, fb->hdl, &(fb->id));
+
+ if (ret) ERR("FAILED TO ADD FB: %m");
+
+ gbm_bo_set_user_data(bo, fb, _evas_outbuf_fb_cb_destroy);
+
+ return fb;
+ }
+
+ static void
+ _evas_outbuf_cb_pageflip(void *data)
+ {
+ Outbuf *ob;
+ Ecore_Drm_Fb *fb;
+ struct gbm_bo *bo;
+
+ if (!(ob = data)) return;
+
+ bo = ob->priv.bo[ob->priv.curr];
+ if (!bo) return;
+
+ fb = _evas_outbuf_fb_get(ob->info->info.dev, bo);
+ if (fb) fb->pending_flip = EINA_FALSE;
+
+ gbm_surface_release_buffer(ob->surface, bo);
+
+ ob->priv.last = ob->priv.curr;
+ ob->priv.curr = (ob->priv.curr + 1) % ob->priv.num;
+ }
+
+ static void
+ _evas_outbuf_buffer_swap(Outbuf *ob, Eina_Rectangle *rects, unsigned int count)
+ {
+ Ecore_Drm_Fb *fb;
+
+ ob->priv.bo[ob->priv.curr] = gbm_surface_lock_front_buffer(ob->surface);
+ if (!ob->priv.bo[ob->priv.curr])
+ {
+ WRN("Could not lock front buffer: %m");
+ return;
+ }
+
+ fb = _evas_outbuf_fb_get(ob->info->info.dev, ob->priv.bo[ob->priv.curr]);
+ if (fb)
+ {
+ ecore_drm_fb_dirty(fb, rects, count);
+ ecore_drm_fb_set(ob->info->info.dev, fb);
+ ecore_drm_fb_send(ob->info->info.dev, fb, _evas_outbuf_cb_pageflip, ob);
+ }
+ }
+
+ static Eina_Bool
+ _evas_outbuf_make_current(void *data, void *doit)
+ {
+ Outbuf *ob;
+
+ if (!(ob = data)) return EINA_FALSE;
+
+ if (doit)
+ {
+ if (!eglMakeCurrent(ob->egl.disp, ob->egl.surface[0],
+ ob->egl.surface[0], ob->egl.context[0]))
+ return EINA_FALSE;
+ }
+ else
+ {
+ if (!eglMakeCurrent(ob->egl.disp, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT))
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+ }
+
+ static Eina_Bool
+ _evas_outbuf_init(void)
+ {
+ static int _init = 0;
+ if (_init) return EINA_TRUE;
-#ifdef EGL_MESA_platform_gbm
- ob->egl.disp =
- dlsym_eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, ob->info->info.gbm, NULL);
-#else
++//#ifdef EGL_MESA_platform_gbm
++// dlsym_eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
++// eglGetProcAddress("eglGetPlatformDisplayEXT");
++// EINA_SAFETY_ON_NULL_RETURN_VAL(dlsym_eglGetPlatformDisplayEXT, EINA_FALSE);
++// dlsym_eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
++// eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
++// EINA_SAFETY_ON_NULL_RETURN_VAL(dlsym_eglCreatePlatformWindowSurfaceEXT, EINA_FALSE);
++//#endif
+ _init = 1;
+ return EINA_TRUE;
+ }
+
+ static Eina_Bool
+ _evas_outbuf_egl_setup(Outbuf *ob)
+ {
+ int ctx_attr[3];
+ int cfg_attr[40];
+ int maj = 0, min = 0, n = 0, i = 0;
+ EGLint ncfg;
+ EGLConfig *cfgs;
+ const GLubyte *vendor, *renderer, *version, *glslversion;
+ Eina_Bool blacklist = EINA_FALSE;
+
+ if (!_evas_outbuf_init())
+ {
+ ERR("Could not initialize engine!");
+ return EINA_FALSE;
+ }
+
+ /* setup gbm egl surface */
+ ctx_attr[0] = EGL_CONTEXT_CLIENT_VERSION;
+ ctx_attr[1] = 2;
+ ctx_attr[2] = EGL_NONE;
+
+ cfg_attr[n++] = EGL_RENDERABLE_TYPE;
+ cfg_attr[n++] = EGL_OPENGL_ES2_BIT;
+ cfg_attr[n++] = EGL_SURFACE_TYPE;
+ cfg_attr[n++] = EGL_WINDOW_BIT;
+
+ cfg_attr[n++] = EGL_RED_SIZE;
+ cfg_attr[n++] = 1;
+ cfg_attr[n++] = EGL_GREEN_SIZE;
+ cfg_attr[n++] = 1;
+ cfg_attr[n++] = EGL_BLUE_SIZE;
+ cfg_attr[n++] = 1;
+
+
+ cfg_attr[n++] = EGL_ALPHA_SIZE;
+ if (ob->destination_alpha) cfg_attr[n++] = 1;
+ else cfg_attr[n++] = 0;
+ cfg_attr[n++] = EGL_NONE;
+
-#endif
++//#ifdef EGL_MESA_platform_gbm
++// ob->egl.disp =
++// dlsym_eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, ob->info->info.gbm, NULL);
++//#else
+ ob->egl.disp = eglGetDisplay((EGLNativeDisplayType)ob->info->info.gbm);
-#ifdef EGL_MESA_platform_gbm
- ob->egl.surface[0] =
- dlsym_eglCreatePlatformWindowSurfaceEXT(ob->egl.disp, ob->egl.config,
- ob->surface, NULL);
-#else
++//#endif
+ if (ob->egl.disp == EGL_NO_DISPLAY)
+ {
+ ERR("eglGetDisplay() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ if (!eglInitialize(ob->egl.disp, &maj, &min))
+ {
+ ERR("eglInitialize() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ eglBindAPI(EGL_OPENGL_ES_API);
+ if (eglGetError() != EGL_SUCCESS)
+ {
+ ERR("eglBindAPI() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ if (!eglGetConfigs(ob->egl.disp, NULL, 0, &ncfg) || (ncfg == 0))
+ {
+ ERR("eglGetConfigs() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ cfgs = malloc(ncfg * sizeof(EGLConfig));
+ if (!cfgs)
+ {
+ ERR("Failed to malloc space for egl configs");
+ return EINA_FALSE;
+ }
+
+ if (!eglChooseConfig(ob->egl.disp, cfg_attr, cfgs,
+ ncfg, &ncfg) || (ncfg == 0))
+ {
+ ERR("eglChooseConfig() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ for (; i < ncfg; ++i)
+ {
+ EGLint format;
+
+ if (!eglGetConfigAttrib(ob->egl.disp, cfgs[i], EGL_NATIVE_VISUAL_ID,
+ &format))
+ {
+ ERR("eglGetConfigAttrib() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ DBG("Config Format: %d", format);
+ DBG("OB Format: %d", ob->info->info.format);
+
+ if (format == (int)ob->info->info.format)
+ {
+ ob->egl.config = cfgs[i];
+ break;
+ }
+ }
+
-#endif
++//#ifdef EGL_MESA_platform_gbm
++// ob->egl.surface[0] =
++// dlsym_eglCreatePlatformWindowSurfaceEXT(ob->egl.disp, ob->egl.config,
++// ob->surface, NULL);
++//#else
+ ob->egl.surface[0] =
+ eglCreateWindowSurface(ob->egl.disp, ob->egl.config,
+ (EGLNativeWindowType)ob->surface, NULL);
- ob->w, ob->h, ob->rotation);
++//#endif
+ if (ob->egl.surface[0] == EGL_NO_SURFACE)
+ {
+ ERR("eglCreateWindowSurface() fail for %p. code=%#x",
+ ob->surface, eglGetError());
+ return EINA_FALSE;
+ }
+
+ ob->egl.context[0] =
+ eglCreateContext(ob->egl.disp, ob->egl.config, context, ctx_attr);
+ if (ob->egl.context[0] == EGL_NO_CONTEXT)
+ {
+ ERR("eglCreateContext() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ if (context == EGL_NO_CONTEXT) context = ob->egl.context[0];
+
+ if (eglMakeCurrent(ob->egl.disp, ob->egl.surface[0],
+ ob->egl.surface[0], ob->egl.context[0]) == EGL_FALSE)
+ {
+ ERR("eglMakeCurrent() fail. code=%#x", eglGetError());
+ return EINA_FALSE;
+ }
+
+ vendor = glGetString(GL_VENDOR);
+ renderer = glGetString(GL_RENDERER);
+ version = glGetString(GL_VERSION);
+ glslversion = glGetString(GL_SHADING_LANGUAGE_VERSION);
+ if (!vendor) vendor = (unsigned char *)"-UNKNOWN-";
+ if (!renderer) renderer = (unsigned char *)"-UNKNOWN-";
+ if (!version) version = (unsigned char *)"-UNKNOWN-";
+ if (!glslversion) glslversion = (unsigned char *)"-UNKNOWN-";
+ if (getenv("EVAS_GL_INFO"))
+ {
+ fprintf(stderr, "vendor : %s\n", vendor);
+ fprintf(stderr, "renderer: %s\n", renderer);
+ fprintf(stderr, "version : %s\n", version);
+ fprintf(stderr, "glsl ver: %s\n", glslversion);
+ }
+
+ if (strstr((const char *)vendor, "Mesa Project"))
+ {
+ if (strstr((const char *)renderer, "Software Rasterizer"))
+ blacklist = EINA_TRUE;
+ }
+ if (strstr((const char *)renderer, "softpipe"))
+ blacklist = EINA_TRUE;
+ if (strstr((const char *)renderer, "llvmpipe"))
+ blacklist = EINA_TRUE;
+
+ if ((blacklist) && (!getenv("EVAS_GL_NO_BLACKLIST")))
+ {
+ ERR("OpenGL Driver blacklisted:");
+ ERR("Vendor: %s", (const char *)vendor);
+ ERR("Renderer: %s", (const char *)renderer);
+ ERR("Version: %s", (const char *)version);
+ return EINA_FALSE;
+ }
+
+ ob->gl_context = glsym_evas_gl_common_context_new();
+ if (!ob->gl_context) return EINA_FALSE;
+
+ #ifdef GL_GLES
+ ob->gl_context->egldisp = ob->egl.disp;
+ ob->gl_context->eglctxt = ob->egl.context[0];
+ #endif
+
+ evas_outbuf_use(ob);
+ glsym_evas_gl_common_context_resize(ob->gl_context,
- ob->priv.num = 2;
++ ob->w, ob->h, ob->rotation, 1);
+
+ ob->surf = EINA_TRUE;
+
+ return EINA_TRUE;
+ }
+
++Ecore_Drm_Output*
++_evas_outbuf_output_find(unsigned int crtc_id)
++{
++ Ecore_Drm_Device *dev;
++ Ecore_Drm_Output *output;
++ Eina_List *devs = ecore_drm_devices_get();
++ Eina_List *l, *ll;
++
++ EINA_LIST_FOREACH(devs, l, dev)
++ EINA_LIST_FOREACH(dev->outputs, ll, output)
++ if (ecore_drm_output_crtc_id_get(output) == crtc_id)
++ return output;
++
++ return NULL;
++}
++
+ Outbuf *
+ evas_outbuf_new(Evas_Engine_Info_GL_Drm *info, int w, int h, Render_Engine_Swap_Mode swap_mode)
+ {
+ Outbuf *ob;
+ char *num;
+
+ if (!info) return NULL;
+
+ /* try to allocate space for outbuf */
+ if (!(ob = calloc(1, sizeof(Outbuf)))) return NULL;
+
+ win_count++;
+
+ ob->w = w;
+ ob->h = h;
+ ob->info = info;
+ ob->depth = info->info.depth;
+ ob->rotation = info->info.rotation;
+ ob->destination_alpha = info->info.destination_alpha;
+ /* ob->vsync = info->info.vsync; */
+ ob->swap_mode = swap_mode;
- glsym_evas_gl_common_context_resize(nob->gl_context, w, h, rot);
++ ob->priv.num = 4;
+
+ if ((num = getenv("EVAS_GL_DRM_BUFFERS")))
+ {
+ ob->priv.num = atoi(num);
+ if (ob->priv.num <= 0) ob->priv.num = 1;
+ else if (ob->priv.num > 4) ob->priv.num = 4;
+ }
+
+ /* if ((num = getenv("EVAS_GL_DRM_VSYNC"))) */
+ /* ob->vsync = atoi(num); */
+
+ if ((ob->rotation == 0) || (ob->rotation == 180))
+ _evas_outbuf_gbm_surface_create(ob, w, h);
+ else if ((ob->rotation == 90) || (ob->rotation == 270))
+ _evas_outbuf_gbm_surface_create(ob, h, w);
+
+ if (!_evas_outbuf_egl_setup(ob))
+ {
+ evas_outbuf_free(ob);
+ return NULL;
+ }
+
+ return ob;
+ }
+
+ void
+ evas_outbuf_free(Outbuf *ob)
+ {
+ int ref = 0;
+
+ win_count--;
+ evas_outbuf_use(ob);
+
+ if (ob == _evas_gl_drm_window) _evas_gl_drm_window = NULL;
+
+ if (ob->gl_context)
+ {
+ ref = ob->gl_context->references - 1;
+ glsym_evas_gl_common_context_free(ob->gl_context);
+ }
+
+ eglMakeCurrent(ob->egl.disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+ if (ob->egl.context[0] != context)
+ eglDestroyContext(ob->egl.disp, ob->egl.context[0]);
+
+ if (ob->egl.surface[0] != EGL_NO_SURFACE)
+ eglDestroySurface(ob->egl.disp, ob->egl.surface[0]);
+
+ _evas_outbuf_gbm_surface_destroy(ob);
+
+ if (ref == 0)
+ {
+ if (context) eglDestroyContext(ob->egl.disp, context);
+ eglTerminate(ob->egl.disp);
+ eglReleaseThread();
+ context = EGL_NO_CONTEXT;
+ }
+
+ free(ob);
+ }
+
+ void
+ evas_outbuf_use(Outbuf *ob)
+ {
+ Eina_Bool force = EINA_FALSE;
+
+ glsym_evas_gl_preload_render_lock(_evas_outbuf_make_current, ob);
+
+ if (_evas_gl_drm_window)
+ {
+ if (eglGetCurrentContext() != _evas_gl_drm_window->egl.context[0])
+ force = EINA_TRUE;
+ }
+
+ if ((_evas_gl_drm_window != ob) || (force))
+ {
+ if (_evas_gl_drm_window)
+ {
+ glsym_evas_gl_common_context_use(_evas_gl_drm_window->gl_context);
+ glsym_evas_gl_common_context_flush(_evas_gl_drm_window->gl_context);
+ }
+
+ _evas_gl_drm_window = ob;
+
+ if (ob)
+ {
+ if (ob->egl.surface[0] != EGL_NO_SURFACE)
+ {
+ if (eglMakeCurrent(ob->egl.disp, ob->egl.surface[0],
+ ob->egl.surface[0],
+ ob->egl.context[0]) == EGL_FALSE)
+ ERR("eglMakeCurrent() failed!");
+ }
+ }
+ }
+
+ if (ob) glsym_evas_gl_common_context_use(ob->gl_context);
+ }
+
+ void
+ evas_outbuf_resurf(Outbuf *ob)
+ {
+ if (ob->surf) return;
+ if (getenv("EVAS_GL_INFO")) printf("resurf %p\n", ob);
+
+ ob->egl.surface[0] =
+ eglCreateWindowSurface(ob->egl.disp, ob->egl.config,
+ (EGLNativeWindowType)ob->surface, NULL);
+
+ if (ob->egl.surface[0] == EGL_NO_SURFACE)
+ {
+ ERR("eglCreateWindowSurface() fail for %p. code=%#x",
+ ob->surface, eglGetError());
+ return;
+ }
+
+ if (eglMakeCurrent(ob->egl.disp, ob->egl.surface[0], ob->egl.surface[0],
+ ob->egl.context[0]) == EGL_FALSE)
+ ERR("eglMakeCurrent() failed!");
+
+ ob->surf = EINA_TRUE;
+ }
+
+ void
+ evas_outbuf_unsurf(Outbuf *ob)
+ {
+ if (!ob->surf) return;
+ if (!getenv("EVAS_GL_WIN_RESURF")) return;
+ if (getenv("EVAS_GL_INFO")) printf("unsurf %p\n", ob);
+
+ if (_evas_gl_drm_window)
+ glsym_evas_gl_common_context_flush(_evas_gl_drm_window->gl_context);
+ if (_evas_gl_drm_window == ob)
+ {
+ eglMakeCurrent(ob->egl.disp, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ if (ob->egl.surface[0] != EGL_NO_SURFACE)
+ eglDestroySurface(ob->egl.disp, ob->egl.surface[0]);
+ ob->egl.surface[0] = EGL_NO_SURFACE;
+
+ _evas_gl_drm_window = NULL;
+ }
+
+ ob->surf = EINA_FALSE;
+ }
+
+ void
+ evas_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth)
+ {
+ Evas_Public_Data *epd;
+ Evas_Engine_Info_GL_Drm *einfo;
+ Render_Engine *re;
+ struct gbm_surface *osurface;
+ Outbuf *nob;
+
+ if (depth == OUTBUF_DEPTH_INHERIT) depth = ob->depth;
+
+ epd = eo_data_scope_get(ob->evas, EVAS_CANVAS_CLASS);
+ EINA_SAFETY_ON_NULL_RETURN(epd);
+
+ re = epd->engine.data.output;
+ EINA_SAFETY_ON_NULL_RETURN(re);
+
+ einfo = ob->info;
+ osurface = ob->surface;
+
+ if ((ob->rotation == 0) || (ob->rotation == 180))
+ nob = evas_outbuf_new(einfo, w, h, ob->swap_mode);
+ else
+ nob = evas_outbuf_new(einfo, h, w, ob->swap_mode);
+
+ if (!nob)
+ {
+ ERR("Could not create new Outbuf");
+ return;
+ }
+
+ re->generic.software.ob->gl_context->references++;
+
+ evas_outbuf_free(ob);
+ re->generic.software.ob = NULL;
+
+ evas_outbuf_use(nob);
+
+ evas_render_engine_software_generic_update(&re->generic.software, nob, w, h);
+
+ re->generic.software.ob->gl_context->references--;
+
- else
++ glsym_evas_gl_common_context_resize(nob->gl_context, w, h, rot, 1);
+ }
+
+ Render_Engine_Swap_Mode
+ evas_outbuf_buffer_state_get(Outbuf *ob)
+ {
+ /* check for valid output buffer */
+ if (!ob) return MODE_FULL;
+
+ if (ob->swap_mode == MODE_AUTO && _extn_have_buffer_age)
+ {
+ Render_Engine_Swap_Mode swap_mode;
+ EGLint age = 0;
+
+ if (!eglQuerySurface(ob->egl.disp, ob->egl.surface[0],
+ EGL_BUFFER_AGE_EXT, &age))
+ age = 0;
+
+ if (age == 1) swap_mode = MODE_COPY;
+ else if (age == 2) swap_mode = MODE_DOUBLE;
+ else if (age == 3) swap_mode = MODE_TRIPLE;
+ else if (age == 4) swap_mode = MODE_QUADRUPLE;
+ else swap_mode = MODE_FULL;
+ if ((int)age != ob->priv.prev_age) swap_mode = MODE_FULL;
+ ob->priv.prev_age = age;
+
+ return swap_mode;
+ }
++ else if ((ob->swap_mode != MODE_AUTO) &&
++ (ob->swap_mode != MODE_FULL))
+ {
+ int delta;
+
+ delta = (ob->priv.last - ob->priv.curr +
+ (ob->priv.last > ob->priv.last ?
+ 0 : ob->priv.num)) % ob->priv.num;
+
+ switch (delta)
+ {
+ case 0:
+ return MODE_COPY;
+ case 1:
+ return MODE_DOUBLE;
+ case 2:
+ return MODE_TRIPLE;
+ case 3:
+ return MODE_QUADRUPLE;
+ default:
+ return MODE_FULL;
+ }
+ }
+
+ return ob->swap_mode;
+ }
+
+ int
+ evas_outbuf_rot_get(Outbuf *ob)
+ {
+ return ob->rotation;
+ }
+
+ Eina_Bool
+ evas_outbuf_update_region_first_rect(Outbuf *ob)
+ {
+ /* ob->gl_context->preserve_bit = GL_COLOR_BUFFER_BIT0_QCOM; */
+
+ glsym_evas_gl_preload_render_lock(_evas_outbuf_make_current, ob);
+ evas_outbuf_use(ob);
+
+ if (!_re_wincheck(ob)) return EINA_TRUE;
+
+ /* glsym_evas_gl_common_context_resize(ob->gl_context, ob->w, ob->h, ob->rotation); */
+ glsym_evas_gl_common_context_flush(ob->gl_context);
+ glsym_evas_gl_common_context_newframe(ob->gl_context);
+
+ return EINA_FALSE;
+ }
+
+ static void
+ _glcoords_convert(int *result, Outbuf *ob, int x, int y, int w, int h)
+ {
+ switch (ob->rotation)
+ {
+ case 0:
+ result[0] = x;
+ result[1] = ob->gl_context->h - (y + h);
+ result[2] = w;
+ result[3] = h;
+ break;
+ case 90:
+ result[0] = y;
+ result[1] = x;
+ result[2] = h;
+ result[3] = w;
+ break;
+ case 180:
+ result[0] = ob->gl_context->w - (x + w);
+ result[1] = y;
+ result[2] = w;
+ result[3] = h;
+ break;
+ case 270:
+ result[0] = ob->gl_context->h - (y + h);
+ result[1] = ob->gl_context->w - (x + w);
+ result[2] = h;
+ result[3] = w;
+ break;
+ default:
+ result[0] = x;
+ result[1] = ob->gl_context->h - (y + h);
+ result[2] = w;
+ result[3] = h;
+ break;
+ }
+ }
+
+ static void
+ _damage_rect_set(Outbuf *ob, int x, int y, int w, int h)
+ {
+ int rects[4];
+
+ if ((x == 0) && (y == 0) &&
+ (((w == ob->gl_context->w) && (h == ob->gl_context->h)) ||
+ ((h == ob->gl_context->w) && (w == ob->gl_context->h))))
+ return;
+
+ _glcoords_convert(rects, ob, x, y, w, h);
+ glsym_eglSetDamageRegionKHR(ob->egl.disp, ob->egl.surface[0], rects, 1);
+ }
+
+ void *
+ evas_outbuf_update_region_new(Outbuf *ob, int x, int y, int w, int h, int *cx EINA_UNUSED, int *cy EINA_UNUSED, int *cw EINA_UNUSED, int *ch EINA_UNUSED)
+ {
+ if ((w == ob->w) && (h == ob->h))
+ ob->gl_context->master_clip.enabled = EINA_FALSE;
+ else
+ {
+ ob->gl_context->master_clip.enabled = EINA_TRUE;
+ ob->gl_context->master_clip.x = x;
+ ob->gl_context->master_clip.y = y;
+ ob->gl_context->master_clip.w = w;
+ ob->gl_context->master_clip.h = h;
+
+ if (glsym_eglSetDamageRegionKHR)
+ _damage_rect_set(ob, x, y, w, h);
+ }
+
+ return ob->gl_context->def_surface;
+ }
+
+ void
+ evas_outbuf_update_region_push(Outbuf *ob, RGBA_Image *update EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
+ {
+ /* Is it really necessary to flush per region ? Shouldn't we be able to
+ still do that for the full canvas when doing partial update */
+ if (!_re_wincheck(ob)) return;
+ ob->drew = EINA_TRUE;
+ glsym_evas_gl_common_context_flush(ob->gl_context);
+ }
+
+ void
+ evas_outbuf_update_region_free(Outbuf *ob EINA_UNUSED, RGBA_Image *update EINA_UNUSED)
+ {
+ /* Nothing to do here as we don't really create an image per area */
+ }
+
+ void
+ evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
+ {
+ if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) goto end;
+
+ if (!_re_wincheck(ob)) goto end;
+ if (!ob->drew) goto end;
+
+ ob->drew = EINA_FALSE;
+ evas_outbuf_use(ob);
+ glsym_evas_gl_common_context_done(ob->gl_context);
+
+ if (!ob->vsync)
+ {
+ if (ob->info->info.vsync) eglSwapInterval(ob->egl.disp, 1);
+ else eglSwapInterval(ob->egl.disp, 0);
+ ob->vsync = 1;
+ }
+
+ if (ob->info->callback.pre_swap)
+ ob->info->callback.pre_swap(ob->info->callback.data, ob->evas);
+
+ if ((glsym_eglSwapBuffersWithDamage) && (rects) &&
+ (ob->swap_mode != MODE_FULL))
+ {
+ EGLint num = 0, *result = NULL, i = 0;
+ Tilebuf_Rect *r;
+
+ // if partial swaps can be done use re->rects
+ num = eina_inlist_count(EINA_INLIST_GET(rects));
+ if (num > 0)
+ {
+ result = alloca(sizeof(EGLint) * 4 * num);
+ EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
+ {
+ _glcoords_convert(&result[i], ob, r->x, r->y, r->w, r->h);
+ i += 4;
+ }
+ glsym_eglSwapBuffersWithDamage(ob->egl.disp, ob->egl.surface[0],
+ result, num);
+ }
+ }
+ else
+ eglSwapBuffers(ob->egl.disp, ob->egl.surface[0]);
+
+ if (ob->info->callback.post_swap)
+ ob->info->callback.post_swap(ob->info->callback.data, ob->evas);
+
+ if (rects)
+ {
+ Tilebuf_Rect *r;
+ Eina_Rectangle *res;
+ int num, i = 0;
+
+ num = eina_inlist_count(EINA_INLIST_GET(rects));
+ res = alloca(sizeof(Eina_Rectangle) * num);
+ EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
+ {
+ res[i].x = r->x;
+ res[i].y = r->y;
+ res[i].w = r->w;
+ res[i].h = r->h;
+ i++;
+ }
+
+ _evas_outbuf_buffer_swap(ob, res, num);
+ }
+ else
+ //Flush GL Surface data to Framebuffer
+ _evas_outbuf_buffer_swap(ob, NULL, 0);
+
+ ob->priv.frame_cnt++;
+
+ end:
+ //TODO: Need render unlock after drm page flip?
+ glsym_evas_gl_preload_render_unlock(_evas_outbuf_make_current, ob);
+ }
+
+ Evas_Engine_GL_Context *
+ evas_outbuf_gl_context_get(Outbuf *ob)
+ {
+ return ob->gl_context;
+ }
+
+ void *
+ evas_outbuf_egl_display_get(Outbuf *ob)
+ {
+ return ob->egl.disp;
+ }
+
+ Context_3D *
+ evas_outbuf_gl_context_new(Outbuf *ob)
+ {
+ Context_3D *ctx;
+ int context_attrs[3] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
+
+ if (!ob) return NULL;
+
+ ctx = calloc(1, sizeof(Context_3D));
+ if (!ctx) return NULL;
+
+ ctx->context = eglCreateContext(ob->egl.disp, ob->egl.config,
+ ob->egl.context[0], context_attrs);
+
+ if (!ctx->context)
+ {
+ ERR("EGL context creation failed.");
+ goto error;
+ }
+
+ ctx->display = ob->egl.disp;
+ ctx->surface = ob->egl.surface[0];
+
+ return ctx;
+
+ error:
+ free(ctx);
+ return NULL;
+ }
+
+ void
+ evas_outbuf_gl_context_free(Context_3D *ctx)
+ {
+ eglDestroyContext(ctx->display, ctx->context);
+ free(ctx);
+ }
+
+ void
+ evas_outbuf_gl_context_use(Context_3D *ctx)
+ {
+ if (eglMakeCurrent(ctx->display, ctx->surface,
+ ctx->surface, ctx->context) == EGL_FALSE)
+ ERR("eglMakeCurrent() failed.");
+ }
++
++void
++eng_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width EINA_UNUSED, int height, uint format EINA_UNUSED,
++ int sx EINA_UNUSED, int sy EINA_UNUSED, int sw EINA_UNUSED, int sh EINA_UNUSED,
++ int dx EINA_UNUSED, int dy EINA_UNUSED, int dw EINA_UNUSED, int dh EINA_UNUSED)
++{
++ Ecore_Drm_Output *output;
++ uint fb_handle, fb_fmt;
++ int fb_w, fb_h;
++ void *data;
++ struct drm_mode_map_dumb arg = {0,};
++ int fd = -1;
++
++ output = _evas_outbuf_output_find(ob->info->info.crtc_id);
++
++ /* TODO: should find the better way to find current framebuffer */
++ ecore_drm_output_current_fb_info_get(output, &fb_handle, &fb_w, &fb_h, &fb_fmt);
++ fd = ecore_drm_device_fd_get(ob->info->info.dev);
++
++ arg.handle = fb_handle;
++ if (drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &arg))
++ {
++ DBG("dump map failed");
++ return;
++ }
++
++ data = mmap(NULL, fb_w * fb_h * 4, PROT_READ|PROT_WRITE, MAP_SHARED,
++ fd, arg.offset);
++ if (data == MAP_FAILED)
++ {
++ DBG("mmap failed");
++ return;
++ }
++
++ memcpy(buffer, data, stride * height);
++
++ munmap(data, fb_w * fb_h * 4);
++}
}
static void
- eng_ector_renderer_draw(void *data, void *context EINA_UNUSED, void *surface, Ector_Renderer *renderer, Eina_Array *clips, Eina_Bool do_async EINA_UNUSED)
-eng_ector_renderer_draw(void *data, void *context, void *surface, Ector_Renderer *renderer, Eina_Array *clips, Eina_Bool do_async EINA_UNUSED)
++eng_ector_renderer_draw(void *data, void *context, void *surface, Ector_Renderer *renderer, Eina_Array *clips EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
{
- Evas_GL_Image *dst = surface;
+ Evas_GL_Image *glimg = surface;
+ RGBA_Image *img = glimg->im;
Evas_Engine_GL_Context *gc;
Render_Engine_GL_Generic *re = data;
- Eina_Rectangle *r;
Eina_Array *c;
- Eina_Rectangle clip;
- Eina_Array_Iterator it;
- unsigned int i;
+ Eina_Rectangle *r;
+
+ //TODO handle, clips properly
+ c = eina_array_new(1);
+ eina_array_push(c, eina_rectangle_new(0, 0, img->cache_entry.w, img->cache_entry.h));
gc = re->window_gl_context_get(re->software.ob);
- if (gc->dc->clip.use)
- {
- clip.x = gc->dc->clip.x;
- clip.y = gc->dc->clip.y;
- clip.w = gc->dc->clip.w;
- clip.h = gc->dc->clip.h;
- }
- else
- {
- clip.x = 0;
- clip.y = 0;
- clip.w = dst->w;
- clip.h = dst->h;
- }
-
- c = eina_array_new(8);
- if (clips)
- {
- EINA_ARRAY_ITER_NEXT(clips, i, r, it)
- {
- Eina_Rectangle *rc;
-
- rc = eina_rectangle_new(r->x, r->y, r->w, r->h);
- if (!rc) continue;
-
- if (eina_rectangle_intersection(rc, &clip))
- eina_array_push(c, rc);
- else
- eina_rectangle_free(rc);
- }
-
- if (eina_array_count(c) == 0 &&
- eina_array_count(clips) > 0)
- {
- eina_array_free(c);
- return;
- }
- }
-
- if (eina_array_count(c) == 0)
- eina_array_push(c, eina_rectangle_new(clip.x, clip.y, clip.w, clip.h));
-
+ gc->dc = context;
eo_do(renderer,
ector_renderer_draw(_evas_render_op_to_ector_rop(gc->dc->render_op),
c,
eina_array_free(c);
}
-static void *software_buffer = NULL;
+static void *
+eng_ector_surface_create(void *data, void *surface, int width, int height)
+{
+ Evas_GL_Image *glim;
- //@TODO hack to force the texture not to created in a texture atlas
- if (width < 256) width = 256;
- if (height < 256) height = 256;
+
+ if (!surface)
+ {
+ surface = eng_image_new_from_copied_data(data, width, height, NULL, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
+ }
+ else
+ {
+ int cur_w , cur_h;
+ glim = surface;
+ cur_w = glim->im->cache_entry.w;
+ cur_h = glim->im->cache_entry.h;
+ if (width != cur_w || height != cur_h)
+ {
+ eng_image_free(data, surface);
+ surface = eng_image_new_from_copied_data(data, width, height, NULL, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
+ }
+ }
+ // clear the buffer
+ glim = surface;
+ void *pixels = evas_cache_image_pixels(&glim->im->cache_entry);
+ memset(pixels, 0, width * height *4);
+ return surface;
+}
static void
- eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, void *surface, int x, int y, Eina_Bool do_async EINA_UNUSED)
+ eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector,
+ void *surface, int x, int y, Eina_Bool do_async EINA_UNUSED)
{
- Evas_Engine_GL_Context *gl_context;
- Render_Engine_GL_Generic *re = data;
int w, h;
- void *temp;
-
- re->window_use(re->software.ob);
- gl_context = re->window_gl_context_get(re->software.ob);
- evas_gl_common_context_target_surface_set(gl_context, surface);
- gl_context->dc = context;
-
- w = gl_context->w; h = gl_context->h;
-
- temp = software_buffer;
- software_buffer = realloc(software_buffer, sizeof (unsigned int) * w * h);
- if (!software_buffer)
- {
- ERR("Realloc failed!!");
- software_buffer = temp;
- return;
- }
- memset(software_buffer, 0, sizeof (unsigned int) * w * h);
+ Evas_GL_Image *glim = surface;
+ RGBA_Image *dst = glim->im;
+ w = dst->cache_entry.w;
+ h = dst->cache_entry.h;
+ void *pixels = evas_cache_image_pixels(&dst->cache_entry);
if (use_cairo)
{
- eo_do(_software_ector,
+ eo_do(ector,
- ector_cairo_software_surface_set(software_buffer, w, h),
+ ector_cairo_software_surface_set(pixels, w, h),
ector_surface_reference_point_set(x, y));
}
else
{
- eo_do(_software_ector,
+ eo_do(ector,
- ector_software_surface_set(software_buffer, w, h),
+ ector_software_surface_set(pixels, w, h),
ector_surface_reference_point_set(x, y));
}
}
static void
- eng_ector_end(void *data EINA_UNUSED, void *context EINA_UNUSED, void *surface EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
-eng_ector_end(void *data, void *context EINA_UNUSED, Ector_Surface *ector,
- void *surface EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
++eng_ector_end(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector, void *surface EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
{
- Evas_Engine_GL_Context *gl_context;
- Render_Engine_GL_Generic *re = data;
- Evas_GL_Image *im;
- int w, h;
- Eina_Bool mul_use;
-
- gl_context = re->window_gl_context_get(re->software.ob);
- w = gl_context->w; h = gl_context->h;
- mul_use = gl_context->dc->mul.use;
-
if (use_cairo)
{
- eo_do(_software_ector,
+ eo_do(ector,
ector_cairo_software_surface_set(NULL, 0, 0));
}
else
{
- eo_do(_software_ector,
+ eo_do(ector,
ector_software_surface_set(NULL, 0, 0));
}
-
- im = evas_gl_common_image_new_from_copied_data(gl_context, w, h, software_buffer, 1, EVAS_COLORSPACE_ARGB8888);
-
- if (!mul_use)
- {
- // @hack as image_draw uses below fields to do colour multiplication.
- gl_context->dc->mul.col = ector_color_multiply(0xffffffff,gl_context->dc->col.col);
- gl_context->dc->mul.use = EINA_TRUE;
- }
-
- // We actually just bluntly push the pixel all over the
- // destination surface. We don't have the actual information
- // of the widget size. This is not a problem.
- // Later on, we don't want that information and today when
- // using GL backend, you just need to turn on Evas_Map on
- // the Evas_Object_VG.
- evas_gl_common_image_draw(gl_context, im, 0, 0, w, h, 0, 0, w, h, 0);
-
- evas_gl_common_image_free(im);
-
- // restore gl state
- gl_context->dc->mul.use = mul_use;
}
static Evas_Func func, pfunc;
eina_mempool_free(_mp_command_ector_surface, ector_surface);
}
+static void *
+eng_ector_surface_create(void *data EINA_UNUSED, void *surface EINA_UNUSED, int width EINA_UNUSED, int height EINA_UNUSED)
+{
+ return NULL;
+}
+
static void
- eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, void *surface, int x, int y, Eina_Bool do_async)
+ eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector, void *surface, int x, int y, Eina_Bool do_async)
{
if (do_async)
{
NULL, // eng_texture_filter_set
NULL, // eng_texture_filter_get
NULL, // eng_texture_image_set
- eng_ector_get,
+ NULL, // eng_texture_image_get
+ NULL, // eng_output_copy
+ eng_ector_create,
+ eng_ector_destroy,
eng_ector_begin,
eng_ector_renderer_draw,
- eng_ector_end
+ eng_ector_end,
- eng_ector_surface_create
++ eng_ector_surface_create
/* FUTURE software generic calls go here */
};
struct _Native
{
Evas_Native_Surface ns;
+ struct wl_buffer *wl_buf;
void *egl_surface;
+
+ void *surface;
+};
+
+/* Evas GL wl_surface & wl_egl_window */
+typedef struct _Evgl_wl_Surface Evgl_wl_Surface;
+struct _Evgl_wl_Surface
+{
+ struct wl_surface *wl_surf;
+ struct wl_egl_window *egl_win;
};
/* local function prototypes */
FINDSYM(glsym_eglDestroyImage, "eglDestroyImageARB", glsym_func_void);
FINDSYM(glsym_eglDestroyImage, "eglDestroyImage", glsym_func_void);
- FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES",
+ FINDSYM(glsym_glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES",
glsym_func_void);
- FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageEXT",
+ FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageEXT",
glsym_func_uint);
- FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageINTEL",
+ FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamageINTEL",
glsym_func_uint);
- FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamage",
+ FINDSYM(glsym_eglSwapBuffersWithDamage, "eglSwapBuffersWithDamage",
glsym_func_uint);
+ FINDSYM(glsym_eglSetDamageRegionKHR, "eglSetDamageRegionKHR",
+ glsym_func_uint);
+
+ FINDSYM(glsym_eglQueryWaylandBufferWL, "eglQueryWaylandBufferWL",
+ glsym_func_uint);
done = EINA_TRUE;
}
evgl_eng_proc_address_get,
evgl_eng_string_get,
evgl_eng_rotation_angle_get,
- NULL, // PBuffer
- NULL, // PBuffer
+ evgl_eng_pbuffer_surface_create,
+ evgl_eng_pbuffer_surface_destroy,
- NULL, //gles1_surface_create
- NULL, // gles1_surface_destroy
- NULL, //native_win_surface_config_check
+ NULL, // OpenGL-ES 1
+ NULL, // OpenGL-ES 1
+ NULL, // OpenGL-ES 1
+ NULL, // native_win_surface_config_get
};
/* engine functions */
if (!(img = image)) return;
if (!(n = img->native.data)) return;
- if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
+ if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
+ {
+ if (n->egl_surface)
+ {
+ if (glsym_glEGLImageTargetTexture2DOES)
+ {
+ glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, n->egl_surface);
+ if (eglGetError() != EGL_SUCCESS)
+ ERR("glEGLImageTargetTexture2DOES() failed.");
+ }
+ else
+ ERR("Try glEGLImageTargetTexture2DOES on EGL with no support");
+ }
+ }
+ else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
{
glBindTexture(GL_TEXTURE_2D, n->ns.data.opengl.texture_id);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
- void *surface = glsym_evgl_native_surface_buffer_get(n->egl_surface);
+ else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
+ {
+ if (n->egl_surface)
+ {
++ void *surface = glsym_evgl_native_surface_buffer_get(n->egl_surface, NULL);
+ if (glsym_glEGLImageTargetTexture2DOES)
+ {
+ glsym_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, surface);
+ if (eglGetError() != EGL_SUCCESS)
+ ERR("glEGLImageTargetTexture2DOES() failed.");
+ }
+ else
+ ERR("Try glEGLImageTargetTexture2DOES on EGL with no support");
+ }
+ }
}
-static void
+static void
_native_cb_unbind(void *data EINA_UNUSED, void *image)
{
Evas_GL_Image *img;
if (!(img = image)) return;
if (!(n = img->native.data)) return;
- if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
+ if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
+ {
+ //glBindTexture(GL_TEXTURE_2D, 0); //really need?
+ }
+ else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
{
glBindTexture(GL_TEXTURE_2D, 0);
- GLERR(__FUNCTION__, __FILE__, __LINE__, "");
}
+ else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
+ {
+ // nothing
+ }
}
-static void
+static void
_native_cb_free(void *data, void *image)
{
Render_Engine *re;
Evas_GL_Image *img, *img2;
unsigned int tex = 0, fbo = 0;
uint32_t texid;
+ void *buffer = NULL;
+ void *wlid, *wl_buf = NULL;
if (!(re = (Render_Engine *)data)) return NULL;
if (!(ob = eng_get_ob(re))) return NULL;
return NULL;
}
- if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_OPENGL))
+ if (ns)
{
- tex = ns->data.opengl.texture_id;
- fbo = ns->data.opengl.framebuffer_id;
- if (img->native.data)
+ if (ns->type == EVAS_NATIVE_SURFACE_WL)
{
- Evas_Native_Surface *ens;
+ wl_buf = ns->data.wl.legacy_buffer;
+ if (img->native.data)
+ {
+ Evas_Native_Surface *ens;
- ens = img->native.data;
- if ((ens->data.opengl.texture_id == tex) &&
- (ens->data.opengl.framebuffer_id == fbo))
- return img;
+ ens = img->native.data;
+ if (ens->data.wl.legacy_buffer == wl_buf)
+ return img;
+ }
+ }
+ else if (ns->type == EVAS_NATIVE_SURFACE_OPENGL)
+ {
+ tex = ns->data.opengl.texture_id;
+ fbo = ns->data.opengl.framebuffer_id;
+ if (img->native.data)
+ {
+ Evas_Native_Surface *ens;
+
+ ens = img->native.data;
+ if ((ens->data.opengl.texture_id == tex) &&
+ (ens->data.opengl.framebuffer_id == fbo))
+ return img;
+ }
}
}
+ else if ((ns) && (ns->type == EVAS_NATIVE_SURFACE_EVASGL))
+ {
+ buffer = ns->data.evasgl.surface;
+ if (img->native.data)
+ {
+ Evas_Native_Surface *ens = img->native.data;
+ if (ens->data.evasgl.surface == buffer)
+ return img;
+ }
+ }
if ((!ns) && (!img->native.data)) return img;
/* try to allocate space for new render engine */
if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
- ob = _evas_outbuf_setup(w, h, rotation, depth, alpha, shm, surface);
+ ob = _evas_outbuf_setup(w, h, rotation, depth, alpha, shm, surface, disp);
if (!ob) goto err;
- if (!evas_render_engine_software_generic_init(&re->generic, ob,
+ if (!evas_render_engine_software_generic_init(&re->generic, ob,
- _evas_outbuf_swapmode_get,
+ _evas_outbuf_swap_mode_get,
_evas_outbuf_rotation_get,
NULL,
- NULL,
+ NULL,
_evas_outbuf_update_region_new,
_evas_outbuf_update_region_push,
_evas_outbuf_update_region_free,
if (!(re = epd->engine.data.output))
{
/* if we have no engine data, assume we have not initialized yet */
- evas_common_cpu_init();
- evas_common_blend_init();
- evas_common_image_init();
- evas_common_convert_init();
- evas_common_scale_init();
- evas_common_rectangle_init();
- evas_common_polygon_init();
- evas_common_line_init();
- evas_common_font_init();
- evas_common_draw_init();
- evas_common_tilebuf_init();
+ evas_common_init();
re = _render_engine_swapbuf_setup(epd->output.w, epd->output.h,
- einfo->info.rotation,
- einfo->info.depth,
+ einfo->info.rotation,
+ einfo->info.depth,
einfo->info.destination_alpha,
- einfo->info.wl_shm,
+ einfo->info.wl_shm,
- einfo->info.wl_surface);
+ einfo->info.wl_surface,
+ einfo->info.wl_disp);
- if (re)
+ if (re)
- {
- re->generic.ob->info = einfo;
- if (re->generic.ob->surface)
- {
- re->generic.ob->surface->callback.released = einfo->callback.released;
- re->generic.ob->surface->callback.data = einfo->callback.data;
- }
- }
+ re->generic.ob->info = einfo;
else
goto err;
}
{
Outbuf *ob;
- ob = _evas_outbuf_setup(epd->output.w, epd->output.h,
- einfo->info.rotation, einfo->info.depth,
- einfo->info.destination_alpha,
+ ob = _evas_outbuf_setup(epd->output.w, epd->output.h,
+ einfo->info.rotation, einfo->info.depth,
+ einfo->info.destination_alpha,
- einfo->info.wl_shm,
- einfo->info.wl_surface);
+ einfo->info.wl_shm, einfo->info.wl_surface,
+ einfo->info.wl_disp);
if (ob)
{
ob->info = einfo;
- if (ob->surface)
- {
- ob->surface->callback.released = einfo->callback.released;
- ob->surface->callback.data = einfo->callback.data;
- }
- evas_render_engine_software_generic_update(&re->generic, ob,
- epd->output.w,
+ evas_render_engine_software_generic_update(&re->generic, ob,
+ epd->output.w,
epd->output.h);
}
}