diff options
Diffstat (limited to 'meta-ivi/recipes-graphics/wayland/weston-1.6.0/0003-ivi-shell-add-IVI-layout-APIs.patch')
-rw-r--r-- | meta-ivi/recipes-graphics/wayland/weston-1.6.0/0003-ivi-shell-add-IVI-layout-APIs.patch | 5642 |
1 files changed, 0 insertions, 5642 deletions
diff --git a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0003-ivi-shell-add-IVI-layout-APIs.patch b/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0003-ivi-shell-add-IVI-layout-APIs.patch deleted file mode 100644 index 94919dd..0000000 --- a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0003-ivi-shell-add-IVI-layout-APIs.patch +++ /dev/null @@ -1,5642 +0,0 @@ -From f67d989f4b5e1ffd7e6cc562bf6065917b748342 Mon Sep 17 00:00:00 2001 -From: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> -Date: Tue, 6 May 2014 17:25:31 +0900 -Subject: [PATCH 03/15] ivi-shell: add IVI layout APIs - -- ivi-layout.so -- introduces ivi-layout-export.h, ivi-layout.[ch] - -API set of controlling properties of surface and layer which groups -surfaces. An unique ID whose type is integer is required to create -surface and layer. With the unique ID, surface and layer are identified -to control them. The API set consists of APIs to control properties of -surface and layers about followings, - -- visibility. -- opacity. -- clipping (x,y,width,height). -- position and size of it to be displayed. -- orientation per 90 degree. -- add or remove surfaces to a layer. -- order of surfaces/layers in layer/screen to be displayed. -- commit to apply property changes. -- notifications of property change. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -ivi-layout: fix calculation of view scale. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> --------------------------------------------------------- -ivi-shell/ivi-layout.[ch] from transition animation - --------------------------------------------------------- -ivi-shell/ivi-layout-export.h from transition animation - --------------------------------------------------------- -ivi-shell/ivi-layout-private.h from transition animation - --------------------------------------------------------- -ivi-shell: Add IVI layout APIs - ivi_layout_surfaceGetWestonSurface - ivi_layout_surfaceGetSize These are used by screenshot APIs. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - -------------------------------------------------------- -update for configure support - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------- -ivi-shell: transition animation support - -- introduces ivi-shell/ivi-layout-transition.[ch] - -interpolate animation when an atribute of surface is changed by -commitChanges. - ------------------------------------------------------------ -update for configure support for transition animation - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Insert a space between "void" and "(*". - -> > In all function pointer type definitions, need a space between "void" -> > and "(*". -> [ntanibata] I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> ------------------------------------------------------------ - -ivi-shell: Define return type. - -> > Hm, the return type is unsigned, so -1 makes little sense. Should -> > there -> > be something like #define IVI_INVALID_ID 0xffffffff and the use -> > that? -> [ntanibata] I agree. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete unused APIs - -> What is color? An array? How many bits per channel? -> What if the output or buffer is at different bit depth? -> [ntanibata] This is not valid. I will remove. - -> What are capabilities? -> [ntanibata] This is not valid now. I will remove. - -> What is a layer type? -> [ntanibata] This is not valid now. I will remove. - -> Unimplemented... how would you use this? -> How would you set the content? -> [ntanibata] This is not valid now. I will remove. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: remove commented-out code - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete input acceptance function. - -> > Is this really necessary, when you could be forcing the input region -> > of -> > weston_surface? What are 'devices' and... -> > -> > Oh, I see that this function is not actually implemented. You should -> > remove -> > all functions you do not implement. You can add the implementations -> > later, -> > and if you need the stubs to be able to test non-upstream code, you -> > can -> > keep the stubs in your own repository. -> > -> [ntanibata] I agree. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: layout APIs header, clean up public and private ones in two -headers, ivi-layout-export/private.h - -> b40fdf4 ivi-shell: add IVI layout APIs -> -> Header rearrangements? -> What are the API stability guarantees? -> New title: "ivi-shell: add ivi-layout.so module and API" - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Changed stdbool from uint32_t - -> Supposedly visibility is a boolean? Non-zero means visible? -> [ntanibata] It should be a Boolean. I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Change the return-type of APIs to void if it had not used. - -> > It's kind of strange to see this sort of function being able to -> > return -> > failure. How could it reasonably fail? -> > -> > Looking at your implementation, it cannot fail, unless the caller -> > made -> > a mistake. It is worth returning a failure only if the called can -> > sensibly -> > react to or recover from it. -> > -> > Couldn't this (and all other remove functions) just return void? -> > -> > You can still do the sanity check in the code and log an error, but -> > I -> don't -> > see value in returning the error from the function. Is there some -> > value? -> > -> [ntanibata] I will change it to void. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -Change return-type of getter of properties APIs to const properties pointer. - -> > Any particular reason to return a copy, rather than a const pointer to -> > the original? -> [ntanibata] I will check. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Return the requested value in the return value. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Change type of orientation value int32_t to wl_output_transform. - -> > > > What is 'orientation'? enum wl_output_transform? -> > > [ntanibata] rotate surface/layer with 0,90,180,270 degree. -> > -> > Yeah, I guessed that much, but what is the actual API here? :-) -> > The values from enum wl_output_transform? -> [ntanibata] they are from here. However, it should use enum -> defined in Weston. I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete functions of Keyboard focus. - -> > Keyboard focus of which weston_seat? How do you handle multiple -> > weston_seats? -> [ntanibata] This would be discuss later with patch of src/input.c. -> For the time being, this will be removed. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Replace allocation check assert to if-statement. - -> > Heh, considering your usual paranoid pointer checks, using an assert -> > here is surprising. ;-) -> > -> > I think in Weston we are accustomed to check the return value from -> > malloc() and propagate the failure, even though it usually is in -> > vain. -> > -> > assert()s should be reserved for programmer errors. -> [ntanibata] I see. I will fix. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete needless memory allocation. - -> > Just allocate it from stack instead? -> [ntanibata] I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Use the weston_config that has already been created. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Output log when mamory allocation fails. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete cursor check. - -> > > > What is this about? -> > > > Why would you remove the cursor_layer? -> > > > Also, there is a default cursor theme if nothing is set in -> > > > weston.ini. -> > > [ntanibata] I think I should add comments clearly. -> > > If cursor-theme is not set, I want to disable showing cursor -> > > because cursor is not mandatory on ivi system e.g with touch -> > > panel. -> > > So I call wl_list_remove. -> > -> > But a cursor theme has nothing to do whether a cursor will be shown. -> > If no theme is set, a default theme is used (and if that does not -> > exist, a built-in theme from libwayland-cursor gets used). So there -> > is always some theme, regardless of settings. -> > -> > A cursor will be shown, if the compositor has a wl_pointer device (a -> > mouse). -> > If there are no wl_pointer devices, there are also no cursors. -> > That is how Weston works already. -> [ntanibata] Oh, I see. This feature fix may use case. So I will remove -> this code. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Fix ivi_layout_layerGetDimension - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Change int type from array type - -> Just one value? Or is it supposed to be an array of two values? -> [ntanibata] It is an array two values. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Delete unsupported APIs. - -> > Why would an external module want to know? It cannot really do -> > anything -> > with that information, can it? -> > -> > Handling hardware overlays is an internal detail of a Weston -> > backend, and -> > deliberately not exposed to clients, and not even to outside of the -> > backend really. -> [ntanibata] I will remote this API. This is just a history from Layer -> manager - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ------------------------------------------------------------ -ivi-shell: Modification of function name - -> "identifier"? -> [ntanibata] right. I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Fix comment out message - -> Twice? -> [ntanibata] Oh, I will remove one. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Add function header comments. - -> > What is this for really? The implementation looks suspiciously -> > broken, -> > depending on how it is supposed to be used. -> [ntanibata] If this is not used, I will remove. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- - -ivi-shell: Fix ivi_layout_surfaceSetPosition. Change int type from array type - -> Again, array of two or? -> [ntanibata] I will fix. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- - -Add comments: what happens when commitchange is called during transition -animation in comment of ivi-layout.c - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Delete ivi_layout_surface_pixelformat - -> Does this pixel format enumeration come from somewhere, or was it -> invented here? Or are you removing it with the unsupported/unused features? -> [ntanibata]Yes, I will remove them. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Change quoted_printable_encode form camelcase - -> Is the style here, that all internal and Weston core facing things are -> named with underscores, and all ivi-layout public API is in CamelCase? -> [ntanibata] I will change them to underscores to avoid CamelCase. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -add FIXME at calling clock_gettime - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Replace list_thing with thing_list. - -> > We'd prefer naming it as thing_list, not list_thing. Like in English -> > you can have a "note list" meaning a "list of notes", while "list -> > note" -> > sounds like it is one note about a list. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Declare variable in the beginning of a block. - -> > Declarations mixed up with code. Our style has declarations only in -> > the beginning of a block. -> [ntanibata] I will fix it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout.c, clean-up definition of valueable in the middle function. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout.c, remove #if 0 - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- - ivi-shell: ivi-layout-transition.c, clean-up definition of valueable in the middle - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- - ivi-shell: ivi-layout-transition.c, remove code commented out - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout, modify comments, surface/layer/screen -> ivi_* - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Delete duplicated of definition. - -> > > > Looks identical to enum ivi_layout_transition_type, do you -> > > > really need another? -> > > [ntanibata] Question: Do you mean why there are many types? -> > -> > Why define ivi_layout_inner_transition_type, when -> > ivi_layout_transition_type is already the same down to the actual -> > values, if I'm not mistaken? -> > -> > Why not just use ivi_layout_transition_type everywhere? -> [ntanibata] Oh, I see "inner". I will fix them. I jumped the gun:) - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout-export/private.h, reorgenize two interface from private to export because it is used by hmi-controller.c - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Use error-code defined in ivi-application-protocol. - -> > You also need to add the two error codes into ivi-application -> > interface and use those instead of WL_DISPLAY_ERROR_INVALID_OBJECT. -> [ntanibata] I will fix this according to two error codes. -> <enum name="error"> -> <entry name="role" value="0" summary="given wl_surface has -> another role"/> -> <entry name="ivi_id" value="1" summary="given ivi_id is assigned -> to another wl_surface"/> -> </enum> -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Amend wrong comments regarding return values: - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Fix transition bug on visibility change. - -This is embeded during cleaning up code. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Qualify const modifier to readonly argument. - -This is embded during cleaning up code before. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Fix invalid type. - -> prop->opacity = wlfixedfrom_double(1.0); -> What? 'opacity' is a float, isn't it? - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell:ivi-layout.c Change type of calculatable variables to signed from unsigned - -> FWIW, if you are going to do calculations with these variables, they -> should be signed. If you mix unsigned and signed variables in -> calculations, the result is probably not what you expect in all cases. -> This is just a reminder for you, that you might want to change these in the future. -> Weston core categorically uses signed variables for anything that is -> involved in calculations, even if negative values would not make any -> sense for a particular variable. -> Counters (that may wrap around) are of course better stored as unsigned. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -Makefile.am: clean up Makefile.am with FR3 for ivi-layout - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -configure.ac: remove checking module cairo. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout-export.h, remove unused member of structure. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout-transition, remove wl_event_source_timer_update -because The timer is already disarmed when you create it. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout-export.h, add an explanation of what kind of -stability guarantees this API -and ABI should have. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Move functions that are not used by other to private.h from export.h. - -> +WL_EXPORT int32_t +ivi_layout_surface_get_dimension(struct -> ivi_layout_surface ivisurf, + int32_t dest_width, int32_t +*dest_height) -> Does this function need to be WL_EXPORT? -> hmi-controller does not use it, and it is exposed to ivi-shell.so via -> struct ivi_layout_interface. - -For the time being, there are some APIs which is not used by -hmi-controller.c. but it is used by ivi-controller.so maintained by -another project. I will add reference implementation for them later in -hmi-controller.c - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: ivi-layout-export.h remove type of ivi_layout_layer_properties - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: Rename confusing functions - -> .oO( That looks strange, it's returning either 0 or 1 as an identifier. -> Maybe this has nothing to do with identifiers... ) - -This callback is to detect whether transition happens or not. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout-private/export.h, move struct ivi_layout_interface declarations from > ivi-layout-export.h into ivi-layout-private.h - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout.c, Remove casts to (void) - -> I don't think we need these casts. The warning about unused arguments is disabled, isn't it? -> You should be able to remove casts to (void) from all places. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: private.h, remove WL_EXPORT definition of ivi_layout_interface - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: remove ivi_layout_surface_set_native_content. - -There are two use case to -- create ivi_surface without wl_surface to set property in advanced -- keep property per ID during deletion of ivi_surface. - -This is supported later. For the time being, remove this function. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: Fix invalid memory read/write. correct destruction methods - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: code style clean up - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: revert destruction method to re-organize them. - -This commit is a target of this revert. -https://github.com/ntanibata/weston-ivi-shell/commit/f097ccf90a12efad954228f2534a4cad8f578d19 - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout: remove unused function. This was called from ivi-shell. -However it is not called anymore after code clean up. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-shell: ivi-layout.c, Remove all configure event on specified surface. - -Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> - ----------------------------------------------------------- -ivi-layout.c: remove unneeded casts - -Also a couple of whitespace fixes. - -ivi-layout.c: reflow long lines - ----------------------------------------------------------- -ivi-layout.c: simplify add_link_to_surface() - -There is a way to make this function even simpler. - -If you guarantee, that it is always legal to call wl_list_remove() on the -link, this function could literally be just: - -wl_list_remove(&link_layer->link_to_layer); -wl_list_insert(&ivilayer->link_to_surface, &link_layer->link_to_layer); - -You would go from an O(n) operation to O(1) operation! ---- - Makefile.am | 20 + - configure.ac | 9 + - ivi-shell/ivi-layout-export.h | 689 +++++++++ - ivi-shell/ivi-layout-private.h | 319 +++++ - ivi-shell/ivi-layout-transition.c | 1111 +++++++++++++++ - ivi-shell/ivi-layout.c | 2809 +++++++++++++++++++++++++++++++++++++ - 6 files changed, 4957 insertions(+) - create mode 100644 ivi-shell/ivi-layout-export.h - create mode 100644 ivi-shell/ivi-layout-private.h - create mode 100644 ivi-shell/ivi-layout-transition.c - create mode 100644 ivi-shell/ivi-layout.c - -diff --git a/Makefile.am b/Makefile.am -index 2330933..812b4bd 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -720,6 +720,26 @@ nodist_fullscreen_shell_la_SOURCES = \ - BUILT_SOURCES += $(nodist_fullscreen_shell_la_SOURCES) - endif - -+if ENABLE_IVI_SHELL -+ -+module_LTLIBRARIES += \ -+ $(ivi_layout) -+ -+ivi_layout = ivi-layout.la -+ivi_layout_la_LDFLAGS = -module -avoid-version -+ivi_layout_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la -+ivi_layout_la_CFLAGS = $(GCC_CFLAGS) $(COMPOSITOR_CFLAGS) -+ivi_layout_la_SOURCES = \ -+ ivi-shell/ivi-layout-export.h \ -+ ivi-shell/ivi-layout-private.h \ -+ ivi-shell/ivi-layout.c \ -+ ivi-shell/ivi-layout-transition.c -+ -+BUILT_SOURCES += $(nodist_ivi_layout_la_SOURCES) -+ -+endif -+ -+ - if ENABLE_SCREEN_SHARING - - module_LTLIBRARIES += screen-share.la -diff --git a/configure.ac b/configure.ac -index 05e883d..e45dbeb 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -434,6 +434,13 @@ if test "x$enable_dbus" != "xno"; then - fi - AM_CONDITIONAL(ENABLE_DBUS, test "x$enable_dbus" = "xyes") - -+# ivi-shell support -+AC_ARG_ENABLE(ivi-shell, -+ AS_HELP_STRING([--disable-ivi-shell], -+ [do not build ivi-shell server plugin and client]),, -+ enable_ivi_shell=yes) -+AM_CONDITIONAL(ENABLE_IVI_SHELL, test "x$enable_ivi_shell" = "xyes") -+ - AC_ARG_ENABLE(wcap-tools, [ --disable-wcap-tools],, enable_wcap_tools=yes) - AM_CONDITIONAL(BUILD_WCAP_TOOLS, test x$enable_wcap_tools = xyes) - if test x$enable_wcap_tools = xyes; then -@@ -523,6 +530,8 @@ AC_MSG_RESULT([ - XWayland ${enable_xwayland} - dbus ${enable_dbus} - -+ ivi-shell ${enable_ivi_shell} -+ - Build wcap utility ${enable_wcap_tools} - Build Fullscreen Shell ${enable_fullscreen_shell} - -diff --git a/ivi-shell/ivi-layout-export.h b/ivi-shell/ivi-layout-export.h -new file mode 100644 -index 0000000..18b1dc3 ---- /dev/null -+++ b/ivi-shell/ivi-layout-export.h -@@ -0,0 +1,689 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and -+ * its documentation for any purpose is hereby granted without fee, provided -+ * that the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the copyright holders not be used in -+ * advertising or publicity pertaining to distribution of the software -+ * without specific, written prior permission. The copyright holders make -+ * no representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER -+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+/** -+ * The ivi-layout library supports API set of controlling properties of -+ * surface and layer which groups surfaces. An unique ID whose type is integer -+ * is required to create surface and layer. With the unique ID, surface and -+ * layer are identified to control them. The API set consists of APIs to control -+ * properties of surface and layers about followings, -+ * - visibility. -+ * - opacity. -+ * - clipping (x,y,width,height). -+ * - position and size of it to be displayed. -+ * - orientation per 90 degree. -+ * - add or remove surfaces to a layer. -+ * - order of surfaces/layers in layer/screen to be displayed. -+ * - commit to apply property changes. -+ * - notifications of property change. -+ * -+ * Management of surfaces and layers grouping these surfaces are common -+ * way in In-Vehicle Infotainment system, which integrate several domains -+ * in one system. A layer is allocated to a domain in order to control -+ * application surfaces grouped to the layer all together. -+ * -+ * This API and ABI follow following specifications. -+ * http://projects.genivi.org/wayland-ivi-extension/layer-manager-apis -+ */ -+ -+#ifndef _IVI_LAYOUT_EXPORT_H_ -+#define _IVI_LAYOUT_EXPORT_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+#include "stdbool.h" -+#include "compositor.h" -+ -+#define IVI_SUCCEEDED (0) -+#define IVI_FAILED (-1) -+ -+struct ivi_layout_layer; -+struct ivi_layout_screen; -+struct ivi_layout_surface; -+ -+struct ivi_layout_surface_properties -+{ -+ wl_fixed_t opacity; -+ int32_t source_x; -+ int32_t source_y; -+ int32_t source_width; -+ int32_t source_height; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t start_width; -+ int32_t start_height; -+ int32_t dest_x; -+ int32_t dest_y; -+ int32_t dest_width; -+ int32_t dest_height; -+ enum wl_output_transform orientation; -+ bool visibility; -+ int32_t transition_type; -+ uint32_t transition_duration; -+}; -+ -+struct ivi_layout_layer_properties -+{ -+ wl_fixed_t opacity; -+ int32_t source_x; -+ int32_t source_y; -+ int32_t source_width; -+ int32_t source_height; -+ int32_t dest_x; -+ int32_t dest_y; -+ int32_t dest_width; -+ int32_t dest_height; -+ enum wl_output_transform orientation; -+ uint32_t visibility; -+ int32_t transition_type; -+ uint32_t transition_duration; -+ double start_alpha; -+ double end_alpha; -+ uint32_t is_fade_in; -+}; -+ -+enum ivi_layout_notification_mask { -+ IVI_NOTIFICATION_NONE = 0, -+ IVI_NOTIFICATION_OPACITY = (1 << 1), -+ IVI_NOTIFICATION_SOURCE_RECT = (1 << 2), -+ IVI_NOTIFICATION_DEST_RECT = (1 << 3), -+ IVI_NOTIFICATION_DIMENSION = (1 << 4), -+ IVI_NOTIFICATION_POSITION = (1 << 5), -+ IVI_NOTIFICATION_ORIENTATION = (1 << 6), -+ IVI_NOTIFICATION_VISIBILITY = (1 << 7), -+ IVI_NOTIFICATION_PIXELFORMAT = (1 << 8), -+ IVI_NOTIFICATION_ADD = (1 << 9), -+ IVI_NOTIFICATION_REMOVE = (1 << 10), -+ IVI_NOTIFICATION_CONFIGURE = (1 << 11), -+ IVI_NOTIFICATION_ALL = 0xFFFF -+}; -+ -+enum ivi_layout_transition_type{ -+ IVI_LAYOUT_TRANSITION_NONE, -+ IVI_LAYOUT_TRANSITION_VIEW_DEFAULT, -+ IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY, -+ IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY, -+ IVI_LAYOUT_TRANSITION_LAYER_FADE, -+ IVI_LAYOUT_TRANSITION_LAYER_MOVE, -+ IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER, -+ IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE, -+ IVI_LAYOUT_TRANSITION_VIEW_RESIZE, -+ IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ IVI_LAYOUT_TRANSITION_MAX, -+}; -+ -+typedef void (*layer_property_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ const struct ivi_layout_layer_properties *, -+ enum ivi_layout_notification_mask mask, -+ void *userdata); -+ -+typedef void (*surface_property_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ const struct ivi_layout_surface_properties *, -+ enum ivi_layout_notification_mask mask, -+ void *userdata); -+ -+typedef void (*layer_create_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ void *userdata); -+ -+typedef void (*layer_remove_notification_func)( -+ struct ivi_layout_layer *ivilayer, -+ void *userdata); -+ -+typedef void (*surface_create_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*surface_remove_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*surface_configure_notification_func)( -+ struct ivi_layout_surface *ivisurf, -+ void *userdata); -+ -+typedef void (*ivi_controller_surface_content_callback)( -+ struct ivi_layout_surface *ivisurf, -+ int32_t content, -+ void *userdata); -+ -+/** -+ * \brief register for notification when layer is created -+ */ -+int32_t -+ivi_layout_add_notification_create_layer( -+ layer_create_notification_func callback, -+ void *userdata); -+ -+void -+ivi_layout_remove_notification_create_layer( -+ layer_create_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief register for notification when layer is removed -+ */ -+int32_t -+ivi_layout_add_notification_remove_layer( -+ layer_remove_notification_func callback, -+ void *userdata); -+ -+void -+ivi_layout_remove_notification_remove_layer( -+ layer_remove_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief register for notification when surface is created -+ */ -+int32_t -+ivi_layout_add_notification_create_surface( -+ surface_create_notification_func callback, -+ void *userdata); -+ -+void -+ivi_layout_remove_notification_create_surface( -+ surface_create_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief register for notification when surface is removed -+ */ -+int32_t -+ivi_layout_add_notification_remove_surface( -+ surface_remove_notification_func callback, -+ void *userdata); -+ -+void -+ivi_layout_remove_notification_remove_surface( -+ surface_remove_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief register for notification when surface is configured -+ */ -+int32_t -+ivi_layout_add_notification_configure_surface( -+ surface_configure_notification_func callback, -+ void *userdata); -+ -+void -+ivi_layout_remove_notification_configure_surface( -+ surface_configure_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief get id of surface from ivi_layout_surface -+ * -+ * \return id of surface -+ */ -+uint32_t -+ivi_layout_get_id_of_surface(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief get id of layer from ivi_layout_layer -+ * -+ * -+ * \return id of layer -+ */ -+uint32_t -+ivi_layout_get_id_of_layer(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief get ivi_layout_surface from id of surface -+ * -+ * \return (struct ivi_layout_surface *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+struct ivi_layout_surface * -+ivi_layout_get_surface_from_id(uint32_t id_surface); -+ -+/** -+ * \brief get ivi_layout_screen from id of screen -+ * -+ * \return (struct ivi_layout_screen *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+struct ivi_layout_screen * -+ivi_layout_get_screen_from_id(uint32_t id_screen); -+ -+/** -+ * \brief Get the screen resolution of a specific screen -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_screen_resolution(struct ivi_layout_screen *iviscrn, -+ int32_t *pWidth, -+ int32_t *pHeight); -+ -+/** -+ * \brief Set an observer callback for surface content status change. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_content_observer( -+ struct ivi_layout_surface *ivisurf, -+ ivi_controller_surface_content_callback callback, -+ void* userdata); -+ -+/** -+ * \brief Get the layer properties -+ * -+ * \return (const struct ivi_layout_layer_properties *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+const struct ivi_layout_layer_properties * -+ivi_layout_get_properties_of_layer(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief Get the screens -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_screens(int32_t *pLength, struct ivi_layout_screen ***ppArray); -+ -+/** -+ * \brief Get the screens under the given layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_screens_under_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_screen ***ppArray); -+ -+/** -+ * \brief Get all Layers which are currently registered and managed -+ * by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_layers(int32_t *pLength, struct ivi_layout_layer ***ppArray); -+ -+/** -+ * \brief Get all Layers under the given surface -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_layers_under_surface(struct ivi_layout_surface *ivisurf, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray); -+ -+/** -+ * \brief Get all Surfaces which are currently registered and managed -+ * by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_surfaces(int32_t *pLength, struct ivi_layout_surface ***ppArray); -+ -+/** -+ * \brief Create a layer which should be managed by the service -+ * -+ * \return (struct ivi_layout_layer *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+struct ivi_layout_layer * -+ivi_layout_layer_create_with_dimension(uint32_t id_layer, -+ int32_t width, int32_t height); -+ -+/** -+ * \brief Removes a layer which is currently managed by the service -+ */ -+void -+ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief Set the visibility of a layer. If a layer is not visible, the -+ * layer and its surfaces will not be rendered. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer, -+ bool newVisibility); -+ -+/** -+ * \brief Set the opacity of a layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, -+ wl_fixed_t opacity); -+ -+/** -+ * \brief Get the opacity of a layer. -+ * -+ * \return opacity if the method call was successful -+ * \return wl_fixed_from_double(0.0) if the method call was failed -+ */ -+wl_fixed_t -+ivi_layout_layer_get_opacity(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief Set the area of a layer which should be used for the rendering. -+ * -+ * Only this part will be visible. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_source_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+/** -+ * \brief Set the destination area on the display for a layer. -+ * -+ * The layer will be scaled and positioned to this rectangle -+ * for rendering -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_destination_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+/** -+ * \brief Get the horizontal and vertical position of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_get_position(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_x, int32_t *dest_y); -+ -+/** -+ * \brief Sets the horizontal and vertical position of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer, -+ int32_t dest_x, int32_t dest_y); -+ -+/** -+ * \brief Sets the orientation of a layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_orientation(struct ivi_layout_layer *ivilayer, -+ enum wl_output_transform orientation); -+ -+/** -+ * \brief Sets render order of surfaces within one layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface **pSurface, -+ int32_t number); -+ -+/** -+ * \brief Set the visibility of a surface. -+ * -+ * If a surface is not visible it will not be rendered. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf, -+ bool newVisibility); -+ -+/** -+ * \brief Get the visibility of a surface. -+ * -+ * If a surface is not visible it will not be rendered. -+ * -+ * \return true if surface is visible -+ * \return false if surface is invisible or the method call was failed -+ */ -+bool -+ivi_layout_surface_get_visibility(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief Set the opacity of a surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, -+ wl_fixed_t opacity); -+ -+/** -+ * \brief Get the opacity of a surface. -+ * -+ * \return opacity if the method call was successful -+ * \return wl_fixed_from_double(0.0) if the method call was failed -+ */ -+wl_fixed_t -+ivi_layout_surface_get_opacity(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief Set the destination area of a surface within a layer for rendering. -+ * -+ * The surface will be scaled to this rectangle for rendering. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+/** -+ * \brief Sets the orientation of a surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_orientation(struct ivi_layout_surface *ivisurf, -+ enum wl_output_transform orientation); -+ -+/** -+ * \brief Add a layer to a screen which is currently managed by the service -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_screen_add_layer(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer *addlayer); -+ -+/** -+ * \brief Sets render order of layers on a display -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer **pLayer, -+ const int32_t number); -+ -+/** -+ * \brief register for notification on property changes of layer -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_add_notification(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief remove notification on property changes of layer -+ */ -+void -+ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief register for notification on property changes of surface -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_add_notification(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata); -+ -+/** -+ * \brief remove notification on property changes of surface -+ */ -+void -+ivi_layout_surface_remove_notification(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief Get the surface properties -+ * -+ * \return (const struct ivi_surface_layer_properties *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+const struct ivi_layout_surface_properties * -+ivi_layout_get_properties_of_surface(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief Add a surface to a layer which is currently managed by the service -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_add_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *addsurf); -+ -+/** -+ * \brief Removes a surface from a layer which is currently managed by the service -+ */ -+void -+ivi_layout_layer_remove_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *remsurf); -+ -+/** -+ * \brief Set the area of a surface which should be used for the rendering. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_source_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height); -+ -+/** -+ * \brief get weston_output from ivi_layout_screen. -+ * -+ * \return (struct weston_output *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+struct weston_output * -+ivi_layout_screen_get_output(struct ivi_layout_screen *); -+ -+struct weston_surface * -+ivi_layout_surface_get_weston_surface(struct ivi_layout_surface *ivisurf); -+ -+int32_t -+ivi_layout_surface_get_size(struct ivi_layout_surface *ivisurf, -+ int32_t *width, -+ int32_t *height, -+ int32_t *stride); -+ -+int32_t -+ivi_layout_layer_set_transition(struct ivi_layout_layer *ivilayer, -+ enum ivi_layout_transition_type type, -+ uint32_t duration); -+ -+int32_t -+ivi_layout_layer_set_fade_info(struct ivi_layout_layer* layer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha); -+ -+int32_t -+ivi_layout_surface_set_transition(struct ivi_layout_surface *ivisurf, -+ enum ivi_layout_transition_type type, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_layer_render_order(struct ivi_layout_layer* layer, -+ struct ivi_layout_surface** new_order, -+ uint32_t surface_num, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer* layer); -+ -+/** -+ * \brief Commit all changes and execute all enqueued commands since -+ * last commit. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_commit_changes(void); -+ -+#ifdef __cplusplus -+} -+#endif /* __cplusplus */ -+ -+#endif /* _IVI_LAYOUT_EXPORT_H_ */ -diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h -new file mode 100644 -index 0000000..8287e93 ---- /dev/null -+++ b/ivi-shell/ivi-layout-private.h -@@ -0,0 +1,319 @@ -+/* -+ * Copyright (C) 2014 DENSO CORPORATION -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and -+ * its documentation for any purpose is hereby granted without fee, provided -+ * that the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the copyright holders not be used in -+ * advertising or publicity pertaining to distribution of the software -+ * without specific, written prior permission. The copyright holders make -+ * no representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER -+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#ifndef _ivi_layout_PRIVATE_H_ -+#define _ivi_layout_PRIVATE_H_ -+ -+#include "compositor.h" -+#include "ivi-layout-export.h" -+ -+struct ivi_layout_surface { -+ struct wl_list link; -+ struct wl_signal property_changed; -+ struct wl_list layer_list; -+ int32_t update_count; -+ uint32_t id_surface; -+ -+ struct ivi_layout *layout; -+ struct weston_surface *surface; -+ -+ struct wl_listener surface_destroy_listener; -+ struct weston_transform surface_rotation; -+ struct weston_transform layer_rotation; -+ struct weston_transform surface_pos; -+ struct weston_transform layer_pos; -+ struct weston_transform scaling; -+ -+ struct ivi_layout_surface_properties prop; -+ uint32_t event_mask; -+ -+ struct { -+ struct ivi_layout_surface_properties prop; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ struct wl_list link; -+ struct wl_list layer_list; -+ } order; -+ -+ struct { -+ ivi_controller_surface_content_callback callback; -+ void *userdata; -+ } content_observer; -+ -+ struct wl_signal configured; -+}; -+ -+struct ivi_layout_layer { -+ struct wl_list link; -+ struct wl_signal property_changed; -+ struct wl_list screen_list; -+ struct wl_list link_to_surface; -+ uint32_t id_layer; -+ -+ struct ivi_layout *layout; -+ -+ struct ivi_layout_layer_properties prop; -+ uint32_t event_mask; -+ -+ struct { -+ struct ivi_layout_layer_properties prop; -+ struct wl_list surface_list; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ struct wl_list surface_list; -+ struct wl_list link; -+ } order; -+}; -+ -+struct ivi_layout { -+ struct weston_compositor *compositor; -+ -+ struct wl_list surface_list; -+ struct wl_list layer_list; -+ struct wl_list screen_list; -+ -+ struct { -+ struct wl_signal created; -+ struct wl_signal removed; -+ } layer_notification; -+ -+ struct { -+ struct wl_signal created; -+ struct wl_signal removed; -+ struct wl_signal configure_changed; -+ } surface_notification; -+ -+ struct weston_layer layout_layer; -+ struct wl_signal warning_signal; -+ -+ struct ivi_layout_transition_set *transitions; -+ struct wl_list pending_transition_list; -+}; -+ -+struct ivi_layout *get_instance(void); -+ -+struct ivi_layout_transition; -+ -+struct ivi_layout_transition_set { -+ struct wl_event_source *event_source; -+ struct wl_list transition_list; -+}; -+ -+typedef void (*ivi_layout_transition_destroy_user_func)(void *user_data); -+ -+struct ivi_layout_transition_set * -+ivi_layout_transition_set_create(struct weston_compositor *ec); -+ -+void -+ivi_layout_transition_move_resize_view(struct ivi_layout_surface *surface, -+ int32_t dest_x, int32_t dest_y, -+ int32_t dest_width, int32_t dest_height, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_visibility_on(struct ivi_layout_surface *surface, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_visibility_off(struct ivi_layout_surface *surface, -+ uint32_t duration); -+ -+ -+void -+ivi_layout_transition_move_layer(struct ivi_layout_layer *layer, -+ int32_t dest_x, int32_t dest_y, -+ uint32_t duration); -+ -+void -+ivi_layout_transition_fade_layer(struct ivi_layout_layer *layer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha, -+ void *user_data, -+ ivi_layout_transition_destroy_user_func destroy_func, -+ uint32_t duration); -+ -+int32_t -+is_surface_transition(struct ivi_layout_surface *surface); -+ -+/** -+ * \brief get ivi_layout_layer from id of layer -+ * -+ * \return (struct ivi_layout_layer *) -+ * if the method call was successful -+ * \return NULL if the method call was failed -+ */ -+struct ivi_layout_layer * -+ivi_layout_get_layer_from_id(uint32_t id_layer); -+ -+/** -+ * \brief Remove a surface -+ */ -+void -+ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf); -+ -+/** -+ * \brief Get all Layers of the given screen -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray); -+ -+/** -+ * \brief Get all Surfaces which are currently registered to a given -+ * layer and are managed by the services -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_get_surfaces_on_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_surface ***ppArray); -+ -+/** -+ * \brief Get the visibility of a layer. If a layer is not visible, -+ * the layer and its surfaces will not be rendered. -+ * -+ * \return true if layer is visible -+ * \return false if layer is invisible or the method call was failed -+ */ -+bool -+ivi_layout_layer_get_visibility(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief Get the horizontal and vertical dimension of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_get_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_width, int32_t *dest_height); -+ -+/** -+ * \brief Set the horizontal and vertical dimension of the layer. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_layer_set_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t dest_width, int32_t dest_height); -+ -+/** -+ * \brief Gets the orientation of a layer. -+ * -+ * \return (enum wl_output_transform) -+ * if the method call was successful -+ * \return WL_OUTPUT_TRANSFORM_NORMAL if the method call was failed -+ */ -+enum wl_output_transform -+ivi_layout_layer_get_orientation(struct ivi_layout_layer *ivilayer); -+ -+/** -+ * \brief Set the horizontal and vertical dimension of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t dest_width, int32_t dest_height); -+ -+/** -+ * \brief Get the horizontal and vertical dimension of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_get_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, int32_t *dest_height); -+ -+/** -+ * \brief Sets the horizontal and vertical position of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_set_position(struct ivi_layout_surface *ivisurf, -+ int32_t dest_x, int32_t dest_y); -+ -+/** -+ * \brief Get the horizontal and vertical position of the surface. -+ * -+ * \return IVI_SUCCEEDED if the method call was successful -+ * \return IVI_FAILED if the method call was failed -+ */ -+int32_t -+ivi_layout_surface_get_position(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_x, int32_t *dest_y); -+ -+/** -+ * \brief Gets the orientation of a surface. -+ * -+ * \return (enum wl_output_transform) -+ * if the method call was successful -+ * \return WL_OUTPUT_TRANSFORM_NORMAL if the method call was failed -+ */ -+enum wl_output_transform -+ivi_layout_surface_get_orientation(struct ivi_layout_surface *ivisurf); -+ -+int32_t -+ivi_layout_surface_set_transition_duration( -+ struct ivi_layout_surface *ivisurf, -+ uint32_t duration); -+ -+struct ivi_layout_interface { -+ struct weston_view *(*get_weston_view)( -+ struct ivi_layout_surface *surface); -+ -+ void (*surface_configure)(struct ivi_layout_surface *ivisurf, -+ int32_t width, -+ int32_t height); -+ -+ struct ivi_layout_surface *(*surface_create)( -+ struct weston_surface *wl_surface, -+ uint32_t id_surface); -+ -+ void (*init_with_compositor)(struct weston_compositor *ec); -+ -+ int32_t (*get_surface_dimension)( -+ struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, -+ int32_t *dest_height); -+ -+ void (*add_surface_configured_listener)( -+ struct ivi_layout_surface *ivisurf, -+ struct wl_listener* listener); -+}; -+ -+#endif -diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c -new file mode 100644 -index 0000000..0c45c4a ---- /dev/null -+++ b/ivi-shell/ivi-layout-transition.c -@@ -0,0 +1,1111 @@ -+/* -+ * Copyright (C) 2014 DENSO CORPORATION -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and -+ * its documentation for any purpose is hereby granted without fee, provided -+ * that the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the copyright holders not be used in -+ * advertising or publicity pertaining to distribution of the software -+ * without specific, written prior permission. The copyright holders make -+ * no representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER -+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#include <time.h> -+#include <assert.h> -+#include <stdlib.h> -+#include <stdio.h> -+ -+#include "ivi-layout-export.h" -+#include "ivi-layout-private.h" -+ -+struct ivi_layout_transition; -+ -+typedef void (*ivi_layout_transition_frame_func)( -+ struct ivi_layout_transition *transition); -+typedef void (*ivi_layout_transition_destroy_func)( -+ struct ivi_layout_transition *transition); -+typedef int32_t (*ivi_layout_is_transition_func)(void *private_data, void *id); -+ -+struct ivi_layout_transition { -+ enum ivi_layout_transition_type type; -+ void *private_data; -+ void *user_data; -+ -+ uint32_t time_start; -+ uint32_t time_duration; -+ uint32_t time_elapsed; -+ uint32_t is_done; -+ ivi_layout_is_transition_func is_transition_func; -+ ivi_layout_transition_frame_func frame_func; -+ ivi_layout_transition_destroy_func destroy_func; -+}; -+ -+struct transition_node { -+ struct ivi_layout_transition *transition; -+ struct wl_list link; -+}; -+ -+static void layout_transition_destroy(struct ivi_layout_transition *transition); -+ -+static struct ivi_layout_transition * -+get_transition_from_type_and_id(enum ivi_layout_transition_type type, -+ void *id_data) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ struct ivi_layout_transition *tran; -+ -+ wl_list_for_each(node, &layout->transitions->transition_list, link) { -+ tran = node->transition; -+ -+ if (tran->type == type && -+ tran->is_transition_func(tran->private_data, id_data)) -+ return tran; -+ } -+ -+ return NULL; -+} -+ -+WL_EXPORT int32_t -+is_surface_transition(struct ivi_layout_surface *surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ struct ivi_layout_transition *tran; -+ -+ wl_list_for_each(node, &layout->transitions->transition_list, link) { -+ tran = node->transition; -+ -+ if ((tran->type == IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE || -+ tran->type == IVI_LAYOUT_TRANSITION_VIEW_RESIZE) && -+ tran->is_transition_func(tran->private_data, surface)) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static void -+tick_transition(struct ivi_layout_transition *transition, uint32_t timestamp) -+{ -+ const double t = timestamp - transition->time_start; -+ -+ if (transition->time_duration <= t) { -+ transition->time_elapsed = transition->time_duration; -+ transition->is_done = 1; -+ } else { -+ transition->time_elapsed = t; -+ } -+} -+ -+static float time_to_nowpos(struct ivi_layout_transition *transition) -+{ -+ return sin((float)transition->time_elapsed / -+ (float)transition->time_duration * M_PI_2); -+} -+ -+static void -+do_transition_frame(struct ivi_layout_transition *transition, -+ uint32_t timestamp) -+{ -+ if (0 == transition->time_start) -+ transition->time_start = timestamp; -+ -+ tick_transition(transition, timestamp); -+ transition->frame_func(transition); -+ -+ if (transition->is_done) -+ layout_transition_destroy(transition); -+} -+ -+static int32_t -+layout_transition_frame(void *data) -+{ -+ struct ivi_layout_transition_set *transitions = data; -+ uint32_t fps = 30; -+ struct timespec timestamp = {}; -+ uint32_t msec = 0; -+ struct transition_node *node = NULL; -+ struct transition_node *next = NULL; -+ -+ if (wl_list_empty(&transitions->transition_list)) { -+ wl_event_source_timer_update(transitions->event_source, 0); -+ return 1; -+ } -+ -+ wl_event_source_timer_update(transitions->event_source, 1000 / fps); -+ -+ clock_gettime(CLOCK_MONOTONIC, ×tamp);//FIXME; -+ msec = (1e+3 * timestamp.tv_sec + 1e-6 * timestamp.tv_nsec); -+ -+ wl_list_for_each_safe(node, next, &transitions->transition_list, link) { -+ do_transition_frame(node->transition, msec); -+ } -+ -+ ivi_layout_commit_changes(); -+ return 1; -+} -+ -+WL_EXPORT struct ivi_layout_transition_set * -+ivi_layout_transition_set_create(struct weston_compositor *ec) -+{ -+ struct ivi_layout_transition_set *transitions; -+ struct wl_event_loop *loop; -+ -+ transitions = malloc(sizeof(*transitions)); -+ if (transitions == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ wl_list_init(&transitions->transition_list); -+ -+ loop = wl_display_get_event_loop(ec->wl_display); -+ transitions->event_source = -+ wl_event_loop_add_timer(loop, layout_transition_frame, -+ transitions); -+ -+ return transitions; -+} -+ -+static void -+layout_transition_register(struct ivi_layout_transition *trans) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct transition_node *node; -+ -+ node = malloc(sizeof(*node)); -+ if (node == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ node->transition = trans; -+ wl_list_insert(&layout->pending_transition_list, &node->link); -+} -+ -+static void -+remove_transition(struct ivi_layout *layout, -+ struct ivi_layout_transition *trans) -+{ -+ struct transition_node *node; -+ struct transition_node *next; -+ -+ wl_list_for_each_safe(node, next, -+ &layout->transitions->transition_list, link) { -+ if (node->transition == trans) { -+ wl_list_remove(&node->link); -+ free(node); -+ return; -+ } -+ } -+ -+ wl_list_for_each_safe(node, next, -+ &layout->pending_transition_list, link) { -+ if (node->transition == trans) { -+ wl_list_remove(&node->link); -+ free(node); -+ return; -+ } -+ } -+} -+ -+static void -+layout_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ remove_transition(layout, transition); -+ if(transition->destroy_func) -+ transition->destroy_func(transition); -+ free(transition); -+} -+ -+static struct ivi_layout_transition * -+create_layout_transition(void) -+{ -+ struct ivi_layout_transition *transition = malloc(sizeof(*transition)); -+ -+ if (transition == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_MAX; -+ transition->time_start = 0; -+ transition->time_duration = 300; /* 300ms */ -+ transition->time_elapsed = 0; -+ -+ transition->is_done = 0; -+ -+ transition->private_data = NULL; -+ transition->user_data = NULL; -+ -+ transition->frame_func = NULL; -+ transition->destroy_func = NULL; -+ -+ return transition; -+} -+ -+/* move and resize view transition */ -+ -+struct move_resize_view_data { -+ struct ivi_layout_surface *surface; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t end_x; -+ int32_t end_y; -+ int32_t start_width; -+ int32_t start_height; -+ int32_t end_width; -+ int32_t end_height; -+}; -+ -+static void -+transition_move_resize_view_destroy(struct ivi_layout_transition *transition) -+{ -+ struct move_resize_view_data *data = -+ (struct move_resize_view_data *)transition->private_data; -+ struct ivi_layout_surface *layout_surface = data->surface; -+ -+ wl_signal_emit(&layout_surface->configured, layout_surface); -+ -+ if (transition->private_data) { -+ free(transition->private_data); -+ transition->private_data = NULL; -+ } -+} -+ -+static void -+transition_move_resize_view_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct move_resize_view_data *mrv = transition->private_data; -+ const double current = time_to_nowpos(transition); -+ -+ const int32_t destx = mrv->start_x + -+ (mrv->end_x - mrv->start_x) * current; -+ -+ const int32_t desty = mrv->start_y + -+ (mrv->end_y - mrv->start_y) * current; -+ -+ const int32_t dest_width = mrv->start_width + -+ (mrv->end_width - mrv->start_width) * current; -+ -+ const int32_t dest_height = mrv->start_height + -+ (mrv->end_height - mrv->start_height) * current; -+ -+ ivi_layout_surface_set_destination_rectangle(mrv->surface, -+ destx, desty, -+ dest_width, dest_height); -+} -+ -+static int32_t -+is_transition_move_resize_view_func(struct move_resize_view_data *data, -+ struct ivi_layout_surface *view) -+{ -+ return data->surface == view; -+} -+ -+static struct ivi_layout_transition * -+create_move_resize_view_transition( -+ struct ivi_layout_surface *surface, -+ int32_t start_x, int32_t start_y, -+ int32_t end_x, int32_t end_y, -+ int32_t start_width, int32_t start_height, -+ int32_t end_width, int32_t end_height, -+ ivi_layout_transition_frame_func frame_func, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition = create_layout_transition(); -+ struct move_resize_view_data *data = malloc(sizeof(*data)); -+ -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_move_resize_view_func; -+ -+ transition->frame_func = frame_func; -+ transition->destroy_func = destroy_func; -+ transition->private_data = data; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->surface = surface; -+ data->start_x = start_x; -+ data->start_y = start_y; -+ data->end_x = end_x; -+ data->end_y = end_y; -+ -+ data->start_width = start_width; -+ data->start_height = start_height; -+ data->end_width = end_width; -+ data->end_height = end_height; -+ -+ return transition; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_move_resize_view(struct ivi_layout_surface *surface, -+ int32_t dest_x, int32_t dest_y, -+ int32_t dest_width, int32_t dest_height, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ int32_t start_pos[2] = { -+ surface->pending.prop.start_x, -+ surface->pending.prop.start_y -+ }; -+ -+ int32_t start_size[2] = { -+ surface->pending.prop.start_width, -+ surface->pending.prop.start_height -+ }; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_VIEW_MOVE_RESIZE, -+ surface); -+ if (transition) { -+ struct move_resize_view_data *data = transition->private_data; -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ -+ data->start_x = start_pos[0]; -+ data->start_y = start_pos[1]; -+ data->end_x = dest_x; -+ data->end_y = dest_y; -+ -+ data->start_width = start_size[0]; -+ data->start_height = start_size[1]; -+ data->end_width = dest_width; -+ data->end_height = dest_height; -+ return; -+ } -+ -+ transition = create_move_resize_view_transition( -+ surface, -+ start_pos[0], start_pos[1], -+ dest_x, dest_y, -+ start_size[0], start_size[1], -+ dest_width, dest_height, -+ transition_move_resize_view_user_frame, -+ transition_move_resize_view_destroy, -+ duration); -+ -+ layout_transition_register(transition); -+} -+ -+/* fade transition */ -+struct fade_view_data { -+ struct ivi_layout_surface *surface; -+ double start_alpha; -+ double end_alpha; -+}; -+ -+struct store_alpha{ -+ double alpha; -+}; -+ -+static void -+fade_view_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *fade = transition->private_data; -+ struct ivi_layout_surface *surface = fade->surface; -+ -+ const double current = time_to_nowpos(transition); -+ const double alpha = fade->start_alpha + -+ (fade->end_alpha - fade->start_alpha) * current; -+ -+ ivi_layout_surface_set_opacity(surface, wl_fixed_from_double(alpha)); -+ ivi_layout_surface_set_visibility(surface, true); -+} -+ -+static int32_t -+is_transition_fade_view_func(struct fade_view_data *data, -+ struct ivi_layout_surface *view) -+{ -+ return data->surface == view; -+} -+ -+static struct ivi_layout_transition * -+create_fade_view_transition( -+ struct ivi_layout_surface *surface, -+ double start_alpha, double end_alpha, -+ ivi_layout_transition_frame_func frame_func, -+ void *user_data, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition = create_layout_transition(); -+ struct fade_view_data *data = malloc(sizeof(*data)); -+ -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_VIEW_FADE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_fade_view_func; -+ -+ transition->user_data = user_data; -+ transition->private_data = data; -+ transition->frame_func = frame_func; -+ transition->destroy_func = destroy_func; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->surface = surface; -+ data->start_alpha = start_alpha; -+ data->end_alpha = end_alpha; -+ -+ return transition; -+} -+ -+static void -+create_visibility_transition(struct ivi_layout_surface *surface, -+ double start_alpha, -+ double dest_alpha, -+ void *user_data, -+ ivi_layout_transition_destroy_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition = NULL; -+ -+ transition = create_fade_view_transition( -+ surface, -+ start_alpha, dest_alpha, -+ fade_view_user_frame, -+ user_data, -+ destroy_func, -+ duration); -+ -+ layout_transition_register(transition); -+} -+ -+static void -+visibility_on_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *data = transition->private_data; -+ struct store_alpha *user_data = transition->user_data; -+ -+ ivi_layout_surface_set_visibility(data->surface, true); -+ -+ free(data); -+ transition->private_data = NULL; -+ -+ free(user_data); -+ transition->user_data = NULL; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_visibility_on(struct ivi_layout_surface *surface, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ bool is_visible = ivi_layout_surface_get_visibility(surface); -+ wl_fixed_t dest_alpha = ivi_layout_surface_get_opacity(surface); -+ struct store_alpha *user_data = NULL; -+ wl_fixed_t start_alpha = 0.0; -+ struct fade_view_data *data = NULL; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ surface); -+ if (transition) { -+ start_alpha = ivi_layout_surface_get_opacity(surface); -+ user_data = transition->user_data; -+ data = transition->private_data; -+ -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ transition->destroy_func = visibility_on_transition_destroy; -+ -+ data->start_alpha = wl_fixed_to_double(start_alpha); -+ data->end_alpha = user_data->alpha; -+ return; -+ } -+ -+ if (is_visible) -+ return; -+ -+ user_data = malloc(sizeof(*user_data)); -+ if (user_data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ user_data->alpha = wl_fixed_to_double(dest_alpha); -+ -+ create_visibility_transition(surface, -+ 0.0, // start_alpha -+ wl_fixed_to_double(dest_alpha), -+ user_data, -+ visibility_on_transition_destroy, -+ duration); -+} -+ -+static void -+visibility_off_transition_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_view_data *data = transition->private_data; -+ struct store_alpha *user_data = transition->user_data; -+ -+ ivi_layout_surface_set_visibility(data->surface, false); -+ -+ ivi_layout_surface_set_opacity(data->surface, -+ wl_fixed_from_double(user_data->alpha)); -+ -+ free(data); -+ transition->private_data = NULL; -+ -+ free(user_data); -+ transition->user_data= NULL; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_visibility_off(struct ivi_layout_surface *surface, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ wl_fixed_t start_alpha = ivi_layout_surface_get_opacity(surface); -+ struct store_alpha* user_data = NULL; -+ struct fade_view_data* data = NULL; -+ -+ transition = -+ get_transition_from_type_and_id(IVI_LAYOUT_TRANSITION_VIEW_FADE, -+ surface); -+ if (transition) { -+ data = transition->private_data; -+ -+ transition->time_start = 0; -+ transition->time_duration = duration; -+ transition->destroy_func = visibility_off_transition_destroy; -+ -+ data->start_alpha = wl_fixed_to_double(start_alpha); -+ data->end_alpha = 0; -+ return; -+ } -+ -+ user_data = malloc(sizeof(*user_data)); -+ if (user_data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ user_data->alpha = wl_fixed_to_double(start_alpha); -+ -+ create_visibility_transition(surface, -+ wl_fixed_to_double(start_alpha), -+ 0.0, // dest_alpha -+ user_data, -+ visibility_off_transition_destroy, -+ duration); -+} -+ -+/* move layer transition */ -+ -+struct move_layer_data { -+ struct ivi_layout_layer *layer; -+ int32_t start_x; -+ int32_t start_y; -+ int32_t end_x; -+ int32_t end_y; -+ ivi_layout_transition_destroy_user_func destroy_func; -+}; -+ -+static void -+transition_move_layer_user_frame(struct ivi_layout_transition *transition) -+{ -+ struct move_layer_data *data = transition->private_data; -+ struct ivi_layout_layer *layer = data->layer; -+ -+ const float current = time_to_nowpos(transition); -+ -+ const int32_t dest_x = data->start_x + -+ (data->end_x - data->start_x) * current; -+ -+ const int32_t dest_y = data->start_y + -+ (data->end_y - data->start_y) * current; -+ -+ ivi_layout_layer_set_position(layer, dest_x, dest_y); -+} -+ -+static void -+transition_move_layer_destroy(struct ivi_layout_transition *transition) -+{ -+ struct move_layer_data *data = transition->private_data; -+ -+ if(data->destroy_func) -+ data->destroy_func(transition->user_data); -+ -+ free(data); -+ transition->private_data = NULL; -+} -+ -+static int32_t -+is_transition_move_layer_func(struct move_layer_data *data, -+ struct ivi_layout_layer *layer) -+{ -+ return data->layer == layer; -+} -+ -+ -+static struct ivi_layout_transition * -+create_move_layer_transition( -+ struct ivi_layout_layer *layer, -+ int32_t start_x, int32_t start_y, -+ int32_t end_x, int32_t end_y, -+ void *user_data, -+ ivi_layout_transition_destroy_user_func destroy_user_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition = create_layout_transition(); -+ struct move_layer_data *data = malloc(sizeof(*data)); -+ -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return NULL; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_LAYER_MOVE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_move_layer_func; -+ -+ transition->frame_func = transition_move_layer_user_frame; -+ transition->destroy_func = transition_move_layer_destroy; -+ transition->private_data = data; -+ transition->user_data = user_data; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->layer = layer; -+ data->start_x = start_x; -+ data->start_y = start_y; -+ data->end_x = end_x; -+ data->end_y = end_y; -+ data->destroy_func = destroy_user_func; -+ -+ return transition; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_move_layer(struct ivi_layout_layer *layer, -+ int32_t dest_x, int32_t dest_y, -+ uint32_t duration) -+{ -+ int32_t start_pos_x = 0; -+ int32_t start_pos_y = 0; -+ struct ivi_layout_transition *transition = NULL; -+ -+ ivi_layout_layer_get_position(layer, &start_pos_x, &start_pos_y); -+ -+ transition = create_move_layer_transition( -+ layer, -+ start_pos_x, start_pos_y, -+ dest_x, dest_y, -+ NULL, NULL, -+ duration); -+ -+ layout_transition_register(transition); -+ -+ return; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_move_layer_cancel(struct ivi_layout_layer *layer) -+{ -+ struct ivi_layout_transition *transition = -+ get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_LAYER_MOVE, -+ layer); -+ if (transition) { -+ layout_transition_destroy(transition); -+ } -+} -+ -+/* fade layer transition */ -+struct fade_layer_data { -+ struct ivi_layout_layer *layer; -+ uint32_t is_fade_in; -+ double start_alpha; -+ double end_alpha; -+ ivi_layout_transition_destroy_user_func destroy_func; -+}; -+ -+static void -+transition_fade_layer_destroy(struct ivi_layout_transition *transition) -+{ -+ struct fade_layer_data *data = transition->private_data; -+ transition->private_data = NULL; -+ -+ free(data); -+} -+ -+static void -+transition_fade_layer_user_frame(struct ivi_layout_transition *transition) -+{ -+ double current = time_to_nowpos(transition); -+ struct fade_layer_data *data = transition->private_data; -+ double alpha = data->start_alpha + -+ (data->end_alpha - data->start_alpha) * current; -+ wl_fixed_t fixed_alpha = wl_fixed_from_double(alpha); -+ -+ int32_t is_done = transition->is_done; -+ bool is_visible = !is_done || data->is_fade_in; -+ -+ ivi_layout_layer_set_opacity(data->layer, fixed_alpha); -+ ivi_layout_layer_set_visibility(data->layer, is_visible); -+} -+ -+static int32_t -+is_transition_fade_layer_func(struct fade_layer_data *data, -+ struct ivi_layout_layer *layer) -+{ -+ return data->layer == layer; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_fade_layer( -+ struct ivi_layout_layer *layer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha, -+ void* user_data, -+ ivi_layout_transition_destroy_user_func destroy_func, -+ uint32_t duration) -+{ -+ struct ivi_layout_transition *transition; -+ struct fade_layer_data *data = NULL; -+ wl_fixed_t fixed_opacity = 0.0; -+ double now_opacity = 0.0; -+ double remain = 0.0; -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_LAYER_FADE, -+ layer); -+ if (transition) { -+ /* transition update */ -+ data = transition->private_data; -+ -+ /* FIXME */ -+ fixed_opacity = ivi_layout_layer_get_opacity(layer); -+ now_opacity = wl_fixed_to_double(fixed_opacity); -+ remain = 0.0; -+ -+ data->is_fade_in = is_fade_in; -+ data->start_alpha = now_opacity; -+ data->end_alpha = end_alpha; -+ -+ remain = is_fade_in? 1.0 - now_opacity : now_opacity; -+ transition->time_start = 0; -+ transition->time_elapsed = 0; -+ transition->time_duration = duration * remain; -+ -+ return; -+ } -+ -+ transition = create_layout_transition(); -+ data = malloc(sizeof(*data)); -+ -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_LAYER_FADE; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_fade_layer_func; -+ -+ transition->private_data = data; -+ transition->user_data = user_data; -+ -+ transition->frame_func = transition_fade_layer_user_frame; -+ transition->destroy_func = transition_fade_layer_destroy; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->layer = layer; -+ data->is_fade_in = is_fade_in; -+ data->start_alpha = start_alpha; -+ data->end_alpha = end_alpha; -+ data->destroy_func = destroy_func; -+ -+ layout_transition_register(transition); -+ -+ return; -+} -+ -+/* render order transition */ -+struct surface_reorder { -+ uint32_t id_surface; -+ uint32_t new_index; -+}; -+ -+struct change_order_data { -+ struct ivi_layout_layer *layer; -+ uint32_t surface_num; -+ struct surface_reorder *reorder; -+}; -+ -+struct surf_with_index { -+ uint32_t id_surface; -+ float surface_index; -+}; -+ -+static int -+cmp_order_asc(const void *lhs, const void *rhs) -+{ -+ const struct surf_with_index *l = lhs; -+ const struct surf_with_index *r = rhs; -+ -+ return l->surface_index > r->surface_index; -+} -+ -+/* -+render oerder transition -+ -+index 0 1 2 -+old surfA, surfB, surfC -+new surfB, surfC, surfA -+ (-1) (-1) (+2) -+ -+after 10% of time elapsed -+ 0.2 0.9 1.9 -+ surfA, surfB, surfC -+ -+after 50% of time elapsed -+ 0.5 1.0 1.5 -+ surfB, surfA, surfC -+*/ -+ -+static void -+transition_change_order_user_frame(struct ivi_layout_transition *transition) -+{ -+ uint32_t i, old_index; -+ double current = time_to_nowpos(transition); -+ struct change_order_data *data = transition->private_data; -+ -+ struct surf_with_index *swi = malloc(sizeof(*swi) * data->surface_num); -+ struct ivi_layout_surface **new_surface_order = NULL; -+ uint32_t surface_num = 0; -+ -+ if (swi == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ for (old_index = 0; old_index < data->surface_num; old_index++) { -+ swi[old_index].id_surface = data->reorder[old_index].id_surface; -+ swi[old_index].surface_index = (float)old_index + -+ ((float)data->reorder[old_index].new_index - (float)old_index) * current; -+ } -+ -+ qsort(swi, data->surface_num, sizeof(*swi), cmp_order_asc); -+ -+ new_surface_order = -+ malloc(sizeof(*new_surface_order) * data->surface_num); -+ -+ if (new_surface_order == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ for (i = 0; i < data->surface_num; i++) { -+ struct ivi_layout_surface *surf = -+ ivi_layout_get_surface_from_id(swi[i].id_surface); -+ if(surf) -+ new_surface_order[surface_num++] = surf; -+ } -+ -+ ivi_layout_layer_set_render_order(data->layer, new_surface_order, -+ surface_num); -+ -+ free(new_surface_order); -+ free(swi); -+} -+ -+static void -+transition_change_order_destroy(struct ivi_layout_transition *transition) -+{ -+ struct change_order_data *data = transition->private_data; -+ -+ free(data->reorder); -+ free(data); -+} -+ -+static int32_t find_surface(struct ivi_layout_surface **surfaces, -+ uint32_t surface_num, -+ struct ivi_layout_surface *target) -+{ -+ uint32_t i = 0; -+ -+ for(i = 0; i < surface_num; i++) { -+ if (surfaces[i] == target) -+ return i; -+ } -+ -+ return -1; -+} -+ -+static int32_t -+is_transition_change_order_func(struct change_order_data *data, -+ struct ivi_layout_layer *layer) -+{ -+ return data->layer == layer; -+} -+ -+WL_EXPORT void -+ivi_layout_transition_layer_render_order(struct ivi_layout_layer *layer, -+ struct ivi_layout_surface **new_order, -+ uint32_t surface_num, -+ uint32_t duration) -+{ -+ struct surface_reorder *reorder; -+ struct ivi_layout_surface *surf; -+ uint32_t old_index = 0; -+ struct ivi_layout_transition *transition; -+ struct change_order_data *data = NULL; -+ int32_t new_index = 0; -+ uint32_t id = 0; -+ -+ reorder = malloc(sizeof(*reorder) * surface_num); -+ if (reorder == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ wl_list_for_each(surf, &layer->order.surface_list, order.link) { -+ new_index = find_surface(new_order, surface_num, surf); -+ id = ivi_layout_get_id_of_surface(surf); -+ if(new_index < 0){ -+ fprintf(stderr, "invalid render order!!!\n"); -+ return; -+ } -+ -+ reorder[old_index].id_surface = id; -+ reorder[old_index].new_index = new_index; -+ old_index++; -+ } -+ -+ transition = get_transition_from_type_and_id( -+ IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER, -+ layer); -+ if (transition) { -+ /* update transition */ -+ struct change_order_data *data = transition->private_data; -+ transition->time_start = 0; /* timer reset */ -+ -+ if (duration != 0) { -+ transition->time_duration = duration; -+ } -+ -+ free(data->reorder); -+ data->reorder = reorder; -+ return; -+ } -+ -+ transition = create_layout_transition(); -+ data = malloc(sizeof(*data)); -+ -+ if (data == NULL) { -+ weston_log("%s: memory allocation fails\n", __func__); -+ return; -+ } -+ -+ transition->type = IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER; -+ transition->is_transition_func = (ivi_layout_is_transition_func)is_transition_change_order_func; -+ -+ transition->private_data = data; -+ transition->frame_func = transition_change_order_user_frame; -+ transition->destroy_func = transition_change_order_destroy; -+ -+ if (duration != 0) -+ transition->time_duration = duration; -+ -+ data->layer = layer; -+ data->reorder = reorder; -+ data->surface_num = old_index; -+ -+ layout_transition_register(transition); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_transition(struct ivi_layout_surface *ivisurf, -+ enum ivi_layout_transition_type type, -+ uint32_t duration) -+{ -+ struct ivi_layout_surface_properties *prop; -+ -+ if (ivisurf == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->transition_type = type; -+ prop->transition_duration = duration; -+ return 0; -+} -+ -+int32_t -+ivi_layout_surface_set_transition_duration(struct ivi_layout_surface *ivisurf, -+ uint32_t duration) -+{ -+ struct ivi_layout_surface_properties *prop; -+ -+ if (ivisurf == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->transition_duration = duration*10; -+ return 0; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_transition(struct ivi_layout_layer *ivilayer, -+ enum ivi_layout_transition_type type, -+ uint32_t duration) -+{ -+ if (ivilayer == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ ivilayer->pending.prop.transition_type = type; -+ ivilayer->pending.prop.transition_duration = duration; -+ -+ return 0; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_fade_info(struct ivi_layout_layer* ivilayer, -+ uint32_t is_fade_in, -+ double start_alpha, double end_alpha) -+{ -+ if (ivilayer == NULL) { -+ weston_log("%s: invalid argument\n", __func__); -+ return -1; -+ } -+ -+ ivilayer->pending.prop.is_fade_in = is_fade_in; -+ ivilayer->pending.prop.start_alpha = start_alpha; -+ ivilayer->pending.prop.end_alpha = end_alpha; -+ -+ return 0; -+} -diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c -new file mode 100644 -index 0000000..6f7c3c2 ---- /dev/null -+++ b/ivi-shell/ivi-layout.c -@@ -0,0 +1,2809 @@ -+/* -+ * Copyright (C) 2013 DENSO CORPORATION -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and -+ * its documentation for any purpose is hereby granted without fee, provided -+ * that the above copyright notice appear in all copies and that both that -+ * copyright notice and this permission notice appear in supporting -+ * documentation, and that the name of the copyright holders not be used in -+ * advertising or publicity pertaining to distribution of the software -+ * without specific, written prior permission. The copyright holders make -+ * no representations about the suitability of this software for any -+ * purpose. It is provided "as is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER -+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+/** -+ * Implementation of ivi-layout library. The actual view on ivi_screen is -+ * not updated till calling ivi_layout_commit_changes. A overview from -+ * calling API for updating properties of ivi_surface/ivi_layer to asking -+ * compositor to compose them by using weston_compositor_schedule_repaint, -+ * 0/ initialize this library by ivi_layout_init_with_compositor -+ * with (struct weston_compositor *ec) from ivi-shell. -+ * 1/ When a API for updating properties of ivi_surface/ivi_layer, it updates -+ * pending prop of ivi_surface/ivi_layer/ivi_screen which are structure to -+ * store properties. -+ * 2/ Before calling commitChanges, in case of calling a API to get a property, -+ * return current property, not pending property. -+ * 3/ At the timing of calling ivi_layout_commitChanges, pending properties -+ * are applied to properties. -+ * -+ * *) ivi_layout_commitChanges is also called by transition animation -+ * per each frame. See ivi-layout-transition.c in details. Transition -+ * animation interpolates frames between previous properties of ivi_surface -+ * and new ones. -+ * For example, when a property of ivi_surface is changed from invisibility -+ * to visibility, it behaves like fade-in. When ivi_layout_commitChange is -+ * called during transition animation, it cancels the transition and -+ * re-start transition to new properties from current properties of final -+ * frame just before the the cancellation. -+ * -+ * 4/ According properties, set transformation by using weston_matrix and -+ * weston_view per ivi_surfaces and ivi_layers in while loop. -+ * 5/ Set damage and trigger transform by using weston_view_geometry_dirty. -+ * 6/ Notify update of properties. -+ * 7/ Trigger composition by weston_compositor_schedule_repaint. -+ * -+ */ -+ -+#include <sys/wait.h> -+#include <unistd.h> -+#include <stdlib.h> -+#include <stdio.h> -+#include <string.h> -+#include <linux/input.h> -+ -+#include "compositor.h" -+#include "ivi-layout-export.h" -+#include "ivi-layout-private.h" -+ -+struct link_layer { -+ struct ivi_layout_layer *ivilayer; -+ struct wl_list link; -+ struct wl_list link_to_layer; -+}; -+ -+struct link_screen { -+ struct ivi_layout_screen *iviscrn; -+ struct wl_list link; -+ struct wl_list link_to_screen; -+}; -+ -+struct listener_layout_notification { -+ void *userdata; -+ struct wl_listener listener; -+}; -+ -+struct ivi_layout; -+ -+struct ivi_layout_screen { -+ struct wl_list link; -+ struct wl_list link_to_layer; -+ uint32_t id_screen; -+ -+ struct ivi_layout *layout; -+ struct weston_output *output; -+ -+ uint32_t event_mask; -+ -+ struct { -+ struct wl_list layer_list; -+ struct wl_list link; -+ } pending; -+ -+ struct { -+ struct wl_list layer_list; -+ struct wl_list link; -+ } order; -+}; -+ -+struct ivi_layout_notification_callback { -+ void *callback; -+ void *data; -+}; -+ -+static struct ivi_layout ivilayout = {0}; -+ -+struct ivi_layout * -+get_instance(void) -+{ -+ return &ivilayout; -+} -+ -+/** -+ * Internal API to add/remove a link to ivi_surface from ivi_layer. -+ */ -+static void -+add_link_to_surface(struct ivi_layout_layer *ivilayer, -+ struct link_layer *link_layer) -+{ -+ struct link_layer *link = NULL; -+ -+ wl_list_for_each(link, &ivilayer->link_to_surface, link_to_layer) { -+ if (link == link_layer) -+ return; -+ } -+ -+ wl_list_insert(&ivilayer->link_to_surface, &link_layer->link_to_layer); -+} -+ -+static void -+remove_link_to_surface(struct ivi_layout_layer *ivilayer) -+{ -+ struct link_layer *link = NULL; -+ struct link_layer *next = NULL; -+ -+ wl_list_for_each_safe(link, next, &ivilayer->link_to_surface, link_to_layer) { -+ if (!wl_list_empty(&link->link_to_layer)) { -+ wl_list_remove(&link->link_to_layer); -+ } -+ if (!wl_list_empty(&link->link)) { -+ wl_list_remove(&link->link); -+ } -+ free(link); -+ } -+ -+ wl_list_init(&ivilayer->link_to_surface); -+} -+ -+/** -+ * Internal API to add a link to ivi_layer from ivi_screen. -+ */ -+static void -+add_link_to_layer(struct ivi_layout_screen *iviscrn, -+ struct link_screen *link_screen) -+{ -+ wl_list_init(&link_screen->link_to_screen); -+ wl_list_insert(&iviscrn->link_to_layer, &link_screen->link_to_screen); -+} -+ -+/** -+ * Internal API to add/remove a ivi_surface from ivi_layer. -+ */ -+static void -+add_ordersurface_to_layer(struct ivi_layout_surface *ivisurf, -+ struct ivi_layout_layer *ivilayer) -+{ -+ struct link_layer *link_layer = NULL; -+ -+ link_layer = malloc(sizeof *link_layer); -+ if (link_layer == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return; -+ } -+ -+ link_layer->ivilayer = ivilayer; -+ wl_list_init(&link_layer->link); -+ wl_list_insert(&ivisurf->layer_list, &link_layer->link); -+ add_link_to_surface(ivilayer, link_layer); -+} -+ -+static void -+remove_ordersurface_from_layer(struct ivi_layout_surface *ivisurf) -+{ -+ struct link_layer *link_layer = NULL; -+ struct link_layer *next = NULL; -+ -+ wl_list_for_each_safe(link_layer, next, &ivisurf->layer_list, link) { -+ if (!wl_list_empty(&link_layer->link)) { -+ wl_list_remove(&link_layer->link); -+ } -+ if (!wl_list_empty(&link_layer->link_to_layer)) { -+ wl_list_remove(&link_layer->link_to_layer); -+ } -+ free(link_layer); -+ } -+ wl_list_init(&ivisurf->layer_list); -+} -+ -+/** -+ * Internal API to add/remove a ivi_layer to/from ivi_screen. -+ */ -+static void -+add_orderlayer_to_screen(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_screen *iviscrn) -+{ -+ struct link_screen *link_scrn = NULL; -+ -+ link_scrn = malloc(sizeof *link_scrn); -+ if (link_scrn == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return; -+ } -+ -+ link_scrn->iviscrn = iviscrn; -+ wl_list_init(&link_scrn->link); -+ wl_list_insert(&ivilayer->screen_list, &link_scrn->link); -+ add_link_to_layer(iviscrn, link_scrn); -+} -+ -+static void -+remove_orderlayer_from_screen(struct ivi_layout_layer *ivilayer) -+{ -+ struct link_screen *link_scrn = NULL; -+ struct link_screen *next = NULL; -+ -+ wl_list_for_each_safe(link_scrn, next, &ivilayer->screen_list, link) { -+ if (!wl_list_empty(&link_scrn->link)) { -+ wl_list_remove(&link_scrn->link); -+ } -+ if (!wl_list_empty(&link_scrn->link_to_screen)) { -+ wl_list_remove(&link_scrn->link_to_screen); -+ } -+ free(link_scrn); -+ } -+ wl_list_init(&ivilayer->screen_list); -+} -+ -+/** -+ * Internal API to add/remove a ivi_layer to/from ivi_screen. -+ */ -+static struct ivi_layout_surface * -+get_surface(struct wl_list *surf_list, uint32_t id_surface) -+{ -+ struct ivi_layout_surface *ivisurf; -+ -+ wl_list_for_each(ivisurf, surf_list, link) { -+ if (ivisurf->id_surface == id_surface) { -+ return ivisurf; -+ } -+ } -+ -+ return NULL; -+} -+ -+static struct ivi_layout_layer * -+get_layer(struct wl_list *layer_list, uint32_t id_layer) -+{ -+ struct ivi_layout_layer *ivilayer; -+ -+ wl_list_for_each(ivilayer, layer_list, link) { -+ if (ivilayer->id_layer == id_layer) { -+ return ivilayer; -+ } -+ } -+ -+ return NULL; -+} -+ -+/** -+ * Called at destruction of ivi_surface -+ */ -+static void -+westonsurface_destroy_from_ivisurface(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ ivisurf = container_of(listener, struct ivi_layout_surface, -+ surface_destroy_listener); -+ -+ wl_list_init(&ivisurf->surface_rotation.link); -+ wl_list_init(&ivisurf->layer_rotation.link); -+ wl_list_init(&ivisurf->surface_pos.link); -+ wl_list_init(&ivisurf->layer_pos.link); -+ wl_list_init(&ivisurf->scaling.link); -+ -+ ivisurf->surface = NULL; -+ ivi_layout_surface_remove(ivisurf); -+} -+ -+/** -+ * Internal API to check ivi_layer/ivi_surface already added in ivi_layer/ivi_screen. -+ * Called by ivi_layout_layer_add_surface/ivi_layout_screenAddLayer -+ */ -+static int -+is_surface_in_layer(struct ivi_layout_surface *ivisurf, -+ struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surf = NULL; -+ -+ wl_list_for_each(surf, &ivilayer->pending.surface_list, pending.link) { -+ if (surf->id_surface == ivisurf->id_surface) { -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+static int -+is_layer_in_screen(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_screen *iviscrn) -+{ -+ struct ivi_layout_layer *layer = NULL; -+ -+ wl_list_for_each(layer, &iviscrn->pending.layer_list, pending.link) { -+ if (layer->id_layer == ivilayer->id_layer) { -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+/** -+ * Internal API to initialize ivi_screens found from output_list of weston_compositor. -+ * Called by ivi_layout_init_with_compositor. -+ */ -+static void -+create_screen(struct weston_compositor *ec) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct weston_output *output = NULL; -+ int32_t count = 0; -+ -+ wl_list_for_each(output, &ec->output_list, link) { -+ iviscrn = calloc(1, sizeof *iviscrn); -+ if (iviscrn == NULL) { -+ weston_log("fails to allocate memory\n"); -+ continue; -+ } -+ -+ wl_list_init(&iviscrn->link); -+ iviscrn->layout = layout; -+ -+ iviscrn->id_screen = count; -+ count++; -+ -+ iviscrn->output = output; -+ iviscrn->event_mask = 0; -+ -+ wl_list_init(&iviscrn->pending.layer_list); -+ wl_list_init(&iviscrn->pending.link); -+ -+ wl_list_init(&iviscrn->order.layer_list); -+ wl_list_init(&iviscrn->order.link); -+ -+ wl_list_init(&iviscrn->link_to_layer); -+ -+ wl_list_insert(&layout->screen_list, &iviscrn->link); -+ } -+} -+ -+/** -+ * Internal APIs to initialize properties of ivi_surface/ivi_layer when they are created. -+ */ -+static void -+init_layer_properties(struct ivi_layout_layer_properties *prop, -+ int32_t width, int32_t height) -+{ -+ memset(prop, 0, sizeof *prop); -+ prop->opacity = wl_fixed_from_double(1.0); -+ prop->source_width = width; -+ prop->source_height = height; -+ prop->dest_width = width; -+ prop->dest_height = height; -+} -+ -+static void -+init_surface_properties(struct ivi_layout_surface_properties *prop) -+{ -+ memset(prop, 0, sizeof *prop); -+ prop->opacity = wl_fixed_from_double(1.0); -+} -+ -+/** -+ * Internal APIs to be called from ivi_layout_commit_changes. -+ */ -+static void -+update_opacity(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ double layer_alpha = wl_fixed_to_double(ivilayer->prop.opacity); -+ double surf_alpha = wl_fixed_to_double(ivisurf->prop.opacity); -+ -+ if ((ivilayer->event_mask & IVI_NOTIFICATION_OPACITY) || -+ (ivisurf->event_mask & IVI_NOTIFICATION_OPACITY)) { -+ struct weston_view *tmpview = NULL; -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview == NULL) { -+ continue; -+ } -+ tmpview->alpha = layer_alpha * surf_alpha; -+ } -+ } -+} -+ -+static void -+update_surface_orientation(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_view *view; -+ struct weston_matrix *matrix = &ivisurf->surface_rotation.matrix; -+ float width = 0.0f; -+ float height = 0.0f; -+ float v_sin = 0.0f; -+ float v_cos = 0.0f; -+ float cx = 0.0f; -+ float cy = 0.0f; -+ float sx = 1.0f; -+ float sy = 1.0f; -+ -+ wl_list_for_each(view, &ivisurf->surface->views, surface_link) { -+ if (view != NULL) { -+ break; -+ } -+ } -+ -+ if (view == NULL) { -+ return; -+ } -+ -+ if ((ivilayer->prop.dest_width == 0) || -+ (ivilayer->prop.dest_height == 0)) { -+ return; -+ } -+ width = (float)ivilayer->prop.dest_width; -+ height = (float)ivilayer->prop.dest_height; -+ -+ switch (ivisurf->prop.orientation) { -+ case WL_OUTPUT_TRANSFORM_NORMAL: -+ v_sin = 0.0f; -+ v_cos = 1.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_90: -+ v_sin = 1.0f; -+ v_cos = 0.0f; -+ sx = width / height; -+ sy = height / width; -+ break; -+ case WL_OUTPUT_TRANSFORM_180: -+ v_sin = 0.0f; -+ v_cos = -1.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_270: -+ default: -+ v_sin = -1.0f; -+ v_cos = 0.0f; -+ sx = width / height; -+ sy = height / width; -+ break; -+ } -+ wl_list_remove(&ivisurf->surface_rotation.link); -+ weston_view_geometry_dirty(view); -+ -+ weston_matrix_init(matrix); -+ cx = 0.5f * width; -+ cy = 0.5f * height; -+ weston_matrix_translate(matrix, -cx, -cy, 0.0f); -+ weston_matrix_rotate_xy(matrix, v_cos, v_sin); -+ weston_matrix_scale(matrix, sx, sy, 1.0); -+ weston_matrix_translate(matrix, cx, cy, 0.0f); -+ wl_list_insert(&view->geometry.transformation_list, -+ &ivisurf->surface_rotation.link); -+ -+ weston_view_set_transform_parent(view, NULL); -+ weston_view_update_transform(view); -+} -+ -+static void -+update_layer_orientation(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_surface *es = ivisurf->surface; -+ struct weston_view *view; -+ struct weston_matrix *matrix = &ivisurf->layer_rotation.matrix; -+ struct weston_output *output = NULL; -+ float width = 0.0f; -+ float height = 0.0f; -+ float v_sin = 0.0f; -+ float v_cos = 0.0f; -+ float cx = 0.0f; -+ float cy = 0.0f; -+ float sx = 1.0f; -+ float sy = 1.0f; -+ -+ wl_list_for_each(view, &ivisurf->surface->views, surface_link) { -+ if (view != NULL) { -+ break; -+ } -+ } -+ -+ if (es == NULL || view == NULL) { -+ return; -+ } -+ -+ output = es->output; -+ if (output == NULL) { -+ return; -+ } -+ if ((output->width == 0) || (output->height == 0)) { -+ return; -+ } -+ width = (float)output->width; -+ height = (float)output->height; -+ -+ switch (ivilayer->prop.orientation) { -+ case WL_OUTPUT_TRANSFORM_NORMAL: -+ v_sin = 0.0f; -+ v_cos = 1.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_90: -+ v_sin = 1.0f; -+ v_cos = 0.0f; -+ sx = width / height; -+ sy = height / width; -+ break; -+ case WL_OUTPUT_TRANSFORM_180: -+ v_sin = 0.0f; -+ v_cos = -1.0f; -+ break; -+ case WL_OUTPUT_TRANSFORM_270: -+ default: -+ v_sin = -1.0f; -+ v_cos = 0.0f; -+ sx = width / height; -+ sy = height / width; -+ break; -+ } -+ wl_list_remove(&ivisurf->layer_rotation.link); -+ weston_view_geometry_dirty(view); -+ -+ weston_matrix_init(matrix); -+ cx = 0.5f * width; -+ cy = 0.5f * height; -+ weston_matrix_translate(matrix, -cx, -cy, 0.0f); -+ weston_matrix_rotate_xy(matrix, v_cos, v_sin); -+ weston_matrix_scale(matrix, sx, sy, 1.0); -+ weston_matrix_translate(matrix, cx, cy, 0.0f); -+ wl_list_insert(&view->geometry.transformation_list, -+ &ivisurf->layer_rotation.link); -+ -+ weston_view_set_transform_parent(view, NULL); -+ weston_view_update_transform(view); -+} -+ -+static void -+update_surface_position(struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_view *view; -+ float tx = (float)ivisurf->prop.dest_x; -+ float ty = (float)ivisurf->prop.dest_y; -+ struct weston_matrix *matrix = &ivisurf->surface_pos.matrix; -+ -+ wl_list_for_each(view, &ivisurf->surface->views, surface_link) { -+ if (view != NULL) { -+ break; -+ } -+ } -+ -+ if (view == NULL) { -+ return; -+ } -+ -+ wl_list_remove(&ivisurf->surface_pos.link); -+ -+ weston_matrix_init(matrix); -+ weston_matrix_translate(matrix, tx, ty, 0.0f); -+ wl_list_insert(&view->geometry.transformation_list, -+ &ivisurf->surface_pos.link); -+ -+ weston_view_set_transform_parent(view, NULL); -+ weston_view_update_transform(view); -+} -+ -+static void -+update_layer_position(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_view *view; -+ struct weston_matrix *matrix = &ivisurf->layer_pos.matrix; -+ float tx = (float)ivilayer->prop.dest_x; -+ float ty = (float)ivilayer->prop.dest_y; -+ -+ wl_list_for_each(view, &ivisurf->surface->views, surface_link) { -+ if (view != NULL) { -+ break; -+ } -+ } -+ -+ if (view == NULL) { -+ return; -+ } -+ -+ wl_list_remove(&ivisurf->layer_pos.link); -+ -+ weston_matrix_init(matrix); -+ weston_matrix_translate(matrix, tx, ty, 0.0f); -+ wl_list_insert(&view->geometry.transformation_list, -+ &ivisurf->layer_pos.link); -+ -+ weston_view_set_transform_parent(view, NULL); -+ weston_view_update_transform(view); -+} -+ -+static void -+update_scale(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ struct weston_view *view; -+ struct weston_matrix *matrix = &ivisurf->scaling.matrix; -+ float sx = 0.0f; -+ float sy = 0.0f; -+ float lw = 0.0f; -+ float sw = 0.0f; -+ float lh = 0.0f; -+ float sh = 0.0f; -+ -+ wl_list_for_each(view, &ivisurf->surface->views, surface_link) { -+ if (view != NULL) { -+ break; -+ } -+ } -+ -+ if (view == NULL) { -+ return; -+ } -+ -+ if (ivisurf->prop.dest_width == 0 && ivisurf->prop.dest_height == 0) { -+ ivisurf->prop.dest_width = ivisurf->surface->width_from_buffer; -+ ivisurf->prop.dest_height = ivisurf->surface->height_from_buffer; -+ } -+ -+ lw = ((float)ivilayer->prop.dest_width / (float)ivilayer->prop.source_width ); -+ sw = ((float)ivisurf->prop.dest_width / (float)ivisurf->prop.source_width ); -+ lh = ((float)ivilayer->prop.dest_height / (float)ivilayer->prop.source_height); -+ sh = ((float)ivisurf->prop.dest_height / (float)ivisurf->prop.source_height ); -+ sx = sw * lw; -+ sy = sh * lh; -+ -+ wl_list_remove(&ivisurf->scaling.link); -+ weston_matrix_init(matrix); -+ weston_matrix_scale(matrix, sx, sy, 1.0f); -+ -+ wl_list_insert(&view->geometry.transformation_list, -+ &ivisurf->scaling.link); -+ -+ weston_view_set_transform_parent(view, NULL); -+ weston_view_update_transform(view); -+} -+ -+static void -+update_prop(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *ivisurf) -+{ -+ if (ivilayer->event_mask | ivisurf->event_mask) { -+ struct weston_view *tmpview; -+ update_opacity(ivilayer, ivisurf); -+ update_layer_orientation(ivilayer, ivisurf); -+ update_layer_position(ivilayer, ivisurf); -+ update_surface_position(ivisurf); -+ update_surface_orientation(ivilayer, ivisurf); -+ update_scale(ivilayer, ivisurf); -+ -+ ivisurf->update_count++; -+ -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ -+ if (tmpview != NULL) { -+ weston_view_geometry_dirty(tmpview); -+ } -+ -+ if (ivisurf->surface != NULL) { -+ weston_surface_damage(ivisurf->surface); -+ } -+ } -+} -+ -+static void -+commit_changes(struct ivi_layout *layout) -+{ -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ update_prop(ivilayer, ivisurf); -+ } -+ } -+ } -+} -+ -+static void -+commit_surface_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t dest_x = 0; -+ int32_t dest_y = 0; -+ int32_t dest_width = 0; -+ int32_t dest_height = 0; -+ int32_t configured = 0; -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEFAULT) { -+ dest_x = ivisurf->prop.dest_x; -+ dest_y = ivisurf->prop.dest_y; -+ dest_width = ivisurf->prop.dest_width; -+ dest_height = ivisurf->prop.dest_height; -+ -+ ivi_layout_transition_move_resize_view(ivisurf, -+ ivisurf->pending.prop.dest_x, -+ ivisurf->pending.prop.dest_y, -+ ivisurf->pending.prop.dest_width, -+ ivisurf->pending.prop.dest_height, -+ ivisurf->pending.prop.transition_duration); -+ -+ if(ivisurf->pending.prop.visibility) { -+ ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); -+ } else { -+ ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.dest_x = dest_x; -+ ivisurf->prop.dest_y = dest_y; -+ ivisurf->prop.dest_width = dest_width; -+ ivisurf->prop.dest_height = dest_height; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_DEST_RECT_ONLY){ -+ dest_x = ivisurf->prop.dest_x; -+ dest_y = ivisurf->prop.dest_y; -+ dest_width = ivisurf->prop.dest_width; -+ dest_height = ivisurf->prop.dest_height; -+ -+ ivi_layout_transition_move_resize_view(ivisurf, -+ ivisurf->pending.prop.dest_x, -+ ivisurf->pending.prop.dest_y, -+ ivisurf->pending.prop.dest_width, -+ ivisurf->pending.prop.dest_height, -+ ivisurf->pending.prop.transition_duration); -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.dest_x = dest_x; -+ ivisurf->prop.dest_y = dest_y; -+ ivisurf->prop.dest_width = dest_width; -+ ivisurf->prop.dest_height = dest_height; -+ -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ } else if(ivisurf->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY){ -+ configured = 0; -+ if(ivisurf->pending.prop.visibility) { -+ ivi_layout_transition_visibility_on(ivisurf, ivisurf->pending.prop.transition_duration); -+ } else { -+ ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transition_duration); -+ } -+ -+ if (ivisurf->prop.dest_width != ivisurf->pending.prop.dest_width || -+ ivisurf->prop.dest_height != ivisurf->pending.prop.dest_height) { -+ configured = 1; -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ if (configured && !is_surface_transition(ivisurf)) -+ wl_signal_emit(&ivisurf->configured, ivisurf); -+ } else { -+ configured = 0; -+ if (ivisurf->prop.dest_width != ivisurf->pending.prop.dest_width || -+ ivisurf->prop.dest_height != ivisurf->pending.prop.dest_height) { -+ configured = 1; -+ } -+ -+ ivisurf->prop = ivisurf->pending.prop; -+ ivisurf->prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ if (configured && !is_surface_transition(ivisurf)) -+ wl_signal_emit(&ivisurf->configured, ivisurf); -+ } -+ } -+} -+ -+static void -+commit_layer_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_MOVE) { -+ ivi_layout_transition_move_layer(ivilayer, ivilayer->pending.prop.dest_x, ivilayer->pending.prop.dest_y, ivilayer->pending.prop.transition_duration); -+ } else if(ivilayer->pending.prop.transition_type == IVI_LAYOUT_TRANSITION_LAYER_FADE) { -+ ivi_layout_transition_fade_layer(ivilayer,ivilayer->pending.prop.is_fade_in, -+ ivilayer->pending.prop.start_alpha,ivilayer->pending.prop.end_alpha, -+ NULL, NULL, -+ ivilayer->pending.prop.transition_duration); -+ } -+ ivilayer->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE; -+ -+ ivilayer->prop = ivilayer->pending.prop; -+ -+ if (!(ivilayer->event_mask & -+ (IVI_NOTIFICATION_ADD | IVI_NOTIFICATION_REMOVE)) ) { -+ continue; -+ } -+ -+ if (ivilayer->event_mask & IVI_NOTIFICATION_REMOVE) { -+ wl_list_for_each_safe(ivisurf, next, -+ &ivilayer->order.surface_list, order.link) { -+ remove_ordersurface_from_layer(ivisurf); -+ -+ if (!wl_list_empty(&ivisurf->order.link)) { -+ wl_list_remove(&ivisurf->order.link); -+ } -+ -+ wl_list_init(&ivisurf->order.link); -+ ivisurf->event_mask |= IVI_NOTIFICATION_REMOVE; -+ } -+ -+ wl_list_init(&ivilayer->order.surface_list); -+ } -+ -+ if (ivilayer->event_mask & IVI_NOTIFICATION_ADD) { -+ wl_list_for_each_safe(ivisurf, next, -+ &ivilayer->order.surface_list, order.link) { -+ remove_ordersurface_from_layer(ivisurf); -+ -+ if (!wl_list_empty(&ivisurf->order.link)) { -+ wl_list_remove(&ivisurf->order.link); -+ } -+ -+ wl_list_init(&ivisurf->order.link); -+ } -+ -+ wl_list_init(&ivilayer->order.surface_list); -+ wl_list_for_each(ivisurf, &ivilayer->pending.surface_list, -+ pending.link) { -+ if(!wl_list_empty(&ivisurf->order.link)){ -+ wl_list_remove(&ivisurf->order.link); -+ wl_list_init(&ivisurf->order.link); -+ } -+ -+ wl_list_insert(&ivilayer->order.surface_list, -+ &ivisurf->order.link); -+ add_ordersurface_to_layer(ivisurf, ivilayer); -+ ivisurf->event_mask |= IVI_NOTIFICATION_ADD; -+ } -+ } -+ } -+} -+ -+static void -+commit_screen_list(struct ivi_layout *layout) -+{ -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ if (iviscrn->event_mask & IVI_NOTIFICATION_REMOVE) { -+ wl_list_for_each_safe(ivilayer, next, -+ &iviscrn->order.layer_list, order.link) { -+ remove_orderlayer_from_screen(ivilayer); -+ -+ if (!wl_list_empty(&ivilayer->order.link)) { -+ wl_list_remove(&ivilayer->order.link); -+ } -+ -+ wl_list_init(&ivilayer->order.link); -+ ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; -+ } -+ } -+ -+ if (iviscrn->event_mask & IVI_NOTIFICATION_ADD) { -+ wl_list_for_each_safe(ivilayer, next, -+ &iviscrn->order.layer_list, order.link) { -+ remove_orderlayer_from_screen(ivilayer); -+ -+ if (!wl_list_empty(&ivilayer->order.link)) { -+ wl_list_remove(&ivilayer->order.link); -+ } -+ -+ wl_list_init(&ivilayer->order.link); -+ } -+ -+ wl_list_init(&iviscrn->order.layer_list); -+ wl_list_for_each(ivilayer, &iviscrn->pending.layer_list, -+ pending.link) { -+ wl_list_insert(&iviscrn->order.layer_list, -+ &ivilayer->order.link); -+ add_orderlayer_to_screen(ivilayer, iviscrn); -+ ivilayer->event_mask |= IVI_NOTIFICATION_ADD; -+ } -+ } -+ -+ iviscrn->event_mask = 0; -+ -+ /* Clear view list of layout ivi_layer */ -+ wl_list_init(&layout->layout_layer.view_list.link); -+ -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, order.link) { -+ if (ivilayer->prop.visibility == false) -+ continue; -+ -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ struct weston_view *tmpview = NULL; -+ wl_list_for_each(tmpview, &ivisurf->surface->views, surface_link) { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ -+ if (ivisurf->prop.visibility == false) -+ continue; -+ if (ivisurf->surface == NULL || tmpview == NULL) -+ continue; -+ -+ weston_layer_entry_insert(&layout->layout_layer.view_list, -+ &tmpview->layer_link); -+ -+ ivisurf->surface->output = iviscrn->output; -+ } -+ } -+ -+ break; -+ } -+} -+ -+static void -+commit_transition(struct ivi_layout* layout) -+{ -+ if(wl_list_empty(&layout->pending_transition_list)){ -+ return; -+ } -+ -+ wl_list_insert_list(&layout->transitions->transition_list, -+ &layout->pending_transition_list); -+ -+ wl_list_init(&layout->pending_transition_list); -+ -+ wl_event_source_timer_update(layout->transitions->event_source, 1); -+} -+ -+static void -+send_surface_prop(struct ivi_layout_surface *ivisurf) -+{ -+ wl_signal_emit(&ivisurf->property_changed, ivisurf); -+ ivisurf->event_mask = 0; -+} -+ -+static void -+send_layer_prop(struct ivi_layout_layer *ivilayer) -+{ -+ wl_signal_emit(&ivilayer->property_changed, ivilayer); -+ ivilayer->event_mask = 0; -+} -+ -+static void -+send_prop(struct ivi_layout *layout) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each_reverse(ivilayer, &layout->layer_list, link) { -+ send_layer_prop(ivilayer); -+ } -+ -+ wl_list_for_each_reverse(ivisurf, &layout->surface_list, link) { -+ send_surface_prop(ivisurf); -+ } -+} -+ -+static void -+clear_surface_pending_list(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surface_link = NULL; -+ struct ivi_layout_surface *surface_next = NULL; -+ -+ wl_list_for_each_safe(surface_link, surface_next, -+ &ivilayer->pending.surface_list, pending.link) { -+ if (!wl_list_empty(&surface_link->pending.link)) { -+ wl_list_remove(&surface_link->pending.link); -+ } -+ -+ wl_list_init(&surface_link->pending.link); -+ } -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; -+} -+ -+static void -+clear_surface_order_list(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout_surface *surface_link = NULL; -+ struct ivi_layout_surface *surface_next = NULL; -+ -+ wl_list_for_each_safe(surface_link, surface_next, -+ &ivilayer->order.surface_list, order.link) { -+ if (!wl_list_empty(&surface_link->order.link)) { -+ wl_list_remove(&surface_link->order.link); -+ } -+ -+ wl_list_init(&surface_link->order.link); -+ } -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; -+} -+ -+static void -+layer_created(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *created_callback = -+ notification->userdata; -+ -+ ((layer_create_notification_func)created_callback->callback) -+ (ivilayer, created_callback->data); -+} -+ -+static void -+layer_removed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *removed_callback = -+ notification->userdata; -+ -+ ((layer_remove_notification_func)removed_callback->callback) -+ (ivilayer, removed_callback->data); -+} -+ -+static void -+layer_prop_changed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_layer *ivilayer = data; -+ -+ struct listener_layout_notification *layout_listener = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *prop_callback = -+ layout_listener->userdata; -+ -+ ((layer_property_notification_func)prop_callback->callback) -+ (ivilayer, &ivilayer->prop, ivilayer->event_mask, prop_callback->data); -+} -+ -+static void -+surface_created(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *created_callback = -+ notification->userdata; -+ -+ ((surface_create_notification_func)created_callback->callback) -+ (ivisurface, created_callback->data); -+} -+ -+static void -+surface_removed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *removed_callback = -+ notification->userdata; -+ -+ ((surface_remove_notification_func)removed_callback->callback) -+ (ivisurface, removed_callback->data); -+} -+ -+static void -+surface_prop_changed(struct wl_listener *listener, void *data) -+{ -+ struct ivi_layout_surface *ivisurf = data; -+ -+ struct listener_layout_notification *layout_listener = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *prop_callback = -+ layout_listener->userdata; -+ -+ ((surface_property_notification_func)prop_callback->callback) -+ (ivisurf, &ivisurf->prop, ivisurf->event_mask, prop_callback->data); -+ -+ ivisurf->event_mask = 0; -+} -+ -+static void -+surface_configure_changed(struct wl_listener *listener, -+ void *data) -+{ -+ struct ivi_layout_surface *ivisurface = data; -+ -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *configure_changed_callback = -+ notification->userdata; -+ -+ ((surface_configure_notification_func)configure_changed_callback->callback) -+ (ivisurface, configure_changed_callback->data); -+} -+ -+static int32_t -+add_notification(struct wl_signal *signal, -+ wl_notify_func_t callback, -+ void *userdata) -+{ -+ struct listener_layout_notification *notification = NULL; -+ -+ notification = malloc(sizeof *notification); -+ if (notification == NULL) { -+ weston_log("fails to allocate memory\n"); -+ free(userdata); -+ return IVI_FAILED; -+ } -+ -+ notification->listener.notify = callback; -+ notification->userdata = userdata; -+ -+ wl_signal_add(signal, ¬ification->listener); -+ -+ return IVI_SUCCEEDED; -+} -+ -+static void -+remove_notification(struct wl_list *listener_list, void *callback, void *userdata) -+{ -+ struct wl_listener *listener = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(listener, next, listener_list, link) { -+ struct listener_layout_notification *notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ struct ivi_layout_notification_callback *notification_callback = -+ notification->userdata; -+ -+ if ((notification_callback->callback != callback) || -+ (notification_callback->data != userdata)) { -+ continue; -+ } -+ -+ if (!wl_list_empty(&listener->link)) { -+ wl_list_remove(&listener->link); -+ } -+ -+ free(notification->userdata); -+ free(notification); -+ } -+} -+ -+static void -+remove_all_notification(struct wl_list *listener_list) -+{ -+ struct wl_listener *listener = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(listener, next, listener_list, link) { -+ struct listener_layout_notification *notification = NULL; -+ if (!wl_list_empty(&listener->link)) { -+ wl_list_remove(&listener->link); -+ } -+ -+ notification = -+ container_of(listener, -+ struct listener_layout_notification, -+ listener); -+ -+ free(notification->userdata); -+ free(notification); -+ } -+} -+ -+/** -+ * Exported APIs of ivi-layout library are implemented from here. -+ * Brief of APIs is described in ivi-layout-export.h. -+ */ -+WL_EXPORT int32_t -+ivi_layout_add_notification_create_layer(layer_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *created_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_create_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback = malloc(sizeof *created_callback); -+ if (created_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback->callback = callback; -+ created_callback->data = userdata; -+ -+ return add_notification(&layout->layer_notification.created, -+ layer_created, -+ created_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_remove_notification_create_layer(layer_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->layer_notification.created.listener_list, callback, userdata); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_add_notification_remove_layer(layer_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *removed_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_remove_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback = malloc(sizeof *removed_callback); -+ if (removed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback->callback = callback; -+ removed_callback->data = userdata; -+ return add_notification(&layout->layer_notification.removed, -+ layer_removed, -+ removed_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_remove_notification_remove_layer(layer_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->layer_notification.removed.listener_list, callback, userdata); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_add_notification_create_surface(surface_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *created_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_create_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback = malloc(sizeof *created_callback); -+ if (created_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ created_callback->callback = callback; -+ created_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.created, -+ surface_created, -+ created_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_remove_notification_create_surface(surface_create_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.created.listener_list, callback, userdata); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_add_notification_remove_surface(surface_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *removed_callback = NULL; -+ -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_remove_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback = malloc(sizeof *removed_callback); -+ if (removed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ removed_callback->callback = callback; -+ removed_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.removed, -+ surface_removed, -+ removed_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_remove_notification_remove_surface(surface_remove_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.removed.listener_list, callback, userdata); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_add_notification_configure_surface(surface_configure_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_notification_callback *configure_changed_callback = NULL; -+ if (callback == NULL) { -+ weston_log("ivi_layout_add_notification_configure_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ configure_changed_callback = malloc(sizeof *configure_changed_callback); -+ if (configure_changed_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ configure_changed_callback->callback = callback; -+ configure_changed_callback->data = userdata; -+ -+ return add_notification(&layout->surface_notification.configure_changed, -+ surface_configure_changed, -+ configure_changed_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_remove_notification_configure_surface(surface_configure_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout *layout = get_instance(); -+ remove_notification(&layout->surface_notification.configure_changed.listener_list, callback, userdata); -+} -+ -+WL_EXPORT uint32_t -+ivi_layout_get_id_of_surface(struct ivi_layout_surface *ivisurf) -+{ -+ return ivisurf->id_surface; -+} -+ -+WL_EXPORT uint32_t -+ivi_layout_get_id_of_layer(struct ivi_layout_layer *ivilayer) -+{ -+ return ivilayer->id_layer; -+} -+ -+struct ivi_layout_layer * -+ivi_layout_get_layer_from_id(uint32_t id_layer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if (ivilayer->id_layer == id_layer) { -+ return ivilayer; -+ } -+ } -+ -+ return NULL; -+} -+ -+WL_EXPORT struct ivi_layout_surface * -+ivi_layout_get_surface_from_id(uint32_t id_surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ if (ivisurf->id_surface == id_surface) { -+ return ivisurf; -+ } -+ } -+ -+ return NULL; -+} -+ -+WL_EXPORT struct ivi_layout_screen * -+ivi_layout_get_screen_from_id(uint32_t id_screen) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+//FIXME : select iviscrn from screen_list by id_screen -+ return iviscrn; -+ break; -+ } -+ -+ return NULL; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_screen_resolution(struct ivi_layout_screen *iviscrn, -+ int32_t *pWidth, int32_t *pHeight) -+{ -+ struct weston_output *output = NULL; -+ -+ if (pWidth == NULL || pHeight == NULL) { -+ weston_log("ivi_layout_get_screen_resolution: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ output = iviscrn->output; -+ *pWidth = output->current_mode->width; -+ *pHeight = output->current_mode->height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_add_notification(struct ivi_layout_surface *ivisurf, -+ surface_property_notification_func callback, -+ void *userdata) -+{ -+ struct listener_layout_notification* notification = NULL; -+ struct ivi_layout_notification_callback *prop_callback = NULL; -+ -+ if (ivisurf == NULL || callback == NULL) { -+ weston_log("ivi_layout_surface_add_notification: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ notification = malloc(sizeof *notification); -+ if (notification == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback = malloc(sizeof *prop_callback); -+ if (prop_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback->callback = callback; -+ prop_callback->data = userdata; -+ -+ notification->listener.notify = surface_prop_changed; -+ notification->userdata = prop_callback; -+ -+ wl_signal_add(&ivisurf->property_changed, ¬ification->listener); -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT void -+ivi_layout_surface_remove_notification(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_remove_notification: invalid argument\n"); -+ return; -+ } -+ -+ remove_all_notification(&ivisurf->property_changed.listener_list); -+} -+ -+static void -+remove_configured_listener(struct ivi_layout_surface *ivisurf) -+{ -+ struct wl_listener *link = NULL; -+ struct wl_listener *next = NULL; -+ -+ wl_list_for_each_safe(link, next, &ivisurf->configured.listener_list, link) { -+ wl_list_remove(&link->link); -+ } -+} -+ -+void -+ivi_layout_surface_remove(struct ivi_layout_surface *ivisurf) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_remove: invalid argument\n"); -+ return; -+ } -+ -+ if (!wl_list_empty(&ivisurf->pending.link)) { -+ wl_list_remove(&ivisurf->pending.link); -+ } -+ if (!wl_list_empty(&ivisurf->order.link)) { -+ wl_list_remove(&ivisurf->order.link); -+ } -+ if (!wl_list_empty(&ivisurf->link)) { -+ wl_list_remove(&ivisurf->link); -+ } -+ remove_ordersurface_from_layer(ivisurf); -+ -+ wl_signal_emit(&layout->surface_notification.removed, ivisurf); -+ -+ remove_configured_listener(ivisurf); -+ -+ ivi_layout_surface_remove_notification(ivisurf); -+ -+ free(ivisurf); -+} -+ -+WL_EXPORT const struct ivi_layout_layer_properties * -+ivi_layout_get_properties_of_layer(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_get_properties_of_layer: invalid argument\n"); -+ return NULL; -+ } -+ -+ return &ivilayer->prop; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_screens(int32_t *pLength, struct ivi_layout_screen ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_screen *iviscrn = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_screens: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->screen_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(iviscrn, &layout->screen_list, link) { -+ (*ppArray)[n++] = iviscrn; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_screens_under_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_screen ***ppArray) -+{ -+ struct link_screen *link_scrn = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivilayer == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_screens_under_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivilayer->screen_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_screen *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(link_scrn, &ivilayer->screen_list, link) { -+ (*ppArray)[n++] = link_scrn->iviscrn; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_layers(int32_t *pLength, struct ivi_layout_layer ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_layers: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->layer_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ (*ppArray)[n++] = ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_get_layers_on_screen(struct ivi_layout_screen *iviscrn, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray) -+{ -+ struct ivi_layout_layer *ivilayer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (iviscrn == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_layers_on_screen: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&iviscrn->order.layer_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivilayer, &iviscrn->order.layer_list, link) { -+ (*ppArray)[n++] = ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_layers_under_surface(struct ivi_layout_surface *ivisurf, -+ int32_t *pLength, -+ struct ivi_layout_layer ***ppArray) -+{ -+ struct link_layer *link_layer = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivisurf == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_getLayers: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivisurf->layer_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_layer *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(link_layer, &ivisurf->layer_list, link) { -+ (*ppArray)[n++] = link_layer->ivilayer; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_get_surfaces(int32_t *pLength, struct ivi_layout_surface ***ppArray) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_get_surfaces: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&layout->surface_list); -+ -+ if (length != 0){ -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_surface *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivisurf, &layout->surface_list, link) { -+ (*ppArray)[n++] = ivisurf; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_get_surfaces_on_layer(struct ivi_layout_layer *ivilayer, -+ int32_t *pLength, -+ struct ivi_layout_surface ***ppArray) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ int32_t length = 0; -+ int32_t n = 0; -+ -+ if (ivilayer == NULL || pLength == NULL || ppArray == NULL) { -+ weston_log("ivi_layout_getSurfaceIDsOnLayer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ length = wl_list_length(&ivilayer->order.surface_list); -+ -+ if (length != 0) { -+ /* the Array must be free by module which called this function */ -+ *ppArray = calloc(length, sizeof(struct ivi_layout_surface *)); -+ if (*ppArray == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each(ivisurf, &ivilayer->order.surface_list, order.link) { -+ (*ppArray)[n++] = ivisurf; -+ } -+ } -+ -+ *pLength = length; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT struct ivi_layout_layer * -+ivi_layout_layer_create_with_dimension(uint32_t id_layer, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ -+ ivilayer = get_layer(&layout->layer_list, id_layer); -+ if (ivilayer != NULL) { -+ weston_log("id_layer is already created\n"); -+ return ivilayer; -+ } -+ -+ ivilayer = calloc(1, sizeof *ivilayer); -+ if (ivilayer == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return NULL; -+ } -+ -+ wl_list_init(&ivilayer->link); -+ wl_signal_init(&ivilayer->property_changed); -+ wl_list_init(&ivilayer->screen_list); -+ wl_list_init(&ivilayer->link_to_surface); -+ ivilayer->layout = layout; -+ ivilayer->id_layer = id_layer; -+ -+ init_layer_properties(&ivilayer->prop, width, height); -+ ivilayer->event_mask = 0; -+ -+ wl_list_init(&ivilayer->pending.surface_list); -+ wl_list_init(&ivilayer->pending.link); -+ ivilayer->pending.prop = ivilayer->prop; -+ -+ wl_list_init(&ivilayer->order.surface_list); -+ wl_list_init(&ivilayer->order.link); -+ -+ wl_list_insert(&layout->layer_list, &ivilayer->link); -+ -+ wl_signal_emit(&layout->layer_notification.created, ivilayer); -+ -+ return ivilayer; -+} -+ -+WL_EXPORT void -+ivi_layout_layer_remove(struct ivi_layout_layer *ivilayer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_remove: invalid argument\n"); -+ return; -+ } -+ -+ wl_signal_emit(&layout->layer_notification.removed, ivilayer); -+ -+ clear_surface_pending_list(ivilayer); -+ clear_surface_order_list(ivilayer); -+ -+ if (!wl_list_empty(&ivilayer->pending.link)) { -+ wl_list_remove(&ivilayer->pending.link); -+ } -+ if (!wl_list_empty(&ivilayer->order.link)) { -+ wl_list_remove(&ivilayer->order.link); -+ } -+ if (!wl_list_empty(&ivilayer->link)) { -+ wl_list_remove(&ivilayer->link); -+ } -+ remove_orderlayer_from_screen(ivilayer); -+ remove_link_to_surface(ivilayer); -+ ivi_layout_layer_remove_notification(ivilayer); -+ -+ free(ivilayer); -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_visibility(struct ivi_layout_layer *ivilayer, -+ bool newVisibility) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_visibility: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->visibility = newVisibility; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_VISIBILITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+bool -+ivi_layout_layer_get_visibility(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_visibility: invalid argument\n"); -+ return false; -+ } -+ -+ return ivilayer->prop.visibility; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_opacity(struct ivi_layout_layer *ivilayer, -+ wl_fixed_t opacity) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_opacity: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->opacity = opacity; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_OPACITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT wl_fixed_t -+ivi_layout_layer_get_opacity(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_opacity: invalid argument\n"); -+ return wl_fixed_from_double(0.0); -+ } -+ -+ return ivilayer->prop.opacity; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_source_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_source_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->source_x = x; -+ prop->source_y = y; -+ prop->source_width = width; -+ prop->source_height = height; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_destination_rectangle(struct ivi_layout_layer *ivilayer, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_destination_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->dest_x = x; -+ prop->dest_y = y; -+ prop->dest_width = width; -+ prop->dest_height = height; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_DEST_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_layer_get_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_width, int32_t *dest_height) -+{ -+ if (ivilayer == NULL || dest_width == NULL || dest_height == NULL) { -+ weston_log("ivi_layout_layer_get_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_width = ivilayer->prop.dest_width; -+ *dest_height = ivilayer->prop.dest_height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_layer_set_dimension(struct ivi_layout_layer *ivilayer, -+ int32_t dest_width, int32_t dest_height) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ -+ prop->dest_width = dest_width; -+ prop->dest_height = dest_height; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_DIMENSION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_get_position(struct ivi_layout_layer *ivilayer, -+ int32_t *dest_x, int32_t *dest_y) -+{ -+ if (ivilayer == NULL || dest_x == NULL || dest_y == NULL) { -+ weston_log("ivi_layout_layer_get_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_x = ivilayer->prop.dest_x; -+ *dest_y = ivilayer->prop.dest_y; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_position(struct ivi_layout_layer *ivilayer, -+ int32_t dest_x, int32_t dest_y) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->dest_x = dest_x; -+ prop->dest_y = dest_y; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_POSITION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_orientation(struct ivi_layout_layer *ivilayer, -+ enum wl_output_transform orientation) -+{ -+ struct ivi_layout_layer_properties *prop = NULL; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_orientation: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivilayer->pending.prop; -+ prop->orientation = orientation; -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_ORIENTATION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+enum wl_output_transform -+ivi_layout_layer_get_orientation(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_get_orientation: invalid argument\n"); -+ return 0; -+ } -+ -+ return ivilayer->prop.orientation; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_set_render_order(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface **pSurface, -+ int32_t number) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ uint32_t *id_surface = NULL; -+ int32_t i = 0; -+ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_set_render_order: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ if (pSurface == NULL) { -+ wl_list_for_each_safe(ivisurf, next, &ivilayer->pending.surface_list, pending.link) { -+ if (!wl_list_empty(&ivisurf->pending.link)) { -+ wl_list_remove(&ivisurf->pending.link); -+ } -+ -+ wl_list_init(&ivisurf->pending.link); -+ } -+ ivilayer->event_mask |= IVI_NOTIFICATION_REMOVE; -+ return IVI_SUCCEEDED; -+ } -+ -+ for (i = 0; i < number; i++) { -+ id_surface = &pSurface[i]->id_surface; -+ -+ wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) { -+ if (*id_surface != ivisurf->id_surface) { -+ continue; -+ } -+ -+ if (!wl_list_empty(&ivisurf->pending.link)) { -+ wl_list_remove(&ivisurf->pending.link); -+ } -+ wl_list_init(&ivisurf->pending.link); -+ wl_list_insert(&ivilayer->pending.surface_list, -+ &ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_ADD; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_visibility(struct ivi_layout_surface *ivisurf, -+ bool newVisibility) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_visibility: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->visibility = newVisibility; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_VISIBILITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT bool -+ivi_layout_surface_get_visibility(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_visibility: invalid argument\n"); -+ return false; -+ } -+ -+ return ivisurf->prop.visibility; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_opacity(struct ivi_layout_surface *ivisurf, -+ wl_fixed_t opacity) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_opacity: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->opacity = opacity; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_OPACITY; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT wl_fixed_t -+ivi_layout_surface_get_opacity(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_opacity: invalid argument\n"); -+ return wl_fixed_from_double(0.0); -+ } -+ -+ return ivisurf->prop.opacity; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_destination_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_destination_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->start_x = prop->dest_x; -+ prop->start_y = prop->dest_y; -+ prop->dest_x = x; -+ prop->dest_y = y; -+ prop->start_width = prop->dest_width; -+ prop->start_height = prop->dest_height; -+ prop->dest_width = width; -+ prop->dest_height = height; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_DEST_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_set_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t dest_width, int32_t dest_height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->dest_width = dest_width; -+ prop->dest_height = dest_height; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_DIMENSION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_get_dimension(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_width, int32_t *dest_height) -+{ -+ if (ivisurf == NULL || dest_width == NULL || dest_height == NULL) { -+ weston_log("ivi_layout_surface_get_dimension: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_width = ivisurf->prop.dest_width; -+ *dest_height = ivisurf->prop.dest_height; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_set_position(struct ivi_layout_surface *ivisurf, -+ int32_t dest_x, int32_t dest_y) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->dest_x = dest_x; -+ prop->dest_y = dest_y; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_POSITION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+int32_t -+ivi_layout_surface_get_position(struct ivi_layout_surface *ivisurf, -+ int32_t *dest_x, int32_t *dest_y) -+{ -+ if (ivisurf == NULL || dest_x == NULL || dest_y == NULL) { -+ weston_log("ivi_layout_surface_get_position: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ *dest_x = ivisurf->prop.dest_x; -+ *dest_y = ivisurf->prop.dest_y; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_orientation(struct ivi_layout_surface *ivisurf, -+ enum wl_output_transform orientation) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_orientation: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->orientation = orientation; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_ORIENTATION; -+ -+ return IVI_SUCCEEDED; -+} -+ -+enum wl_output_transform -+ivi_layout_surface_get_orientation(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_get_orientation: invalid argument\n"); -+ return 0; -+ } -+ -+ return ivisurf->prop.orientation; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_screen_add_layer(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer *addlayer) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ int is_layer_in_scrn = 0; -+ -+ if (iviscrn == NULL || addlayer == NULL) { -+ weston_log("ivi_layout_screen_add_layer: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ is_layer_in_scrn = is_layer_in_screen(addlayer, iviscrn); -+ if (is_layer_in_scrn == 1) { -+ weston_log("ivi_layout_screen_add_layer: addlayer is already available\n"); -+ return IVI_SUCCEEDED; -+ } -+ -+ wl_list_for_each_safe(ivilayer, next, &layout->layer_list, link) { -+ if (ivilayer->id_layer == addlayer->id_layer) { -+ if (!wl_list_empty(&ivilayer->pending.link)) { -+ wl_list_remove(&ivilayer->pending.link); -+ } -+ wl_list_init(&ivilayer->pending.link); -+ wl_list_insert(&iviscrn->pending.layer_list, -+ &ivilayer->pending.link); -+ break; -+ } -+ } -+ -+ iviscrn->event_mask |= IVI_NOTIFICATION_ADD; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_screen_set_render_order(struct ivi_layout_screen *iviscrn, -+ struct ivi_layout_layer **pLayer, -+ const int32_t number) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_layer *ivilayer = NULL; -+ struct ivi_layout_layer *next = NULL; -+ uint32_t *id_layer = NULL; -+ int32_t i = 0; -+ -+ if (iviscrn == NULL) { -+ weston_log("ivi_layout_screen_set_render_order: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ wl_list_for_each_safe(ivilayer, next, -+ &iviscrn->pending.layer_list, pending.link) { -+ wl_list_init(&ivilayer->pending.link); -+ } -+ -+ wl_list_init(&iviscrn->pending.layer_list); -+ -+ if (pLayer == NULL) { -+ wl_list_for_each_safe(ivilayer, next, &iviscrn->pending.layer_list, pending.link) { -+ if (!wl_list_empty(&ivilayer->pending.link)) { -+ wl_list_remove(&ivilayer->pending.link); -+ } -+ -+ wl_list_init(&ivilayer->pending.link); -+ } -+ -+ iviscrn->event_mask |= IVI_NOTIFICATION_REMOVE; -+ return IVI_SUCCEEDED; -+ } -+ -+ for (i = 0; i < number; i++) { -+ id_layer = &pLayer[i]->id_layer; -+ wl_list_for_each(ivilayer, &layout->layer_list, link) { -+ if (*id_layer != ivilayer->id_layer) { -+ continue; -+ } -+ -+ if (!wl_list_empty(&ivilayer->pending.link)) { -+ wl_list_remove(&ivilayer->pending.link); -+ } -+ wl_list_init(&ivilayer->pending.link); -+ wl_list_insert(&iviscrn->pending.layer_list, -+ &ivilayer->pending.link); -+ break; -+ } -+ } -+ -+ iviscrn->event_mask |= IVI_NOTIFICATION_ADD; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT struct weston_output * -+ivi_layout_screen_get_output(struct ivi_layout_screen *iviscrn) -+{ -+ return iviscrn->output; -+} -+ -+/** -+ * This function is used by the additional ivi-module because of dumping ivi_surface sceenshot. -+ * The ivi-module, e.g. ivi-controller.so, is in wayland-ivi-extension of Genivi's Layer Management. -+ * This function is used to get the result of drawing by clients. -+ */ -+WL_EXPORT struct weston_surface * -+ivi_layout_surface_get_weston_surface(struct ivi_layout_surface *ivisurf) -+{ -+ return ivisurf != NULL ? ivisurf->surface : NULL; -+} -+ -+/** -+ * This function is used by the additional ivi-module because of dumping ivi_surface sceenshot. -+ * The ivi-module, e.g. ivi-controller.so, is in wayland-ivi-extension of Genivi's Layer Management. -+ * This function is used to get the region and the stride. -+ */ -+WL_EXPORT int32_t -+ivi_layout_surface_get_size(struct ivi_layout_surface *ivisurf, int32_t *width, int32_t *height, int32_t *stride) -+{ -+ if (ivisurf == NULL) { -+ return IVI_FAILED; -+ } -+ -+ if (width != NULL) { -+ *width = ivisurf->prop.source_width; -+ } -+ -+ if (height != NULL) { -+ *height = ivisurf->prop.source_height; -+ } -+ -+ if (stride != NULL && -+ ivisurf->surface->buffer_ref.buffer != NULL && -+ ivisurf->surface->buffer_ref.buffer->shm_buffer != NULL) { -+ *stride = wl_shm_buffer_get_stride(ivisurf->surface->buffer_ref.buffer->shm_buffer); -+ } -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_add_notification(struct ivi_layout_layer *ivilayer, -+ layer_property_notification_func callback, -+ void *userdata) -+{ -+ struct ivi_layout_notification_callback *prop_callback = NULL; -+ -+ if (ivilayer == NULL || callback == NULL) { -+ weston_log("ivi_layout_layer_add_notification: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback = malloc(sizeof *prop_callback); -+ if (prop_callback == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return IVI_FAILED; -+ } -+ -+ prop_callback->callback = callback; -+ prop_callback->data = userdata; -+ -+ return add_notification(&ivilayer->property_changed, -+ layer_prop_changed, -+ prop_callback); -+} -+ -+WL_EXPORT void -+ivi_layout_layer_remove_notification(struct ivi_layout_layer *ivilayer) -+{ -+ if (ivilayer == NULL) { -+ weston_log("ivi_layout_layer_remove_notification: invalid argument\n"); -+ return; -+ } -+ -+ remove_all_notification(&ivilayer->property_changed.listener_list); -+} -+ -+WL_EXPORT const struct ivi_layout_surface_properties * -+ivi_layout_get_properties_of_surface(struct ivi_layout_surface *ivisurf) -+{ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_get_properties_of_surface: invalid argument\n"); -+ return NULL; -+ } -+ -+ return &ivisurf->prop; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_layer_add_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *addsurf) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ int is_surf_in_layer = 0; -+ -+ if (ivilayer == NULL || addsurf == NULL) { -+ weston_log("ivi_layout_layer_add_surface: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ is_surf_in_layer = is_surface_in_layer(addsurf, ivilayer); -+ if (is_surf_in_layer == 1) { -+ weston_log("ivi_layout_layer_add_surface: addsurf is already available\n"); -+ return IVI_SUCCEEDED; -+ } -+ -+ wl_list_for_each_safe(ivisurf, next, &layout->surface_list, link) { -+ if (ivisurf->id_surface == addsurf->id_surface) { -+ if (!wl_list_empty(&ivisurf->pending.link)) { -+ wl_list_remove(&ivisurf->pending.link); -+ } -+ wl_list_init(&ivisurf->pending.link); -+ wl_list_insert(&ivilayer->pending.surface_list, -+ &ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ ivilayer->event_mask |= IVI_NOTIFICATION_ADD; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT void -+ivi_layout_layer_remove_surface(struct ivi_layout_layer *ivilayer, -+ struct ivi_layout_surface *remsurf) -+{ -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct ivi_layout_surface *next = NULL; -+ -+ if (ivilayer == NULL || remsurf == NULL) { -+ weston_log("ivi_layout_layer_remove_surface: invalid argument\n"); -+ return; -+ } -+ -+ wl_list_for_each_safe(ivisurf, next, -+ &ivilayer->pending.surface_list, pending.link) { -+ if (ivisurf->id_surface == remsurf->id_surface) { -+ if (!wl_list_empty(&ivisurf->pending.link)) { -+ wl_list_remove(&ivisurf->pending.link); -+ } -+ wl_list_init(&ivisurf->pending.link); -+ break; -+ } -+ } -+ -+ remsurf->event_mask |= IVI_NOTIFICATION_REMOVE; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_source_rectangle(struct ivi_layout_surface *ivisurf, -+ int32_t x, int32_t y, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout_surface_properties *prop = NULL; -+ -+ if (ivisurf == NULL) { -+ weston_log("ivi_layout_surface_set_source_rectangle: invalid argument\n"); -+ return IVI_FAILED; -+ } -+ -+ prop = &ivisurf->pending.prop; -+ prop->source_x = x; -+ prop->source_y = y; -+ prop->source_width = width; -+ prop->source_height = height; -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_SOURCE_RECT; -+ -+ return IVI_SUCCEEDED; -+} -+ -+WL_EXPORT int32_t -+ivi_layout_commit_changes(void) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ commit_surface_list(layout); -+ commit_layer_list(layout); -+ commit_screen_list(layout); -+ -+ commit_transition(layout); -+ -+ commit_changes(layout); -+ send_prop(layout); -+ weston_compositor_schedule_repaint(layout->compositor); -+ -+ return IVI_SUCCEEDED; -+} -+ -+/***called from ivi-shell**/ -+static struct weston_view * -+ivi_layout_get_weston_view(struct ivi_layout_surface *surface) -+{ -+ struct weston_view *tmpview = NULL; -+ -+ if(surface == NULL) -+ return NULL; -+ -+ wl_list_for_each(tmpview, &surface->surface->views, surface_link) -+ { -+ if (tmpview != NULL) { -+ break; -+ } -+ } -+ return tmpview; -+} -+ -+static void -+ivi_layout_surface_configure(struct ivi_layout_surface *ivisurf, -+ int32_t width, int32_t height) -+{ -+ struct ivi_layout *layout = get_instance(); -+ int32_t in_init = 0; -+ ivisurf->surface->width_from_buffer = width; -+ ivisurf->surface->height_from_buffer = height; -+ -+ if (ivisurf->prop.source_width == 0 || ivisurf->prop.source_height == 0) { -+ in_init = 1; -+ } -+ -+ /* FIXME: when sourceHeight/Width is used as clipping range in image buffer */ -+ /* if (ivisurf->prop.sourceWidth == 0 || ivisurf->prop.sourceHeight == 0) { */ -+ ivisurf->pending.prop.source_width = width; -+ ivisurf->pending.prop.source_height = height; -+ ivisurf->prop.source_width = width; -+ ivisurf->prop.source_height = height; -+ /* } */ -+ -+ ivisurf->event_mask |= IVI_NOTIFICATION_CONFIGURE; -+ -+ if (in_init) { -+ wl_signal_emit(&layout->surface_notification.configure_changed, ivisurf); -+ } else { -+ ivi_layout_commit_changes(); -+ } -+} -+ -+WL_EXPORT int32_t -+ivi_layout_surface_set_content_observer(struct ivi_layout_surface *ivisurf, -+ ivi_controller_surface_content_callback callback, -+ void* userdata) -+{ -+ int32_t ret = IVI_FAILED; -+ -+ if (ivisurf != NULL) { -+ ivisurf->content_observer.callback = callback; -+ ivisurf->content_observer.userdata = userdata; -+ ret = IVI_SUCCEEDED; -+ } -+ return ret; -+} -+ -+static struct ivi_layout_surface* -+ivi_layout_surface_create(struct weston_surface *wl_surface, -+ uint32_t id_surface) -+{ -+ struct ivi_layout *layout = get_instance(); -+ struct ivi_layout_surface *ivisurf = NULL; -+ struct weston_view *tmpview = NULL; -+ -+ if (wl_surface == NULL) { -+ weston_log("ivi_layout_surface_create: invalid argument\n"); -+ return NULL; -+ } -+ -+ ivisurf = get_surface(&layout->surface_list, id_surface); -+ if (ivisurf != NULL) { -+ if (ivisurf->surface != NULL) { -+ weston_log("id_surface(%d) is already created\n", id_surface); -+ return NULL; -+ } -+ } -+ -+ ivisurf = calloc(1, sizeof *ivisurf); -+ if (ivisurf == NULL) { -+ weston_log("fails to allocate memory\n"); -+ return NULL; -+ } -+ -+ wl_list_init(&ivisurf->link); -+ wl_signal_init(&ivisurf->property_changed); -+ wl_signal_init(&ivisurf->configured); -+ wl_list_init(&ivisurf->layer_list); -+ ivisurf->id_surface = id_surface; -+ ivisurf->layout = layout; -+ -+ ivisurf->surface = wl_surface; -+ ivisurf->surface_destroy_listener.notify = -+ westonsurface_destroy_from_ivisurface; -+ wl_resource_add_destroy_listener(wl_surface->resource, -+ &ivisurf->surface_destroy_listener); -+ -+ tmpview = weston_view_create(wl_surface); -+ if (tmpview == NULL) { -+ weston_log("fails to allocate memory\n"); -+ } -+ -+ ivisurf->surface->width_from_buffer = 0; -+ ivisurf->surface->height_from_buffer = 0; -+ -+ weston_matrix_init(&ivisurf->surface_rotation.matrix); -+ weston_matrix_init(&ivisurf->layer_rotation.matrix); -+ weston_matrix_init(&ivisurf->surface_pos.matrix); -+ weston_matrix_init(&ivisurf->layer_pos.matrix); -+ weston_matrix_init(&ivisurf->scaling.matrix); -+ -+ wl_list_init(&ivisurf->surface_rotation.link); -+ wl_list_init(&ivisurf->layer_rotation.link); -+ wl_list_init(&ivisurf->surface_pos.link); -+ wl_list_init(&ivisurf->layer_pos.link); -+ wl_list_init(&ivisurf->scaling.link); -+ -+ init_surface_properties(&ivisurf->prop); -+ ivisurf->event_mask = 0; -+ -+ ivisurf->pending.prop = ivisurf->prop; -+ wl_list_init(&ivisurf->pending.link); -+ -+ wl_list_init(&ivisurf->order.link); -+ wl_list_init(&ivisurf->order.layer_list); -+ -+ wl_list_insert(&layout->surface_list, &ivisurf->link); -+ -+ wl_signal_emit(&layout->surface_notification.created, ivisurf); -+ -+ return ivisurf; -+} -+ -+static void -+ivi_layout_init_with_compositor(struct weston_compositor *ec) -+{ -+ struct ivi_layout *layout = get_instance(); -+ -+ layout->compositor = ec; -+ -+ wl_list_init(&layout->surface_list); -+ wl_list_init(&layout->layer_list); -+ wl_list_init(&layout->screen_list); -+ -+ wl_signal_init(&layout->layer_notification.created); -+ wl_signal_init(&layout->layer_notification.removed); -+ -+ wl_signal_init(&layout->surface_notification.created); -+ wl_signal_init(&layout->surface_notification.removed); -+ wl_signal_init(&layout->surface_notification.configure_changed); -+ -+ /* Add layout_layer at the last of weston_compositor.layer_list */ -+ weston_layer_init(&layout->layout_layer, ec->layer_list.prev); -+ -+ create_screen(ec); -+ -+ layout->transitions = ivi_layout_transition_set_create(ec); -+ wl_list_init(&layout->pending_transition_list); -+} -+ -+ -+static void -+ivi_layout_surface_add_configured_listener(struct ivi_layout_surface* ivisurf, -+ struct wl_listener* listener) -+{ -+ wl_signal_add(&ivisurf->configured, listener); -+} -+ -+WL_EXPORT struct ivi_layout_interface ivi_layout_interface = { -+ .get_weston_view = ivi_layout_get_weston_view, -+ .surface_configure = ivi_layout_surface_configure, -+ .surface_create = ivi_layout_surface_create, -+ .init_with_compositor = ivi_layout_init_with_compositor, -+ .get_surface_dimension = ivi_layout_surface_get_dimension, -+ .add_surface_configured_listener = ivi_layout_surface_add_configured_listener -+}; --- -1.7.9.5 - |