--- /dev/null
+Developer:
+ Ji-hoon Lee <dalton.lee at samsung dot com>
+ Yanjie Hu <yanjie.hu at samsung dot com>
--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(libscl-ui-nui CXX)
+
+SET(SRCS
+ scl/sclres_manager.cpp
+ scl/sclres.cpp
+ scl/main_entry_parser.cpp
+ scl/input_mode_configure_parser.cpp
+ scl/layout_parser.cpp
+ scl/layout_parser_helper.cpp
+ scl/modifier_decoration_parser.cpp
+ scl/label_properties_parser.cpp
+ scl/default_configure_parser.cpp
+ scl/autopopup_configure_parser.cpp
+ scl/magnifier_configure_parser.cpp
+ scl/nine_patch_file_list_parser.cpp
+ scl/xmlresource.cpp
+ scl/xml_parser_utils.cpp
+ scl/string_bin_parser.cpp
+ scl/metadata_bin_parser.cpp
+ scl/input_mode_configure_bin_parser.cpp
+ scl/layout_bin_parser.cpp
+ scl/key_coordinate_frame_bin_parser.cpp
+ scl/modifier_decoration_bin_parser.cpp
+ scl/label_properties_bin_parser.cpp
+ scl/default_configure_bin_parser.cpp
+ scl/autopopup_configure_bin_parser.cpp
+ scl/magnifier_configure_bin_parser.cpp
+ scl/nine_patch_file_list_bin_parser.cpp
+ scl/binary_xmlresource.cpp
+ scl/file_storage.cpp
+ scl/sclerroradjustment.cpp
+ scl/sclutils-linux.cpp
+ scl/scldebug.cpp
+ scl/sclutils.cpp
+ scl/sclcontroller.cpp
+ scl/sclgwes.cpp
+ scl/sclevents.cpp
+# scl/sclwindows-efl.cpp
+# scl/sclgraphics-efl.cpp
+# scl/sclanimator-efl.cpp
+# scl/sclevents-efl.cpp
+
+ scl/sclwindows-nui.cpp
+ scl/sclgraphics-nui.cpp
+ scl/sclanimator-nui.cpp
+ scl/sclevents-nui.cpp
+
+ scl/sclfeedback.cpp
+ scl/scluibuilder.cpp
+ scl/scluiimpl.cpp
+ scl/sclui.cpp
+ scl/scleffect.cpp
+ scl/scleventhandler.cpp
+ scl/sclwindows.cpp
+ scl/sclgraphics.cpp
+ scl/sclimageproxy.cpp
+ scl/sclfontproxy.cpp
+ scl/sclcontext.cpp
+ scl/sclactionstate.cpp
+ scl/sclresourcecache.cpp
+ scl/sclkeyfocushandler.cpp
+ scl/sclanimator.cpp
+ res/sclresource.cpp
+ res/simple_debug.cpp
+)
+
+SET(PACKAGE ${PROJECT_NAME})
+SET(PKGNAME ${PACKAGE})
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(LIBDIR ${LIB_INSTALL_DIR})
+SET(INCLUDEDIR "\${PREFIX}/scl/include")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF()
+MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
+ ${CMAKE_SOURCE_DIR}/src/include
+ ${CMAKE_SOURCE_DIR}/scl
+ ${CMAKE_SOURCE_DIR}/scl/include
+ ${CMAKE_SOURCE_DIR}/xmlresource/include
+ ${CMAKE_SOURCE_DIR}/binary_xmlresource/include
+ ${CMAKE_SOURCE_DIR}/binary_xmlresource/include/interface
+ ${CMAKE_SOURCE_DIR}/sclres
+ ${CMAKE_SOURCE_DIR}/scl/gwes
+ ${CMAKE_SOURCE_DIR}/scl/gwes/efl
+ ${CMAKE_SOURCE_DIR}/res )
+
+INCLUDE(FindPkgConfig)
+SET(PKGS_CHECK_MODULES
+ elementary
+ glib-2.0
+ feedback
+ dlog
+ libxml-2.0
+ tts
+ vconf
+ eldbus
+ libscl-common
+ )
+
+IF (with_wayland)
+ ADD_DEFINITIONS("-DWAYLAND")
+ SET(PKGS_CHECK_MODULES ${PKGS_CHECK_MODULES} ecore-wl2)
+ENDIF(with_wayland)
+
+pkg_check_modules(pkgs REQUIRED ${PKGS_CHECK_MODULES})
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Wno-stringop-truncation")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -g")
+
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
+ADD_DEFINITIONS("-DPACKAGE_NAME=\"${PKGNAME}\"")
+ADD_DEFINITIONS("-DLOG_TAG=\"LIBSCL_UI\"")
+ADD_DEFINITIONS("-DDEFAULT_THEME=\"default\"")
+ADD_DEFINITIONS("-DIMG_PATH_PREFIX=\"image\"")
+ADD_DEFINITIONS("-D__NUI__")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
+
+set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR})
+
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclui.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclconfig.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclstructs.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/scleventcallback.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclgraphicsinfo.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclgraphicsbackendcallback.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclwindowbackendcallback.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclutils.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclfeedback.h" DESTINATION include/${name})
+
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclcontroller.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclgwes.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclwindows.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclgraphics.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclevents.h" DESTINATION include/${name})
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/scl/sclcontext.h" DESTINATION include/${name})
+
+CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig)
+
+ADD_SUBDIRECTORY(capi)
--- /dev/null
+2012-02-21 11:15 Ji-hoon Lee <dalton.lee@samsung.com>
+
+ Initial version.
+
--- /dev/null
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
--- /dev/null
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
--- /dev/null
+Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+Except as noted, this software is licensed under Apache License, Version 2.
+Please, see the LICENSE file for Apache License terms and conditions.
--- /dev/null
+libscl-ui
+==============
+
+This is a library that helps developing S/W Keyboards.
+
--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(scl-ui-nui-capi CXX)
+
+# Find Packages
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ elementary
+ glib-2.0
+ feedback
+ dlog
+ libxml-2.0
+ tts
+ vconf
+ eldbus
+ libscl-common
+ ecore-wl2
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIE")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -std=c++11")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}")
+
+#SET(CAPI_LIBSCL_UI_NUI inputmethod_unittests)
+
+SET(fw_name "scl-ui-nui-capi")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DTIZEN_DEBUG")
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib")
+
+AUX_SOURCE_DIRECTORY(src SOURCES)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../scl LIBSCL_SOURCES)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../res LIBSCL_RES_SOURCES)
+ADD_LIBRARY(${fw_name} SHARED
+ ${SOURCES}
+ ${LIBSCL_SOURCES}
+ ${LIBSCL_RES_SOURCES}
+ )
+TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS} ${pkgs_LDFLAGS})
+
+SET_TARGET_PROPERTIES(${fw_name}
+ PROPERTIES
+ VERSION ${FULLVER}
+ SOVERSION ${MAJORVER}
+ CLEAN_DIRECT_OUTPUT 1
+)
+
+INSTALL(TARGETS ${fw_name} DESTINATION ${LIBDIR})
+
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/capi/include/cscl-ui-nui.h" DESTINATION include)
+INSTALL(FILES "${CMAKE_SOURCE_DIR}/capi/include/cscl-ui-controller.h" DESTINATION include)
+
+SET(PC_NAME ${fw_name})
+SET(PC_REQUIRED ${dependents})
+SET(PC_LDFLAGS -l${fw_name})
+
+CONFIGURE_FILE(
+ scl-ui-nui-capi.pc.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc
+ @ONLY
+)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIBDIR}/pkgconfig)
+
+#SET(SOURCES "")
+
+#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../inputmethod/include
+# ${CMAKE_CURRENT_SOURCE_DIR}/../remote_input/include)
+
+SET(INC_DIR include)
+INCLUDE_DIRECTORIES(${INC_DIR})
+
+#AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../remote_input/src SCL_UI_SOURCES)
+
+ADD_DEFINITIONS("-DFULLVER=\"${FULLVER}\"")
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_CAPI_CONTROLLER_H__
+#define __SCL_CAPI_CONTROLLER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int scl_controller_mouse_press(int x, int y);
+int scl_controller_mouse_release(int x, int y);
+int scl_controller_mouse_move(int x, int y, int touch_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SCL_CAPI_CONTROLLER_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_EVENT_CALLBACK_H__
+#define __SCL_EVENT_CALLBACK_H__
+
+#include <sclui.h>
+
+class CUIEventCallback : public ISCLUIEventCallback
+{
+public :
+ /*
+ Ecore_Timer* word_timer = NULL;
+ static Eina_Bool _multi_tap_timer_cb(void *data)
+ {
+ LOGD("Time Out");
+ ise_send_event(MVK_Done, KEY_MASK_NULL);
+ return ECORE_CALLBACK_CANCEL;
+ }
+ */
+ SCLEventReturnType on_event_key_clicked(SclUIEventDesc event_desc);
+ SCLEventReturnType on_event_drag_state_changed(SclUIEventDesc event_desc);
+ SCLEventReturnType on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info);
+};
+
+#endif /* __SCL_EVENT_CALLBACK_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_GRAPHICS_BACKEND_H__
+#define __SCL_GRAPHICS_BACKEND_H__
+
+#include <sclui.h>
+
+class CUIGraphicsBackendCallback : public ISCLUIGraphicsBackendCallback
+{
+public :
+ void on_draw_text(const SclFontInfo& font_info, const SclColor& color, const char *str, int pos_x, int pos_y, int w, int h,
+ SCLLabelAlignment align, int padding_x, int padding_y, int inner_width, int inner_height, void* user_data);
+
+ void on_draw_image(const char *image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, void* user_data);
+
+ void on_draw_rectangle(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a, void* user_data);
+};
+
+#endif /* __SCL_GRAPHICS_BACKEND_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_CSHARP_NUI_H__
+#define __SCL_CSHARP_NUI_H__
+
+#include <tizen.h>
+#include <cscl-ui-controller.h>
+
+#define MAX_FONT_NAME_LEN 32
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+typedef struct _FontInfo {
+ char font_name[MAX_FONT_NAME_LEN];
+ short font_size;
+ bool is_italic;
+ bool is_bold;
+} FontInfo;
+
+typedef struct {
+ char r, g, b, a;
+} Color;
+*/
+
+typedef enum _LabelAlignment {
+ LABEL_ALIGN_LEFT_TOP = 0,
+ LABEL_ALIGN_CENTER_TOP,
+ LABEL_ALIGN_RIGHT_TOP,
+ LABEL_ALIGN_LEFT_MIDDLE,
+ LABEL_ALIGN_CENTER_MIDDLE,
+ LABEL_ALIGN_RIGHT_MIDDLE,
+ LABEL_ALIGN_LEFT_BOTTOM,
+ LABEL_ALIGN_CENTER_BOTTOM,
+ LABEL_ALIGN_RIGHT_BOTTOM,
+ MAX_LABEL_ALIGNMENT
+} LabelAlignment;
+
+/* graphics backend */
+typedef void (*scl_nui_draw_text_cb)(const char *font_name, short font_size, bool is_italic, bool is_bold, int r, int g, int b, int a,
+ const char *str, int pos_x, int pos_y, int w, int h,
+ LabelAlignment align, int padding_x, int padding_y, int inner_width, int inner_height, void* user_data);
+
+typedef void (*scl_nui_draw_image_cb)(const char *image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, void* user_data);
+typedef void (*scl_nui_draw_rectangle_cb)(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a, void* user_data);
+
+/* window backend */
+typedef void (*scl_nui_update_window_cb)(int x, int y, int width, int height, void* user_data);
+
+int scl_nui_init(const char *entry_filepath);
+int scl_nui_fini();
+
+int scl_nui_set_input_mode(const char *input_mode);
+int scl_nui_set_update_pending(bool pend);
+
+int scl_nui_set_draw_text_cb(scl_nui_draw_text_cb callback, void *user_data);
+int scl_nui_set_draw_image_cb(scl_nui_draw_image_cb callback, void *user_data);
+int scl_nui_set_draw_rectangle_cb(scl_nui_draw_rectangle_cb callback, void *user_data);
+
+int scl_nui_set_cur_sublayout(const char *sub_layout_name);
+int scl_nui_set_string_substitution(const char *original, const char *substitute);
+
+int scl_nui_set_update_window_cb(scl_nui_update_window_cb callback, void *user_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __SCL_CSHARP_NUI_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_CAPI_WIN_H__
+#define __SCL_CAPI_WIN_H__
+
+#include "Evas.h"
+
+Evas_Object *get_main_window();
+
+#endif /* __SCL_CAPI_WIN_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SCL_WINDOW_BACKEND_H__
+#define __SCL_WINDOW_BACKEND_H__
+
+#include <sclui.h>
+
+class CUIWindowBackendCallback : public ISCLUIWindowBackendCallback
+{
+public :
+ void update_window(int x, int y, int width, int height, void* user_data);
+};
+
+#endif /* __SCL_WINDOW_BACKEND_H__ */
--- /dev/null
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=/usr
+libdir=@LIBDIR@
+includedir=/usr/include
+
+Name: @PC_NAME@
+Description: @PACKAGE_DESCRIPTION@
+Version: @VERSION@
+Requires: @PC_REQUIRED@
+Libs: -L${libdir} @PC_LDFLAGS@
+Cflags: -I${includedir}
+
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dlog.h>
+#include <tizen.h>
+#include "cscl-ui-controller.h"
+#include "sclcontroller.h"
+#include "cscl-ui-win.h"
+
+using namespace std;
+using namespace scl;
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "CSCLUINUI"
+
+EXPORT_API int scl_controller_mouse_press(int x, int y)
+{
+ LOGD("mouse down x:%d, y:%d", x, y);
+ //return 0;
+
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ LOGD("mouse down x:%d, y:%d", x, y);
+ controller->mouse_press(get_main_window(), x, y);
+ return 0;
+ }
+ else {
+ LOGW("No controller");
+ return 1;
+ }
+}
+
+
+EXPORT_API int scl_controller_mouse_release(int x, int y)
+{
+ LOGD("mouse release x:%d, y:%d", x, y);
+
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ LOGD("mouse release x:%d, y:%d", x, y);
+ controller->mouse_release(get_main_window(), x, y);
+ return 0;
+ }
+ else {
+ LOGW("No controller");
+ return 1;
+ }
+}
+
+EXPORT_API int scl_controller_mouse_move(int x, int y, int touch_id)
+{
+ CSCLController *controller = CSCLController::get_instance();
+ LOGD("mouse move x:%d, y:%d", x, y);
+
+ if (controller) {
+ LOGD("mouse move x:%d, y:%d", x, y);
+ controller->mouse_move(get_main_window(), x, y, touch_id);
+ return 0;
+ }
+ else {
+ LOGW("No controller");
+ return 1;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dlog.h>
+#include <sclui.h>
+#include <Elementary.h>
+#include "cscl-ui-nui.h"
+#include "cscl-ui-graphics-backend.h"
+#include "cscl-ui-window-backend.h"
+#include "cscl-ui-event-callback.h"
+
+using namespace std;
+using namespace scl;
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "CSCLUINUI"
+
+#define USE_ELM_WIN 1
+
+#ifdef USE_ELM_WIN
+static Evas_Object *g_win = NULL;
+#endif
+
+static CSCLUI *g_ui = NULL;
+
+static scl_nui_draw_text_cb g_draw_text_cb;
+static void *g_draw_text_cb_data = NULL;
+
+static scl_nui_draw_image_cb g_draw_image_cb = NULL;
+static void *g_draw_image_cb_data = NULL;
+
+static scl_nui_draw_rectangle_cb g_draw_rectangle_cb = NULL;
+static void *g_draw_rectangle_cb_data = NULL;
+
+static scl_nui_update_window_cb g_update_window_cb = NULL;
+static void *g_update_window_cb_data = NULL;
+
+void CUIGraphicsBackendCallback::on_draw_text(const SclFontInfo& font_info, const SclColor& color, const char *str, int pos_x, int pos_y, int w, int h,
+ SCLLabelAlignment align, int padding_x, int padding_y, int inner_width, int inner_height, void* user_data)
+ //const char *str, int x, int y, int w, int h, int fontsize, void* user_data)
+{
+ LOGD("draw text : %p", g_draw_text_cb);
+ if (g_draw_text_cb) {
+ //g_draw_text_cb(str, pos_x, pos_y, w, h, font_info.font_size, user_data);
+ /*
+ FontInfo fi;
+ strcpy(fi.font_name, font_info.font_name);
+ fi.font_size = font_info.font_size;
+ fi.is_bold = font_info.is_bold;
+ fi.is_italic = font_info.is_italic;
+
+ Color ci;
+ ci.a = color.a;
+ ci.b = color.b;
+ ci.g = color.g;
+ ci.r = color.r;
+ */
+
+ /*
+ g_draw_text_cb(fi, ci, str, pos_x, pos_y, w, h,
+ (LabelAlignment)align, padding_x, padding_y, inner_width, inner_height, user_data);
+ */
+ g_draw_text_cb(font_info.font_name, font_info.font_size, font_info.is_bold, font_info.is_italic,
+ color.r, color.g, color.b, color.a,
+ str, pos_x, pos_y, w, h,
+ (LabelAlignment)align, padding_x, padding_y, inner_width, inner_height, user_data);
+ }
+}
+
+void CUIGraphicsBackendCallback::on_draw_image(const char *image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, void* user_data)
+{
+ LOGD("draw image : %p", g_draw_image_cb);
+ if (g_draw_image_cb) {
+ g_draw_image_cb(image_path, dest_x, dest_y, dest_weight, dest_height, src_x, src_y, src_width, src_height, user_data);
+ }
+}
+
+void CUIGraphicsBackendCallback::on_draw_rectangle(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a, void* user_data)
+{
+ LOGD("draw rectangle : %p", g_draw_rectangle_cb);
+ if (g_draw_rectangle_cb) {
+ g_draw_rectangle_cb(pos_x, pos_y, width, height,
+ fill, fill_color_r, fill_color_g, fill_color_b, fill_color_a, user_data);
+ }
+}
+
+void CUIWindowBackendCallback::update_window(int x, int y, int width, int height, void* user_data)
+{
+ LOGD("update_window : %p", g_update_window_cb);
+ if (g_update_window_cb) {
+ g_update_window_cb(x, y, width, height, user_data);
+ }
+}
+
+SCLEventReturnType CUIEventCallback::on_event_key_clicked(SclUIEventDesc event_desc)
+{
+ LOGI("");
+ return SCL_EVENT_PASS_ON;
+}
+
+SCLEventReturnType CUIEventCallback::on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info)
+{
+ LOGI("");
+ return SCL_EVENT_PASS_ON;
+}
+
+SCLEventReturnType CUIEventCallback::on_event_drag_state_changed(SclUIEventDesc event_desc)
+{
+ LOGI("");
+ return SCL_EVENT_PASS_ON;
+}
+
+static CUIGraphicsBackendCallback callback;
+
+static CUIWindowBackendCallback window_callback;
+
+static CUIEventCallback event_callback;
+
+Evas_Object *get_main_window()
+{
+ return g_win;
+}
+
+EXPORT_API int scl_nui_init(const char *entry_filepath)
+{
+#ifdef USE_ELM_WIN
+ elm_init(0, NULL);
+#endif
+
+ //LOGI("################## Hello ################");
+
+ //sleep(10);
+
+ if (!g_ui) {
+ g_ui = new CSCLUI;
+ }
+
+ if (!g_ui)
+ return 1;
+
+#ifdef USE_ELM_WIN
+ g_win = elm_win_add(NULL, "test", ELM_WIN_UTILITY);
+#endif
+
+ g_ui->init(g_win, SCL_PARSER_TYPE_XML, entry_filepath);
+
+ g_ui->set_graphics_backend_callback(&callback, NULL);
+
+ g_ui->set_window_backend_callback(&window_callback, NULL);
+
+ /* Default ISE callback */
+ g_ui->set_ui_event_callback(&event_callback);
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_fini()
+{
+ int ret = 0;
+
+#ifdef USE_ELM_WIN
+ if (g_win)
+ evas_object_del(g_win);
+
+ g_win = NULL;
+#endif
+
+ if (g_ui)
+ g_ui->fini();
+ else
+ ret = 1;
+
+#ifdef USE_ELM_WIN
+ elm_shutdown();
+#endif
+
+ return ret;
+}
+
+EXPORT_API int scl_nui_set_input_mode(const char *input_mode)
+{
+ if (!g_ui)
+ return 1;
+
+ g_ui->set_input_mode(input_mode);
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_update_pending(bool pend)
+{
+ if (!g_ui)
+ return 1;
+
+ g_ui->set_update_pending(pend);
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_draw_text_cb(scl_nui_draw_text_cb callback, void *user_data)
+{
+ g_draw_text_cb = callback;
+ g_draw_text_cb_data = user_data;
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_draw_image_cb(scl_nui_draw_image_cb callback, void *user_data)
+{
+ g_draw_image_cb = callback;
+ g_draw_image_cb_data = user_data;
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_draw_rectangle_cb(scl_nui_draw_rectangle_cb callback, void *user_data)
+{
+ g_draw_rectangle_cb = callback;
+ g_draw_rectangle_cb_data = user_data;
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_cur_sublayout(const char *sub_layout_name)
+{
+ if (!g_ui)
+ return 1;
+
+ LOGD("cur sublayout : %s", sub_layout_name);
+
+ g_ui->set_cur_sublayout(sub_layout_name);
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_string_substitution(const char *original, const char *substitute)
+{
+ if (!g_ui)
+ return 1;
+
+ LOGD("original : %s, substitute : %s", original, substitute);
+
+ g_ui->set_string_substitution(original, substitute);
+
+ return 0;
+}
+
+EXPORT_API int scl_nui_set_update_window_cb(scl_nui_update_window_cb callback, void *user_data)
+{
+ g_update_window_cb = callback;
+ g_update_window_cb_data = user_data;
+
+ return 0;
+}
--- /dev/null
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
--- /dev/null
+# Package Information for pkg-config
+
+prefix=@PREFIX@
+exec_prefix=${prefix}
+libdir=@LIBDIR@
+includedir=${prefix}/include
+
+Name: libscl-ui-nui
+Description: SCL UI - A library for developing XML-based software keyboards
+Version: 1.0
+Requires: libscl-common
+Libs: -L${libdir} -lscl-ui-nui
+Cflags: -I${includedir}/libscl-ui-nui
+
--- /dev/null
+%bcond_with x
+%bcond_with wayland
+
+Name: libscl-ui-nui
+Summary: A library for developing XML-based software keyboards
+Version: 0.6.88
+Release: 1
+Group: Graphics & UI Framework/Input
+License: Apache-2.0
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake
+BuildRequires: pkgconfig(libtzplatform-config)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(eldbus)
+BuildRequires: pkgconfig(ecore-wl2)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(feedback)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(tts)
+BuildRequires: pkgconfig(libscl-common)
+
+
+%description
+A library that helps developing S/W Keyboard
+
+%package devel
+Summary: SCL-UI header file
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+
+%description devel
+A devel package of libscl-ui library that helps developing S/W Keyboard
+
+%prep
+%setup -q
+
+
+%build
+export CFLAGS+=" -fvisibility=hidden -DTIZEN_DEBUG_ENABLE -Werror"
+export CXXFLAGS+=" -fvisibility=hidden -fvisibility-inlines-hidden -DTIZEN_DEBUG_ENABLE -Werror"
+export FFLAGS+=" -DTIZEN_DEBUG_ENABLE"
+
+# The -fvisibility=hidden option disables a generation of the rtti information for
+# some classes with hidden visibility, this information is critically needed for
+# ubsan VPTR check. Since this library needed to ise-default package, we should
+# just disable visibility option with ubsan to avoid situation with undefined
+# refernce to typeinfo.
+%{?ubsan:
+export CFLAGS=$(echo $CFLAGS | sed -e "s/-fvisibility=hidden//g")
+export CXXFLAGS=$(echo $CXXFLAGS | sed -e "s/-fvisibility=hidden//g" -e "s/-fvisibility-inlines-hidden//g")
+}
+
+rm -rf CMakeFiles
+rm -rf CMakeCache.txt
+MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
+
+%cmake . -Dwith_wayland=TRUE -DMAJORVER=${MAJORVER} -DFULLVER=%{version}
+
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+
+%make_install
+
+
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%{_libdir}/*.so
+%{_libdir}/*.so.*
+#%{_libdir}/%{name}.so.*
+%license LICENSE
+
+%files devel
+%defattr(-,root,root,-)
+#%{_includedir}/cscl-ui-nui.h
+#%{_includedir}/cscl-ui-controller.h
+%{_libdir}/pkgconfig/*.pc
+%{_includedir}/*
+#%{_libdir}/pkgconfig/%{name}.pc
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __PUT_RECORD_H__
+#define __PUT_RECORD_H__
+/*This file is just for debug*/
+/*Use this file to output scl resources in txt format*/
+
+// Open this flag to output the scl txt
+// #define __SCL_TXT_DEBUG
+
+/////////////////////////////////////////////////////
+#ifdef __SCL_TXT_DEBUG
+
+#include <stdio.h>
+#include <string>
+#include <unistd.h>
+using namespace std;
+#include "sclresource.h"
+
+#define ENCODE 0
+#define DECODE 1
+#define PARSER 2
+static const string get_folder() {
+ return string(getenv("HOME")) + "/";
+}
+
+static inline void
+put_str(FILE* fp, const char* str) {
+ assert(fp);
+ if (NULL != str) {
+ fprintf(fp, "%s\n", str);
+ } else {
+ fprintf(fp, "String:NULL\n");
+ }
+}
+
+static inline void
+put_int(FILE* fp, int data) {
+ assert(fp);
+ fprintf(fp, "%d\n", data);
+}
+static inline void
+put_flt(FILE* fp, double data) {
+ assert(fp);
+ fprintf(fp, "%lf\n", data);
+}
+static inline void
+put_color(FILE* fp, const SclColor& c) {
+ assert(fp);
+
+ fprintf(fp, "Color:\n");
+ put_int(fp, c.r);
+ put_int(fp, c.g);
+ put_int(fp, c.b);
+ put_int(fp, c.a);
+}
+
+static inline void
+put_point(FILE* fp, const SclPoint& p) {
+ assert(fp);
+
+ fprintf(fp, "Point:\n");
+ put_int(fp, p.x);
+ put_int(fp, p.y);
+}
+static inline void
+put_rect(FILE* fp, const SclRect& r) {
+ assert(fp);
+
+ fprintf(fp, "Rect:\n");
+ put_int(fp, r.left);
+ put_int(fp, r.top);
+ put_int(fp, r.right);
+ put_int(fp, r.bottom);
+}
+
+static inline void
+put_note(FILE*fp, int no) {
+ fprintf(fp, "--------------------------");
+ fprintf(fp, "%d", no);
+ fprintf(fp, "--------------------------\n\n");
+}
+
+static inline void
+put_note(FILE*fp, int i, int j) {
+ fprintf(fp, "--------------------------");
+ fprintf(fp, "i is %d, j is %d", i, j);
+ fprintf(fp, "--------------------------\n\n");
+}
+static inline void
+put_seperator(FILE *fp) {
+ fprintf(fp, "\n##########\n\n");
+}
+
+static void
+put_magnifier_wnd_configure_record(FILE* fp, const SclMagnifierWndConfigure& record) {
+ assert(fp);
+
+ put_int(fp, record.style);
+ put_int(fp, record.width);
+ put_int(fp, record.height);
+ put_rect(fp, record.label_area_rect);
+ put_str(fp, record.bg_image_path);
+ put_seperator(fp);
+
+ put_str(fp, record.bg_shift_image_path);
+ put_str(fp, record.bg_shift_lock_image_path);
+ put_str(fp, record.bg_long_key_image_path);
+ put_int(fp, record.use_actual_window);
+ put_str(fp, record.label_type);
+ put_seperator(fp);
+
+ put_int(fp, record.padding_x);
+ put_int(fp, record.padding_y);
+ put_int(fp, record.show_shift_label);
+}
+
+static void
+put_autopopup_configure_record(FILE*fp, const SclAutoPopupConfigure& record) {
+ assert(fp);
+
+ put_str(fp, record.bg_image_path);
+ put_color(fp, record.bg_color);
+ put_flt(fp, record.bg_line_width);
+ put_color(fp, record.bg_line_color);
+ put_int(fp, record.bg_padding);
+ put_seperator(fp);
+
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ put_str(fp, record.button_image_path[i]);
+ }
+ put_seperator(fp);
+
+ put_int(fp, record.sw_button_style);
+ put_int(fp, record.button_width);
+ put_int(fp, record.button_height);
+ put_int(fp, record.button_spacing);
+
+ put_str(fp, record.label_type);
+ put_seperator(fp);
+ for (int i = 0; i < MAX_WND_DECORATOR; ++i) {
+ put_str(fp, record.decoration_image_path[i]);
+ }
+
+ put_seperator(fp);
+ put_int(fp, record.decoration_size);
+ put_int(fp, record.max_column);
+ put_int(fp, record.add_grab_left);
+ put_int(fp, record.add_grab_right);
+ put_int(fp, record.add_grab_top);
+ put_seperator(fp);
+ put_int(fp, record.add_grab_bottom);
+}
+
+static void
+put_nine_patch_info_record(FILE* fp, const SclNinePatchInfo& record) {
+ assert(fp);
+
+ put_str(fp, record.image_path);
+ put_int(fp, record.left);
+ put_int(fp, record.right);
+ put_int(fp, record.top);
+ put_int(fp, record.bottom);
+}
+
+static void
+put_modifier_decoration_record(FILE* fp, const SclModifierDecoration& record) {
+ assert(fp);
+
+ put_int(fp, record.extract_background);
+ put_str(fp, record.name);
+ put_seperator(fp);
+
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ for (int j = 0; j < KEY_MODIFIER_MAX; ++j) {
+ put_str(fp, record.bg_image_path[i][j]);
+ }
+ }
+}
+
+static void
+put_default_configure_record(FILE* fp, const SclDefaultConfigure& record) {
+ put_int(fp, record.display_mode);
+ put_str(fp, record.input_mode);
+ put_str(fp, record.image_file_base_path);
+ put_int(fp, record.target_screen_width);
+ put_int(fp, record.target_screen_height);
+ put_seperator(fp);
+
+ put_int(fp, record.auto_detect_landscape);
+ put_int(fp, record.use_magnifier_window);
+ put_int(fp, record.use_auto_popup);
+ put_int(fp, record.use_zoom_window);
+ put_int(fp, record.on_error_noti_send);
+ put_seperator(fp);
+ put_int(fp, record.use_word_deletion);
+ put_int(fp, record.sw_button_style);
+ put_seperator(fp);
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ put_int(fp, record.touch_offset_level[i]);
+ }
+
+ put_seperator(fp);
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ put_point(fp, record.touch_offset[i]);
+ }
+
+ put_seperator(fp);
+ put_str(fp, record.default_sub_layout);
+ put_int(fp, record.use_actual_dim_window);
+ put_color(fp, record.dim_color);
+}
+
+static void put_label_properties_record(FILE* fp, const SclLabelProperties& record) {
+ put_str(fp, record.label_type);
+ put_str(fp, record.font_name);
+ put_int(fp, record.font_size);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ put_color(fp, record.font_color[i][j]);
+ }
+ }
+ put_seperator(fp);
+ put_int(fp, record.alignment);
+ put_int(fp, record.padding_x);
+ put_int(fp, record.padding_y);
+ put_int(fp, record.inner_width);
+ put_int(fp, record.inner_height);
+ put_int(fp, record.shadow_distance);
+ put_int(fp, record.shadow_direction);
+ put_seperator(fp);
+
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ put_color(fp, record.shadow_color[i][j]);
+ }
+ }
+}
+
+static void put_key_coordinate_record(FILE* fp, const SclLayoutKeyCoordinate& record) {
+ put_int(fp, record.x);
+ put_int(fp, record.y);
+ put_int(fp, record.width);
+ put_int(fp, record.height);
+ put_seperator(fp);
+ put_int(fp, record.add_hit_left);
+ put_int(fp, record.add_hit_right);
+ put_int(fp, record.add_hit_top);
+ put_int(fp, record.add_hit_bottom);
+ put_seperator(fp);
+
+ put_int(fp, record.popup_relative_x);
+ put_int(fp, record.popup_relative_y);
+ put_int(fp, record.extract_offset_x);
+ put_int(fp, record.extract_offset_y);
+ put_seperator(fp);
+ put_str(fp, record.sub_layout);
+ put_seperator(fp);
+
+ put_int(fp, record.magnifier_offset_x);
+ put_int(fp, record.magnifier_offset_y);
+ put_seperator(fp);
+ put_str(fp, record.custom_id);
+ put_int(fp, record.button_type);
+ put_int(fp, record.key_type);
+ put_int(fp, record.popup_type);
+ put_seperator(fp);
+
+ put_int(fp, record.use_magnifier);
+ put_int(fp, record.use_long_key_magnifier);
+
+ put_seperator(fp);
+ for (int i = 0; i < SCL_DRAG_STATE_MAX; ++i) {
+ put_str(fp, record.popup_input_mode[i]);
+ }
+ put_seperator(fp);
+ put_str(fp, record.sound_style);
+ put_str(fp, record.vibe_style);
+ put_int(fp, record.is_side_button);
+ put_int(fp, record.label_count);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ put_str(fp, record.label[i][j]);
+ }
+ }
+ put_seperator(fp);
+ put_str(fp, record.label_type);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ put_str(fp, record.image_label_path[i][j]);
+ }
+ }
+ put_str(fp, record.image_label_type);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ put_str(fp, record.bg_image_path[i][j]);
+ }
+ }
+ put_seperator(fp);
+ put_int(fp, record.key_value_count);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ put_str(fp, record.key_value[i][j]);
+ }
+ }
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ put_int(fp, record.key_event[i][j]);
+ }
+ }
+ put_seperator(fp);
+ put_str(fp, record.long_key_value);
+ put_int(fp, record.use_repeat_key);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_AUTOPOPUP_STRING; ++j) {
+ put_str(fp, record.autopopup_key_labels[i][j]);
+ put_str(fp, record.autopopup_key_values[i][j]);
+ put_int(fp, record.autopopup_key_events[i][j]);
+ }
+ }
+ put_seperator(fp);
+ put_int(fp, record.dont_close_popup);
+ put_int(fp, record.extra_option);
+ put_int(fp, record.multitouch_type);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ put_str(fp, record.magnifier_label[i][j]);
+ }
+ }
+ put_seperator(fp);
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ put_str(fp, record.hint_string[i][j]);
+ }
+ }
+}
+static void put_input_mode_configure_record(FILE* fp, const SclInputModeConfigure& record) {
+ put_str(fp, record.name);
+ put_str(fp, record.layouts[0]);
+ put_str(fp, record.layouts[1]);
+ put_int(fp, record.use_virtual_window);
+ put_int(fp, record.use_dim_window);
+ put_flt(fp, record.timeout);
+}
+static void put_layout_record(FILE* fp, const SclLayout& record ) {
+ put_str(fp, record.name);
+ put_int(fp, record.display_mode);
+ put_int(fp, record.style);
+ put_int(fp, record.width);
+ put_int(fp, record.height);
+ put_seperator(fp);
+ put_int(fp, record.use_sw_button);
+ put_int(fp, record.extract_background);
+ put_int(fp, record.use_magnifier_window);
+ put_int(fp, record.key_width);
+ put_int(fp, record.key_height);
+ put_seperator(fp);
+ put_int(fp, record.use_sw_background);
+ put_flt(fp, record.bg_line_width);
+ put_int(fp, record.add_grab_left);
+ put_int(fp, record.add_grab_right);
+ put_int(fp, record.add_grab_top);
+ put_int(fp, record.add_grab_bottom);
+ put_seperator(fp);
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ put_str(fp, record.image_path[i]);
+ }
+ put_seperator(fp);
+ //key_background_image
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ put_str(fp, record.key_background_image[i][j]);
+ }
+ }
+}
+
+static void put_input_mode_configure_table(int flag, const PSclInputModeConfigure table) {
+ string file_name;
+ if (flag == ENCODE)
+ file_name = "encode_input_mode_configure.txt";
+ else if (flag == DECODE)
+ file_name = "decode_input_mode_configure.txt";
+ else
+ file_name = "sclres_input_mode_configure.txt";
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ for (int i = 0; i < MAX_SCL_INPUT_MODE; ++i) {
+ put_note(fp, i);
+ put_input_mode_configure_record(fp, table[i]);
+ }
+
+ fclose(fp);
+}
+
+static void put_layout_table(int flag, const PSclLayout table) {
+ string file_name;
+ if (flag == ENCODE)
+ file_name = "encode_layout.txt";
+ else if (flag == DECODE)
+ file_name = "decode_layout.txt";
+ else
+ file_name = "sclres_layout.txt";
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ put_note(fp, i);
+ put_layout_record(fp, table[i]);
+ }
+ fclose(fp);
+}
+
+static void
+put_key_coordinate_frame(int flag, const PSclLayoutKeyCoordinatePointerTable frame) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_key_coordinate_frame.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_key_coordinate_frame.txt";
+ } else {
+ file_name = "sclres_key_coordinate_frame.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ if (frame[i][0] == NULL) break;
+
+ for (int j = 0; j < MAX_KEY; ++j) {
+ put_note(fp, i, j);
+ const SclLayoutKeyCoordinatePointer p = frame[i][j];
+ if (!p) break;
+ const SclLayoutKeyCoordinate& cur = *p;
+ put_key_coordinate_record(fp, cur);
+ }
+ }
+ fclose(fp);
+}
+
+static void
+put_label_properties_frame(int flag, const PSclLabelPropertiesTable frame) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_label_properties_frame.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_label_properties_frame.txt";
+ } else {
+ file_name = "sclres_label_properties_frame.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ for (int i = 0; i < MAX_SCL_LABEL_PROPERTIES; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ put_note(fp, i, j);
+ put_label_properties_record(fp, frame[i][j]);
+ }
+ }
+ fclose(fp);
+}
+
+static void
+put_default_configure(int flag, const SclDefaultConfigure& record) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_default_configure.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_default_configure.txt";
+ } else {
+ file_name = "sclres_default_configure.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ put_default_configure_record(fp, record);
+ fclose(fp);
+}
+
+static void
+put_autopopup_configure(int flag, const SclAutoPopupConfigure& record) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_autopopup_configure.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_autopopup_configure.txt";
+ } else {
+ file_name = "sclres_autopopup_configure.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ put_autopopup_configure_record(fp, record);
+ fclose(fp);
+}
+
+static void
+put_nine_patch_info(int flag, const SclNinePatchInfo* table) {
+ static const int MAX_NINE_PATCH_FILE_LIST = 128;
+
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_nine_patch_info.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_nine_patch_info.txt";
+ } else {
+ file_name = "sclres_nine_patch_info.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+
+ for (int i = 0; i < MAX_NINE_PATCH_FILE_LIST; ++i) {
+ put_note(fp, i);
+ put_nine_patch_info_record(fp, table[i]);
+ }
+ fclose(fp);
+}
+
+
+static void
+put_magnifier_wnd_configure(int flag, const SclMagnifierWndConfigure& record) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_magnifier_wnd_configure.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_magnifier_wnd_configure.txt";
+ } else {
+ file_name = "sclres_magnifier_wnd_configure.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+ put_magnifier_wnd_configure_record(fp, record);
+ fclose(fp);
+}
+
+static void
+put_modifier_decoration(int flag, const PSclModifierDecoration table) {
+ string file_name;
+ if (flag == ENCODE) {
+ file_name = "encode_modifier_decoration.txt";
+ } else if (flag == DECODE) {
+ file_name = "decode_modifier_decoration.txt";
+ } else {
+ file_name = "sclres_modifier_decoration.txt";
+ }
+
+ string path = get_folder() + file_name;
+ FILE *fp = fopen(path.c_str(), "w+");
+ if (!fp) {
+ perror("Warning: path.c_str()");
+ return;
+ }
+
+ for (int i = 0; i < MAX_SCL_MODIFIER_DECORATION_NUM; ++i) {
+ put_note(fp, i);
+ put_modifier_decoration_record(fp, table[i]);
+ }
+ fclose(fp);
+}
+#endif
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "sclresource.h"
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "sclkeydefines.h"
+
+/* This prevents "deprecated conversion" warnings.. */
+#pragma GCC diagnostic ignored "-Wwrite-strings"
+
+#ifndef __SCL_RESOURCE_H__
+#define __SCL_RESOURCE_H__
+
+#define RESOURCE_DATA_LABEL_LEN 10
+#define RESOURCE_DATA_IMG_PATH_LEN 50
+#define RESOURCE_DATA_KEY_VALUE_LEN 8
+#define RESOURCE_DATA_AUTOPOPUP_KEY_LEN 4
+
+#define DEFAULT_FONT_NAME "SLP:style=medium"
+
+#define MAX_KEY 127
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_RESOURCEKEYS_H__
+#define __SCL_RESOURCEKEYS_H__
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "simple_debug.h"
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <dlog.h>
+
+SclLog::SclLog() : m_flog(NULL) {
+ char *env = NULL;
+ char *scllog = NULL;
+ char log_path[128];
+
+ /*
+ * Use export scllog="true" to enable scllog
+ */
+ scllog = getenv("scllog");
+ if (scllog == NULL || 0 != strcmp(scllog, "true")) {
+ return;
+ }
+
+ env = getenv("HOME");
+ if (env == NULL) {
+ return;
+ }
+
+ snprintf(log_path, 128, "%s/scl.log", env);
+}
+
+SclLog::~SclLog() {
+ if (m_flog != NULL) {
+ fclose(m_flog);
+ }
+}
+
+SclLog*
+SclLog::get_instance() {
+ static SclLog instance;
+ return &instance;
+}
+
+void
+SclLog::log(enum LOG_LEVEL level, const char* fmt, ...) {
+ static const char *log_message[MAX_LOG_LEVEL] = {
+ "message", "warning", "debug", "error"
+ };
+
+ if (level >= MAX_LOG_LEVEL)
+ return;
+
+ char str_log[128];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(str_log, sizeof(str_log), fmt, ap);
+ va_end(ap);
+
+ if (m_flog == NULL) {
+ switch (level) {
+ case WARNING:
+ {
+ LOGW("%s", str_log);
+ break;
+ }
+ case ERROR:
+ {
+ LOGE("%s", str_log);
+ break;
+ }
+ case DEBUG:
+ {
+ LOGD("%s", str_log);
+ break;
+ }
+ default:
+ {
+ LOGI("%s", str_log);
+ }
+ }
+ } else {
+ /*
+ * log current time
+ */
+ time_t now;
+ struct tm timenow;
+
+ time(&now);
+ localtime_r(&now, &timenow);
+
+ char buf[64] = { 0 };
+ asctime_r(&timenow, buf);
+
+ fprintf(m_flog, "[ %s ] %s\n", log_message[level], buf);
+ fprintf(m_flog, "\t%s\n", str_log);
+
+ fflush(m_flog);
+ }
+}
+
+void
+SCLLOG(enum SclLog::LOG_LEVEL level, const char* fmt, ...) {
+ SclLog *log = SclLog::get_instance();
+ if (log) {
+ char str_log[128];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(str_log, sizeof(str_log), fmt, ap);
+ va_end(ap);
+ log->log(level, str_log);
+ }
+}
+
+static struct timeval g_time_begin;
+static struct timeval g_time_end;
+void
+SCLLOG_TIME_BEGIN() {
+ gettimeofday(&g_time_begin, NULL);
+}
+
+void
+SCLLOG_TIME_END(const char *msg) {
+ gettimeofday(&g_time_end, NULL);
+
+ long diff = (g_time_end.tv_sec - g_time_begin.tv_sec) * 1000000 + g_time_end.tv_usec - g_time_begin.tv_usec;
+ fprintf(stdout, "%s use %ld usec\n", msg, diff);
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SIMPLE_DEBUG_H__
+#define __SIMPLE_DEBUG_H__
+#include <stdio.h>
+
+class SclLog {
+ public:
+ enum LOG_LEVEL {
+ MESSAGE = 0,
+ WARNING,
+ DEBUG,
+ ERROR,
+ MAX_LOG_LEVEL
+ };
+
+ static SclLog* get_instance();
+ void log(enum LOG_LEVEL, const char* fmt, ...);
+ ~SclLog();
+ private:
+ SclLog();
+
+ FILE *m_flog;
+};
+
+
+void SCLLOG(enum SclLog::LOG_LEVEL level, const char* fmt, ...);
+
+void SCLLOG_TIME_BEGIN();
+void SCLLOG_TIME_END(const char *msg);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/*
+ * Use `g++ -I. simple_debug.cpp simple_debug_test.cpp` to compiler it
+ */
+#include <simple_debug.h>
+#include <stdio.h>
+
+int main() {
+ /* Test SclLog */
+ SclLog *log = SclLog::get_instance();
+ if (log) {
+ log->log(SclLog::WARNING, "Test %d\n", 100);
+ }
+
+ /* Test SCLLOG */
+ SCLLOG(SclLog::ERROR, "%s/%d", "SCLLOG", 100);
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/*This file is generated by auto_codes.py.*/
+
+#ifndef __AUTO_METADATA_H__
+#define __AUTO_METADATA_H__
+
+#include <memory.h>
+typedef struct _Input_mode_configure_width {
+ int name;
+ int layout_portrait;
+ int layout_landscape;
+ int use_virtual_window;
+ int use_dim_window;
+ int timeout;
+}Input_mode_configure_width;
+
+typedef struct _Layout_width {
+ int name;
+ int display_mode;
+ int style;
+ int width;
+ int height;
+ int use_sw_button;
+ int use_magnifier_window;
+ int extract_background;
+ int key_width;
+ int key_height;
+ int key_spacing;
+ int row_spacing;
+ int use_sw_background;
+ int bg_color;
+ int bg_line_width;
+ int bg_line_color;
+ int add_grab_left;
+ int add_grab_right;
+ int add_grab_top;
+ int add_grab_bottom;
+ int image_path;
+ int key_background_image;
+ int sound_style;
+ int vibe_style;
+ int label_type;
+ int modifier_decorator;
+}Layout_width;
+
+typedef struct _Key_coordinate_record_width {
+ int x;
+ int y;
+ int width;
+ int height;
+ int add_hit_left;
+ int add_hit_right;
+ int add_hit_top;
+ int add_hit_bottom;
+ int popup_relative_x;
+ int popup_relative_y;
+ int extract_offset_x;
+ int extract_offset_y;
+ int sub_layout;
+ int magnifier_offset_x;
+ int magnifier_offset_y;
+ int custom_id;
+ int button_type;
+ int key_type;
+ int popup_type;
+ int use_magnifier;
+ int use_long_key_magnifier;
+ int popup_input_mode;
+ int sound_style;
+ int vibe_style;
+ int is_side_button;
+ int label_count;
+ int label;
+ int label_type;
+ int image_label_path;
+ int image_label_type;
+ int bg_image_path;
+ int key_value_count;
+ int key_value;
+ int key_event;
+ int long_key_type;
+ int long_key_value;
+ int long_key_event;
+ int use_repeat_key;
+ int autopopup_key_labels;
+ int autopopup_key_values;
+ int autopopup_key_events;
+ int dont_close_popup;
+ int extra_option;
+ int multitouch_type;
+ int modifier_decorator;
+ int magnifier_label;
+ int hint_string;
+}Key_coordinate_record_width;
+
+typedef struct _Label_properties_record_width {
+ int label_type;
+ int font_name;
+ int font_size;
+ int font_color;
+ int alignment;
+ int padding_x;
+ int padding_y;
+ int inner_width;
+ int inner_height;
+ int shadow_distance;
+ int shadow_direction;
+ int shadow_color;
+}Label_properties_record_width;
+
+typedef struct _Default_configure_width {
+ int display_mode;
+ int input_mode;
+ int image_file_base_path;
+ int target_screen_width;
+ int target_screen_height;
+ int auto_detect_landscape;
+ int use_magnifier_window;
+ int use_auto_popup;
+ int use_zoom_window;
+ int on_error_noti_send;
+ int use_word_deletion;
+ int sw_button_style;
+ int touch_offset_level;
+ int touch_offset;
+ int default_sub_layout;
+ int use_actual_dim_window;
+ int dim_color;
+}Default_configure_width;
+
+typedef struct _Magnifier_configure_width {
+ int style;
+ int width;
+ int height;
+ int label_area_rect;
+ int bg_image_path;
+ int bg_shift_image_path;
+ int bg_shift_lock_image_path;
+ int bg_long_key_image_path;
+ int use_actual_window;
+ int label_type;
+ int padding_x;
+ int padding_y;
+ int show_shift_label;
+}Magnifier_configure_width;
+
+typedef struct _Autopopup_configure_width {
+ int bg_image_path;
+ int bg_color;
+ int bg_line_width;
+ int bg_line_color;
+ int bg_padding;
+ int button_image_path;
+ int sw_button_style;
+ int button_width;
+ int button_height;
+ int button_spacing;
+ int label_type;
+ int decoration_image_path;
+ int decoration_size;
+ int max_column;
+ int add_grab_left;
+ int add_grab_right;
+ int add_grab_top;
+ int add_grab_bottom;
+}Autopopup_configure_width;
+
+typedef struct _Modifier_decoration_width {
+ int extract_background;
+ int name;
+ int bg_image_path;
+}Modifier_decoration_width;
+
+typedef struct _Nine_patch_width {
+ int image_path;
+ int left;
+ int right;
+ int top;
+ int bottom;
+}Nine_patch_width;
+
+template <class T>
+void set_input_mode_configure_width(T& md_helper,
+ Input_mode_configure_width & record_width) {
+ md_helper.set_current_metadata_record("input_mode_configure");
+ memset(&record_width, 0x00, sizeof(Input_mode_configure_width));
+
+ record_width.name = md_helper.get_width("name");
+ record_width.layout_portrait = md_helper.get_width("layout_portrait");
+ record_width.layout_landscape = md_helper.get_width("layout_landscape");
+ record_width.use_virtual_window = md_helper.get_width("use_virtual_window");
+ record_width.use_dim_window = md_helper.get_width("use_dim_window");
+ record_width.timeout = md_helper.get_width("timeout");
+}
+
+template <class T>
+void set_layout_width(T& md_helper,
+ Layout_width & record_width) {
+ md_helper.set_current_metadata_record("layout");
+ memset(&record_width, 0x00, sizeof(Layout_width));
+
+ record_width.name = md_helper.get_width("name");
+ record_width.display_mode = md_helper.get_width("display_mode");
+ record_width.style = md_helper.get_width("style");
+ record_width.width = md_helper.get_width("width");
+ record_width.height = md_helper.get_width("height");
+ record_width.use_sw_button = md_helper.get_width("use_sw_button");
+ record_width.use_magnifier_window = md_helper.get_width("use_magnifier_window");
+ record_width.extract_background = md_helper.get_width("extract_background");
+ record_width.key_width = md_helper.get_width("key_width");
+ record_width.key_height = md_helper.get_width("key_height");
+ record_width.key_spacing = md_helper.get_width("key_spacing");
+ record_width.row_spacing = md_helper.get_width("row_spacing");
+ record_width.use_sw_background = md_helper.get_width("use_sw_background");
+ record_width.bg_color = md_helper.get_width("bg_color");
+ record_width.bg_line_width = md_helper.get_width("bg_line_width");
+ record_width.bg_line_color = md_helper.get_width("bg_line_color");
+ record_width.add_grab_left = md_helper.get_width("add_grab_left");
+ record_width.add_grab_right = md_helper.get_width("add_grab_right");
+ record_width.add_grab_top = md_helper.get_width("add_grab_top");
+ record_width.add_grab_bottom = md_helper.get_width("add_grab_bottom");
+ record_width.image_path = md_helper.get_width("image_path");
+ record_width.key_background_image = md_helper.get_width("key_background_image");
+ record_width.sound_style = md_helper.get_width("sound_style");
+ record_width.vibe_style = md_helper.get_width("vibe_style");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.modifier_decorator = md_helper.get_width("modifier_decorator");
+}
+
+template <class T>
+void set_key_coordinate_record_width(T *md_helper,
+ Key_coordinate_record_width & record_width) {
+ if (md_helper) {
+ md_helper->set_current_metadata_record("key_coordinate_record");
+ memset(&record_width, 0x00, sizeof(Key_coordinate_record_width));
+
+ record_width.x = md_helper->get_width("x");
+ record_width.y = md_helper->get_width("y");
+ record_width.width = md_helper->get_width("width");
+ record_width.height = md_helper->get_width("height");
+ record_width.add_hit_left = md_helper->get_width("add_hit_left");
+ record_width.add_hit_right = md_helper->get_width("add_hit_right");
+ record_width.add_hit_top = md_helper->get_width("add_hit_top");
+ record_width.add_hit_bottom = md_helper->get_width("add_hit_bottom");
+ record_width.popup_relative_x = md_helper->get_width("popup_relative_x");
+ record_width.popup_relative_y = md_helper->get_width("popup_relative_y");
+ record_width.extract_offset_x = md_helper->get_width("extract_offset_x");
+ record_width.extract_offset_y = md_helper->get_width("extract_offset_y");
+ record_width.sub_layout = md_helper->get_width("sub_layout");
+ record_width.magnifier_offset_x = md_helper->get_width("magnifier_offset_x");
+ record_width.magnifier_offset_y = md_helper->get_width("magnifier_offset_y");
+ record_width.custom_id = md_helper->get_width("custom_id");
+ record_width.button_type = md_helper->get_width("button_type");
+ record_width.key_type = md_helper->get_width("key_type");
+ record_width.popup_type = md_helper->get_width("popup_type");
+ record_width.use_magnifier = md_helper->get_width("use_magnifier");
+ record_width.use_long_key_magnifier = md_helper->get_width("use_long_key_magnifier");
+ record_width.popup_input_mode = md_helper->get_width("popup_input_mode");
+ record_width.sound_style = md_helper->get_width("sound_style");
+ record_width.vibe_style = md_helper->get_width("vibe_style");
+ record_width.is_side_button = md_helper->get_width("is_side_button");
+ record_width.label_count = md_helper->get_width("label_count");
+ record_width.label = md_helper->get_width("label");
+ record_width.label_type = md_helper->get_width("label_type");
+ record_width.image_label_path = md_helper->get_width("image_label_path");
+ record_width.image_label_type = md_helper->get_width("image_label_type");
+ record_width.bg_image_path = md_helper->get_width("bg_image_path");
+ record_width.key_value_count = md_helper->get_width("key_value_count");
+ record_width.key_value = md_helper->get_width("key_value");
+ record_width.key_event = md_helper->get_width("key_event");
+ record_width.long_key_type = md_helper->get_width("long_key_type");
+ record_width.long_key_value = md_helper->get_width("long_key_value");
+ record_width.long_key_event = md_helper->get_width("long_key_event");
+ record_width.use_repeat_key = md_helper->get_width("use_repeat_key");
+ record_width.autopopup_key_labels = md_helper->get_width("autopopup_key_labels");
+ record_width.autopopup_key_values = md_helper->get_width("autopopup_key_values");
+ record_width.autopopup_key_events = md_helper->get_width("autopopup_key_events");
+ record_width.dont_close_popup = md_helper->get_width("dont_close_popup");
+ record_width.extra_option = md_helper->get_width("extra_option");
+ record_width.multitouch_type = md_helper->get_width("multitouch_type");
+ record_width.modifier_decorator = md_helper->get_width("modifier_decorator");
+ record_width.magnifier_label = md_helper->get_width("magnifier_label");
+ record_width.hint_string = md_helper->get_width("hint_string");
+ }
+}
+
+template <class T>
+void set_label_properties_record_width(T& md_helper,
+ Label_properties_record_width & record_width) {
+ md_helper.set_current_metadata_record("label_properties_record");
+ memset(&record_width, 0x00, sizeof(Label_properties_record_width));
+
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.font_name = md_helper.get_width("font_name");
+ record_width.font_size = md_helper.get_width("font_size");
+ record_width.font_color = md_helper.get_width("font_color");
+ record_width.alignment = md_helper.get_width("alignment");
+ record_width.padding_x = md_helper.get_width("padding_x");
+ record_width.padding_y = md_helper.get_width("padding_y");
+ record_width.inner_width = md_helper.get_width("inner_width");
+ record_width.inner_height = md_helper.get_width("inner_height");
+ record_width.shadow_distance = md_helper.get_width("shadow_distance");
+ record_width.shadow_direction = md_helper.get_width("shadow_direction");
+ record_width.shadow_color = md_helper.get_width("shadow_color");
+}
+
+template <class T>
+void set_default_configure_width(T& md_helper,
+ Default_configure_width & record_width) {
+ md_helper.set_current_metadata_record("default_configure");
+ memset(&record_width, 0x00, sizeof(Default_configure_width));
+
+ record_width.display_mode = md_helper.get_width("display_mode");
+ record_width.input_mode = md_helper.get_width("input_mode");
+ record_width.image_file_base_path = md_helper.get_width("image_file_base_path");
+ record_width.target_screen_width = md_helper.get_width("target_screen_width");
+ record_width.target_screen_height = md_helper.get_width("target_screen_height");
+ record_width.auto_detect_landscape = md_helper.get_width("auto_detect_landscape");
+ record_width.use_magnifier_window = md_helper.get_width("use_magnifier_window");
+ record_width.use_auto_popup = md_helper.get_width("use_auto_popup");
+ record_width.use_zoom_window = md_helper.get_width("use_zoom_window");
+ record_width.on_error_noti_send = md_helper.get_width("on_error_noti_send");
+ record_width.use_word_deletion = md_helper.get_width("use_word_deletion");
+ record_width.sw_button_style = md_helper.get_width("sw_button_style");
+ record_width.touch_offset_level = md_helper.get_width("touch_offset_level");
+ record_width.touch_offset = md_helper.get_width("touch_offset");
+ record_width.default_sub_layout = md_helper.get_width("default_sub_layout");
+ record_width.use_actual_dim_window = md_helper.get_width("use_actual_dim_window");
+ record_width.dim_color = md_helper.get_width("dim_color");
+}
+
+template <class T>
+void set_magnifier_configure_width(T& md_helper,
+ Magnifier_configure_width & record_width) {
+ md_helper.set_current_metadata_record("magnifier_configure");
+ memset(&record_width, 0x00, sizeof(Magnifier_configure_width));
+
+ record_width.style = md_helper.get_width("style");
+ record_width.width = md_helper.get_width("width");
+ record_width.height = md_helper.get_width("height");
+ record_width.label_area_rect = md_helper.get_width("label_area_rect");
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+ record_width.bg_shift_image_path = md_helper.get_width("bg_shift_image_path");
+ record_width.bg_shift_lock_image_path = md_helper.get_width("bg_shift_lock_image_path");
+ record_width.bg_long_key_image_path = md_helper.get_width("bg_long_key_image_path");
+ record_width.use_actual_window = md_helper.get_width("use_actual_window");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.padding_x = md_helper.get_width("padding_x");
+ record_width.padding_y = md_helper.get_width("padding_y");
+ record_width.show_shift_label = md_helper.get_width("show_shift_label");
+}
+
+template <class T>
+void set_autopopup_configure_width(T& md_helper,
+ Autopopup_configure_width & record_width) {
+ md_helper.set_current_metadata_record("autopopup_configure");
+ memset(&record_width, 0x00, sizeof(Autopopup_configure_width));
+
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+ record_width.bg_color = md_helper.get_width("bg_color");
+ record_width.bg_line_width = md_helper.get_width("bg_line_width");
+ record_width.bg_line_color = md_helper.get_width("bg_line_color");
+ record_width.bg_padding = md_helper.get_width("bg_padding");
+ record_width.button_image_path = md_helper.get_width("button_image_path");
+ record_width.sw_button_style = md_helper.get_width("sw_button_style");
+ record_width.button_width = md_helper.get_width("button_width");
+ record_width.button_height = md_helper.get_width("button_height");
+ record_width.button_spacing = md_helper.get_width("button_spacing");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.decoration_image_path = md_helper.get_width("decoration_image_path");
+ record_width.decoration_size = md_helper.get_width("decoration_size");
+ record_width.max_column = md_helper.get_width("max_column");
+ record_width.add_grab_left = md_helper.get_width("add_grab_left");
+ record_width.add_grab_right = md_helper.get_width("add_grab_right");
+ record_width.add_grab_top = md_helper.get_width("add_grab_top");
+ record_width.add_grab_bottom = md_helper.get_width("add_grab_bottom");
+}
+
+template <class T>
+void set_modifier_decoration_width(T& md_helper,
+ Modifier_decoration_width & record_width) {
+ md_helper.set_current_metadata_record("modifier_decoration");
+ memset(&record_width, 0x00, sizeof(Modifier_decoration_width));
+
+ record_width.extract_background = md_helper.get_width("extract_background");
+ record_width.name = md_helper.get_width("name");
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+}
+
+template <class T>
+void set_nine_patch_width(T& md_helper,
+ Nine_patch_width & record_width) {
+ md_helper.set_current_metadata_record("nine_patch");
+ memset(&record_width, 0x00, sizeof(Nine_patch_width));
+
+ record_width.image_path = md_helper.get_width("image_path");
+ record_width.left = md_helper.get_width("left");
+ record_width.right = md_helper.get_width("right");
+ record_width.top = md_helper.get_width("top");
+ record_width.bottom = md_helper.get_width("bottom");
+}
+
+
+#endif //End __AUTO_METADATA_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "autopopup_configure_bin_parser.h"
+#include <assert.h>
+using namespace std;
+#include "put_record.h"
+
+BinAutoPopupConfigParser::BinAutoPopupConfigParser() {
+ memset((void*)&m_autopopup_configure, 0x00, sizeof(SclAutoPopupConfigure));
+ parser_info_provider = NULL;
+}
+
+BinAutoPopupConfigParser::~BinAutoPopupConfigParser() {
+}
+
+BinAutoPopupConfigParser* BinAutoPopupConfigParser::get_instance() {
+ static BinAutoPopupConfigParser instance;
+
+ return &instance;
+}
+
+void
+BinAutoPopupConfigParser::decode_color(SclColor& color, int width) {
+ if (width <= 0) return;
+
+ color.r = m_storage.get<sint_t>(width);
+ color.g = m_storage.get<sint_t>(width);
+ color.b = m_storage.get<sint_t>(width);
+ color.a = m_storage.get<sint_t>(width);
+}
+
+void BinAutoPopupConfigParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+
+ parsing_autopopup_configure();
+}
+
+void BinAutoPopupConfigParser::parsing_autopopup_configure() {
+ Autopopup_configure_width record_width;
+ set_autopopup_configure_width(*parser_info_provider, record_width);
+
+ PSclAutoPopupConfigure cur = &m_autopopup_configure;
+
+ // skip data_size
+ m_storage.advance(8);
+
+ //bg_image_path
+ m_storage.get_str(&(cur->bg_image_path), record_width.bg_image_path, m_string_collector);
+
+ //bg_color
+ decode_color(cur->bg_color, record_width.bg_color);
+ //double value
+ cur->bg_line_width = m_storage.get<float_t>(record_width.bg_line_width);
+
+ //bg_line_color
+ decode_color(cur->bg_line_color, record_width.bg_line_color);
+
+ //bg_padding
+ cur->bg_padding = m_storage.get<sint_t>(record_width.bg_padding);
+
+ //button_image_path
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ m_storage.get_str(&(cur->button_image_path[i]), record_width.button_image_path, m_string_collector);
+ }
+
+ //sw_button_style
+ cur->sw_button_style = m_storage.get<sint_t>(record_width.sw_button_style);
+
+ //button_width
+ cur->button_width = m_storage.get<sint_t>(record_width.button_width);
+
+ //button_height
+ cur->button_height = m_storage.get<sint_t>(record_width.button_height);
+
+ //button_spacing
+ cur->button_spacing = m_storage.get<sint_t>(record_width.button_spacing);
+
+ m_storage.get_str(&(cur->label_type), record_width.label_type, m_string_collector);
+
+ for (int i = 0; i < MAX_WND_DECORATOR; ++i) {
+ m_storage.get_str(&(cur->decoration_image_path[i]), record_width.decoration_image_path, m_string_collector);
+ }
+
+ //decoration_size
+ cur->decoration_size = m_storage.get<sint_t>(record_width.decoration_size);
+
+ //max_column
+ cur->max_column = m_storage.get<sint_t>(record_width.max_column);
+
+ //add_grab_left
+ cur->add_grab_left = m_storage.get<sint_t>(record_width.add_grab_left);
+
+ //add_grab_right
+ cur->add_grab_right = m_storage.get<sint_t>(record_width.add_grab_right);
+
+ //add_grab_top
+ cur->add_grab_top = m_storage.get<sint_t>(record_width.add_grab_top);
+
+ //add_grab_bottom
+ cur->add_grab_bottom = m_storage.get<sint_t>(record_width.add_grab_bottom);
+#ifdef __SCL_TXT_DEBUG
+ put_autopopup_configure(DECODE, m_autopopup_configure);
+#endif
+}
+
+PSclAutoPopupConfigure BinAutoPopupConfigParser::get_autopopup_configure() {
+ return &m_autopopup_configure;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BinAutoPopupConfigParser__H__
+#define __BinAutoPopupConfigParser__H__
+#include "sclres_type.h"
+#include "string_collector.h"
+#include "iparserinfo_provider.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+
+class BinAutoPopupConfigParser {
+public:
+ ~BinAutoPopupConfigParser();
+ static BinAutoPopupConfigParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+
+ PSclAutoPopupConfigure get_autopopup_configure();
+
+private:
+ BinAutoPopupConfigParser();
+ void parsing_autopopup_configure();
+ void decode_color(SclColor&, int width);
+private:
+ SclAutoPopupConfigure m_autopopup_configure;
+ StringCollector m_string_collector;
+ FileStorage m_storage;
+ IParserInfo_Provider* parser_info_provider;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <libxml/parser.h>
+
+#include "autopopup_configure_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+using namespace std;
+
+class AutoPopupConfigureParserImpl {
+ public:
+ AutoPopupConfigureParserImpl() {
+ memset((void*)&m_autopopup_configure, 0x00, sizeof(SclAutoPopupConfigure));
+
+ m_autopopup_configure.add_grab_left = NOT_USED;
+ m_autopopup_configure.add_grab_right = NOT_USED;
+ m_autopopup_configure.add_grab_top = NOT_USED;
+ m_autopopup_configure.add_grab_bottom = NOT_USED;
+ }
+
+ ~AutoPopupConfigureParserImpl() {
+ reset();
+ }
+
+ void reset() {
+ sclint loop;
+ for (loop = 0; loop < SCL_BUTTON_STATE_MAX; loop++) {
+ if (m_autopopup_configure.button_image_path[loop]) {
+ xmlFree(m_autopopup_configure.button_image_path[loop]);
+ m_autopopup_configure.button_image_path[loop] = NULL;
+ }
+ }
+ for (loop = 0; loop < MAX_WND_DECORATOR; loop++) {
+ if (m_autopopup_configure.decoration_image_path[loop]) {
+ xmlFree(m_autopopup_configure.decoration_image_path[loop]);
+ m_autopopup_configure.decoration_image_path[loop] = NULL;
+ }
+ }
+
+ if (m_autopopup_configure.label_type) {
+ xmlFree(m_autopopup_configure.label_type);
+ m_autopopup_configure.label_type = NULL;
+ }
+
+ if (m_autopopup_configure.bg_image_path) {
+ xmlFree(m_autopopup_configure.bg_image_path);
+ m_autopopup_configure.bg_image_path = NULL;
+ }
+
+ if (m_autopopup_configure.line_image_path) {
+ xmlFree(m_autopopup_configure.line_image_path);
+ m_autopopup_configure.line_image_path = NULL;
+ }
+
+ memset((void*)&m_autopopup_configure, 0x00, sizeof(SclAutoPopupConfigure));
+
+ m_autopopup_configure.add_grab_left = NOT_USED;
+ m_autopopup_configure.add_grab_right = NOT_USED;
+ m_autopopup_configure.add_grab_top = NOT_USED;
+ m_autopopup_configure.add_grab_bottom = NOT_USED;
+ }
+
+ int reload_autopopup_configure(const char* input_file) {
+ reset();
+ return parsing_autopopup_configure(input_file);
+ }
+ int parsing_autopopup_configure(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::WARNING, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::WARNING, "AutoPopupConfigParser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"autopopup_configure"))
+ {
+ SCLLOG(SclLog::WARNING, "AutoPopup_Configure: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_image_path")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_autopopup_configure.bg_image_path = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_color")) {
+ parsing_background_color(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_line_width")) {
+ m_autopopup_configure.bg_line_width = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_line_color")) {
+ parsing_background_line_color(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_padding")) {
+ m_autopopup_configure.bg_padding = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"button_image_path")) {
+ parsing_button_image_path(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"sw_button_style")) {
+ m_autopopup_configure.sw_button_style = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"button_size")) {
+ parsing_button_size(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"button_spacing")) {
+ m_autopopup_configure.button_spacing = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"line_image_path")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_autopopup_configure.line_image_path = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"label_type")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_autopopup_configure.label_type = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"window_decorator")) {
+ get_prop_number(cur_node, "size", &(m_autopopup_configure.decoration_size));
+ parsing_window_decorator_image_path(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"max_column")) {
+ m_autopopup_configure.max_column = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"grab_area")) {
+ parsing_grab_area(cur_node);
+ }
+
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+ return 0;
+ }
+ void parsing_background_color(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"r")) {
+ m_autopopup_configure.bg_color.r = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"g")) {
+ m_autopopup_configure.bg_color.g = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"b")) {
+ m_autopopup_configure.bg_color.b = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"a")) {
+ m_autopopup_configure.bg_color.a = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_background_line_color(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"r")) {
+ m_autopopup_configure.bg_line_color.r = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"g")) {
+ m_autopopup_configure.bg_line_color.g = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"b")) {
+ m_autopopup_configure.bg_line_color.b = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"a")) {
+ m_autopopup_configure.bg_line_color.a = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_button_image_path(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"button_image_path"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"image")) {
+ int button_state = get_button_state_prop(child_node);
+ if (button_state >= 0 && button_state < SCL_BUTTON_STATE_MAX) {
+ m_autopopup_configure.button_image_path[button_state] = (sclchar*)xmlNodeGetContent(child_node);
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_button_size(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"width")) {
+ m_autopopup_configure.button_width = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"height")) {
+ m_autopopup_configure.button_height = get_content_int(child_node);
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_window_decorator_image_path(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"window_decorator"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"image")) {
+ if (equal_prop(child_node, "direction", "top_left")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_TOP_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "top_center")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_TOP_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "top_right")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_TOP_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_left")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_MIDDLE_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_center")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_MIDDLE_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_right")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_MIDDLE_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_left")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_BOTTOM_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_center")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_BOTTOM_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_right")) {
+ m_autopopup_configure.decoration_image_path[WND_DECORATOR_BOTTOM_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_grab_area(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"left")) {
+ m_autopopup_configure.add_grab_left = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"right")) {
+ m_autopopup_configure.add_grab_right = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"top")) {
+ m_autopopup_configure.add_grab_top = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"bottom")) {
+ m_autopopup_configure.add_grab_bottom = get_content_int(child_node);
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ int get_button_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ int button_state = -1;
+
+ if (equal_prop(cur_node, "button_state", "pressed")) {
+ button_state = BUTTON_STATE_PRESSED;
+ } else if (equal_prop(cur_node, "button_state", "normal")) {
+ button_state = BUTTON_STATE_NORMAL;
+ } else if (equal_prop(cur_node, "button_state", "disabled")) {
+ button_state = BUTTON_STATE_DISABLED;
+ } else if (equal_prop(cur_node, "button_state", "toggled")) {
+ button_state = BUTTON_STATE_TOGGLED;
+ }
+ return button_state;
+ }
+ SCLDisplayMode get_content_displaymode(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ SCLDisplayMode display_mode = DISPLAYMODE_PORTRAIT;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+ if (key!= NULL) {
+ if (0 == strcmp("landscape", (const char*)key)) {
+ display_mode = DISPLAYMODE_LANDSCAPE;
+ }
+ xmlFree(key);
+ }
+
+ return display_mode;
+ }
+ SclAutoPopupConfigure m_autopopup_configure;
+};
+
+AutoPopupConfigParser::AutoPopupConfigParser() {
+ m_impl = new AutoPopupConfigureParserImpl;
+}
+
+AutoPopupConfigParser::~AutoPopupConfigParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~AutoPopupConfigParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+AutoPopupConfigParser*
+AutoPopupConfigParser::get_instance() {
+ static AutoPopupConfigParser instance;
+ return &instance;
+}
+
+int
+AutoPopupConfigParser::init(const char* file) {
+ return m_impl->parsing_autopopup_configure(file);
+}
+
+int
+AutoPopupConfigParser::reload(const char* file) {
+ return m_impl->reload_autopopup_configure(file);
+}
+
+PSclAutoPopupConfigure
+AutoPopupConfigParser::get_autopopup_configure() {
+ return &m_impl->m_autopopup_configure;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __AutoPopupConfigParser__H__
+#define __AutoPopupConfigParser__H__
+#include "sclres_type.h"
+
+typedef SclAutoPopupConfigure *PSclAutoPopupConfigure;
+
+class AutoPopupConfigureParserImpl;
+
+class AutoPopupConfigParser {
+ AutoPopupConfigureParserImpl *m_impl;
+ public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclAutoPopupConfigure get_autopopup_configure();
+ public:
+ ~AutoPopupConfigParser();
+ static AutoPopupConfigParser *get_instance();
+ private:
+ AutoPopupConfigParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "binary_xmlresource.h"
+#include "string_bin_parser.h"
+#include "metadata_bin_parser.h"
+#include "parserinfo_provider.h"
+#include "string_provider.h"
+#include "metadata_provider.h"
+#include <assert.h>
+#include "simple_debug.h"
+
+using namespace binary_xmlresource;
+
+BinResource::BinResource() {
+ m_input_mode_configure_parser = NULL;
+ m_layout_parser = NULL;
+ m_key_coordinate_frame_parser = NULL;
+ m_modifier_decoration_parser = NULL;
+ m_label_properties_parser = NULL;
+ m_default_configure_parser = NULL;
+ m_autopopup_configure_parser = NULL;
+ m_magnifier_configure_parser = NULL;
+ m_nine_patch_file_list_parser = NULL;
+
+ memset(m_info, 0x00, sizeof(m_info));
+}
+
+BinResource::~BinResource() {
+ m_input_mode_configure_parser = NULL;
+ m_layout_parser = NULL;
+ m_key_coordinate_frame_parser = NULL;
+ m_modifier_decoration_parser = NULL;
+ m_label_properties_parser = NULL;
+ m_default_configure_parser = NULL;
+ m_autopopup_configure_parser = NULL;
+ m_magnifier_configure_parser = NULL;
+ m_nine_patch_file_list_parser = NULL;
+}
+
+BinResource* BinResource::get_instance() {
+ static BinResource instance;
+ return &instance;
+}
+
+void BinResource::init(const char *entry_filepath) {
+ SCLLOG_TIME_BEGIN();
+
+ char path[_POSIX_PATH_MAX] = {0};
+
+
+ snprintf(path, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), "sclresource.bin");
+
+ FileStorage storageAllData;
+ if (storageAllData.loadFile(path) <= 0) {
+ return;
+ }
+
+ const int _SIZE_WIDTH = 8;
+ const int OFFSET_WIDTH = 8;
+ int size_table[MAX_DATATYPE] = {0};
+ int offset_table[MAX_DATATYPE] = {0};
+ {
+ FileStorage headerStorage;
+ headerStorage.get_storage(storageAllData, 0, MAX_DATATYPE * (_SIZE_WIDTH + OFFSET_WIDTH));
+ for (int i = ALLDATA; i < MAX_DATATYPE; ++i) {
+ size_table[i] = headerStorage.get<sint_t>(_SIZE_WIDTH);
+ offset_table[i] = headerStorage.get<sint_t>(OFFSET_WIDTH);
+ }
+ }
+
+ for (int i = ALLDATA; i < MAX_DATATYPE; ++i) {
+ m_info[i].offset = offset_table[i];
+ m_info[i].size = size_table[i];
+ }
+
+ String_Bin_Parser stringBinParser(storageAllData, m_info[STRING].offset, m_info[STRING].size);
+ Metadata_Bin_Parser metadataBinParser(storageAllData, m_info[METADATA].offset, m_info[METADATA].size);
+
+ String_Provider stringProvider(&stringBinParser);
+ Metadata_Provider metadataProvider(&metadataBinParser);
+ ParserInfo_Provider parser_info_provider(&metadataProvider, &stringProvider);
+
+ if (m_input_mode_configure_parser == NULL) {
+ m_input_mode_configure_parser = BinInputModeConfigParser::get_instance();
+ m_input_mode_configure_parser->init(storageAllData, m_info[INPUT_MODE_CONFIGURE].offset, m_info[INPUT_MODE_CONFIGURE].size, &parser_info_provider);
+ }
+ if (m_default_configure_parser == NULL) {
+ m_default_configure_parser = BinDefaultConfigParser::get_instance();
+ m_default_configure_parser->init(storageAllData, m_info[DEFAULT_CONFIGURE].offset, m_info[DEFAULT_CONFIGURE].size, &parser_info_provider);
+ }
+ if (m_key_coordinate_frame_parser == NULL) {
+ m_key_coordinate_frame_parser = BinKeyCoordFrameParser::get_instance();
+ m_key_coordinate_frame_parser->init(storageAllData, m_info[KEY_COORDINATE_FRAME].offset, m_info[KEY_COORDINATE_FRAME].size, &parser_info_provider);
+ }
+
+ if (m_layout_parser == NULL) {
+ m_layout_parser = BinLayoutParser::get_instance();
+ m_layout_parser->init(storageAllData, m_info[LAYOUT].offset, m_info[LAYOUT].size, &parser_info_provider);
+ }
+ if (m_modifier_decoration_parser == NULL) {
+ m_modifier_decoration_parser = BinModifierDecorationParser::get_instance();
+ m_modifier_decoration_parser->init(storageAllData, m_info[MODIFIER_DECORATION].offset, m_info[MODIFIER_DECORATION].size, &parser_info_provider);
+ }
+ if (m_label_properties_parser == NULL) {
+ m_label_properties_parser = BinLabelPropertyParser::get_instance();
+ m_label_properties_parser->init(storageAllData, m_info[LABEL_PROPERTIES_FRAME].offset, m_info[LABEL_PROPERTIES_FRAME].size, &parser_info_provider);
+ }
+
+ if (m_autopopup_configure_parser == NULL) {
+ m_autopopup_configure_parser = BinAutoPopupConfigParser::get_instance();
+ m_autopopup_configure_parser->init(storageAllData, m_info[AUTOPOPUP_CONFIGURE].offset, m_info[AUTOPOPUP_CONFIGURE].size, &parser_info_provider);
+ }
+ if (m_magnifier_configure_parser == NULL) {
+ m_magnifier_configure_parser = BinMagnifierConfigParser::get_instance();
+ m_magnifier_configure_parser->init(storageAllData, m_info[MAGNIFIER_CONFIGURE].offset, m_info[MAGNIFIER_CONFIGURE].size, &parser_info_provider);
+ }
+
+ if (m_nine_patch_file_list_parser == NULL) {
+ m_nine_patch_file_list_parser = BinNinePatchFileParser::get_instance();
+ m_nine_patch_file_list_parser->init(storageAllData, m_info[NINE_PATCH].offset, m_info[NINE_PATCH].size, &parser_info_provider);
+ }
+
+ SCLLOG_TIME_END("Parsing binary XML files");
+}
+
+void BinResource::reload() {
+ // We do not support reload function at BinResource class yet
+}
+
+void BinResource::load(int layout_id) {
+ //m_layout_parser->load(layout_id);
+ m_key_coordinate_frame_parser->load(layout_id);
+}
+void BinResource::unload() {
+ //m_layout_parser->unload();
+ m_key_coordinate_frame_parser->unload();
+}
+bool BinResource::loaded(int layout_id) {
+ //return m_layout_parser->loaded(layout_id);
+ return m_key_coordinate_frame_parser->loaded(layout_id);
+}
+
+int BinResource::get_labelproperty_size() {
+ return m_label_properties_parser->get_size();
+}
+bool BinResource::get_nine_patch_info(const char *filename, SclNinePatchInfo *info) {
+ return m_nine_patch_file_list_parser->get_nine_patch_info(filename, info);
+}
+int BinResource::get_inputmode_id(const char *name) {
+ return m_input_mode_configure_parser->get_inputmode_id(name);
+}
+const char* BinResource::get_inputmode_name(int id) {
+ return m_input_mode_configure_parser->get_inputmode_name(id);
+}
+int BinResource::get_inputmode_size() {
+ return m_input_mode_configure_parser->get_inputmode_size();
+}
+PSclInputModeConfigure BinResource::get_input_mode_configure_table() {
+ return m_input_mode_configure_parser->get_input_mode_configure_table();
+}
+int BinResource::get_layout_id(const char *name) {
+ return m_layout_parser->get_layout_index(name);
+}
+int BinResource::get_layout_size() {
+ return m_layout_parser->get_layout_size();
+}
+int BinResource::get_modifier_decoration_id(const char *name) {
+ return m_modifier_decoration_parser->get_modifier_decoration_id(name);
+}
+PSclLayout BinResource::get_layout_table() {
+ return m_layout_parser->get_layout_table();
+}
+PSclLayoutKeyCoordinatePointerTable BinResource::get_key_coordinate_pointer_frame() {
+ return m_layout_parser->get_key_coordinate_pointer_frame();
+}
+PSclModifierDecoration BinResource::get_modifier_decoration_table() {
+ return m_modifier_decoration_parser->get_modifier_decoration_table();
+}
+
+PSclLabelPropertiesTable BinResource::get_label_properties_frame() {
+ return m_label_properties_parser->get_label_properties_frame();
+}
+
+PSclDefaultConfigure BinResource::get_default_configure() {
+ return m_default_configure_parser->get_default_configure();
+}
+
+PSclAutoPopupConfigure BinResource::get_autopopup_configure() {
+ return m_autopopup_configure_parser->get_autopopup_configure();
+}
+
+PSclMagnifierWndConfigure BinResource::get_magnifier_configure() {
+ return m_magnifier_configure_parser->get_magnifier_configure();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BIN_XMLRESOURCE__
+#define __BIN_XMLRESOURCE__
+
+#include <limits.h>
+#include <libxml/parser.h>
+#include "input_mode_configure_bin_parser.h"
+#include "layout_bin_parser.h"
+#include "key_coordinate_frame_bin_parser.h"
+#include "modifier_decoration_bin_parser.h"
+#include "label_properties_bin_parser.h"
+#include "default_configure_bin_parser.h"
+#include "autopopup_configure_bin_parser.h"
+#include "magnifier_configure_bin_parser.h"
+#include "nine_patch_file_list_bin_parser.h"
+#include "sclres.h"
+struct resource_info_t{
+ int offset;
+ int size;
+};
+
+
+enum{
+ ALLDATA = 0,
+ METADATA,
+ INPUT_MODE_CONFIGURE,
+ LAYOUT,
+ KEY_COORDINATE_FRAME,
+ LABEL_PROPERTIES_FRAME,
+ MODIFIER_DECORATION,
+ DEFAULT_CONFIGURE,
+ AUTOPOPUP_CONFIGURE,
+ MAGNIFIER_CONFIGURE,
+ NINE_PATCH,
+ STRING,
+ MAX_DATATYPE
+};
+namespace binary_xmlresource {
+class BinResource: public sclres::SclRes{
+ public:
+ ~BinResource();
+ static BinResource* get_instance();
+ void init(const char *entry_filepath);
+ void reload();
+
+ /* These functions are for dynamic (lazy) loading layouts */
+ void load(int layout_id);
+ void unload();
+ bool loaded(int layout_id);
+
+ public:
+ PSclInputModeConfigure get_input_mode_configure_table();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+ PSclModifierDecoration get_modifier_decoration_table();
+ PSclLabelPropertiesTable get_label_properties_frame();
+ PSclDefaultConfigure get_default_configure();
+ PSclAutoPopupConfigure get_autopopup_configure();
+ PSclMagnifierWndConfigure get_magnifier_configure();
+
+ int get_inputmode_id(const char *name);
+ const char* get_inputmode_name(int id);
+ int get_inputmode_size();
+ int get_layout_id(const char* name);
+ int get_layout_size();
+ int get_labelproperty_size();
+ int get_modifier_decoration_id(const char *name);
+ bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info);
+
+ const char* get_name() {
+ return "binary_xmlparser";
+ }
+
+ void destroy();
+ struct resource_info_t m_info[MAX_DATATYPE];
+ private:
+ BinResource();
+
+ private:
+ BinInputModeConfigParser *m_input_mode_configure_parser;
+ BinLayoutParser *m_layout_parser;
+ BinKeyCoordFrameParser *m_key_coordinate_frame_parser;
+ BinModifierDecorationParser *m_modifier_decoration_parser;
+ BinLabelPropertyParser *m_label_properties_parser;
+ BinDefaultConfigParser *m_default_configure_parser;
+ BinAutoPopupConfigParser *m_autopopup_configure_parser;
+ BinMagnifierConfigParser *m_magnifier_configure_parser;
+ BinNinePatchFileParser *m_nine_patch_file_list_parser;
+};
+}
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "default_configure_bin_parser.h"
+#include <assert.h>
+using namespace std;
+#include "put_record.h"
+
+BinDefaultConfigParser::BinDefaultConfigParser() {
+ memset((void*)&m_default_configure, 0x00, sizeof(SclDefaultConfigure));
+ parser_info_provider = NULL;
+}
+
+BinDefaultConfigParser::~BinDefaultConfigParser() {
+}
+
+BinDefaultConfigParser* BinDefaultConfigParser::get_instance() {
+ static BinDefaultConfigParser instance;
+ return &instance;
+}
+
+void BinDefaultConfigParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+ parsing_default_configure();
+}
+void
+BinDefaultConfigParser::decode_color(SclColor& color, int width) {
+ if (width <= 0) return;
+
+ color.r = m_storage.get<sint_t>(width);
+ color.g = m_storage.get<sint_t>(width);
+ color.b = m_storage.get<sint_t>(width);
+ color.a = m_storage.get<sint_t>(width);
+}
+
+void BinDefaultConfigParser::parsing_default_configure() {
+ PSclDefaultConfigure cur = &m_default_configure;
+
+ Default_configure_width record_width;
+ set_default_configure_width(*parser_info_provider, record_width);
+
+ // skip data_size
+ m_storage.advance(8);
+
+ //display_mode
+ cur->display_mode = (SCLDisplayMode)m_storage.get<sint_t>(record_width.display_mode);
+
+ //input_mode
+ m_storage.get_str(&(cur->input_mode), record_width.input_mode, m_string_collector);
+
+ //image_file_base_path
+ m_storage.get_str(&(cur->image_file_base_path), record_width.image_file_base_path, m_string_collector);
+
+ //target_screen_width
+ cur->target_screen_width = m_storage.get<sint_t>(record_width.target_screen_width);
+
+ //target_screen_height
+ cur->target_screen_height = m_storage.get<sint_t>(record_width.target_screen_height);
+
+ //auto_detect_landscape
+ cur->auto_detect_landscape = m_storage.get<sint_t>(record_width.auto_detect_landscape);
+
+ //use_magnifier_window
+ cur->use_magnifier_window = m_storage.get<sint_t>(record_width.use_magnifier_window);
+
+ //use_auto_popup
+ cur->use_auto_popup = m_storage.get<sint_t>(record_width.use_auto_popup);
+
+ //use_zoom_window
+ cur->use_zoom_window = m_storage.get<sint_t>(record_width.use_zoom_window);
+
+ //on_error_noti_send
+ cur->on_error_noti_send = m_storage.get<sint_t>(record_width.on_error_noti_send);
+
+ //use_word_deletion
+ cur->use_word_deletion = m_storage.get<sint_t>(record_width.use_word_deletion);
+
+ //sw_button_style
+ cur->sw_button_style = m_storage.get<sint_t>(record_width.sw_button_style);
+
+ //touch_offset_level
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ cur->touch_offset_level[i] = (SCLTouchOffsetLevel)m_storage.get<sint_t>(record_width.touch_offset_level);
+ }
+
+ //touch_offset
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ cur->touch_offset[i].x = m_storage.get<sint_t>(record_width.touch_offset);
+ cur->touch_offset[i].y = m_storage.get<sint_t>(record_width.touch_offset);
+ }
+
+ //default_sub_layout
+ m_storage.get_str(&(cur->default_sub_layout), record_width.default_sub_layout, m_string_collector);
+
+ //use_actual_dim_window
+ cur->use_actual_dim_window = m_storage.get<sint_t>(record_width.use_actual_dim_window);
+
+ //dim_color
+ decode_color(cur->dim_color, record_width.dim_color);
+
+#ifdef __SCL_TXT_DEBUG
+ put_default_configure(DECODE, m_default_configure);
+#endif
+}
+
+PSclDefaultConfigure BinDefaultConfigParser::get_default_configure() {
+ return &m_default_configure;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __DEFAULT_CONFIGURE_BIN_PARSER__H__
+#define __DEFAULT_CONFIGURE_BIN_PARSER__H__
+#include "sclres_type.h"
+#include "string_collector.h"
+#include "iparserinfo_provider.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+class BinDefaultConfigParser {
+public:
+ ~BinDefaultConfigParser();
+ static BinDefaultConfigParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+
+ PSclDefaultConfigure get_default_configure();
+
+
+ //These private methods for parsing
+private:
+ BinDefaultConfigParser();
+ void parsing_default_configure();
+ void decode_color(SclColor&, int width);
+private:
+ SclDefaultConfigure m_default_configure;
+ StringCollector m_string_collector;
+ IParserInfo_Provider* parser_info_provider;
+ FileStorage m_storage;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <libxml/parser.h>
+#include "default_configure_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+using namespace std;
+
+class DefaultConfigureParserImpl {
+ public:
+ DefaultConfigureParserImpl() {
+ memset((void*)&m_default_configure, 0x00, sizeof(SclDefaultConfigure));
+ }
+
+ ~DefaultConfigureParserImpl() {
+ reset();
+ }
+
+ void reset() {
+ if (m_default_configure.input_mode) {
+ xmlFree(m_default_configure.input_mode);
+ m_default_configure.input_mode = NULL;
+ }
+
+ if (m_default_configure.input_mode) {
+ xmlFree(m_default_configure.input_mode);
+ m_default_configure.input_mode = NULL;
+ }
+
+ if (m_default_configure.image_file_base_path) {
+ xmlFree(m_default_configure.image_file_base_path);
+ m_default_configure.image_file_base_path = NULL;
+ }
+
+ if (m_default_configure.default_sub_layout) {
+ xmlFree(m_default_configure.default_sub_layout);
+ m_default_configure.default_sub_layout = NULL;
+ }
+ memset((void*)&m_default_configure, 0x00, sizeof(SclDefaultConfigure));
+ }
+
+ int reload_default_configure(const char* input_file) {
+ reset();
+ return parsing_default_configure(input_file);
+ }
+ int parsing_default_configure(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "DefaultConfigParser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"default_configure"))
+ {
+ SCLLOG(SclLog::DEBUG, "DefaultConfigParser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"display")) {
+ m_default_configure.display_mode = get_content_display_mode(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"input_mode")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_default_configure.input_mode = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"base_screen_width")) {
+ m_default_configure.target_screen_width = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"base_screen_height")) {
+ m_default_configure.target_screen_height = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"auto_detect_landscape")) {
+ m_default_configure.auto_detect_landscape = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"image_file_base_path")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_default_configure.image_file_base_path = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_magnifier")) {
+ m_default_configure.use_magnifier_window = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_autopopup")) {
+ m_default_configure.use_auto_popup = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_zoomwindow")) {
+ m_default_configure.use_zoom_window = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_error_sound")) {
+ m_default_configure.on_error_noti_send = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_word_deletion")) {
+ m_default_configure.use_word_deletion = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"touch_offset_level")) {
+ // Let's skip this item since it does not seem to be useful anymore
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"touch_offset")) {
+ // Let's skip this item since it does not seem to be useful anymore
+ parsing_touch_offset(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"default_sub_layout")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_default_configure.default_sub_layout = (sclchar *)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"dim_use_window_flag")) {
+ m_default_configure.use_actual_dim_window = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"dim_color")) {
+ parsing_dim_color(cur_node);
+ }
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+
+ void parsing_touch_offset(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"portrait")) {
+ xmlNodePtr grandChildNode = child_node->xmlChildrenNode;
+ while (grandChildNode != NULL) {
+ if (0 == xmlStrcmp(grandChildNode->name, (const xmlChar*)"x")) {
+ m_default_configure.touch_offset[DISPLAYMODE_PORTRAIT].x = get_content_int(grandChildNode);
+ } else if (0 == xmlStrcmp(grandChildNode->name, (const xmlChar*)"y")) {
+ m_default_configure.touch_offset[DISPLAYMODE_PORTRAIT].y = get_content_int(grandChildNode);
+ }
+ grandChildNode = grandChildNode->next;
+ }
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"landscape")) {
+ xmlNodePtr grandChildNode = child_node->xmlChildrenNode;
+ while (grandChildNode != NULL) {
+ if (0 == xmlStrcmp(grandChildNode->name, (const xmlChar*)"x")) {
+ m_default_configure.touch_offset[DISPLAYMODE_LANDSCAPE].x = get_content_int(grandChildNode);
+ } else if (0 == xmlStrcmp(grandChildNode->name, (const xmlChar*)"y")) {
+ m_default_configure.touch_offset[DISPLAYMODE_LANDSCAPE].y = get_content_int(grandChildNode);
+ }
+ grandChildNode = grandChildNode->next;
+ }
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_dim_color(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"r")) {
+ m_default_configure.dim_color.r = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"g")) {
+ m_default_configure.dim_color.g = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"b")) {
+ m_default_configure.dim_color.b = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"a")) {
+ m_default_configure.dim_color.a = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ SCLDisplayMode get_content_display_mode(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ SCLDisplayMode display_mode = DISPLAYMODE_PORTRAIT;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+ if (key!= NULL) {
+ if (0 == strcmp("landscape", (const char*)key)) {
+ display_mode = DISPLAYMODE_LANDSCAPE;
+ }
+ xmlFree(key);
+ }
+
+ return display_mode;
+ }
+ SclDefaultConfigure m_default_configure;
+};
+
+DefaultConfigParser*
+DefaultConfigParser::get_instance() {
+ static DefaultConfigParser instance;
+ return &instance;
+}
+DefaultConfigParser::DefaultConfigParser() {
+ m_impl = new DefaultConfigureParserImpl;
+}
+
+DefaultConfigParser::~DefaultConfigParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~DefaultConfigParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+int
+DefaultConfigParser::init(const char* file) {
+ return m_impl->parsing_default_configure(file);
+}
+
+int
+DefaultConfigParser::reload(const char* file) {
+ return m_impl->reload_default_configure(file);
+}
+
+PSclDefaultConfigure
+DefaultConfigParser::get_default_configure() {
+ return &m_impl->m_default_configure;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __DEFAULT_CONFIGURE_PARSER__H__
+#define __DEFAULT_CONFIGURE_PARSER__H__
+#include "sclres_type.h"
+
+typedef SclDefaultConfigure *PSclDefaultConfigure;
+
+class DefaultConfigureParserImpl;
+
+class DefaultConfigParser {
+ DefaultConfigureParserImpl *m_impl;
+public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclDefaultConfigure get_default_configure();
+public:
+ ~DefaultConfigParser();
+ static DefaultConfigParser *get_instance();
+private:
+ DefaultConfigParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "file_storage_impl.h"
+
+FileStorage::FileStorage(const IString_Provider* string_provider):
+ m_storage(NULL),
+ m_offset(0),
+ m_size(0),
+ m_string_provider(string_provider) {
+ }
+
+FileStorage::~FileStorage() {
+ if (m_storage) {
+ delete []m_storage;
+ }
+ m_storage = NULL;
+ m_size = 0;
+ m_offset = 0;
+}
+
+int FileStorage::
+get_offset() const {
+ return m_offset;
+}
+void FileStorage::
+set_str_provider(const IString_Provider* string_provider) {
+ this->m_string_provider = string_provider;
+}
+const char* FileStorage::
+get_str(int width) {
+ assert(m_string_provider);
+
+ if (width <= 0) return NULL;
+
+ int string_no = get<sint_t>(width);
+ return m_string_provider->get_string_by_id(string_no);
+}
+
+void FileStorage::
+get_str(char** p, int width, IStringCollector& collector) {
+ if (p == NULL) return;
+ const char* str = get_str(width);
+ if (str != NULL) {
+ int len = strlen(str) + 1;
+ *p = new char[len];
+ strncpy((*p), str, len);
+ collector.add(*p);
+ } else {
+ *p = NULL;
+ }
+}
+
+void FileStorage::
+advance(int bytes) {
+ m_offset += bytes;
+}
+
+const char* FileStorage::
+get_str() {
+ // the length of the string, not include '\0'
+ int len = get<sint_t>(1);
+ // the string stored in storage are end with '\0'
+ const char* str = m_storage + m_offset;
+ m_offset += len + 1;
+ return str;
+}
+
+int FileStorage::
+ loadFile(const char* file_name) {
+ if (file_name == NULL) return -1;
+
+ FILE* fp = fopen(file_name, "rb");
+ if (fp == NULL) {
+ return -1;
+ }
+
+ if (m_storage != NULL) {
+ delete[] m_storage;
+ }
+ m_storage = NULL;
+
+ if (0 != fseek(fp, 0L, SEEK_END)) {
+ fclose(fp);
+ return -1;
+ }
+
+ long size = ftell(fp);
+
+ if (size > 0) {
+ m_storage = new char[size];
+ }
+ if (m_storage == NULL) {
+ fclose(fp);
+ return -1;
+ }
+
+ if (0 != fseek(fp, 0L, SEEK_SET)) {
+ if (m_storage) {
+ delete []m_storage;
+ }
+ m_storage = NULL;
+ fclose(fp);
+ return -1;
+ }
+ if (size > 0 && 1 != fread(m_storage, size, 1, fp)) {
+ if (m_storage) {
+ delete []m_storage;
+ }
+ m_storage = NULL;
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+
+ m_size = size;
+ m_offset = 0;
+ return m_size;
+}
+int FileStorage::
+ loadFile(const char* file_name, int offset, int size) {
+ if (file_name == NULL) return -1;
+ if (offset < 0 || size <= 0) return -1;
+
+ FILE* fp = fopen(file_name, "rb");
+ if (fp == NULL) {
+ return -1;
+ }
+
+ if (m_storage != NULL) {
+ delete[] m_storage;
+ }
+ m_storage = NULL;
+
+ if (0 != fseek(fp, 0L, SEEK_END)) {
+ fclose(fp);
+ return -1;
+ }
+
+ int file_size = ftell(fp);
+ if (file_size < offset + size) {
+ fclose(fp);
+ return -1;
+ }
+ m_storage = new char[size];
+ if (m_storage == NULL) {
+ fclose(fp);
+ return -1;
+ }
+
+ int nbytes = 0;
+ if (fseek(fp, offset, 0) != -1) {
+ nbytes = fread(m_storage, size, 1, fp);
+ }
+ if (nbytes != 1) {
+ if (m_storage) {
+ delete []m_storage;
+ }
+ m_storage = NULL;
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+
+ m_size = size;
+ m_offset = 0;
+ return m_size;
+}
+int FileStorage::
+get_size() const {
+ return m_size;
+}
+int FileStorage::
+get_storage(const FileStorage& storage, int offset, int block_size) {
+ if (offset < 0 || block_size <= 0) return -1;
+ if (storage.get_size() < offset + block_size) return -1;
+
+ if (m_storage != NULL) {
+ delete[] m_storage;
+ }
+
+ m_storage = new char[block_size];
+ if (m_storage == NULL) {
+ return -1;
+ }
+
+ memcpy(m_storage, storage.m_storage + offset, block_size);
+
+ m_size = block_size;
+ m_offset = 0;
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __FILE_STORAGE_H__
+#define __FILE_STORAGE_H__
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "istring_provider.h"
+#include "istring_collector.h"
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+typedef char int8;
+typedef short int16;
+typedef int int32;
+typedef long long int64;
+typedef float float32;
+typedef double float64;
+
+typedef int64 sint_t;
+typedef uint64 uint_t;
+typedef float64 float_t;
+using namespace std;
+class FileStorage{
+ public:
+ FileStorage(const IString_Provider* string_provider = NULL);
+ ~FileStorage();
+
+ int get_offset() const;
+ void set_str_provider(const IString_Provider*);
+ template <typename T>
+ T get(int width);
+
+ const char* get_str(int width);
+
+ void get_str(char** p, int width, IStringCollector& collector);
+
+ const char* get_str();
+
+ int loadFile(const char* file_name);
+ int loadFile(const char* file_name, int offset, int size);
+ /** brief get_storage from a field of another storage
+ */
+ int get_storage(const FileStorage&, int offset, int block_size);
+
+ void advance(int bytes);
+ int get_size() const;
+
+ private:
+ /** brief unify get_xx method name
+ */
+ template <typename T>
+ T get_primitive_data();
+
+ uint8 get_uint8();
+ uint16 get_uint16();
+ uint32 get_uint32();
+ uint64 get_uint64();
+ int8 get_int8();
+ int16 get_int16();
+ int32 get_int32();
+ int64 get_int64();
+ float32 get_float32();
+ float64 get_float64();
+
+ char* m_storage; /* memory that read from bin file */
+ int m_offset; /* current offset of the memory */
+ int m_size; /* the size of the memory */
+
+ /** brief Infact, the strings' ids are stored for structures
+ * m_string_provider can get the actual string by id
+ */
+ const IString_Provider* m_string_provider;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __FILE_STORAGE_IMPL_H__
+#define __FILE_STORAGE_IMPL_H__
+#include "file_storage.h"
+///////////////////////////////////////
+inline uint8 FileStorage::
+get_uint8() {
+ uint8* p = (uint8*)(m_storage + m_offset);
+ m_offset += sizeof(uint8);
+ return *p;
+}
+inline uint16 FileStorage::
+get_uint16() {
+ uint16* p = (uint16*)(m_storage + m_offset);
+ m_offset += sizeof(uint16);
+ return *p;
+}
+inline uint32 FileStorage::
+get_uint32() {
+ uint32* p = (uint32*)(m_storage + m_offset);
+ m_offset += sizeof(uint32);
+ return *p;
+}
+inline uint64 FileStorage::
+get_uint64() {
+ uint64* p = (uint64*)(m_storage + m_offset);
+ m_offset += sizeof(uint64);
+ return *p;
+}
+// in put_methods,
+// inline put_intx(intx data) {
+// put_uintx(data);
+// }
+// so below is ok
+inline int8 FileStorage::
+get_int8() {
+ return (int)get_uint8();
+}
+
+inline int16 FileStorage::
+get_int16() {
+ return (int)get_uint16();
+}
+inline int32 FileStorage::
+get_int32() {
+ return (int)get_uint32();
+}
+inline int64 FileStorage::
+get_int64() {
+ return (int)get_uint64();
+}
+//float32
+inline float32 FileStorage::
+get_float32() {
+ union{
+ float32 m;
+ uint32 n;
+ };
+
+ n = get_uint32();
+ return m;
+}
+//float64
+inline float64 FileStorage::
+get_float64() {
+ union{
+ float64 m;
+ uint64 n;
+ };
+
+ n = get_uint64();
+ return m;
+}
+
+//unify put_xx method name
+//the width is sizeof(T)
+template <>
+inline uint8 FileStorage::
+get_primitive_data<uint8>() {
+ return get_uint8();
+}
+template <>
+inline uint16 FileStorage::
+get_primitive_data<uint16>() {
+ return get_uint16();
+}
+
+template <>
+inline uint32 FileStorage::
+get_primitive_data<uint32>() {
+ return get_uint32();
+}
+template <>
+inline uint64 FileStorage::
+get_primitive_data<uint64>() {
+ return get_uint64();
+}
+template <>
+inline int8 FileStorage::
+get_primitive_data<int8>() {
+ return get_int8();
+}
+template <>
+inline int16 FileStorage::
+get_primitive_data<int16>() {
+ return get_int16();
+}
+
+template <>
+inline int32 FileStorage::
+get_primitive_data<int32>() {
+ return get_int32();
+}
+template <>
+inline int64 FileStorage::
+get_primitive_data<int64>() {
+ return get_int64();
+}
+template <>
+inline float32 FileStorage::
+get_primitive_data<float32>() {
+ return get_float32();
+}
+template <>
+inline float64 FileStorage::
+get_primitive_data<float64>() {
+ return get_float64();
+}
+//put sint_t value to storage
+//width is assigned by para "width"
+template <>
+inline sint_t FileStorage::
+get<sint_t>(int width) {
+ switch (width) {
+ case 0:
+ /*Nothing to put*/
+ break;
+ case 1:
+ return get_primitive_data<int8>();
+ case 2:
+ return get_primitive_data<int16>();
+ case 4:
+ return get_primitive_data<int32>();
+ case 8:
+ return get_primitive_data<int64>();
+ default:
+ break;
+ }
+ return -1;
+}
+template <>
+inline uint_t FileStorage::
+get<uint_t>(int width) {
+ switch (width) {
+ case 0:
+ /*Nothing to put*/
+ break;
+ case 1:
+ return get_primitive_data<uint8>();
+ case 2:
+ return get_primitive_data<uint16>();
+ case 4:
+ return get_primitive_data<uint32>();
+ case 8:
+ return get_primitive_data<uint64>();
+ default:
+ break;
+ }
+ return -1;
+}
+
+template <>
+inline float_t FileStorage::
+get<float_t>(int width) {
+ switch (width) {
+ case 0:
+ return 0;
+ case 4:
+ return (float_t)get_primitive_data<float32>();
+ case 8:
+ return (float_t)get_primitive_data<float64>();
+ default:
+ break;
+ }
+ return -1;
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __IMETADATA_PROVIDER_H__
+#define __IMETADATA_PROVIDER_H__
+class IMetadata_Provider{
+ public:
+ virtual void set_current_metadata_record(const char* record_name) = 0;
+ virtual int get_width(const char* fieldName)const = 0;
+ virtual ~IMetadata_Provider() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "input_mode_configure_bin_parser.h"
+#include "simple_debug.h"
+#include "put_record.h"
+using namespace std;
+
+BinInputModeConfigParser::BinInputModeConfigParser() {
+ m_inputmode_size = 0;
+ memset(m_input_mode_configure_table, 0x00, sizeof(SclInputModeConfigure) * MAX_SCL_INPUT_MODE);
+ parser_info_provider = NULL;
+}
+
+BinInputModeConfigParser::~BinInputModeConfigParser() {
+}
+
+BinInputModeConfigParser*
+BinInputModeConfigParser::get_instance() {
+ static BinInputModeConfigParser instance;
+ return &instance;
+}
+
+void
+BinInputModeConfigParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(parser_info_provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+ parsing_input_mode_configure_table();
+}
+
+int
+BinInputModeConfigParser::get_inputmode_id(const char *name) {
+ if (name == NULL) return -1;
+
+ for (int i = 0; i < MAX_SCL_INPUT_MODE; ++i) {
+ if ( m_input_mode_configure_table[i].name ) {
+ if ( 0 == strcmp(m_input_mode_configure_table[i].name, name) ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+}
+
+const char*
+BinInputModeConfigParser::get_inputmode_name(int id) {
+ if (id >= 0 && id < MAX_SCL_INPUT_MODE) {
+ return m_input_mode_configure_table[id].name;
+ }
+
+ return NULL;
+}
+
+int
+BinInputModeConfigParser::get_inputmode_size() {
+ return m_inputmode_size;
+}
+
+void
+BinInputModeConfigParser::parsing_input_mode_configure_table() {
+ // skip data_size
+ m_storage.advance(8);
+
+ //rec_num
+ m_inputmode_size = m_storage.get<sint_t>(4);
+
+ Input_mode_configure_width record_width;
+ set_input_mode_configure_width(*parser_info_provider, record_width);
+
+ PSclInputModeConfigure cur = m_input_mode_configure_table;
+
+ for (int i = 0; i < m_inputmode_size; ++i) {
+ //name
+ m_storage.get_str(&(cur->name), record_width.name, m_string_collector);
+ //layout_portrait
+ m_storage.get_str(&(cur->layouts[0]), record_width.layout_portrait, m_string_collector);
+ //layout_landscape
+ m_storage.get_str(&(cur->layouts[1]), record_width.layout_landscape, m_string_collector);
+ //use_virtual_window
+ cur->use_virtual_window = m_storage.get<sint_t>(record_width.use_virtual_window);
+ //use_dim_window
+ cur->use_dim_window = m_storage.get<sint_t>(record_width.use_dim_window);
+
+ cur->timeout = m_storage.get<sint_t>(record_width.timeout);
+
+ cur++;
+ }
+
+#ifdef __SCL_TXT_DEBUG
+ put_input_mode_configure_table(DECODE, m_input_mode_configure_table);
+#endif
+}
+
+PSclInputModeConfigure
+BinInputModeConfigParser::get_input_mode_configure_table() {
+ return m_input_mode_configure_table;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INPUT_MODE_BIN_PARSER__H__
+#define __INPUT_MODE_BIN_PARSER__H__
+#include <libxml/parser.h>
+#include "sclres_type.h"
+#include "iparserinfo_provider.h"
+#include <vector>
+#include "file_storage_impl.h"
+#include "string_collector.h"
+#include "_auto_metadata.h"
+
+class BinInputModeConfigParser {
+ public:
+ ~BinInputModeConfigParser();
+ static BinInputModeConfigParser *get_instance();
+ void init(const FileStorage&, int, int, IParserInfo_Provider* provider);
+ PSclInputModeConfigure get_input_mode_configure_table();
+ int get_inputmode_id(const char *name);
+ const char* get_inputmode_name(int id);
+ int get_inputmode_size();
+
+ void decode_string(FileStorage &storage, char** p, int width);
+ private:
+ BinInputModeConfigParser();
+ void parsing_input_mode_configure_table();
+ void set_input_mode_configure_default_record(const PSclInputModeConfigure);
+
+ StringCollector m_string_collector;
+ private:
+ int m_inputmode_size;
+ SclInputModeConfigure m_input_mode_configure_table[MAX_SCL_INPUT_MODE];
+
+ FileStorage m_storage;
+ IParserInfo_Provider* parser_info_provider;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <string.h>
+#include <libxml/parser.h>
+
+#include "input_mode_configure_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+
+/** Example of input mode XML file :
+ * <?xml version="1.0"?>
+ * <input_mode_table>
+ * <mode name="ENGLISH_QTY">
+ * <keyset>PORTRAIT_QTY_DEFAULT</keyset>
+ * <keyset>LANDSCAPE_QTY_DEFAULT</keyset>
+ * </mode>
+ * <mode name="PUNCTUATION_POPUP" dim_window="true">
+ * <keyset>PORTRAIT_PUNCTUATION_POPUP</keyset>
+ * <keyset>LANDSCAPE_PUNCTUATION_POPUP</keyset>
+ * </mode>
+ * </input_mode_table>
+ */
+
+#define INPUT_MODE_CONFIGURE_TABLE_TAG "input_mode_table"
+
+#define INPUT_MODE_CONFIGURE_MODE_TAG "mode"
+#define INPUT_MODE_CONFIGURE_MODE_NAME_ATTRIBUTE "name"
+#define INPUT_MODE_CONFIGURE_MODE_DIM_WINDOW_ATTRIBUTE "dim_window"
+#define INPUT_MODE_CONFIGURE_MODE_VIRTUAL_WINDOW_ATTRIBUTE "virtual_window"
+
+#define INPUT_MODE_CONFIGURE_LAYOUT_TAG "layouts"
+#define INPUT_MODE_CONFIGURE_LAYOUT_PORTRAIT_TAG "portrait"
+#define INPUT_MODE_CONFIGURE_LAYOUT_LANDSCAPE_TAG "landscape"
+
+class InputModeConfigureParserImpl {
+ public:
+ InputModeConfigureParserImpl() {
+ m_inputmode_size = 0;
+ memset(m_input_mode_configure_table, 0x00, sizeof(SclInputModeConfigure) * MAX_SCL_INPUT_MODE);
+ }
+
+ ~InputModeConfigureParserImpl() {
+ reset();
+ }
+
+ void reset() {
+ for (int input_mode = 0; input_mode < MAX_SCL_INPUT_MODE; ++input_mode) {
+ SclInputModeConfigure& cur_rec = m_input_mode_configure_table[input_mode];
+ if (cur_rec.name) {
+ xmlFree(cur_rec.name);
+ cur_rec.name = NULL;
+ }
+ if (cur_rec.layouts[DISPLAYMODE_PORTRAIT]) {
+ xmlFree(cur_rec.layouts[DISPLAYMODE_PORTRAIT]);
+ cur_rec.layouts[DISPLAYMODE_PORTRAIT] = NULL;
+ }
+ if (cur_rec.layouts[DISPLAYMODE_LANDSCAPE]) {
+ xmlFree(cur_rec.layouts[DISPLAYMODE_LANDSCAPE]);
+ cur_rec.layouts[DISPLAYMODE_LANDSCAPE] = NULL;
+ }
+ }
+ m_inputmode_size = 0;
+ memset(m_input_mode_configure_table, 0x00, sizeof(SclInputModeConfigure) * MAX_SCL_INPUT_MODE);
+ }
+
+ int reload_input_mode_configure_table(const char* input_file) {
+ reset();
+ return parsing_input_mode_configure_table(input_file);
+ }
+ int parsing_input_mode_configure_table(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "InputModeConfigParser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)INPUT_MODE_CONFIGURE_TABLE_TAG))
+ {
+ SCLLOG(SclLog::DEBUG, "InputModeConfigParser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ m_inputmode_size = 0;
+ cur_node = cur_node->xmlChildrenNode;
+
+ SclInputModeConfigure* cur_rec = m_input_mode_configure_table;
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)INPUT_MODE_CONFIGURE_MODE_TAG)) {
+ parsing_mode_node(cur_node, cur_rec);
+ m_inputmode_size++;
+ cur_rec++;
+ if (m_inputmode_size >= MAX_SCL_INPUT_MODE) {
+ SCLLOG(SclLog::ERROR, "No Space for input mode record.");
+ break;
+ }
+ }
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+
+ void set_input_mode_configure_default_record(const PSclInputModeConfigure cur_rec) {
+ cur_rec->name = NULL;
+ cur_rec->layouts[DISPLAYMODE_PORTRAIT] = NULL;
+ cur_rec->layouts[DISPLAYMODE_LANDSCAPE] = NULL;
+ cur_rec->use_virtual_window = FALSE;
+ cur_rec->use_dim_window = FALSE;
+ }
+
+ void parsing_mode_node(const xmlNodePtr cur_node, const PSclInputModeConfigure cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ set_input_mode_configure_default_record(cur_rec);
+
+ get_prop_bool(cur_node, INPUT_MODE_CONFIGURE_MODE_VIRTUAL_WINDOW_ATTRIBUTE, &(cur_rec->use_virtual_window));
+ get_prop_bool(cur_node, INPUT_MODE_CONFIGURE_MODE_DIM_WINDOW_ATTRIBUTE, &(cur_rec->use_dim_window));
+
+ xmlChar* temp = xmlGetProp(cur_node, (const xmlChar*)INPUT_MODE_CONFIGURE_MODE_NAME_ATTRIBUTE);
+ cur_rec->name = (sclchar *)temp;
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"text")) {
+ child_node = child_node->next;
+ continue;
+ }
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)INPUT_MODE_CONFIGURE_LAYOUT_TAG)) {
+ parsing_layouts(child_node, cur_rec);
+ } else {
+ SCLLOG(SclLog::WARNING, "input_mode_configure has no such node name: %s\n", (char *)child_node->name);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_layouts(const xmlNodePtr cur_node, const PSclInputModeConfigure cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)INPUT_MODE_CONFIGURE_LAYOUT_TAG) );
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if ( 0 == xmlStrcmp(child_node->name, (const xmlChar *)INPUT_MODE_CONFIGURE_LAYOUT_PORTRAIT_TAG) ) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ cur_rec->layouts[DISPLAYMODE_PORTRAIT] = (sclchar*)temp;
+ } else if ( 0 == xmlStrcmp(child_node->name, (const xmlChar *)INPUT_MODE_CONFIGURE_LAYOUT_LANDSCAPE_TAG) ) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ cur_rec->layouts[DISPLAYMODE_LANDSCAPE] = (sclchar*)temp;
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ int m_inputmode_size;
+ SclInputModeConfigure m_input_mode_configure_table[MAX_SCL_INPUT_MODE];
+};
+
+InputModeConfigParser::InputModeConfigParser() {
+ m_impl = new InputModeConfigureParserImpl;
+}
+
+InputModeConfigParser::~InputModeConfigParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~InputModeConfigParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+InputModeConfigParser*
+InputModeConfigParser::get_instance() {
+ static InputModeConfigParser instance;
+ return &instance;
+}
+
+int
+InputModeConfigParser::init(const char* file) {
+ return m_impl->parsing_input_mode_configure_table(file);
+}
+
+int
+InputModeConfigParser::reload(const char* file) {
+ return m_impl->reload_input_mode_configure_table(file);
+}
+
+int
+InputModeConfigParser::get_inputmode_id(const char *name) {
+ if (name == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_inputmode_id failed");
+ return -1;
+ }
+
+ PSclInputModeConfigure config_table = get_input_mode_configure_table();
+
+ if (config_table == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_inputmode_id failed");
+ return -1;
+ }
+
+ for (int i = 0; i < get_inputmode_size(); ++i) {
+ if (config_table[i].name) {
+ if ( 0 == strcmp(config_table[i].name, name) ) {
+ return i;
+ }
+ }
+ }
+
+ SCLLOG(SclLog::DEBUG, "get_inputmode_id failed");
+ return -1;
+}
+
+const char*
+InputModeConfigParser::get_inputmode_name(int id) {
+ if (id >= 0 && id < MAX_SCL_INPUT_MODE) {
+ PSclInputModeConfigure config_table = get_input_mode_configure_table();
+ if (config_table) {
+ return config_table[id].name;
+ }
+ }
+
+ return NULL;
+}
+
+int
+InputModeConfigParser::get_inputmode_size() {
+ return m_impl->m_inputmode_size;
+}
+
+PSclInputModeConfigure
+InputModeConfigParser::get_input_mode_configure_table() {
+ return m_impl->m_input_mode_configure_table;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INPUT_MODE_PARSER__H__
+#define __INPUT_MODE_PARSER__H__
+#include "sclres_type.h"
+
+class InputModeConfigureParserImpl;
+
+class InputModeConfigParser {
+ InputModeConfigureParserImpl *m_impl;
+ public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclInputModeConfigure get_input_mode_configure_table();
+ int get_inputmode_id(const char *name);
+ const char* get_inputmode_name(int id);
+ int get_inputmode_size();
+ public:
+ ~InputModeConfigParser();
+ static InputModeConfigParser *get_instance();
+ private:
+ InputModeConfigParser();
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __IPARSERINFO_PROVIDER_H__
+#define __IPARSERINFO_PROVIDER_H__
+#include <string>
+
+/***
+* 1. How to get field width, take "input mode configure" for example
+ 1) set_current_metadata_record("input_mode_configure")
+ 2) get_width("name");
+ 2. How to get a string
+ 1) parsing the binary file to get the string_id
+ 2) use get_string_by_id(string_id);
+*/
+#include "istring_provider.h"
+class IParserInfo_Provider: public IString_Provider{
+ public:
+ virtual void set_current_metadata_record(const char* record_name) = 0;
+ virtual int get_width(const char* field_name) const = 0;
+ virtual const char* get_string_by_id(const int id) const = 0;
+ virtual ~IParserInfo_Provider() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INTERFACE_STRING_COLLECTOR_H__
+#define __INTERFACE_STRING_COLLECTOR_H__
+
+/*Use this interface to collect all the new strings*/
+class IStringCollector{
+ public:
+ virtual void add(char* str) = 0;
+ virtual ~IStringCollector() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ISTRING_PROVIDER_H__
+#define __ISTRING_PROVIDER_H__
+#include <string>
+
+class IString_Provider{
+ public:
+ virtual const char* get_string_by_id(const int id)const = 0;
+ virtual ~IString_Provider() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "key_coordinate_frame_bin_parser.h"
+#include "sclutils.h"
+
+#include "string_bin_parser.h"
+#include "metadata_bin_parser.h"
+#include "parserinfo_provider.h"
+#include "string_provider.h"
+#include "metadata_provider.h"
+#include <algorithm>
+#include "put_record.h"
+#include <malloc.h>
+#include "binary_xmlresource.h"
+#include "simple_debug.h"
+using namespace binary_xmlresource;
+
+using namespace std;
+using namespace scl;
+
+BinKeyCoordFrameParser::BinKeyCoordFrameParser() {
+ memset(m_key_coordinate_pointer_frame, 0x00, sizeof(SclLayoutKeyCoordinatePointer) * MAX_SCL_LAYOUT * MAX_KEY);
+ parser_info_provider = NULL;
+}
+BinKeyCoordFrameParser::~BinKeyCoordFrameParser() {
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ for (int j = 0; j < MAX_KEY; ++j) {
+ free(m_key_coordinate_pointer_frame[i][j]);
+ m_key_coordinate_pointer_frame[i][j] = NULL;
+ }
+ }
+}
+BinKeyCoordFrameParser* BinKeyCoordFrameParser::get_instance() {
+ static BinKeyCoordFrameParser instance;
+ return &instance;
+}
+
+void
+BinKeyCoordFrameParser::
+load(int layout_id)
+{
+ BinResource *bin_xmlres = BinResource::get_instance();
+
+ char path[_POSIX_PATH_MAX] = {0};
+
+ snprintf(path, _POSIX_PATH_MAX, "%s/%s", bin_xmlres->get_resource_directory(), "sclresource.bin");
+
+ FileStorage storage;
+ FileStorage alldata;
+ alldata.loadFile(path);
+
+ String_Bin_Parser stringBinParser(alldata, bin_xmlres->m_info[STRING].offset, bin_xmlres->m_info[STRING].size);
+ Metadata_Bin_Parser metadataBinParser(alldata, bin_xmlres->m_info[METADATA].offset, bin_xmlres->m_info[METADATA].size);
+
+ String_Provider stringProvider(&stringBinParser);
+ Metadata_Provider metadataProvider(&metadataBinParser);
+ ParserInfo_Provider provider(&metadataProvider, &stringProvider);
+ storage.set_str_provider(&provider);
+ this->parser_info_provider = &provider;
+ storage.get_storage(
+ alldata,
+ bin_xmlres->m_info[KEY_COORDINATE_FRAME].offset,
+ bin_xmlres->m_info[KEY_COORDINATE_FRAME].size);
+
+ // 4 byte (range[0-4,294,967,295))
+ const int DATA_SIZE_BYTES = 4;
+ // 1 byte (range[0-128))
+ const int REC_NUM_BYTES = 1;
+ const int KEY_NUM_BYTES = 1;
+ // 2 byte (range[0-65536))
+ const int KEY_COORDIANTE_REC_DATA_SIZE_BYTES = 2;
+
+ // skip data_size
+ storage.advance(DATA_SIZE_BYTES);
+
+ // rec_num
+ int layout_num = storage.get<uint_t>(REC_NUM_BYTES);
+ int *pKey_num_array = new int[layout_num];
+ memset(pKey_num_array, 0x00, layout_num * sizeof(int));
+ for (int i = 0; i < layout_num; ++i) {
+ pKey_num_array[i] = storage.get<uint_t>(KEY_NUM_BYTES);
+ }
+
+ // key_coordinate_rec_data_size
+ int key_coordinate_rec_data_size = storage.get<uint_t>(KEY_COORDIANTE_REC_DATA_SIZE_BYTES);
+ Key_coordinate_record_width record_width;
+ set_key_coordinate_record_width(parser_info_provider, record_width);
+
+ for (int i = 0; i < layout_num; ++i) {
+ if (layout_id == i) {
+ for (int j = 0; j < pKey_num_array[i]; ++j) {
+ SclLayoutKeyCoordinatePointer curPointer = (SclLayoutKeyCoordinatePointer)malloc(sizeof(SclLayoutKeyCoordinate));
+ if (curPointer == NULL) {
+ SCLLOG(SclLog::ERROR, "Memory malloc error.\n");
+ assert(0);
+ }
+ memset(curPointer, 0x00, sizeof(SclLayoutKeyCoordinate));
+ decode_key_coordinate_record(storage, curPointer, record_width);
+ m_key_coordinate_pointer_frame[i][j] = curPointer;
+ }
+ break;
+ } else {
+ storage.advance(pKey_num_array[i] * key_coordinate_rec_data_size);
+ }
+ }
+
+ delete []pKey_num_array;
+}
+
+bool
+BinKeyCoordFrameParser::
+loaded(int layout_id)
+{
+ bool ret = TRUE;
+ if (layout_id >= 0 && layout_id < MAX_SCL_LAYOUT) {
+ if (m_key_coordinate_pointer_frame[layout_id][0] == NULL) {
+ ret = FALSE;
+ }
+ }
+ return ret;
+}
+
+void
+BinKeyCoordFrameParser::
+unload()
+{
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ for (int j = 0; j < MAX_KEY; ++j) {
+ free(m_key_coordinate_pointer_frame[i][j]);
+ m_key_coordinate_pointer_frame[i][j] = NULL;
+ }
+ }
+}
+void
+BinKeyCoordFrameParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(parser_info_provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+}
+
+PSclLayoutKeyCoordinatePointerTable
+BinKeyCoordFrameParser::get_key_coordinate_pointer_frame() {
+ return m_key_coordinate_pointer_frame;
+}
+
+void
+BinKeyCoordFrameParser::decode_key_coordinate_record(FileStorage& storage, const PSclLayoutKeyCoordinate cur, const Key_coordinate_record_width& record_width) {
+ cur->valid = (sclboolean)true;
+ //x
+ cur->x = storage.get<sint_t>(record_width.x);
+ //y
+ cur->y = storage.get<sint_t>(record_width.y);
+
+ //width
+ cur->width = storage.get<sint_t>(record_width.width);
+ //height
+ cur->height = storage.get<sint_t>(record_width.height);
+
+ //add_hit_left
+ cur->add_hit_left = storage.get<sint_t>(record_width.add_hit_left);
+ //add_hit_right
+ cur->add_hit_right = storage.get<sint_t>(record_width.add_hit_right);
+ //add_hit_top
+ cur->add_hit_top = storage.get<sint_t>(record_width.add_hit_top);
+ //add_hit_bottom
+ cur->add_hit_bottom = storage.get<sint_t>(record_width.add_hit_bottom);
+ //popup_relative_x
+ cur->popup_relative_x = storage.get<sint_t>(record_width.popup_relative_x);
+ //popup_relative_y
+ cur->popup_relative_y = storage.get<sint_t>(record_width.popup_relative_y);
+ //extract_offset_x
+ cur->extract_offset_x = storage.get<sint_t>(record_width.extract_offset_x);
+ //extract_offset_y
+ cur->extract_offset_y = storage.get<sint_t>(record_width.extract_offset_y);
+
+ storage.get_str(&(cur->sub_layout), record_width.sub_layout, m_string_collector);
+
+ //magnifier_offset_x
+ cur->magnifier_offset_x = storage.get<sint_t>(record_width.magnifier_offset_x);
+ //magnifier_offset_y
+ cur->magnifier_offset_y = storage.get<sint_t>(record_width.magnifier_offset_y);
+
+ storage.get_str(&(cur->custom_id), record_width.custom_id, m_string_collector);
+
+ //button_type
+ cur->button_type = (SCLButtonType)storage.get<sint_t>(record_width.button_type);
+ //key_type
+ cur->key_type = (SCLKeyType)storage.get<sint_t>(record_width.key_type);
+ //popup_type
+ cur->popup_type = (SCLPopupType)storage.get<sint_t>(record_width.popup_type);
+
+ cur->use_magnifier = storage.get<sint_t>(record_width.use_magnifier);
+ cur->use_long_key_magnifier = storage.get<sint_t>(record_width.use_long_key_magnifier);
+
+ //popup_input_mode
+ for (int i = 0; i < SCL_DRAG_STATE_MAX; ++i) {
+ storage.get_str(&(cur->popup_input_mode[i]), record_width.popup_input_mode, m_string_collector);
+ }
+
+ storage.get_str(&(cur->sound_style), record_width.sound_style, m_string_collector);
+ storage.get_str(&(cur->vibe_style), record_width.vibe_style, m_string_collector);
+ cur->is_side_button = storage.get<sint_t>(record_width.is_side_button);
+
+ //label_count
+ cur->label_count = storage.get<sint_t>(record_width.label_count);
+
+ //label
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ storage.get_str(&(cur->label[i][j]), record_width.label, m_string_collector);
+ }
+ }
+
+ storage.get_str(&(cur->label_type), record_width.label_type, m_string_collector);
+
+ //label_image_path
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ storage.get_str(&(cur->image_label_path[i][j]), record_width.image_label_path, m_string_collector);
+ }
+ }
+
+ storage.get_str(&(cur->image_label_type), record_width.image_label_type, m_string_collector);
+
+ //bg_image_path
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ storage.get_str(&(cur->bg_image_path[i][j]), record_width.bg_image_path, m_string_collector);
+ }
+ }
+
+ //key_value_count
+ cur->key_value_count = storage.get<sint_t>(record_width.key_value_count);
+
+ //key_value
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ storage.get_str(&(cur->key_value[i][j]), record_width.key_value, m_string_collector);
+ }
+ }
+ //key_event
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ cur->key_event[i][j] = storage.get<sint_t>(record_width.key_event);
+ }
+ }
+
+ //long_key_type
+ cur->long_key_type = (SCLKeyType)storage.get<sint_t>(record_width.long_key_type);
+
+ //long_key_value
+ storage.get_str(&(cur->long_key_value), record_width.long_key_value, m_string_collector);
+
+ //long_key_event
+ cur->long_key_event = storage.get<sint_t>(record_width.long_key_event);
+
+ cur->use_repeat_key = storage.get<sint_t>(record_width.use_repeat_key);
+
+ //autopopup_keys
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_AUTOPOPUP_STRING; ++j) {
+ storage.get_str(&(cur->autopopup_key_labels[i][j]), record_width.autopopup_key_labels, m_string_collector);
+ storage.get_str(&(cur->autopopup_key_values[i][j]), record_width.autopopup_key_values, m_string_collector);
+ cur->autopopup_key_events[i][j] = storage.get<sint_t>(record_width.autopopup_key_events);
+ }
+ }
+
+ cur->dont_close_popup = storage.get<sint_t>(record_width.dont_close_popup);
+
+ //extra_option
+ cur->extra_option = storage.get<sint_t>(record_width.extra_option);
+
+ //multitouch_type
+ cur->multitouch_type = storage.get<sint_t>(record_width.multitouch_type);
+
+ // modifier_decorator
+ storage.get_str(&(cur->modifier_decorator), record_width.modifier_decorator, m_string_collector);
+
+ //magnifier_label
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ storage.get_str(&(cur->magnifier_label[i][j]), record_width.magnifier_label, m_string_collector);
+ }
+ }
+
+ // hint_string
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ storage.get_str(&(cur->hint_string[i][j]), record_width.hint_string, m_string_collector);
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __KEY_COORDINATE_FRAME_BIN_PARSER__H__
+#define __KEY_COORDINATE_FRAME_BIN_PARSER__H__
+#include "sclres_type.h"
+#include "iparserinfo_provider.h"
+#include <vector>
+#include "string_collector.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+class BinKeyCoordFrameParser {
+ public:
+ static BinKeyCoordFrameParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+ ~BinKeyCoordFrameParser();
+
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+ void load(int);
+ bool loaded(int);
+ void unload();
+ private:
+ BinKeyCoordFrameParser();
+ void parsing_key_coordinate_frame();
+ void decode_key_coordinate_record(FileStorage& storage, const PSclLayoutKeyCoordinate cur, const Key_coordinate_record_width&);
+
+ private:
+ SclLayoutKeyCoordinate* m_key_coordinate_pointer_frame[MAX_SCL_LAYOUT][MAX_KEY];
+
+ IParserInfo_Provider *parser_info_provider;
+ StringCollector m_string_collector;
+ FileStorage m_storage;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "label_properties_bin_parser.h"
+#include "simple_debug.h"
+#include "put_record.h"
+
+BinLabelPropertyParser::BinLabelPropertyParser() {
+ m_size = 0;
+ memset(m_label_properties_frame, 0, sizeof(SclLabelProperties) * MAX_SCL_LABEL_PROPERTIES * MAX_SIZE_OF_LABEL_FOR_ONE);
+ parser_info_provider = NULL;
+}
+
+BinLabelPropertyParser::~BinLabelPropertyParser() {
+ m_size = 0;
+}
+
+BinLabelPropertyParser* BinLabelPropertyParser::get_instance() {
+ static BinLabelPropertyParser instance;
+ return &instance;
+}
+void BinLabelPropertyParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(parser_info_provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+ parsing_label_properties_frame();
+}
+int
+BinLabelPropertyParser::get_size() {
+ return m_size;
+}
+
+//recompute_layout will change the table
+PSclLabelPropertiesTable BinLabelPropertyParser::get_label_properties_frame() {
+ return m_label_properties_frame;
+}
+
+void BinLabelPropertyParser::parsing_label_properties_frame() {
+ // skip data_size
+ m_storage.advance(8);
+
+ m_size = m_storage.get<sint_t>(4);
+ int maxj = m_storage.get<sint_t>(4);
+
+ if (parser_info_provider == NULL) {
+ SCLLOG(SclLog::ERROR, "Error parser_info_provider is NULL\n");
+ return;
+ }
+
+ Label_properties_record_width record_width;
+ set_label_properties_record_width(*parser_info_provider, record_width);
+ for (int i = 0; i < m_size; ++i) {
+ for (int j = 0; j < maxj; ++j) {
+ SclLabelProperties &cur = m_label_properties_frame[i][j];
+ decode_label_properties_record(&cur, record_width);
+ }
+ }
+#ifdef __SCL_TXT_DEBUG
+ put_label_properties_frame(DECODE, m_label_properties_frame);
+#endif
+}
+
+void
+BinLabelPropertyParser::decode_color(SclColor& color, int width) {
+ if (width <= 0) return;
+
+ color.r = m_storage.get<sint_t>(width);
+ color.g = m_storage.get<sint_t>(width);
+ color.b = m_storage.get<sint_t>(width);
+ color.a = m_storage.get<sint_t>(width);
+}
+void
+BinLabelPropertyParser::decode_label_properties_record(const PSclLabelProperties cur, const Label_properties_record_width& record_width) {
+ cur->valid = (sclboolean)true;
+
+ //label_name
+ m_storage.get_str(&(cur->label_type), record_width.label_type, m_string_collector);
+ //font_name
+ m_storage.get_str(&(cur->font_name), record_width.font_name, m_string_collector);
+
+ //font_size
+ cur->font_size = m_storage.get<sint_t>(record_width.font_size);
+ //font color
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ decode_color(cur->font_color[i][j], record_width.font_color);
+ }
+ }
+
+ //alignment
+ cur->alignment = (SCLLabelAlignment)m_storage.get<sint_t>(record_width.alignment);
+
+ //padding_x
+ cur->padding_x = m_storage.get<sint_t>(record_width.padding_x);
+
+ //padding_y
+ cur->padding_y = m_storage.get<sint_t>(record_width.padding_y);
+
+ //inner_width
+ cur->inner_width = m_storage.get<sint_t>(record_width.inner_width);
+
+ //inner_height
+ cur->inner_height = m_storage.get<sint_t>(record_width.inner_height);
+
+ //shadow_distance
+ cur->shadow_distance = m_storage.get<sint_t>(record_width.shadow_distance);
+
+ //shadow_direction
+ cur->shadow_direction = (SCLShadowDirection)m_storage.get<sint_t>(record_width.shadow_direction);
+
+ //shadow_color
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ decode_color(cur->shadow_color[i][j], record_width.shadow_color);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BinLabelPropertyParser__H__
+#define __BinLabelPropertyParser__H__
+#include "sclres_type.h"
+#include "iparserinfo_provider.h"
+#include <vector>
+#include "string_collector.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+
+class BinLabelPropertyParser {
+ public:
+ ~BinLabelPropertyParser();
+ static BinLabelPropertyParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+ PSclLabelPropertiesTable get_label_properties_frame();
+ int get_size();
+
+ private:
+ BinLabelPropertyParser();
+ void parsing_label_properties_frame();
+ void decode_label_properties_record(const PSclLabelProperties cur, const Label_properties_record_width&);
+
+ void decode_color(SclColor& color, int width);
+
+ private:
+ SclLabelProperties m_label_properties_frame[MAX_SCL_LABEL_PROPERTIES][MAX_SIZE_OF_LABEL_FOR_ONE];
+ int m_size;
+ IParserInfo_Provider *parser_info_provider;
+ FileStorage m_storage;
+ StringCollector m_string_collector;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <memory.h>
+#include <sstream>
+#include <libxml/parser.h>
+#include "label_properties_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+#include "put_record.h"
+
+using namespace std;
+
+static int
+match_alignment(const char* key) {
+ assert(key != NULL);
+
+ typedef struct _match_table_t {
+ int value;
+ const char* key;
+ }Match_table_t;
+ static Match_table_t table[] = {
+ {LABEL_ALIGN_LEFT_TOP, "left_top" },
+ {LABEL_ALIGN_CENTER_TOP, "center_top" },
+ {LABEL_ALIGN_RIGHT_TOP, "right_top" },
+
+ {LABEL_ALIGN_LEFT_MIDDLE, "left_middle" },
+ {LABEL_ALIGN_CENTER_MIDDLE, "center_middle" },
+ {LABEL_ALIGN_RIGHT_MIDDLE, "right_middle" },
+
+ {LABEL_ALIGN_LEFT_BOTTOM, "left_bottom" },
+ {LABEL_ALIGN_CENTER_BOTTOM, "center_bottom" },
+ {LABEL_ALIGN_RIGHT_BOTTOM, "right_bottom" }
+ };
+
+ int value = LABEL_ALIGN_LEFT_TOP;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Match_table_t); ++i) {
+ if (0 == strcmp(key, table[i].key))
+ {
+ value = table[i].value;
+ break;
+ }
+ }
+ return value;
+}
+static int
+match_shadow_direction(const char* key) {
+ assert(key != NULL);
+
+ typedef struct _match_table_t {
+ int value;
+ const char* key;
+ }Match_table_t;
+ static Match_table_t table[] = {
+ {SHADOW_DIRECTION_NONE, "shadow_direction_none"},
+
+ {SHADOW_DIRECTION_LEFT_TOP, "shadow_direction_left_top"},
+ {SHADOW_DIRECTION_CENTER_TOP, "shadow_direction_center_top"},
+ {SHADOW_DIRECTION_RIGHT_TOP, "shadow_direction_right_top"},
+
+ {SHADOW_DIRECTION_LEFT_MIDDLE, "shadow_direction_left_middle"},
+ {SHADOW_DIRECTION_CENTER_MIDDLE, "shadow_direction_center_middle"},
+ {SHADOW_DIRECTION_RIGHT_MIDDLE, "shadow_direction_right_middle"},
+
+ {SHADOW_DIRECTION_LEFT_BOTTOM, "shadow_direction_left_bottom"},
+ {SHADOW_DIRECTION_CENTER_BOTTOM, "shadow_direction_center_bottom"},
+ {SHADOW_DIRECTION_RIGHT_BOTTOM, "shadow_direction_right_bottom"}
+ };
+
+ int value = SHADOW_DIRECTION_NONE;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Match_table_t); ++i) {
+ if (0 == strcmp(key, table[i].key))
+ {
+ value = table[i].value;
+ break;
+ }
+ }
+ return value;
+}
+class LabelPropertiesParserImpl {
+ public:
+ LabelPropertiesParserImpl() {
+ m_size = 0;
+ memset(m_label_properties_frame, 0, sizeof(SclLabelProperties) * MAX_SCL_LABEL_PROPERTIES * MAX_SIZE_OF_LABEL_FOR_ONE);
+ }
+
+ ~LabelPropertiesParserImpl() {
+ reset();
+ }
+
+ void reset()
+ {
+ for (int i = 0; i < MAX_SCL_LABEL_PROPERTIES && i < m_size; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ if (m_label_properties_frame[i][j].font_name)
+ xmlFree(m_label_properties_frame[i][j].font_name);
+ m_label_properties_frame[i][j].font_name = NULL;
+ if (m_label_properties_frame[i][j].label_type)
+ xmlFree(m_label_properties_frame[i][j].label_type);
+ m_label_properties_frame[i][j].label_type = NULL;
+ }
+ }
+ m_size = 0;
+ memset(m_label_properties_frame, 0, sizeof(SclLabelProperties) * MAX_SCL_LABEL_PROPERTIES * MAX_SIZE_OF_LABEL_FOR_ONE);
+ }
+
+ int reload_label_properties_frame(const char* input_file) {
+ reset();
+ return parsing_label_properties_frame(input_file);
+ }
+
+ int parsing_label_properties_frame(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "Label_Properties_Parser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"label_properties_frame"))
+ {
+ SCLLOG(SclLog::DEBUG, "Label_Properties_Parser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+ assert(m_size == 0);
+ PSclLabelPropertiesTable curTable = m_label_properties_frame;
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"label_properties_table")) {
+ parsing_label_properties_table(cur_node, curTable);
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)"label_type");
+ PSclLabelProperties cur_rec = (PSclLabelProperties)curTable;
+ cur_rec->label_type = (sclchar *)key;
+ m_size++;
+ curTable++;
+ if (m_size >= MAX_SCL_LABEL_PROPERTIES) {
+ SCLLOG(SclLog::ERROR, "No Space for label properties record.");
+ break;
+ }
+ }
+
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+ void parsing_label_properties_table(const xmlNodePtr cur_node, const PSclLabelPropertiesTable curTable) {
+ assert(cur_node != NULL);
+ assert(curTable != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ PSclLabelProperties cur_rec = (PSclLabelProperties)curTable;
+ while (NULL != child_node) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"label_properties")) {
+ parsing_label_properties_record(child_node, cur_rec);
+ cur_rec++;
+ }
+
+ child_node = child_node->next;
+ }
+ }
+ void parsing_label_properties_record(const xmlNodePtr cur_node, const PSclLabelProperties cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+
+ set_label_properties_default_record(cur_rec);
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)"font_name");
+ if (NULL != key) {
+ cur_rec->font_name = (sclchar*)key;
+ }
+
+ get_prop_number(cur_node, "font_size", &(cur_rec->font_size));
+
+ key = xmlGetProp(cur_node, (const xmlChar*)"label_alignment");
+ if (NULL != key) {
+ cur_rec->alignment = (SCLLabelAlignment)match_alignment((const char*)key);
+ xmlFree(key);
+ }
+
+ get_prop_number(cur_node, "padding_X", &(cur_rec->padding_x));
+ get_prop_number(cur_node, "padding_Y", &(cur_rec->padding_y));
+ get_prop_number(cur_node, "inner_width", &(cur_rec->inner_width));
+ get_prop_number(cur_node, "inner_height", &(cur_rec->inner_height));
+
+ get_prop_number(cur_node, "shadow_distance", &(cur_rec->shadow_distance));
+ key = xmlGetProp(cur_node, (const xmlChar*)"shadow_direction");
+ if (NULL != key) {
+ cur_rec->shadow_direction = (SCLShadowDirection)match_shadow_direction((const char*)key);
+ xmlFree(key);
+ }
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"font_color_record")) {
+ parsing_font_color_record(child_node, cur_rec);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"shadow_color_record")) {
+ parsing_shadow_color_record(child_node, cur_rec);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+
+ void set_label_properties_default_record(const PSclLabelProperties cur_rec) {
+ cur_rec->valid = true;
+ cur_rec->font_name = NULL;
+ cur_rec->font_size = 0;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; ++shift_state) {
+ for (int button_state = 0; button_state < SCL_BUTTON_STATE_MAX; ++button_state) {
+ cur_rec->font_color[shift_state][button_state].r = 0;
+ cur_rec->font_color[shift_state][button_state].g = 0;
+ cur_rec->font_color[shift_state][button_state].b = 0;
+ }
+ }
+
+ cur_rec->alignment = LABEL_ALIGN_LEFT_TOP;
+ cur_rec->padding_x = 0;
+ cur_rec->padding_y = 0;
+ cur_rec->inner_width = 0;
+ cur_rec->inner_height = 0;
+ cur_rec->shadow_distance = 0;
+
+ cur_rec->shadow_direction = SHADOW_DIRECTION_NONE;
+
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; ++shift_state) {
+ for (int button_state = 0; button_state < SCL_BUTTON_STATE_MAX; ++button_state) {
+ cur_rec->shadow_color[shift_state][button_state].r = 0;
+ cur_rec->shadow_color[shift_state][button_state].g = 0;
+ cur_rec->shadow_color[shift_state][button_state].b = 0;
+ }
+ }
+ }
+
+ void parsing_font_color_record(const xmlNodePtr cur_node, const PSclLabelProperties cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"font_color_record"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"color")) {
+ SclColor font_color = {0x00, 0x00, 0x00, 0xFF};
+ parsing_rgb(child_node, font_color);
+
+ int shift_state = get_shift_state_prop(child_node);
+ int button_state = get_button_state_prop(child_node);
+
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ for (int button_loop = 0;button_loop < SCL_BUTTON_STATE_MAX;button_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1) &&
+ (button_state == button_loop || button_state == -1)) {
+ cur_rec->font_color[shift_loop][button_loop] = font_color;
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_shadow_color_record(const xmlNodePtr cur_node, const PSclLabelProperties cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"shadow_color_record"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"color")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int button_state = get_button_state_prop(child_node);
+ if (shift_state != -1 && button_state != -1) {
+ parsing_rgb(child_node, cur_rec->shadow_color[shift_state][button_state]);
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void parsing_rgb(const xmlNodePtr cur_node, SclColor& cur_color) {
+ assert(cur_node != NULL);
+
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"color"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ if (child_node) {
+ /* FIXME : A hardcoded routine for parsing 0xRRGGBBAA style string */
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ if (xmlStrlen(key) == 10) {
+ int r, g, b, a;
+ r = g = b = 0;
+ a = 0xff;
+
+ char temp_string[5] = {"0xFF"};
+
+ temp_string[2] = key[2];
+ temp_string[3] = key[3];
+ stringstream convertor_r(temp_string);
+ convertor_r >> hex >> r;
+ if (convertor_r.fail() == true) {
+ SCLLOG(SclLog::ERROR, "parsing_rgb() [r] has failed.");
+ r = 0;
+ }
+
+ temp_string[2] = key[4];
+ temp_string[3] = key[5];
+ stringstream convertor_g(temp_string);
+ convertor_g >> hex >> g;
+ if (convertor_g.fail() == true) {
+ SCLLOG(SclLog::ERROR, "parsing_rgb() [g] has failed.");
+ g = 0;
+ }
+
+ temp_string[2] = key[6];
+ temp_string[3] = key[7];
+ stringstream convertor_b(temp_string);
+ convertor_b >> hex >> b;
+ if (convertor_b.fail() == true) {
+ SCLLOG(SclLog::ERROR, "parsing_rgb() [b] has failed.");
+ b = 0;
+ }
+
+ temp_string[2] = key[8];
+ temp_string[3] = key[9];
+ stringstream convertor_a(temp_string);
+ convertor_a >> hex >> a;
+ if (convertor_a.fail() == true) {
+ SCLLOG(SclLog::ERROR, "parsing_rgb() [a] has failed.");
+ a = 0;
+ }
+
+ cur_color.r = r;
+ cur_color.g = g;
+ cur_color.b = b;
+ cur_color.a = a;
+ }
+ }
+ xmlFree(key);
+ }
+ }
+
+ int get_shift_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ int shift_state = -1;
+
+ if (equal_prop(cur_node, "shift", "on")) {
+ shift_state = SCL_SHIFT_STATE_ON;
+ } else if (equal_prop(cur_node, "shift", "off")) {
+ shift_state = SCL_SHIFT_STATE_OFF;
+
+ } else if (equal_prop(cur_node, "shift", "loc")) {
+ shift_state = SCL_SHIFT_STATE_LOCK;
+ }
+ return shift_state;
+ }
+
+ int get_button_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ int button_state = -1;
+
+ if (equal_prop(cur_node, "button", "pressed")) {
+ button_state = BUTTON_STATE_PRESSED;
+ } else if (equal_prop(cur_node, "button", "normal")) {
+ button_state = BUTTON_STATE_NORMAL;
+ } else if (equal_prop(cur_node, "button", "disabled")) {
+ button_state = BUTTON_STATE_DISABLED;
+ } else if (equal_prop(cur_node, "button", "toggled")) {
+ button_state = BUTTON_STATE_TOGGLED;
+ }
+ return button_state;
+ }
+
+ SclLabelProperties m_label_properties_frame[MAX_SCL_LABEL_PROPERTIES][MAX_SIZE_OF_LABEL_FOR_ONE];
+ int m_size;
+};
+
+LabelPropertyParser::LabelPropertyParser() {
+ m_impl = new LabelPropertiesParserImpl;
+}
+
+LabelPropertyParser::~LabelPropertyParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~LabelPropertyParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+LabelPropertyParser*
+LabelPropertyParser::get_instance() {
+ static LabelPropertyParser instance;
+ return &instance;
+}
+
+int
+LabelPropertyParser::init(const char* file) {
+ return m_impl->parsing_label_properties_frame(file);
+}
+
+int
+LabelPropertyParser::reload(const char* file) {
+ return m_impl->reload_label_properties_frame(file);
+}
+
+int
+LabelPropertyParser::get_size() {
+ return m_impl->m_size;
+}
+
+//recompute_layout will change the table
+PSclLabelPropertiesTable
+LabelPropertyParser::get_label_properties_frame() {
+ return m_impl->m_label_properties_frame;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __LabelPropertyParser__H__
+#define __LabelPropertyParser__H__
+#include "sclres_type.h"
+class LabelPropertiesParserImpl;
+
+class LabelPropertyParser {
+ LabelPropertiesParserImpl *m_impl;
+ public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclLabelPropertiesTable get_label_properties_frame();
+ int get_size();
+ public:
+ ~LabelPropertyParser();
+ static LabelPropertyParser *get_instance();
+ private:
+ LabelPropertyParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "layout_bin_parser.h"
+#include "default_configure_bin_parser.h"
+#include "key_coordinate_frame_bin_parser.h"
+#include "sclutils.h"
+
+#include "put_record.h"
+#include <algorithm>
+using namespace std;
+using namespace scl;
+
+BinLayoutParser::
+BinLayoutParser() {
+ m_layout_size = 0;
+ memset(m_layout_table, 0x00, sizeof(SclLayout) * MAX_SCL_LAYOUT);
+ parser_info_provider = NULL;
+}
+BinLayoutParser::
+~BinLayoutParser() {
+}
+BinLayoutParser* BinLayoutParser::
+get_instance() {
+ static BinLayoutParser instance;
+ return &instance;
+}
+void BinLayoutParser::
+init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+ parsing_layout_table();
+}
+
+int BinLayoutParser::
+get_layout_index(const char *name) {
+ int ret = NOT_USED;
+ if (name) {
+ for (int loop = 0;loop < MAX_SCL_LAYOUT && ret == NOT_USED;loop++) {
+ if (m_layout_table[loop].name) {
+ if (strcmp(m_layout_table[loop].name, name) == 0) {
+ ret = loop;
+ break;
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+PSclLayout BinLayoutParser::
+get_layout_table() {
+ return m_layout_table;
+}
+int BinLayoutParser::
+get_layout_size() {
+ return m_layout_size;
+}
+
+
+PSclLayoutKeyCoordinatePointerTable BinLayoutParser::
+get_key_coordinate_pointer_frame() {
+ BinKeyCoordFrameParser *key_coordinate_frame_bin_parser = BinKeyCoordFrameParser::get_instance();
+ return key_coordinate_frame_bin_parser->get_key_coordinate_pointer_frame();
+}
+
+void BinLayoutParser::
+parsing_layout_table() {
+ // 4 byte (range[0-4,294,967,295))
+ const int DATA_SIZE_BYTES = 4;
+ // 1 byte (range[0-128))
+ const int REC_NUM_BYTES = 1;
+ // 2 byte (range[0-65536))
+ const int LAYOUT_REC_DATA_SIZE_BYTES = 2;
+
+ /*open binary file*/
+ Layout_width record_width;
+ set_layout_width(*parser_info_provider, record_width);
+
+ // skip data size
+ m_storage.advance(DATA_SIZE_BYTES);
+
+ // rec_num
+ m_layout_size = m_storage.get<sint_t>(REC_NUM_BYTES);
+
+ // layout_rec_data_size
+ m_storage.advance(LAYOUT_REC_DATA_SIZE_BYTES);
+
+ for (int i = 0; i < m_layout_size; ++i) {
+ SclLayout& cur = m_layout_table[i];
+ decode_layout_record(cur, record_width);
+ }
+#ifdef __SCL_TXT_DEBUG
+ put_layout_table(DECODE, m_layout_table);
+#endif
+}
+
+void
+BinLayoutParser::
+decode_color(SclColor& color, int width) {
+ if (width <= 0) return;
+
+ color.r = m_storage.get<sint_t>(width);
+ color.g = m_storage.get<sint_t>(width);
+ color.b = m_storage.get<sint_t>(width);
+ color.a = m_storage.get<sint_t>(width);
+}
+void BinLayoutParser::
+decode_layout_record(SclLayout& cur, const Layout_width& record_width) {
+ //name
+ m_storage.get_str(&(cur.name), record_width.name, m_string_collector);
+ //display mode
+ cur.display_mode = (SCLDisplayMode)m_storage.get<sint_t>(record_width.display_mode);
+ //style
+ cur.style = (SCLLayoutStyle)m_storage.get<sint_t>(record_width.style);
+ //width
+ cur.width = m_storage.get<sint_t>(record_width.width);
+ //height
+ cur.height = m_storage.get<sint_t>(record_width.height);
+ //use_sw_button
+ cur.use_sw_button = m_storage.get<sint_t>(record_width.use_sw_button);
+
+ //use_magnifier_window
+ cur.use_magnifier_window = m_storage.get<sint_t>(record_width.use_magnifier_window);
+
+ //extract_background
+ cur.extract_background = m_storage.get<sint_t>(record_width.extract_background);
+
+ //key_width
+ cur.key_width = m_storage.get<sint_t>(record_width.key_width);
+ //key_height
+ cur.key_height = m_storage.get<sint_t>(record_width.key_height);
+ //key_spacing
+ cur.key_spacing = m_storage.get<sint_t>(record_width.key_spacing);
+ //row_spacing
+ cur.row_spacing = m_storage.get<sint_t>(record_width.row_spacing);
+ //use_sw_background
+ cur.use_sw_background = m_storage.get<sint_t>(record_width.use_sw_background);
+
+ decode_color(cur.bg_color, record_width.bg_color);
+ //bg_line_width
+ cur.bg_line_width = m_storage.get<float_t>(record_width.bg_line_width);
+
+ decode_color(cur.bg_line_color, record_width.bg_line_color);
+
+ //add_grab_left
+ cur.add_grab_left = m_storage.get<sint_t>(record_width.add_grab_left);
+
+ //add_grab_right
+ cur.add_grab_right = m_storage.get<sint_t>(record_width.add_grab_right);
+ //add_grab_top
+ cur.add_grab_top = m_storage.get<sint_t>(record_width.add_grab_top);
+ //add_grab_bottom
+ cur.add_grab_bottom = m_storage.get<sint_t>(record_width.add_grab_bottom);
+ //image_path
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ m_storage.get_str(&(cur.image_path[i]), record_width.image_path, m_string_collector);
+ }
+
+ //key_background_image
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ m_storage.get_str(&(cur.key_background_image[i][j]), record_width.key_background_image, m_string_collector);
+ }
+ }
+
+ //sound_style
+ m_storage.get_str(&(cur.sound_style), record_width.sound_style, m_string_collector);
+
+ //vibe_style
+ m_storage.get_str(&(cur.vibe_style), record_width.vibe_style, m_string_collector);
+
+ //label_type
+ m_storage.get_str(&(cur.label_type), record_width.label_type, m_string_collector);
+
+ //modifier_decorator
+ m_storage.get_str(&(cur.modifier_decorator), record_width.modifier_decorator, m_string_collector);
+}
+
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __LAYOUT_BIN_PARSER__H__
+#define __LAYOUT_BIN_PARSER__H__
+#include "sclres_type.h"
+#include "iparserinfo_provider.h"
+#include <vector>
+#include "string_collector.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+class BinLayoutParser {
+ public:
+ static BinLayoutParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+
+ int get_layout_index(const char *name);
+ int get_layout_size();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+
+ ~BinLayoutParser();
+ private:
+ BinLayoutParser();
+ void parsing_layout_table();
+ void decode_layout_record(SclLayout& cur, const Layout_width&);
+ void decode_color(SclColor&, int width);
+
+ private:
+ int m_layout_size;
+ SclLayout m_layout_table[MAX_SCL_LAYOUT];
+
+ FileStorage m_storage;
+ IParserInfo_Provider *parser_info_provider;
+ StringCollector m_string_collector;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <algorithm>
+#include <vector>
+#include <malloc.h>
+#include <string.h>
+#include <libxml/parser.h>
+#include <glib.h>
+
+#include "scldebug.h"
+#include "layout_parser.h"
+#include "default_configure_parser.h" /* use data in default_configure.xml */
+#include "xml_parser_utils.h"
+#include "layout_parser_helper.h"
+#include "put_record.h"
+#include "simple_debug.h"
+#include <dlog.h>
+
+using namespace std;
+
+#define LAYOUT_TAG "layout"
+#define LAYOUT_NAME_ATTRIBUTE "name"
+#define LAYOUT_DIRECTION_ATTRIBUTE "direction"
+#define LAYOUT_DIRECTION_ATTRIBUTE_PORTRAIT_VALUE "portrait"
+#define LAYOUT_DIRECTION_ATTRIBUTE_LANDSCAPE_VALUE "landscape"
+#define LAYOUT_STYLE_ATTRIBUTE "style"
+#define LAYOUT_STYLE_ATTRIBUTE_BASE_VALUE "base"
+#define LAYOUT_STYLE_ATTRIBUTE_POPUP_VALUE "popup"
+#define LAYOUT_STYLE_ATTRIBUTE_POPUP_GRAB_VALUE "popup_grab"
+#define LAYOUT_WIDTH_ATTRIBUTE "width"
+#define LAYOUT_HEIGHT_ATTRIBUTE "height"
+#define LAYOUT_MAGNIFIER_ATTRIBUTE "magnifier"
+#define LAYOUT_PART_BACKGROUND_ATTRIBUTE "part_background"
+#define LAYOUT_SW_BUTTON_ATTRIBUTE "sw_button"
+#define LAYOUT_SW_BACKGROUND_ATTRIBUTE "sw_background"
+#define LAYOUT_KEY_WIDTH_ATTRIBUTE "key_width"
+#define LAYOUT_KEY_HEIGHT_ATTRIBUTE "key_height"
+#define LAYOUT_KEY_SPACING_ATTRIBUTE "key_spacing"
+#define LAYOUT_ROW_SPACING_ATTRIBUTE "row_spacing"
+#define LAYOUT_KEY_ADD_HIT_LEFT_ATTRIBUTE "hit_left"
+#define LAYOUT_KEY_ADD_HIT_RIGHT_ATTRIBUTE "hit_right"
+#define LAYOUT_KEY_ADD_HIT_TOP_ATTRIBUTE "hit_top"
+#define LAYOUT_KEY_ADD_HIT_BOTTOM_ATTRIBUTE "hit_bottom"
+#define LAYOUT_VIBE_STYLE_ATTRIBUTE "vibe_style"
+#define LAYOUT_SOUND_STYLE_ATTRIBUTE "sound_style"
+#define LAYOUT_LABEL_TYPE_ATTRIBUTE "label_type"
+#define LAYOUT_MODIFIER_DECORATION_ATTRIBUTE "modifier_decoration"
+
+#define LAYOUT_ADD_GRAB_TAG "grab_area"
+#define LAYOUT_ADD_GRAB_LEFT_TAG "left"
+#define LAYOUT_ADD_GRAB_RIGHT_TAG "right"
+#define LAYOUT_ADD_GRAB_TOP_TAG "top"
+#define LAYOUT_ADD_GRAB_BOTTOM_TAG "bottom"
+
+#define LAYOUT_KEY_BACKGROUND_REC_TAG "rec"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE "button"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_NORMAL_VALUE "normal"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_PRESSED_VALUE "pressed"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_DISABLED_VALUE "disabled"
+
+#define LAYOUT_KEY_BACKGROUND_TAG "background_image"
+#define LAYOUT_KEY_BACKGROUND_REC_TAG "rec"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE "button"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_NORMAL_VALUE "normal"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_PRESSED_VALUE "pressed"
+#define LAYOUT_KEY_BACKGROUND_REC_BUTTON_ATTRIBUTE_DISABLED_VALUE "disabled"
+
+#define LAYOUT_BACKGROUND_TAG "image_path"
+#define LAYOUT_BACKGROUND_NORMAL_TAG "button_normal"
+#define LAYOUT_BACKGROUND_PRESSED_TAG "button_pressed"
+#define LAYOUT_BACKGROUND_DISABLED_TAG "button_disabled"
+#define LAYOUT_BACKGROUND_TOGGLED_TAG "button_toggled"
+
+#define LAYOUT_SW_BACKGROUND_TAG "background_color"
+
+#define LAYOUT_ROW_TAG "row"
+#define LAYOUT_ROW_SUBLAYOUT_ID_ATTRIBUTE "sub_layout"
+#define LAYOUT_ROW_X_ATTRIBUTE "x"
+#define LAYOUT_ROW_Y_ATTRIBUTE "y"
+#define LAYOUT_ROW_KEY_WIDTH_ATTRIBUTE LAYOUT_KEY_WIDTH_ATTRIBUTE
+#define LAYOUT_ROW_KEY_HEIGHT_ATTRIBUTE LAYOUT_KEY_HEIGHT_ATTRIBUTE
+#define LAYOUT_ROW_KEY_SPACING_ATTRIBUTE LAYOUT_KEY_SPACING_ATTRIBUTE
+
+#define LAYOUT_ROW_KEY_TAG "key"
+#define LAYOUT_ROW_KEY_CUSTOMID_ATTRIBUTE "custom_id"
+#define LAYOUT_ROW_KEY_BUTTON_TYPE_ATTRIBUTE "button_type"
+#define LAYOUT_ROW_KEY_KEY_TYPE_ATTRIBUTE "key_type"
+#define LAYOUT_ROW_KEY_POPUP_TYPE_ATTRIBUTE "popup_type"
+#define LAYOUT_ROW_KEY_MAGNIFIER_ATTRIBUTE "use_magnifier"
+#define LAYOUT_ROW_KEY_LONGKEY_MAGNIFIER_ATTRIBUTE "longkey_magnifier"
+#define LAYOUT_ROW_KEY_VIBE_STYLE_ATTRIBUTE LAYOUT_VIBE_STYLE_ATTRIBUTE
+#define LAYOUT_ROW_KEY_SOUND_STYLE_ATTRIBUTE LAYOUT_SOUND_STYLE_ATTRIBUTE
+#define LAYOUT_ROW_KEY_SIDE_BUTTON_ATTRIBUTE "is_side_button"
+
+#define LAYOUT_ROW_KEY_X_ATTRIBUTE "x"
+#define LAYOUT_ROW_KEY_Y_ATTRIBUTE "y"
+#define LAYOUT_ROW_KEY_KEY_WIDTH_ATTRIBUTE "width"
+#define LAYOUT_ROW_KEY_KEY_HEIGHT_ATTRIBUTE "height"
+#define LAYOUT_ROW_KEY_ADD_HIT_LEFT_ATTRIBUTE "hit_left"
+#define LAYOUT_ROW_KEY_ADD_HIT_RIGHT_ATTRIBUTE "hit_right"
+#define LAYOUT_ROW_KEY_ADD_HIT_TOP_ATTRIBUTE "hit_top"
+#define LAYOUT_ROW_KEY_ADD_HIT_BOTTOM_ATTRIBUTE "hit_bottom"
+#define LAYOUT_ROW_KEY_POPUP_POS_X_ATTRIBUTE "popup_offset_x"
+#define LAYOUT_ROW_KEY_POPUP_POS_Y_ATTRIBUTE "popup_offset_y"
+#define LAYOUT_ROW_KEY_POPUP_IMAGE_X_ATTRIBUTE "popup_image_x"
+#define LAYOUT_ROW_KEY_POPUP_IMAGE_Y_ATTRIBUTE "popup_image_y"
+#define LAYOUT_ROW_KEY_SUBLAYOUT_ID_ATTRIBUTE "sub_layout"
+
+#define LAYOUT_ROW_KEY_LABEL_TYPE_ATTRIBUTE "label_type"
+#define LAYOUT_ROW_KEY_IMAGE_LABEL_TYPE_ATTRIBUTE "image_label_type"
+#define LAYOUT_ROW_KEY_LONGKEY_TYPE_ATTRIBUTE "long_key_type"
+#define LAYOUT_ROW_KEY_LONGKEY_VALUE_ATTRIBUTE "long_key_value"
+#define LAYOUT_ROW_KEY_LONGKEY_EVENT_ATTRIBUTE "long_key_event"
+#define LAYOUT_ROW_KEY_USE_REPEAT_KEY_ATTRIBUTE "use_repeat_key"
+#define LAYOUT_ROW_KEY_DONOT_CLOSE_POPUP_ATTRIBUTE "donot_close_popup"
+#define LAYOUT_ROW_KEY_EXTRA_OPTION_ATTRIBUTE "extra_option"
+#define LAYOUT_ROW_KEY_MULTITOUCH_TYPE_ATTRIBUTE "multitouch_type"
+#define LAYOUT_ROW_KEY_MODIFIER_DECORATION_ID_ATTRIBUTE "modifier_decoration_id"
+
+#define LAYOUT_ROW_KEY_KEY_SPACING_ATTRIBUTE "key_spacing"
+
+#define LAYOUT_ROW_KEY_LABEL_TAG "label"
+#define LAYOUT_ROW_KEY_IMAGE_LABEL_TAG "image_label"
+#define LAYOUT_ROW_KEY_BACKGROUND_IMAGE_TAG "background_image"
+#define LAYOUT_ROW_KEY_KEY_VALUE_TAG "key_value"
+#define LAYOUT_ROW_KEY_KEY_EVENT_TAG "key_event"
+
+#define LAYOUT_ROW_KEY_POPUP_INPUTMODE_RECORD_TAG "popup_input_mode_record"
+#define LAYOUT_ROW_KEY_POPUP_INPUTMODE_RECORD_INPUTMODE_TAG "popup_input_mode"
+
+#define LAYOUT_ROW_KEY_AUTOPOPUP_KEYS_TAG "auto_popup_keys"
+#define LAYOUT_ROW_KEY_AUTOPOPUP_KEYS_SHIFTMODE_ATTRIBUTE "shift_state"
+#define LAYOUT_ROW_KEY_MAGNIFIER_LABEL_TAG "magnifier_label"
+
+#define LAYOUT_ROW_KEY_HINT_STRING_TAG "hint_string"
+
+#define LAYOUT_SUB_LAYOUT_DEFAULT_STRING "DEFAULT"
+
+class LayoutParserImpl {
+ public:
+ typedef struct {
+ int row_x;
+ int row_y;
+
+ sclshort key_width;
+ sclshort key_height;
+ sclshort key_spacing;
+ sclshort row_spacing;
+
+ sclshort add_hit_left;
+ sclshort add_hit_right;
+ sclshort add_hit_top;
+ sclshort add_hit_bottom;
+
+ sclchar *sub_layout;
+ sclchar *vibe_style;
+ sclchar *sound_style;
+ sclchar *label_type;
+ sclchar *bg_image_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ } Row;
+ LayoutParserImpl();
+ ~LayoutParserImpl();
+
+ void reset();
+
+ void load(int layout_id);
+ void unload();
+ bool loaded(int layout_id);
+ void set_directory(const string &dir);
+ int get_layout_index(const char *name);
+ int get_layout_size();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+ int get_drag_state_prop(const xmlNodePtr cur_node);
+ int get_shift_state_prop(const xmlNodePtr cur_node);
+ int get_button_state_prop(const xmlNodePtr cur_node);
+ int get_multitouch_type_prop(const xmlNodePtr cur_node);
+ int get_extra_option_prop(const xmlNodePtr cur_node);
+
+ int parsing_layout_table(const vector<string> &layout_file_name);
+ int reload_layout_table(const vector<string> &layout_file_name);
+
+ void parsing_layout_node(const xmlNodePtr cur_node, const PSclLayout cur_rec_layout, int layout_no);
+ void loading_coordinate_resources(const xmlNodePtr cur_node, const PSclLayout cur_rec_layout, int layout_no);
+ void parsing_background(const xmlNodePtr cur_node, const PSclLayout);
+ void parsing_key_background(const xmlNodePtr cur_node, const PSclLayout);
+ void parsing_grab_area(const xmlNodePtr cur_node, const PSclLayout cur_rec_layout);
+ void parsing_sw_background_color(const xmlNodePtr cur_node, const PSclLayout);
+
+ void set_default_layout_value(const PSclLayout);
+ void set_default_row_value(Row*, const PSclLayout cur_rec_layout, const int row_y);
+ void set_default_key_coordinate_value(const PSclLayoutKeyCoordinate cur_rec_coordinate, const Row*);
+
+ void parsing_layout_row_node(const xmlNodePtr cur_node, const PSclLayout cur_rec_layout,
+ int *row_y, int *sub_layout_height, SclLayoutKeyCoordinatePointer **cur_key, int layout_no);
+ void parsing_key_coordinate_record_node(const xmlNodePtr cur_node, Row* row,
+ SclLayoutKeyCoordinatePointer *cur_key, int layout_no);
+
+ void parsing_label_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_label_image_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_background_image_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_popup_input_mode_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_key_value_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_key_event_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_auto_popup_keys_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_magnifier_label_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+ void parsing_hint_string_record_node(const xmlNodePtr cur_node, const PSclLayoutKeyCoordinate cur_rec);
+
+ void add_layout_string(xmlChar*);
+ void release_layout_strings();
+
+ void add_key_string(xmlChar*);
+ void release_key_strings();
+
+ void add_upper_string(gchar*);
+ void release_upper_strings();
+
+ private:
+ int m_layout_size;
+ int m_num_keys[MAX_SCL_LAYOUT];
+ SclLayout m_layout_table[MAX_SCL_LAYOUT];
+ vector<string> m_file_names;
+ SclLayoutKeyCoordinate* m_key_coordinate_pointer_frame[MAX_SCL_LAYOUT][MAX_KEY];
+
+ std::vector<xmlChar*> m_vec_layout_strings;
+ std::vector<xmlChar*> m_vec_key_strings;
+ std::vector<gchar*> m_vec_upper_strings;
+ std::string m_dir;
+};
+
+
+LayoutParserImpl::LayoutParserImpl() {
+ m_layout_size = 0;
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ m_num_keys[i] = 0;
+ }
+ memset(m_layout_table, 0x00, sizeof(SclLayout) * MAX_SCL_LAYOUT);
+ memset(m_key_coordinate_pointer_frame, 0x00, sizeof(SclLayoutKeyCoordinatePointer) * MAX_SCL_LAYOUT * MAX_KEY);
+}
+
+LayoutParserImpl::~LayoutParserImpl() {
+ reset();
+}
+
+void LayoutParserImpl::reset() {
+ m_layout_size = 0;
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ m_num_keys[i] = 0;
+ for (int j = 0; j < MAX_KEY; ++j) {
+ free(m_key_coordinate_pointer_frame[i][j]);
+ m_key_coordinate_pointer_frame[i][j] = NULL;
+ }
+ }
+
+ memset(m_layout_table, 0x00, sizeof(SclLayout) * MAX_SCL_LAYOUT);
+ memset(m_key_coordinate_pointer_frame, 0x00, sizeof(SclLayoutKeyCoordinatePointer) * MAX_SCL_LAYOUT * MAX_KEY);
+
+ release_layout_strings();
+ release_key_strings();
+ release_upper_strings();
+}
+
+void
+LayoutParserImpl::load(int layout_id) {
+ if (layout_id >= 0 && layout_id < MAX_SCL_LAYOUT) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ string input_file = m_dir + "/" + m_file_names[layout_id];
+ doc = xmlReadFile(input_file.c_str(), NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::ERROR, "Could not load file: %s.", input_file.c_str());
+ LOGE("Could not load file: %s.", input_file.c_str());
+ return;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::ERROR, "LayoutParserImpl: empty document.\n");
+ LOGE("LayoutParserImpl: empty document.");
+ xmlFreeDoc(doc);
+ return;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)LAYOUT_TAG))
+ {
+ SCLLOG(SclLog::ERROR, "LayoutParserImpl: root name error: %s\n!", (char *)cur_node->name);
+ LOGE("LayoutParserImpl: root name error: %s!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return;
+ }
+
+ PSclLayout cur_rec_layout = m_layout_table + layout_id;
+
+ cur_rec_layout->name = (sclchar*)m_file_names[layout_id].c_str();
+
+ parsing_layout_node(cur_node, cur_rec_layout, layout_id);
+ loading_coordinate_resources(cur_node, cur_rec_layout, layout_id);
+
+ xmlFreeDoc(doc);
+ }
+}
+
+void LayoutParserImpl::unload() {
+ for (int i = 0; i < MAX_SCL_LAYOUT; ++i) {
+ for (int j = 0; j < MAX_KEY; ++j) {
+ if (m_key_coordinate_pointer_frame[i][j]) {
+ free(m_key_coordinate_pointer_frame[i][j]);
+ m_key_coordinate_pointer_frame[i][j] = NULL;
+ }
+ }
+ }
+
+ release_layout_strings();
+ release_key_strings();
+ release_upper_strings();
+}
+
+bool
+LayoutParserImpl::loaded(int layout_id) {
+ bool ret = TRUE;
+
+ if (layout_id >= 0 && layout_id < MAX_SCL_LAYOUT) {
+ if (m_key_coordinate_pointer_frame[layout_id][0] == NULL) {
+ ret = FALSE;
+ }
+ }
+
+ return ret;
+}
+
+void
+LayoutParserImpl::set_directory(const string& dir) {
+ m_dir = dir;
+}
+
+void
+LayoutParserImpl::add_layout_string(xmlChar* newstr) {
+ if (newstr) {
+ m_vec_layout_strings.push_back(newstr);
+ }
+}
+
+void
+LayoutParserImpl::release_layout_strings() {
+ for (size_t loop = 0; loop < m_vec_layout_strings.size(); loop++) {
+ if (m_vec_layout_strings[loop]) {
+ xmlFree(m_vec_layout_strings[loop]);
+ }
+ }
+ m_vec_layout_strings.clear();
+}
+
+void
+LayoutParserImpl::add_key_string(xmlChar* newstr) {
+ if (newstr) {
+ m_vec_key_strings.push_back(newstr);
+ }
+}
+
+void
+LayoutParserImpl::release_key_strings() {
+ for (size_t loop = 0; loop < m_vec_key_strings.size(); loop++) {
+ if (m_vec_key_strings[loop]) {
+ xmlFree(m_vec_key_strings[loop]);
+ }
+ }
+ m_vec_key_strings.clear();
+}
+
+void
+LayoutParserImpl::add_upper_string(gchar* newstr) {
+ if (newstr) {
+ m_vec_upper_strings.push_back(newstr);
+ }
+}
+
+void
+LayoutParserImpl::release_upper_strings() {
+ for (size_t loop = 0; loop < m_vec_upper_strings.size(); loop++) {
+ if (m_vec_upper_strings[loop]) {
+ g_free(m_vec_upper_strings[loop]);
+ }
+ }
+ m_vec_upper_strings.clear();
+}
+
+int
+LayoutParserImpl::get_layout_index(const char *name) {
+ if (name) {
+ string strName = (string)name;
+ vector<string>::iterator it;
+ // make sure that the m_file_names are sorted.
+ it = lower_bound(m_file_names.begin(), m_file_names.end(), strName);
+ if (it != m_file_names.end() && *it == strName) {
+ return it - m_file_names.begin();
+ }
+ }
+ return NOT_USED;
+}
+
+PSclLayout
+LayoutParserImpl::get_layout_table() {
+ return m_layout_table;
+}
+
+int
+LayoutParserImpl::get_layout_size() {
+ return m_layout_size;
+}
+
+PSclLayoutKeyCoordinatePointerTable
+LayoutParserImpl::get_key_coordinate_pointer_frame() {
+ return m_key_coordinate_pointer_frame;
+}
+
+int
+LayoutParserImpl::reload_layout_table(const vector<string> &vec_file) {
+ reset();
+ return parsing_layout_table(vec_file);
+}
+
+int
+LayoutParserImpl::parsing_layout_table(const vector<string> &vec_file) {
+ m_file_names = vec_file;
+ m_layout_size = vec_file.size();
+
+ return 0;
+}
+
+void
+LayoutParserImpl::parsing_background(
+ const xmlNodePtr cur_node,
+ PSclLayout cur_layout) {
+ assert(cur_node != NULL);
+ assert(cur_layout != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_BACKGROUND_NORMAL_TAG)) {
+ xmlChar *key = xmlNodeGetContent(child_node);
+ cur_layout->image_path[BUTTON_STATE_NORMAL] = (char *)key;
+ add_layout_string(key);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_BACKGROUND_PRESSED_TAG)) {
+ xmlChar *key = xmlNodeGetContent(child_node);
+ cur_layout->image_path[BUTTON_STATE_PRESSED] = (char *)key;
+ add_layout_string(key);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_BACKGROUND_DISABLED_TAG )) {
+ xmlChar *key = xmlNodeGetContent(child_node);
+ cur_layout->image_path[BUTTON_STATE_DISABLED] = (char *)key;
+ add_layout_string(key);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_BACKGROUND_TOGGLED_TAG )) {
+ xmlChar *key = xmlNodeGetContent(child_node);
+ cur_layout->image_path[BUTTON_STATE_TOGGLED] = (char *)key;
+ add_layout_string(key);
+ }
+
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_sw_background_color(
+ const xmlNodePtr cur_node,
+ PSclLayout cur_layout) {
+ assert(cur_node != NULL);
+ assert(cur_layout != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"r")) {
+ cur_layout->bg_color.r = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"g")) {
+ cur_layout->bg_color.g = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"b")) {
+ cur_layout->bg_color.b = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"a")) {
+ cur_layout->bg_color.a = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_key_background(
+ const xmlNodePtr cur_node,
+ PSclLayout cur_layout) {
+ assert(cur_node != NULL);
+ assert(cur_layout != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int button_state = get_button_state_prop(child_node);
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ for (int button_loop = 0;button_loop < SCL_BUTTON_STATE_MAX;button_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1) &&
+ (button_state == button_loop || button_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ cur_layout->key_background_image[shift_loop][button_loop] = (sclchar*)key;
+ add_layout_string(key);
+ }
+ }
+ }
+ }
+
+ child_node = child_node->next;
+ }
+}
+
+
+void
+LayoutParserImpl::set_default_layout_value(const PSclLayout cur_layout) {
+ DefaultConfigParser *default_configure_parser = DefaultConfigParser::get_instance();
+ assert(default_configure_parser);
+ const PSclDefaultConfigure sclres_default_configure = default_configure_parser->get_default_configure();
+
+ assert(cur_layout != NULL);
+ cur_layout->valid = 1;
+ cur_layout->style = LAYOUT_STYLE_BASE;
+ cur_layout->name = NULL;
+
+ if (sclres_default_configure) {
+ cur_layout->width = sclres_default_configure->target_screen_width;
+ cur_layout->height = sclres_default_configure->target_screen_height;
+ }
+
+ cur_layout->key_width = 0;
+ cur_layout->key_height = 0;
+ cur_layout->key_spacing = 0;
+ cur_layout->row_spacing = 0;
+
+ cur_layout->image_path[BUTTON_STATE_NORMAL] = NULL;
+ cur_layout->image_path[BUTTON_STATE_PRESSED] = NULL;
+ cur_layout->image_path[BUTTON_STATE_DISABLED] = NULL;
+ cur_layout->image_path[BUTTON_STATE_TOGGLED] = NULL;
+
+ cur_layout->use_sw_button = false;
+ cur_layout->use_magnifier_window = false;
+
+ cur_layout->display_mode = DISPLAYMODE_PORTRAIT;
+ cur_layout->use_sw_background = false;
+ memset (&(cur_layout->bg_color), 0, sizeof(SclColor));
+ cur_layout->bg_line_width = 0.0;
+ memset (&(cur_layout->bg_line_color), 0, sizeof(SclColor));
+
+ memset (cur_layout->key_background_image, 0, sizeof(cur_layout->key_background_image));
+ cur_layout->sound_style = NULL;
+ cur_layout->vibe_style = NULL;
+ cur_layout->label_type = NULL;
+ cur_layout->modifier_decorator = NULL;
+
+ cur_layout->add_grab_left = NOT_USED;
+ cur_layout->add_grab_right = NOT_USED;
+ cur_layout->add_grab_top = NOT_USED;
+ cur_layout->add_grab_bottom = NOT_USED;
+}
+
+void
+LayoutParserImpl::set_default_row_value(
+ Row* row,
+ const PSclLayout cur_rec_layout,
+ int row_y) {
+ if (row) {
+ row->row_x = 0;
+ row->row_y = row_y;
+ row->key_width = cur_rec_layout->key_width;
+ row->key_height = cur_rec_layout->key_height;
+ row->key_spacing = cur_rec_layout->key_spacing;
+ row->row_spacing = cur_rec_layout->row_spacing;
+ row->add_hit_left = cur_rec_layout->add_hit_left;
+ row->add_hit_right = cur_rec_layout->add_hit_right;
+ row->add_hit_top = cur_rec_layout->add_hit_top;
+ row->add_hit_bottom = cur_rec_layout->add_hit_bottom;
+ row->sub_layout = NULL;
+ row->label_type = cur_rec_layout->label_type;
+ row->vibe_style = cur_rec_layout->vibe_style;
+ row->sound_style = cur_rec_layout->sound_style;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int button_state = 0; button_state < SCL_BUTTON_STATE_MAX; ++button_state) {
+ row->bg_image_path[shift_state][button_state] = cur_rec_layout->key_background_image[shift_state][button_state];
+ }
+ }
+ }
+}
+
+void
+LayoutParserImpl::set_default_key_coordinate_value(
+ const PSclLayoutKeyCoordinate cur_rec_coordinate,
+ const Row* row) {
+ assert(row != NULL);
+ assert(cur_rec_coordinate != NULL);
+
+ int loop;
+
+ if (row && cur_rec_coordinate) {
+ cur_rec_coordinate->valid = FALSE;
+ cur_rec_coordinate->custom_id = NULL;
+ cur_rec_coordinate->button_type = BUTTON_TYPE_NORMAL;
+ cur_rec_coordinate->key_type = KEY_TYPE_CHAR;
+ cur_rec_coordinate->popup_type = POPUP_TYPE_NONE;
+ cur_rec_coordinate->use_magnifier = (sclboolean)true;
+ cur_rec_coordinate->use_long_key_magnifier = (sclboolean)false;
+ //cur_rec_coordinate->enabled =(sclboolean) TRUE;
+ for (loop = 0;loop < SCL_DRAG_STATE_MAX;loop++) {
+ cur_rec_coordinate->popup_input_mode[loop] = NULL;
+ }
+ cur_rec_coordinate->sound_style = row->sound_style;
+ cur_rec_coordinate->vibe_style = row->vibe_style;
+ cur_rec_coordinate->is_side_button = false;
+
+ cur_rec_coordinate->x = row->row_x;
+ cur_rec_coordinate->y = row->row_y;
+ cur_rec_coordinate->width = row->key_width;
+ cur_rec_coordinate->height = row->key_height;
+
+ cur_rec_coordinate->add_hit_left = row->add_hit_left;
+ cur_rec_coordinate->add_hit_right = row->add_hit_right;
+ cur_rec_coordinate->add_hit_top = row->add_hit_top;
+ cur_rec_coordinate->add_hit_bottom = row->add_hit_bottom;
+
+ cur_rec_coordinate->label_type = row->label_type;
+ cur_rec_coordinate->image_label_type = NULL;
+
+ cur_rec_coordinate->label_count = 0;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int label_for_one = 0; label_for_one < MAX_SIZE_OF_LABEL_FOR_ONE; ++label_for_one) {
+ cur_rec_coordinate->label[shift_state][label_for_one] = NULL;
+ }
+ }
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int button_state = 0; button_state < SCL_BUTTON_STATE_MAX; ++button_state) {
+ cur_rec_coordinate->image_label_path[shift_state][button_state] = NULL;
+ }
+ }
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int button_state = 0; button_state < SCL_BUTTON_STATE_MAX; ++button_state) {
+ //cur_rec_coordinate->bg_image_path[shift_state]![button_state] = NULL;
+ cur_rec_coordinate->bg_image_path[shift_state][button_state] = row->bg_image_path[shift_state][button_state];
+ }
+ }
+ cur_rec_coordinate->key_value_count = 0;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int multitap_state = 0; multitap_state < MAX_SIZE_OF_MULTITAP_CHAR; ++multitap_state) {
+ cur_rec_coordinate->key_value[shift_state][multitap_state] = NULL;
+ }
+ }
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int multitap_state = 0; multitap_state < MAX_SIZE_OF_MULTITAP_CHAR; ++multitap_state) {
+ cur_rec_coordinate->key_event[shift_state][multitap_state] = 0;
+ }
+ }
+ /* assume the long_key_type is the same with key_type, by default */
+ cur_rec_coordinate->long_key_type = cur_rec_coordinate->key_type;
+ cur_rec_coordinate->long_key_value = NULL;
+ cur_rec_coordinate->long_key_event = 0;
+
+ cur_rec_coordinate->use_repeat_key = false;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int autopopup_state = 0; autopopup_state < MAX_SIZE_OF_AUTOPOPUP_STRING; ++autopopup_state) {
+ cur_rec_coordinate->autopopup_key_labels[shift_state][autopopup_state] = NULL;
+ cur_rec_coordinate->autopopup_key_events[shift_state][autopopup_state] = 0;
+ cur_rec_coordinate->autopopup_key_values[shift_state][autopopup_state] = NULL;
+ }
+ }
+ cur_rec_coordinate->dont_close_popup = false;
+ cur_rec_coordinate->extra_option = NOT_USED;
+ cur_rec_coordinate->multitouch_type = SCL_MULTI_TOUCH_TYPE_EXCLUSIVE;
+ cur_rec_coordinate->modifier_decorator = NULL;
+ for (int shift_state = 0; shift_state < SCL_SHIFT_STATE_MAX; shift_state++) {
+ for (int multitap_state = 0; multitap_state < MAX_SIZE_OF_MULTITAP_CHAR; ++multitap_state) {
+ cur_rec_coordinate->hint_string[shift_state][multitap_state] = NULL;
+ }
+ }
+ cur_rec_coordinate->sub_layout = row->sub_layout;
+ }
+}
+
+void
+LayoutParserImpl::parsing_grab_area(
+ const xmlNodePtr cur_node,
+ const PSclLayout cur_rec_layout) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ADD_GRAB_LEFT_TAG)) {
+ cur_rec_layout->add_grab_left = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ADD_GRAB_RIGHT_TAG)) {
+ cur_rec_layout->add_grab_right = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ADD_GRAB_TOP_TAG)) {
+ cur_rec_layout->add_grab_top = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ADD_GRAB_BOTTOM_TAG)) {
+ cur_rec_layout->add_grab_bottom = get_content_int(child_node);
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_layout_node(
+ const xmlNodePtr cur_node,
+ const PSclLayout cur_rec_layout,
+ int layout_no) {
+ assert(cur_node != NULL);
+ assert(cur_rec_layout != NULL);
+
+ set_default_layout_value(cur_rec_layout);
+
+ xmlChar* key;
+
+ if (equal_prop(cur_node, LAYOUT_DIRECTION_ATTRIBUTE,
+ LAYOUT_DIRECTION_ATTRIBUTE_LANDSCAPE_VALUE)) {
+ cur_rec_layout->display_mode = DISPLAYMODE_LANDSCAPE;
+ }
+
+ if (equal_prop(cur_node, LAYOUT_STYLE_ATTRIBUTE,
+ LAYOUT_STYLE_ATTRIBUTE_POPUP_VALUE)) {
+ cur_rec_layout->style = LAYOUT_STYLE_POPUP;
+ } else if (equal_prop(cur_node, LAYOUT_STYLE_ATTRIBUTE,
+ LAYOUT_STYLE_ATTRIBUTE_POPUP_GRAB_VALUE)) {
+ cur_rec_layout->style = LAYOUT_STYLE_POPUP_GRAB;
+ }
+
+ get_prop_number(cur_node, LAYOUT_WIDTH_ATTRIBUTE, &(cur_rec_layout->width));
+ get_prop_number(cur_node, LAYOUT_HEIGHT_ATTRIBUTE, &(cur_rec_layout->height));
+ get_prop_bool(cur_node, LAYOUT_MAGNIFIER_ATTRIBUTE, &(cur_rec_layout->use_magnifier_window));
+
+ get_prop_bool(cur_node, LAYOUT_PART_BACKGROUND_ATTRIBUTE, &(cur_rec_layout->extract_background));
+ get_prop_bool(cur_node, LAYOUT_SW_BUTTON_ATTRIBUTE, &(cur_rec_layout->use_sw_button));
+ get_prop_bool(cur_node, LAYOUT_SW_BACKGROUND_ATTRIBUTE, &(cur_rec_layout->use_sw_background));
+
+ get_prop_number(cur_node, LAYOUT_KEY_WIDTH_ATTRIBUTE, &(cur_rec_layout->key_width));
+ get_prop_number(cur_node, LAYOUT_KEY_HEIGHT_ATTRIBUTE, &(cur_rec_layout->key_height));
+ get_prop_number(cur_node, LAYOUT_KEY_SPACING_ATTRIBUTE, &(cur_rec_layout->key_spacing));
+ get_prop_number(cur_node, LAYOUT_ROW_SPACING_ATTRIBUTE, &(cur_rec_layout->row_spacing));
+
+ get_prop_number(cur_node, LAYOUT_KEY_ADD_HIT_LEFT_ATTRIBUTE, &(cur_rec_layout->add_hit_left));
+ get_prop_number(cur_node, LAYOUT_KEY_ADD_HIT_RIGHT_ATTRIBUTE, &(cur_rec_layout->add_hit_right));
+ get_prop_number(cur_node, LAYOUT_KEY_ADD_HIT_TOP_ATTRIBUTE, &(cur_rec_layout->add_hit_top));
+ get_prop_number(cur_node, LAYOUT_KEY_ADD_HIT_BOTTOM_ATTRIBUTE, &(cur_rec_layout->add_hit_bottom));
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_VIBE_STYLE_ATTRIBUTE);
+ if (key) {
+ cur_rec_layout->vibe_style = (sclchar*)key;
+ add_layout_string(key);
+ }
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_SOUND_STYLE_ATTRIBUTE);
+ if (key) {
+ cur_rec_layout->sound_style = (sclchar*)key;
+ add_layout_string(key);
+ }
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_LABEL_TYPE_ATTRIBUTE);
+ if (key) {
+ cur_rec_layout->label_type = (sclchar*)key;
+ add_layout_string(key);
+ }
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_MODIFIER_DECORATION_ATTRIBUTE);
+ if (key) {
+ cur_rec_layout->modifier_decorator = (sclchar*)key;
+ add_layout_string(key);
+ }
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ /* row node: layout coordinate resources is no need to parsing at this time */
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_BACKGROUND_TAG)) {
+ parsing_background(child_node, cur_rec_layout);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_SW_BACKGROUND_TAG)) {
+ parsing_sw_background_color(child_node, cur_rec_layout);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_KEY_BACKGROUND_TAG)) {
+ parsing_key_background(child_node, cur_rec_layout);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)LAYOUT_ADD_GRAB_TAG)) {
+ parsing_grab_area(child_node, cur_rec_layout);
+ }
+
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::loading_coordinate_resources(
+ const xmlNodePtr cur_node,
+ const PSclLayout cur_rec_layout,
+ int layout_no) {
+ assert(cur_node != NULL);
+
+ int row_y = 0;
+ int sub_layout_height = 0;
+
+ SclLayoutKeyCoordinatePointer *cur_key = NULL;
+
+ if (scl_check_arrindex(layout_no, MAX_SCL_LAYOUT)) {
+ m_num_keys[layout_no] = 0;
+ cur_key = &m_key_coordinate_pointer_frame[layout_no][0];
+ }
+ if (cur_key && *cur_key == NULL) {
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_TAG)) {
+ parsing_layout_row_node(child_node, cur_rec_layout, &row_y, &sub_layout_height, &cur_key, layout_no);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+}
+
+void
+LayoutParserImpl::parsing_layout_row_node(
+ const xmlNodePtr cur_node,
+ const PSclLayout cur_rec_layout,
+ int *row_y, int *sub_layout_height,
+ SclLayoutKeyCoordinatePointer **cur_key,
+ int layout_no) {
+ assert(cur_node != NULL);
+
+ Row row = {0};
+ if (row_y) {
+ set_default_row_value(&row, cur_rec_layout, *row_y);
+ }
+
+ get_prop_number(cur_node, LAYOUT_ROW_X_ATTRIBUTE, &(row.row_x));
+ get_prop_number(cur_node, LAYOUT_ROW_Y_ATTRIBUTE, &(row.row_y));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_WIDTH_ATTRIBUTE, &(row.key_width));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_HEIGHT_ATTRIBUTE, &(row.key_height));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_SPACING_ATTRIBUTE, &(row.key_spacing));
+
+ xmlChar *key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_SUBLAYOUT_ID_ATTRIBUTE);
+ if (key) {
+ row.sub_layout = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ if (row.sub_layout == NULL) {
+ if (row_y) {
+ /* If there's a stored sub_layout_height value, add it to current row's y position */
+ if (sub_layout_height) {
+ row.row_y += *sub_layout_height;
+ *sub_layout_height = 0;
+ }
+ *row_y = row.row_y + row.key_height + row.row_spacing;
+ }
+ }
+ /* Store the current row's height for later use when this sublayout is "DEFAULT" */
+ static const char default_sub_layout_string[] = LAYOUT_SUB_LAYOUT_DEFAULT_STRING;
+ if (row.sub_layout && strncmp(row.sub_layout, default_sub_layout_string, sizeof(default_sub_layout_string)) == 0) {
+ if (sub_layout_height) {
+ *sub_layout_height = row.key_height + row.row_spacing;
+ }
+ }
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_TAG)) {
+ if (scl_check_arrindex_unsigned(layout_no, MAX_SCL_LAYOUT) && m_num_keys[layout_no] < MAX_KEY) {
+ parsing_key_coordinate_record_node(child_node, &row, *cur_key, layout_no);
+ (*cur_key)++;
+ m_num_keys[layout_no]++;
+ } else {
+ SCLLOG(SclLog::ERROR, "The number of keys exceeded %d (%d)\n", MAX_KEY, layout_no);
+ return;
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+int
+LayoutParserImpl::get_drag_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ typedef struct _Match_Struct {
+ int value;
+ const char* key;
+ }Match_Struct;
+ static Match_Struct table[] = {
+ {SCL_DRAG_STATE_NONE, "drag_state_none" },
+ {SCL_DRAG_STATE_LEFT, "drag_state_left" },
+ {SCL_DRAG_STATE_RIGHT, "drag_state_right" },
+ {SCL_DRAG_STATE_UP, "drag_state_up" },
+ {SCL_DRAG_STATE_DOWN, "drag_state_down" },
+ {SCL_DRAG_STATE_INVALID, "drag_state_invalid" },
+ {SCL_DRAG_STATE_RETURN, "drag_state_return" }
+ };
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)"drag_state");
+ if (key == NULL) return SCL_DRAG_STATE_NONE;
+
+ int drag_state = SCL_DRAG_STATE_NONE;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Match_Struct); ++i) {
+ if (0 == strcmp((const char*)key, table[i].key))
+ {
+ drag_state = table[i].value;
+ break;
+ }
+ }
+
+ xmlFree(key);
+ return drag_state;
+}
+
+int
+LayoutParserImpl::get_shift_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ int shift_state = -1;
+
+ if (equal_prop(cur_node, "shift", "on")) {
+ shift_state = SCL_SHIFT_STATE_ON;
+ } else if (equal_prop(cur_node, "shift", "off")) {
+ shift_state = SCL_SHIFT_STATE_OFF;
+ } else if (equal_prop(cur_node, "shift", "loc")) {
+ shift_state = SCL_SHIFT_STATE_LOCK;
+ }
+ return shift_state;
+}
+int
+LayoutParserImpl::get_button_state_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ int button_state = -1;
+
+ if (equal_prop(cur_node, "button", "pressed")) {
+ button_state = BUTTON_STATE_PRESSED;
+ } else if (equal_prop(cur_node, "button", "normal")) {
+ button_state = BUTTON_STATE_NORMAL;
+ } else if (equal_prop(cur_node, "button", "disabled")) {
+ button_state = BUTTON_STATE_DISABLED;
+ } else if (equal_prop(cur_node, "button", "toggled")) {
+ button_state = BUTTON_STATE_TOGGLED;
+ }
+ return button_state;
+}
+
+int
+LayoutParserImpl::get_multitouch_type_prop(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ typedef struct _Match_Struct {
+ int value;
+ const char* key;
+ }Match_Struct;
+ static Match_Struct table[] = {
+ {SCL_MULTI_TOUCH_TYPE_EXCLUSIVE, "exclusive" },
+ {SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS, "settle_previous" },
+ {SCL_MULTI_TOUCH_TYPE_COOPERATIVE, "cooperative" },
+ {SCL_MULTI_TOUCH_TYPE_GRAB_SUB_EVENTS, "grab_sub_events" },
+ };
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_MULTITOUCH_TYPE_ATTRIBUTE);
+ if (key == NULL) return SCL_MULTI_TOUCH_TYPE_EXCLUSIVE;
+
+ int type = SCL_MULTI_TOUCH_TYPE_EXCLUSIVE;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Match_Struct); ++i) {
+ if (0 == strcmp((const char*)key, table[i].key))
+ {
+ type = table[i].value;
+ break;
+ }
+ }
+
+ xmlFree(key);
+ return type;
+}
+
+int
+LayoutParserImpl::get_extra_option_prop(
+ const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ typedef struct _Match_Struct {
+ int value;
+ const char* key;
+ }Match_Struct;
+ static Match_Struct table[] = {
+ {DIRECTION_EXTRA_OPTION_4_DIRECTIONS, "4-directions" },
+ {DIRECTION_EXTRA_OPTION_8_DIRECTIONS, "8-directions" },
+ {DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_LONG, "4-directions-long" },
+ {DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG, "8-directions-long" },
+ {DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN, "4-directions-return" },
+ {DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN, "8-directions-return" },
+ {DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE, "4-directions-return-curve" },
+ };
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_EXTRA_OPTION_ATTRIBUTE);
+ if (key == NULL) return 0;
+
+ int type = DIRECTION_EXTRA_OPTION_4_DIRECTIONS;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Match_Struct); ++i) {
+ if (0 == strcmp((const char*)key, table[i].key))
+ {
+ type = table[i].value;
+ break;
+ }
+ }
+
+ xmlFree(key);
+ return type;
+}
+
+
+void
+LayoutParserImpl::parsing_label_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"label"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+
+ int label_for_one_state = 0;
+ get_prop_number(child_node, "multi", &label_for_one_state);
+ if (cur_rec->label_count < (label_for_one_state + 1)) {
+ cur_rec->label_count = (label_for_one_state + 1);
+ }
+
+ sclboolean auto_upper = FALSE;
+ get_prop_bool(child_node, "auto_upper", &auto_upper);
+
+ if (label_for_one_state >= 0 && label_for_one_state < MAX_SIZE_OF_LABEL_FOR_ONE) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ sclboolean upper_created = FALSE;
+ if (auto_upper) {
+ if (shift_loop != SCL_SHIFT_STATE_OFF) {
+ gchar *upper = g_utf8_strup(reinterpret_cast<gchar*>(key), -1);
+ xmlFree(key);
+ add_upper_string(upper);
+ upper_created = TRUE;
+ key = reinterpret_cast<xmlChar*>(upper);
+ }
+ }
+ if (!upper_created) {
+ add_key_string(key);
+ }
+ cur_rec->label[shift_loop][label_for_one_state] = (sclchar*)key;
+ /* If current key_value is NULL, let's just consider this label is the default key_value */
+ if (label_for_one_state == 0) {
+ if (cur_rec->key_value[shift_loop][label_for_one_state] == NULL) {
+ cur_rec->key_value[shift_loop][label_for_one_state] = (sclchar*)key;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_magnifier_label_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"magnifier_label"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+
+ int label_for_one_state = 0;
+ get_prop_number(child_node, "multi", &label_for_one_state);
+
+ if (label_for_one_state >= 0 && label_for_one_state < MAX_SIZE_OF_LABEL_FOR_ONE) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ cur_rec->magnifier_label[shift_loop][label_for_one_state] = (sclchar*)key;
+ add_key_string(key);
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_hint_string_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"hint_string"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int multichar_state = 0;
+ get_prop_number(child_node, "multichar_state", &multichar_state);
+
+ if (multichar_state >= 0 && multichar_state < MAX_SIZE_OF_MULTITAP_CHAR) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ cur_rec->hint_string[shift_loop][multichar_state] = (sclchar*)key;
+ add_key_string(key);
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_label_image_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"image_label"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int button_state = get_button_state_prop(child_node);
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ for (int button_loop = 0;button_loop < SCL_BUTTON_STATE_MAX;button_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1) &&
+ (button_state == button_loop || button_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ cur_rec->image_label_path[shift_loop][button_loop] = (sclchar*)key;
+ add_key_string(key);
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_background_image_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"background_image"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int button_state = get_button_state_prop(child_node);
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ for (int button_loop = 0;button_loop < SCL_BUTTON_STATE_MAX;button_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1) &&
+ (button_state == button_loop || button_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ cur_rec->bg_image_path[shift_loop][button_loop] = (sclchar*)key;
+ add_key_string(key);
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_key_value_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"key_value"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int multichar_state = 0;
+ get_prop_number(child_node, "multichar_state", &multichar_state);
+
+ sclboolean auto_upper = FALSE;
+ get_prop_bool(child_node, "auto_upper", &auto_upper);
+
+ if (multichar_state >= 0 && multichar_state < MAX_SIZE_OF_MULTITAP_CHAR) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ if (key) {
+ sclboolean upper_created = FALSE;
+ if (auto_upper) {
+ if (shift_loop != SCL_SHIFT_STATE_OFF) {
+ gchar *upper = g_utf8_strup(reinterpret_cast<gchar*>(key), -1);
+ xmlFree(key);
+ add_upper_string(upper);
+ upper_created = TRUE;
+ key = reinterpret_cast<xmlChar*>(upper);
+ }
+ }
+ if (!upper_created) {
+ add_key_string(key);
+ }
+ cur_rec->key_value[shift_loop][multichar_state] = (sclchar*)key;
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_key_event_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"key_event"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"rec")) {
+ int shift_state = get_shift_state_prop(child_node);
+ int multichar_state = 0;
+ get_prop_number(child_node, "multichar_state", &multichar_state);
+
+ if (multichar_state >= 0 && multichar_state < MAX_SIZE_OF_MULTITAP_CHAR) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ cur_rec->key_event[shift_loop][multichar_state] = (sclulong)get_content_dex_string_int(child_node);
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_auto_popup_keys_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"auto_popup_keys"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ int shift_state = get_shift_state_prop(child_node);
+ int autopopup_state = 0;
+ get_prop_number(child_node, "autopopup", &autopopup_state);
+
+ sclboolean auto_upper = FALSE;
+ get_prop_bool(child_node, "auto_upper", &auto_upper);
+
+ if (autopopup_state >= 0 && autopopup_state < MAX_SIZE_OF_AUTOPOPUP_STRING) {
+ for (int shift_loop = 0;shift_loop < SCL_SHIFT_STATE_MAX;shift_loop++) {
+ if ((shift_state == shift_loop || shift_state == -1)) {
+ xmlChar* key = xmlNodeGetContent(child_node);
+ sclboolean need_free = TRUE;
+ if (key) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"label")) {
+ sclboolean upper_created = FALSE;
+ if (auto_upper) {
+ if (shift_loop != SCL_SHIFT_STATE_OFF) {
+ gchar *upper = g_utf8_strup(reinterpret_cast<gchar*>(key), -1);
+ xmlFree(key);
+ add_upper_string(upper);
+ upper_created = TRUE;
+ key = reinterpret_cast<xmlChar*>(upper);
+ need_free = FALSE;
+ }
+ }
+ if (!upper_created) {
+ add_key_string(key);
+ need_free = FALSE;
+ }
+ cur_rec->autopopup_key_labels[shift_loop][autopopup_state] = (sclchar*)key;
+ /* If current key_value is NULL, let's just consider this label is the default key_value */
+ if (cur_rec->autopopup_key_values[shift_loop][autopopup_state] == NULL) {
+ cur_rec->autopopup_key_values[shift_loop][autopopup_state] = (sclchar*)key;
+ }
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"value")) {
+ cur_rec->autopopup_key_values[shift_loop][autopopup_state] = (sclchar*)key;
+ add_key_string(key);
+ need_free = FALSE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"event")) {
+ cur_rec->autopopup_key_events[shift_loop][autopopup_state] = (sclulong)atoi((sclchar*)key);
+ add_key_string(key);
+ need_free = FALSE;
+ }
+ if (need_free) {
+ xmlFree(key);
+ }
+ }
+ }
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+void
+LayoutParserImpl::parsing_key_coordinate_record_node(
+ const xmlNodePtr cur_node, Row *row,
+ SclLayoutKeyCoordinatePointer *cur_rec_coordinate,
+ int layout_no) {
+ assert(cur_node != NULL);
+ assert(cur_rec_coordinate != NULL);
+
+ if (scl_check_arrindex_unsigned(layout_no, MAX_SCL_LAYOUT) && m_num_keys[layout_no] >= MAX_KEY) {
+ SCLLOG(SclLog::ERROR, "The number of keys exceeded %d (%d)\n", MAX_KEY, layout_no);
+ return;
+ }
+ *cur_rec_coordinate = (SclLayoutKeyCoordinatePointer)malloc(sizeof(SclLayoutKeyCoordinate));
+ if (*cur_rec_coordinate == NULL) {
+ SCLLOG(SclLog::ERROR, "LayoutParserImpl: memory malloc eror.\n");
+ return;
+ }
+ memset(*cur_rec_coordinate, 0x00, sizeof(SclLayoutKeyCoordinate));
+
+ set_default_key_coordinate_value(*cur_rec_coordinate, row);
+
+ xmlChar *key;
+
+ int key_spacing = 0;
+
+ if (row) {
+ key_spacing = row->key_spacing;
+ }
+
+ (*cur_rec_coordinate)->valid = TRUE;
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_CUSTOMID_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->custom_id = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_BUTTON_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->button_type = (SCLButtonType)ButtonTypeHelper::Int((const char*)key);
+ xmlFree(key);
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_KEY_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->key_type = (SCLKeyType)KeyTypeHelper::Int((const char*)key);
+ xmlFree(key);
+ }
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_POPUP_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->popup_type = (SCLPopupType)PopupTypeHelper::Int((const char*)key);
+ xmlFree(key);
+ }
+
+ get_prop_bool(cur_node, LAYOUT_ROW_KEY_MAGNIFIER_ATTRIBUTE, &((*cur_rec_coordinate)->use_magnifier));
+ get_prop_bool(cur_node, LAYOUT_ROW_KEY_LONGKEY_MAGNIFIER_ATTRIBUTE,
+ &((*cur_rec_coordinate)->use_long_key_magnifier));
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_VIBE_STYLE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->vibe_style = (sclchar*)key;
+ add_key_string(key);
+ }
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_SOUND_STYLE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->sound_style = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ get_prop_bool(cur_node, LAYOUT_ROW_KEY_SIDE_BUTTON_ATTRIBUTE, &((*cur_rec_coordinate)->is_side_button));
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_X_ATTRIBUTE, &((*cur_rec_coordinate)->x));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_Y_ATTRIBUTE, &((*cur_rec_coordinate)->y));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_KEY_WIDTH_ATTRIBUTE, &((*cur_rec_coordinate)->width));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_KEY_HEIGHT_ATTRIBUTE, &((*cur_rec_coordinate)->height));
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_ADD_HIT_LEFT_ATTRIBUTE, &((*cur_rec_coordinate)->add_hit_left));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_ADD_HIT_RIGHT_ATTRIBUTE, &((*cur_rec_coordinate)->add_hit_right));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_ADD_HIT_TOP_ATTRIBUTE, &((*cur_rec_coordinate)->add_hit_top));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_ADD_HIT_BOTTOM_ATTRIBUTE, &((*cur_rec_coordinate)->add_hit_bottom));
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_POPUP_POS_X_ATTRIBUTE, &((*cur_rec_coordinate)->popup_relative_x));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_POPUP_POS_Y_ATTRIBUTE, &((*cur_rec_coordinate)->popup_relative_y));
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_POPUP_IMAGE_X_ATTRIBUTE, &((*cur_rec_coordinate)->extract_offset_x));
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_POPUP_IMAGE_Y_ATTRIBUTE, &((*cur_rec_coordinate)->extract_offset_y));
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_LONGKEY_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->long_key_type = (SCLKeyType)KeyTypeHelper::Int((const char*)key);
+ xmlFree(key);
+ } else {
+ /* assume the long_key_type is the same with key_type, by default */
+ (*cur_rec_coordinate)->long_key_type = (*cur_rec_coordinate)->key_type;
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_LONGKEY_VALUE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->long_key_value = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_LONGKEY_EVENT_ATTRIBUTE, &((*cur_rec_coordinate)->long_key_event));
+
+ get_prop_bool(cur_node, LAYOUT_ROW_KEY_USE_REPEAT_KEY_ATTRIBUTE, &((*cur_rec_coordinate)->use_repeat_key));
+ get_prop_bool(cur_node, LAYOUT_ROW_KEY_DONOT_CLOSE_POPUP_ATTRIBUTE, &((*cur_rec_coordinate)->dont_close_popup));
+
+ (*cur_rec_coordinate)->extra_option = get_extra_option_prop(cur_node);
+ (*cur_rec_coordinate)->multitouch_type = get_multitouch_type_prop(cur_node);
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_SUBLAYOUT_ID_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->sub_layout = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_LABEL_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->label_type = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_IMAGE_LABEL_TYPE_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->image_label_type = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ key = xmlGetProp(cur_node, (const xmlChar*)LAYOUT_ROW_KEY_MODIFIER_DECORATION_ID_ATTRIBUTE);
+ if (key) {
+ (*cur_rec_coordinate)->modifier_decorator = (sclchar*)key;
+ add_key_string(key);
+ }
+
+ get_prop_number(cur_node, LAYOUT_ROW_KEY_KEY_SPACING_ATTRIBUTE, &key_spacing);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_LABEL_TAG)) {
+ parsing_label_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_IMAGE_LABEL_TAG)) {
+ parsing_label_image_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_BACKGROUND_IMAGE_TAG)) {
+ parsing_background_image_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_KEY_VALUE_TAG)) {
+ parsing_key_value_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_KEY_EVENT_TAG)) {
+ parsing_key_event_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_AUTOPOPUP_KEYS_TAG)) {
+ parsing_auto_popup_keys_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_POPUP_INPUTMODE_RECORD_TAG)) {
+ parsing_popup_input_mode_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_MAGNIFIER_LABEL_TAG)) {
+ parsing_magnifier_label_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_HINT_STRING_TAG)) {
+ parsing_hint_string_record_node(child_node, (*cur_rec_coordinate));
+ (*cur_rec_coordinate)->valid = TRUE;
+ }
+
+ child_node = child_node->next;
+ }
+
+ if (row) {
+ row->row_x = (*cur_rec_coordinate)->x + (*cur_rec_coordinate)->width + key_spacing;
+ }
+}
+
+void
+LayoutParserImpl::parsing_popup_input_mode_record_node(
+ const xmlNodePtr cur_node,
+ const PSclLayoutKeyCoordinate cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)LAYOUT_ROW_KEY_POPUP_INPUTMODE_RECORD_TAG));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)LAYOUT_ROW_KEY_POPUP_INPUTMODE_RECORD_INPUTMODE_TAG)) {
+ int drag_state = get_drag_state_prop(child_node);
+ assert(drag_state >=0);
+ assert(drag_state < SCL_DRAG_STATE_MAX);
+ xmlChar* key = xmlNodeGetContent(child_node);
+
+ if (key) {
+ cur_rec->popup_input_mode[drag_state] = (sclchar*)key;
+ add_key_string(key);
+ }
+ }
+ child_node = child_node->next;
+ }
+}
+
+LayoutParser::LayoutParser() {
+ m_impl = new LayoutParserImpl;
+}
+LayoutParser::~LayoutParser() {
+ SCLLOG(SclLog::MESSAGE, "~LayoutParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+}
+
+LayoutParser*
+LayoutParser::get_instance() {
+ static LayoutParser instance;
+ return &instance;
+}
+
+int
+LayoutParser::init(const char* dir, const vector<string> &vec_file) {
+ int ret = -1;
+ if (dir) {
+ m_impl->set_directory(dir);
+ ret = m_impl->parsing_layout_table(vec_file);
+ }
+
+ return ret;
+}
+
+int
+LayoutParser::reload(const char* dir, const vector<string> &vec_file) {
+ int ret = -1;
+ if (dir) {
+ m_impl->set_directory(dir);
+ m_impl->unload();
+ ret = m_impl->reload_layout_table(vec_file);
+ }
+
+ return ret;
+}
+
+void
+LayoutParser::load(int layout_id) {
+ m_impl->load(layout_id);
+}
+
+bool
+LayoutParser::loaded(int layout_id) {
+ return m_impl->loaded(layout_id);
+}
+
+void
+LayoutParser::unload() {
+ m_impl->unload();
+}
+
+int
+LayoutParser::get_layout_index(const char *name) {
+ return m_impl->get_layout_index(name);
+}
+
+int
+LayoutParser::get_layout_size() {
+ return m_impl->get_layout_size();
+}
+
+PSclLayout
+LayoutParser::get_layout_table() {
+ return m_impl->get_layout_table();
+}
+
+PSclLayoutKeyCoordinatePointerTable
+LayoutParser::get_key_coordinate_pointer_frame() {
+ return m_impl->get_key_coordinate_pointer_frame();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __LAYOUT_PARSER__H__
+#define __LAYOUT_PARSER__H__
+
+#include "sclres_type.h"
+#include <vector>
+
+class LayoutParserImpl;
+
+class LayoutParser {
+ LayoutParserImpl *m_impl;
+ public:
+ ~LayoutParser();
+ static LayoutParser *get_instance();
+ int init(const char *dir,
+ const std::vector<std::string> &vec_layout_file_name);
+ int reload(const char *dir,
+ const std::vector<std::string> &vec_layout_file_name);
+
+ void load(int layout_id);
+ void unload();
+ bool loaded(int layout_id);
+
+ int get_layout_index(const char *name);
+ int get_layout_size();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+
+ private:
+ LayoutParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "layout_parser_helper.h"
+#include <stdio.h>
+#include <string>
+#include <sstream>
+using namespace std;
+
+const string RotationHelper::pcPortrait = "portrait";
+const string RotationHelper::pcLandscape = "landscape";
+
+const string RotationHelper::toString(const int val) {
+ switch (val) {
+ case PORTRAIT:
+ return pcPortrait;
+ case LANDSCAPE:
+ return pcLandscape;
+ default:
+ return pcLandscape;
+ }
+}
+int RotationHelper::Int(const string str) {
+ if (str == pcPortrait) {
+ return PORTRAIT;
+ } else if (str == pcLandscape) {
+ return LANDSCAPE;
+ } else {
+ return PORTRAIT;
+ }
+}
+
+////////////////////////////////////////////////////////////
+const string PopStyleHelper::pcBase = "base";
+const string PopStyleHelper::pcPopup = "popup";
+const string PopStyleHelper::pcPopup_Grab = "popup_grab";
+const string PopStyleHelper::toString(const int val) {
+ switch (val) {
+ case BASE:
+ return pcBase;
+ case POPUP:
+ return pcPopup;
+ case POPUP_GRAB:
+ return pcPopup_Grab;
+ default:
+ return pcBase;
+ }
+}
+
+int PopStyleHelper::Int(const string str) {
+ if (str == pcBase) {
+ return BASE;
+ } else if (str == pcPopup) {
+ return POPUP;
+ } else if (str == pcPopup_Grab) {
+ return POPUP_GRAB;
+ } else {
+ return BASE;
+ }
+}
+
+///////////////////////////////////////////////////////
+
+const string ButtonTypeHelper::pcNormal = "normal";
+const string ButtonTypeHelper::pcGrab = "grab";
+const string ButtonTypeHelper::pcSelfish = "selfish";
+const string ButtonTypeHelper::pcDrag = "drag";
+const string ButtonTypeHelper::pcMultitap = "multitap";
+const string ButtonTypeHelper::pcRotation = "rotation";
+const string ButtonTypeHelper::pcDirection = "direction";
+const string ButtonTypeHelper::pcRelative_Direction = "relative_direction";
+const string ButtonTypeHelper::pcToggle = "toggle";
+const string ButtonTypeHelper::pcUiitem = "uiitem";
+
+const string ButtonTypeHelper::toString(const int val) {
+ switch (val) {
+ case NORMAL:
+ return pcNormal;
+ case GRAB:
+ return pcGrab;
+ case SELFISH:
+ return pcSelfish;
+ case DRAG:
+ return pcDrag;
+ case MULTITAP:
+ return pcMultitap;
+ case ROTATION:
+ return pcRotation;
+ case DIRECTION:
+ return pcDirection;
+ case RELATIVE_DIRECTION:
+ return pcRelative_Direction;
+ case UIITEM:
+ return pcUiitem;
+ default:
+ return pcNormal;
+ }
+}
+
+int ButtonTypeHelper::Int(const string str) {
+ if (str == pcNormal) {
+ return NORMAL;
+ } else if (str == pcGrab) {
+ return GRAB;
+ } else if (str == pcSelfish) {
+ return SELFISH;
+ } else if (str == pcDrag) {
+ return DRAG;
+ } else if (str == pcMultitap) {
+ return MULTITAP;
+ } else if (str == pcRotation) {
+ return ROTATION;
+ } else if (str == pcDirection) {
+ return DIRECTION;
+ } else if (str == pcRelative_Direction) {
+ return RELATIVE_DIRECTION;
+ } else if (str == pcToggle) {
+ return TOGGLE;
+ } else if (str == pcUiitem) {
+ return UIITEM;
+ } else {
+ return NORMAL;
+ }
+}
+////////////////////////////////////////////////////
+const string ShiftStateHelper::pcOn = "on";
+const string ShiftStateHelper::pcOff = "off";
+const string ShiftStateHelper::pcLoc = "loc";
+
+const string ShiftStateHelper::toString(const int val) {
+ switch (val) {
+ case ON:
+ return pcOn;
+ case OFF:
+ return pcOff;
+ case LOC:
+ return pcLoc;
+ default:
+ return pcOn;
+ }
+}
+
+int ShiftStateHelper::Int(const string str) {
+ if (str == pcOn) {
+ return ON;
+ } else if (str == pcOff) {
+ return OFF;
+ } else if (str == pcLoc) {
+ return LOC;
+ } else {
+ return ON;
+ }
+}
+/////////////////////////////////////////////////////////
+const string ButtonStateHelper::pcNormal = "normal";
+const string ButtonStateHelper::pcPressed = "pressed";
+const string ButtonStateHelper::pcDisabled = "disabled";
+const string ButtonStateHelper::toString(const int val) {
+ switch (val) {
+ case NORMAL:
+ return pcNormal;
+ case PRESSED:
+ return pcPressed;
+ case DISABLED:
+ return pcDisabled;
+ default:
+ return pcNormal;
+ }
+}
+int ButtonStateHelper::Int(const string str) {
+ if (str == pcNormal) {
+ return NORMAL;
+ } else if (str == pcPressed) {
+ return PRESSED;
+ } else if (str == pcDisabled) {
+ return DISABLED;
+ } else {
+ return NORMAL;
+ }
+}
+///////////////////////////////////////////////////
+const string KeyTypeHelper::pcNone = "none";
+const string KeyTypeHelper::pcChar = "char";
+const string KeyTypeHelper::pcControl = "control";
+const string KeyTypeHelper::pcModechange = "modechange";
+const string KeyTypeHelper::pcString = "string";
+const string KeyTypeHelper::pcUser = "user";
+const string KeyTypeHelper::toString(const int val) {
+ switch (val) {
+ case NONE:
+ return pcNone;
+ case CHAR:
+ return pcChar;
+ case CONTROL:
+ return pcControl;
+ case MODECHANGE:
+ return pcModechange;
+ case STRING:
+ return pcString;
+ case USER:
+ return pcUser;
+ default:
+ return pcNone;
+ }
+}
+
+int KeyTypeHelper::Int(const string str) {
+ if (str == pcNone) {
+ return NONE;
+ } else if (str == pcChar) {
+ return CHAR;
+ } else if (str == pcControl) {
+ return CONTROL;
+ } else if (str == pcModechange) {
+ return MODECHANGE;
+ } else if (str == pcString) {
+ return STRING;
+ } else if (str == pcUser) {
+ return USER;
+ } else {
+ return NONE;
+ }
+}
+/////////////////////////////////////////////////////////
+const string PopupTypeHelper::pcNone = "none";
+const string PopupTypeHelper::pcBtn_Release_Popup = "release_popup";
+const string PopupTypeHelper::pcBtn_Release_Popup_Once = "release_popup_once";
+const string PopupTypeHelper::pcBtn_Press_Popup_Drag = "press_popup_drag";
+const string PopupTypeHelper::pcLongpress_Popup = "longpress_popup";
+const string PopupTypeHelper::pcLongpress_Popup_Once = "longpress_popup_once";
+const string PopupTypeHelper::pcAuto_Popup = "auto_popup";
+
+const string PopupTypeHelper::toString(const int val) {
+ switch (val) {
+ case NONE:
+ return pcNone;
+ case BTN_RELEASE_POPUP:
+ return pcBtn_Release_Popup;
+ case BTN_RELEASE_POPUP_ONCE:
+ return pcBtn_Release_Popup_Once;
+ case BTN_PRESS_POPUP_DRAG:
+ return pcBtn_Press_Popup_Drag;
+ case LONGPRESS_POPUP:
+ return pcLongpress_Popup;
+ case LONGPRESS_POPUP_ONCE:
+ return pcLongpress_Popup_Once;
+ case AUTO_POPUP:
+ return pcAuto_Popup;
+ default:
+ return pcNone;
+ }
+}
+int PopupTypeHelper::Int(const string str) {
+ if (str == pcNone) {
+ return NONE;
+ } else if (str == pcBtn_Release_Popup) {
+ return BTN_RELEASE_POPUP;
+ } else if (str == pcBtn_Release_Popup_Once) {
+ return BTN_RELEASE_POPUP_ONCE;
+ } else if (str == pcBtn_Press_Popup_Drag) {
+ return BTN_PRESS_POPUP_DRAG;
+ } else if (str == pcLongpress_Popup) {
+ return LONGPRESS_POPUP;
+ } else if (str == pcLongpress_Popup_Once) {
+ return LONGPRESS_POPUP_ONCE;
+ } else if (str == pcAuto_Popup) {
+ return AUTO_POPUP;
+ } else {
+ return NONE;
+ }
+}
+////////////////////////////////////////////////////////
+const string DragStateHelper::pcNone = "none";
+const string DragStateHelper::pcLeft = "left";
+const string DragStateHelper::pcRight = "right";
+const string DragStateHelper::pcUp = "up";
+const string DragStateHelper::pcDown = "down";
+const string DragStateHelper::pcInvalid = "invalid";
+const string DragStateHelper::pcReturn = "return";
+
+const string DragStateHelper::toString(const int val) {
+ switch (val) {
+ case NONE:
+ return pcNone;
+ case LEFT:
+ return pcLeft;
+ case RIGHT:
+ return pcRight;
+ case UP:
+ return pcUp;
+ case DOWN:
+ return pcDown;
+ case INVALID:
+ return pcInvalid;
+ case RETURN:
+ return pcReturn;
+ default:
+ return pcNone;
+ }
+}
+
+int DragStateHelper::Int(const string str) {
+ if (str == pcNone) {
+ return NONE;
+ } else if (str == pcLeft) {
+ return LEFT;
+ } else if (str == pcRight) {
+ return RIGHT;
+ } else if (str == pcUp) {
+ return UP;
+ } else if (str == pcDown) {
+ return DOWN;
+ } else if (str == pcInvalid) {
+ return INVALID;
+ } else if (str == pcReturn) {
+ return RETURN;
+ } else {
+ return NONE;
+ }
+}
+/////////////////////////////////////////////////////////////
+const string ExtraOptionHelper::pcOption_4_directions = "4-directions";
+const string ExtraOptionHelper::pcOption_8_directions = "8-directions";
+const string ExtraOptionHelper::pcOption_4_directions_long = "4-directions-long";
+const string ExtraOptionHelper::pcOption_8_directions_long = "8-directions-long";
+const string ExtraOptionHelper::pcOption_4_directions_return = "4-directions-return";
+const string ExtraOptionHelper::pcOption_8_directions_return = "8-directions-return";
+const string ExtraOptionHelper::pcOption_4_directions_return_curve = "4-directions-return-curve";
+
+const string ExtraOptionHelper::toString(const int val) {
+ switch (val) {
+ case OPTION_4_DIRECTIONS:
+ return pcOption_4_directions;
+ case OPTION_8_DIRECTIONS:
+ return pcOption_8_directions;
+ case OPTION_4_DIRECTIONS_LONG:
+ return pcOption_4_directions_long;
+ case OPTION_8_DIRECTIONS_LONG:
+ return pcOption_8_directions_long;
+ case OPTION_4_DIRECTIONS_RETURN:
+ return pcOption_4_directions_return;
+ case OPTION_8_DIRECTIONS_RETURN:
+ return pcOption_8_directions_return;
+ case OPTION_4_DIRECTIONS_RETURN_CURVE:
+ return pcOption_4_directions_return_curve;
+ default:
+ return pcOption_4_directions;
+ }
+}
+int ExtraOptionHelper::Int(const string str) {
+ if (str == pcOption_4_directions) {
+ return OPTION_4_DIRECTIONS;
+ } else if (str == pcOption_8_directions) {
+ return OPTION_8_DIRECTIONS;
+ } else if (str == pcOption_4_directions_long) {
+ return OPTION_4_DIRECTIONS_LONG;
+ } else if (str == pcOption_8_directions_long) {
+ return OPTION_8_DIRECTIONS_LONG;
+ } else if (str == pcOption_4_directions_return) {
+ return OPTION_4_DIRECTIONS_RETURN;
+ } else if (str == pcOption_8_directions_return) {
+ return OPTION_8_DIRECTIONS_RETURN;
+ } else if (str == pcOption_4_directions_return_curve) {
+ return OPTION_4_DIRECTIONS_RETURN_CURVE;
+ } else {
+ return OPTION_4_DIRECTIONS;
+ }
+}
+/////////////////////////////////////////////////////////////////////////////
+const string MultitouchTypeHelper::pcExclusive = "exclusive";
+const string MultitouchTypeHelper::pcCooperative = "cooperative";
+const string MultitouchTypeHelper::pcGrab_Sub_Events = "grab_sub_events";
+
+const string MultitouchTypeHelper::toString(const int val) {
+ switch (val) {
+ case EXCLUSIVE:
+ return pcExclusive;
+ case COOPERATIVE:
+ return pcCooperative;
+ case GRAB_SUB_EVENTS:
+ return pcGrab_Sub_Events;
+ default:
+ return pcExclusive;
+ }
+}
+int MultitouchTypeHelper::Int(const string str) {
+ if (str == pcExclusive) {
+ return EXCLUSIVE;
+ } else if (str == pcCooperative) {
+ return COOPERATIVE;
+ } else if (str == pcGrab_Sub_Events) {
+ return GRAB_SUB_EVENTS;
+ } else {
+ return EXCLUSIVE;
+ }
+}
+////////////////////////////////////////////////////
+const string BOOLTypeHelper::pcTrue = "true";
+const string BOOLTypeHelper::pcFalse = "false";
+
+const string BOOLTypeHelper::toString(const bool val) {
+ if (val) return pcTrue;
+ return pcFalse;
+}
+int BOOLTypeHelper::Bool(const string str) {
+ if (str == pcFalse) {
+ return false;
+ } else if (str == pcTrue) {
+ return true;
+ } else {
+ return false;
+ }
+}
+/////////////////////////////////////////////////
+const string INTTypeHelper::dextoString(const int val) {
+ char temp[8] = {0};
+ snprintf(temp, sizeof(temp), "0x%x", val);
+ return string(temp);
+}
+const string INTTypeHelper::toString(const int val) {
+ char temp[8] = {0};
+ snprintf(temp, sizeof(temp), "%d", val);
+ return string(temp);
+}
+int INTTypeHelper::Int(const string str) {
+ int val = 0;
+ stringstream convertor(str);
+
+ convertor >> val;
+ if (convertor.fail() == true) {
+ val = 0;
+ }
+
+ return val;
+}
+int INTTypeHelper::dexInt(const string str) {
+ int val = 0;
+ stringstream convertor(str);
+
+ convertor >> hex >> val;
+ if (convertor.fail() == true) {
+ val = 0;
+ }
+ return val;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __KEYSET_ATTR_HELPER__H__
+#define __KEYSET_ATTR_HELPER__H__
+#include <string>
+
+class RotationHelper{
+ public:
+ static const int PORTRAIT = 0;
+ static const int LANDSCAPE = 1;
+ static const int MAX = 2;
+ static const int DEFAULT = 0;
+
+ static const std::string pcPortrait;
+ static const std::string pcLandscape;
+ static const std::string toString(const int val);
+
+ static int Int(const std::string str);
+};
+class PopStyleHelper{
+ public:
+ static const int BASE = 0;
+ static const int POPUP = 1;
+ static const int POPUP_GRAB = 2;
+ static const int MAX = 3;
+ static const int DEFAULT = 0;
+
+ static const std::string pcBase;
+ static const std::string pcPopup;
+ static const std::string pcPopup_Grab;
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+};
+class ButtonTypeHelper{
+ public:
+ //button type
+ static const int NORMAL = 0;
+ static const int GRAB = 1;
+ static const int SELFISH = 2;
+ static const int DRAG = 3;
+ static const int MULTITAP = 4;
+ static const int ROTATION = 5;
+ static const int DIRECTION = 6;
+ static const int RELATIVE_DIRECTION = 7;
+ static const int TOGGLE = 8;
+ static const int UIITEM = 9;
+ static const int MAX = 10;
+ static const int DEFAULT = 0;
+
+ static const std::string pcNormal;
+ static const std::string pcGrab;
+ static const std::string pcSelfish;
+ static const std::string pcDrag;
+ static const std::string pcMultitap;
+ static const std::string pcRotation;
+ static const std::string pcDirection;
+ static const std::string pcRelative_Direction;
+ static const std::string pcToggle;
+ static const std::string pcUiitem;
+
+ static const std::string toString(const int val);
+
+ static int Int(const std::string str);
+};
+class ShiftStateHelper{
+ public:
+ static const int ON = 0;
+ static const int OFF = 1;
+ static const int LOC = 2;
+ static const int MAX = 3;
+ static const int DEFAULT = 0;
+
+ static const std::string pcOn;
+ static const std::string pcOff;
+ static const std::string pcLoc;
+
+ static const std::string toString(const int val);
+
+ static int Int(const std::string str);
+};
+class ButtonStateHelper{
+ public:
+ static const int NORMAL = 0;
+ static const int PRESSED = 1;
+ static const int DISABLED = 2;
+ static const int MAX = 3;
+ static const int DEFAULT = 0;
+
+ static const std::string pcNormal;
+ static const std::string pcPressed;
+ static const std::string pcDisabled ;
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+};
+class KeyTypeHelper{
+ public:
+ //key type
+ static const int NONE = 0;
+ static const int CHAR = 1;
+ static const int CONTROL = 2;
+ static const int MODECHANGE = 3;
+ static const int STRING = 4;
+ static const int USER = 5;
+ static const int MAX = 6;
+ static const int DEFAULT = 0;
+
+ static const std::string pcNone;
+ static const std::string pcChar;
+ static const std::string pcControl;
+ static const std::string pcModechange;
+ static const std::string pcString;
+ static const std::string pcUser;
+ static const std::string toString(const int val);
+
+ static int Int(const std::string str);
+};
+class PopupTypeHelper {
+ public:
+ //popup type
+ static const int NONE = 0;
+ static const int BTN_RELEASE_POPUP = 1;
+ static const int BTN_RELEASE_POPUP_ONCE = 2;
+ static const int BTN_PRESS_POPUP_DRAG = 3;
+ static const int LONGPRESS_POPUP = 4;
+ static const int LONGPRESS_POPUP_ONCE = 5;
+ static const int AUTO_POPUP = 6;
+ static const int MAX = 7;
+ static const int DEFAULT = 0;
+
+ static const std::string pcNone;
+ static const std::string pcBtn_Release_Popup;
+ static const std::string pcBtn_Release_Popup_Once;
+ static const std::string pcBtn_Press_Popup_Drag;
+ static const std::string pcLongpress_Popup;
+ static const std::string pcLongpress_Popup_Once;
+ static const std::string pcAuto_Popup;
+
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+};
+class DragStateHelper{
+ public:
+ //drag state
+ static const int NONE = 0;
+ static const int LEFT = 1;
+ static const int RIGHT = 2;
+ static const int UP = 3;
+ static const int DOWN = 4;
+ static const int INVALID = 5;
+ static const int RETURN = 6;
+ static const int MAX = 7;
+ static const int DEFAULT = 0;
+
+ static const std::string pcNone;
+ static const std::string pcLeft;
+ static const std::string pcRight;
+ static const std::string pcUp;
+ static const std::string pcDown;
+ static const std::string pcInvalid;
+ static const std::string pcReturn;
+
+ static const std::string toString(const int val);
+
+ static int Int(const std::string str);
+};
+class ExtraOptionHelper {
+ public:
+ //extra option
+ static const int OPTION_4_DIRECTIONS = 0;
+ static const int OPTION_8_DIRECTIONS = 1;
+ static const int OPTION_4_DIRECTIONS_LONG = 2;
+ static const int OPTION_8_DIRECTIONS_LONG = 3;
+ static const int OPTION_4_DIRECTIONS_RETURN = 4;
+ static const int OPTION_8_DIRECTIONS_RETURN = 5;
+ static const int OPTION_4_DIRECTIONS_RETURN_CURVE = 6;
+ static const int MAX = 7;
+ static const int DEFAULT = 0;
+
+ static const std::string pcOption_4_directions;
+ static const std::string pcOption_8_directions;
+ static const std::string pcOption_4_directions_long;
+ static const std::string pcOption_8_directions_long;
+ static const std::string pcOption_4_directions_return;
+ static const std::string pcOption_8_directions_return;
+ static const std::string pcOption_4_directions_return_curve;
+
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+};
+
+class MultitouchTypeHelper{
+ public:
+ //multitouch type
+ static const int EXCLUSIVE = 0;
+ static const int COOPERATIVE = 1;
+ static const int GRAB_SUB_EVENTS = 2;
+ static const int MAX = 3;
+ static const int DEFAULT = 0;
+
+ static const std::string pcExclusive;
+ static const std::string pcCooperative;
+ static const std::string pcGrab_Sub_Events;
+
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+};
+
+class BOOLTypeHelper{
+ public:
+ static const bool DEFAULT = false;
+ static const std::string pcTrue;
+ static const std::string pcFalse;
+
+ static const std::string toString(const bool val);
+ static int Bool(const std::string str);
+};
+class INTTypeHelper{
+ public:
+ static const int DEFAULT = 0;
+ static const std::string dextoString(const int val);
+ static const std::string toString(const int val);
+ static int Int(const std::string str);
+ static int dexInt(const std::string str);
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "magnifier_configure_bin_parser.h"
+#include "file_storage.h"
+#include <assert.h>
+using namespace std;
+#include "put_record.h"
+
+BinMagnifierConfigParser::BinMagnifierConfigParser() {
+ memset((void*)&m_magnifier_configure, 0x00, sizeof(SclMagnifierWndConfigure));
+ parser_info_provider = NULL;
+}
+
+BinMagnifierConfigParser::~BinMagnifierConfigParser() {
+}
+
+BinMagnifierConfigParser* BinMagnifierConfigParser::get_instance() {
+ static BinMagnifierConfigParser instance;
+ return &instance;
+}
+
+void BinMagnifierConfigParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+ parsing_magnifier_configure();
+}
+
+
+void BinMagnifierConfigParser::parsing_magnifier_configure() {
+ Magnifier_configure_width record_width;
+ set_magnifier_configure_width(*parser_info_provider, record_width);
+
+ PSclMagnifierWndConfigure cur = &m_magnifier_configure;
+
+ // skip data_size
+ m_storage.advance(8);
+
+ //style
+ cur->style = (SCLMagnifierStyle)m_storage.get<sint_t>(record_width.style);
+ //width
+ cur->width = m_storage.get<sint_t>(record_width.width);
+ //height
+ cur->height = m_storage.get<sint_t>(record_width.height);
+ //label_area_record.left
+ cur->label_area_rect.left = m_storage.get<sint_t>(record_width.label_area_rect);
+ //label_area_rect.right
+ cur->label_area_rect.right = m_storage.get<sint_t>(record_width.label_area_rect);
+
+ //label_area_record.top
+ cur->label_area_rect.top = m_storage.get<sint_t>(record_width.label_area_rect);
+ //label_area_rect.bottom
+ cur->label_area_rect.bottom = m_storage.get<sint_t>(record_width.label_area_rect);
+ //bg_image_path
+ m_storage.get_str(&(cur->bg_image_path), record_width.bg_image_path, m_string_collector);
+
+ //bg_shift_image_path
+ m_storage.get_str(&(cur->bg_shift_image_path), record_width.bg_shift_image_path, m_string_collector);
+
+ //bg_shift_lock_image_path
+ m_storage.get_str(&(cur->bg_shift_lock_image_path), record_width.bg_shift_lock_image_path, m_string_collector);
+
+ //bg_long_key_image_path
+ m_storage.get_str(&(cur->bg_long_key_image_path), record_width.bg_long_key_image_path, m_string_collector);
+ //use_actual_window
+ cur->use_actual_window = m_storage.get<sint_t>(record_width.use_actual_window);
+ //label_name
+ m_storage.get_str(&(cur->label_type), record_width.label_type, m_string_collector);
+ //padding_x
+ cur->padding_x = m_storage.get<sint_t>(record_width.padding_x);
+ //padding_y
+ cur->padding_y = m_storage.get<sint_t>(record_width.padding_y);
+ //show_shift_label
+ cur->show_shift_label = m_storage.get<sint_t>(record_width.show_shift_label);
+
+#ifdef __SCL_TXT_DEBUG
+ put_magnifier_wnd_configure(DECODE, m_magnifier_configure);
+#endif
+}
+
+PSclMagnifierWndConfigure BinMagnifierConfigParser::get_magnifier_configure() {
+ return &m_magnifier_configure;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BinMagnifierConfigParser__H__
+#define __BinMagnifierConfigParser__H__
+#include "sclres_type.h"
+#include "string_collector.h"
+#include "iparserinfo_provider.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+
+class BinMagnifierConfigParser {
+public:
+ ~BinMagnifierConfigParser();
+ static BinMagnifierConfigParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+
+ PSclMagnifierWndConfigure get_magnifier_configure();
+private:
+ BinMagnifierConfigParser();
+ void parsing_magnifier_configure();
+
+private:
+ SclMagnifierWndConfigure m_magnifier_configure;
+ StringCollector m_string_collector;
+ FileStorage m_storage;
+ IParserInfo_Provider* parser_info_provider;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <string.h>
+#include <libxml/parser.h>
+
+#include "magnifier_configure_parser.h"
+#include <assert.h>
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+using namespace std;
+
+static SCLMagnifierStyle
+get_content_magnifier_style(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ SCLMagnifierStyle style = MAGNIFIER_STYLE_LABEL_ONLY;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+ if (key!= NULL) {
+ if (0 == strcmp("area_capture", (const char*)key)) {
+ style = MAGNIFIER_STYLE_SEL_AREA_CAPTURE;
+ }
+ xmlFree(key);
+ }
+
+ return style;
+}
+
+class MagnifierConfigureParserImpl {
+ public:
+ MagnifierConfigureParserImpl() {
+ memset((void*)&m_magnifier_configure, 0x00, sizeof(SclMagnifierWndConfigure));
+ }
+
+ ~MagnifierConfigureParserImpl() {
+ reset();
+ }
+
+ void reset() {
+ if (m_magnifier_configure.bg_image_path) {
+ xmlFree(m_magnifier_configure.bg_image_path);
+ m_magnifier_configure.bg_image_path = NULL;
+ }
+ if (m_magnifier_configure.bg_shift_image_path) {
+ xmlFree(m_magnifier_configure.bg_shift_image_path);
+ m_magnifier_configure.bg_shift_image_path = NULL;
+ }
+ if (m_magnifier_configure.bg_shift_lock_image_path) {
+ xmlFree(m_magnifier_configure.bg_shift_lock_image_path);
+ m_magnifier_configure.bg_shift_lock_image_path = NULL;
+ }
+ if (m_magnifier_configure.bg_long_key_image_path) {
+ xmlFree(m_magnifier_configure.bg_long_key_image_path);
+ m_magnifier_configure.bg_long_key_image_path = NULL;
+ }
+ if (m_magnifier_configure.label_type) {
+ xmlFree(m_magnifier_configure.label_type);
+ m_magnifier_configure.label_type = NULL;
+ }
+ for (int loop = 0; loop < MAX_WND_DECORATOR; loop++) {
+ if (m_magnifier_configure.decoration_image_path[loop]) {
+ xmlFree(m_magnifier_configure.decoration_image_path[loop]);
+ m_magnifier_configure.decoration_image_path[loop] = NULL;
+ }
+ }
+
+ memset((void*)&m_magnifier_configure, 0x00, sizeof(SclMagnifierWndConfigure));
+ }
+
+ int reload_magnifier_configure(const char* input_file) {
+ reset();
+ return parsing_magnifier_configure(input_file);
+ }
+
+ int parsing_magnifier_configure(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "MagnifierConfigParser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"magnifier_configure"))
+ {
+ SCLLOG(SclLog::DEBUG, "MagnifierConfigParser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"magnifier_style")) {
+ m_magnifier_configure.style = get_content_magnifier_style(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"width")) {
+ m_magnifier_configure.width = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"height")) {
+ m_magnifier_configure.height = get_content_int(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"label_area")) {
+ parsing_label_area(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"background_image_path")) {
+ parsing_background_images(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"use_window")) {
+ m_magnifier_configure.use_actual_window = get_content_bool(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"label_type")) {
+ xmlChar* temp = xmlNodeGetContent(cur_node);
+ m_magnifier_configure.label_type = (sclchar*)temp;
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"window_decorator")) {
+ get_prop_number(cur_node, "size", &(m_magnifier_configure.decoration_size));
+ parsing_window_decorator_image_path(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"padding")) {
+ parsing_padding_values(cur_node);
+ } else if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"show_shift_label")) {
+ m_magnifier_configure.show_shift_label = get_content_bool(cur_node);
+ }
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+
+ void parsing_label_area(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"left")) {
+ m_magnifier_configure.label_area_rect.left = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"top")) {
+ m_magnifier_configure.label_area_rect.top = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"right")) {
+ m_magnifier_configure.label_area_rect.right = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"bottom")) {
+ m_magnifier_configure.label_area_rect.bottom = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+ void parsing_background_images(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"image")) {
+ if (equal_prop(child_node, "state", "normal")) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ m_magnifier_configure.bg_image_path = (sclchar *)temp;
+ } else if (equal_prop(child_node, "state", "shift")) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ m_magnifier_configure.bg_shift_image_path = (sclchar *)temp;
+ } else if (equal_prop(child_node, "state", "lock")) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ m_magnifier_configure.bg_shift_lock_image_path = (sclchar *)temp;
+ } else if (equal_prop(child_node, "state", "longkey")) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ m_magnifier_configure.bg_long_key_image_path = (sclchar *)temp;
+ }
+ }
+
+ child_node = child_node->next;
+ }
+ }
+ void parsing_window_decorator_image_path(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"window_decorator"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"image")) {
+ if (equal_prop(child_node, "direction", "top_left")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_TOP_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "top_center")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_TOP_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "top_right")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_TOP_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_left")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_MIDDLE_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_center")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_MIDDLE_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "middle_right")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_MIDDLE_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_left")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_BOTTOM_LEFT] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_center")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_BOTTOM_CENTER] = (sclchar *)xmlNodeGetContent(child_node);
+ } else if (equal_prop(child_node, "direction", "bottom_right")) {
+ m_magnifier_configure.decoration_image_path[WND_DECORATOR_BOTTOM_RIGHT] = (sclchar *)xmlNodeGetContent(child_node);
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+ void parsing_padding_values(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"x")) {
+ m_magnifier_configure.padding_x = get_content_int(child_node);
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar *)"y")) {
+ m_magnifier_configure.padding_y = get_content_int(child_node);
+ }
+
+ child_node = child_node->next;
+ }
+ }
+ SclMagnifierWndConfigure m_magnifier_configure;
+};
+
+MagnifierConfigParser::MagnifierConfigParser() {
+ m_impl = new MagnifierConfigureParserImpl;
+}
+
+MagnifierConfigParser::~MagnifierConfigParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~MagnifierConfigParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+MagnifierConfigParser*
+MagnifierConfigParser::get_instance() {
+ static MagnifierConfigParser instance;
+ return &instance;
+}
+
+int
+MagnifierConfigParser::init(const char* file) {
+ return m_impl->parsing_magnifier_configure(file);
+}
+
+int
+MagnifierConfigParser::reload(const char* file) {
+ return m_impl->reload_magnifier_configure(file);
+}
+
+PSclMagnifierWndConfigure
+MagnifierConfigParser::get_magnifier_configure() {
+ return &m_impl->m_magnifier_configure;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __MagnifierConfigParser__H__
+#define __MagnifierConfigParser__H__
+#include "sclres_type.h"
+
+typedef SclMagnifierWndConfigure *PSclMagnifierWndConfigure;
+
+class MagnifierConfigureParserImpl;
+
+class MagnifierConfigParser {
+ MagnifierConfigureParserImpl *m_impl;
+public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclMagnifierWndConfigure get_magnifier_configure();
+public:
+ ~MagnifierConfigParser();
+ static MagnifierConfigParser *get_instance();
+private:
+ MagnifierConfigParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <libxml/parser.h>
+
+#include "main_entry_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+
+using namespace std;
+
+class MainEntryParserImpl {
+ public:
+ int parsing_main_entry(const char *input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"main-entry"))
+ {
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ make_xml_files(cur_node);
+
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+ int reload_main_entry(const char *input_file) {
+ m_xml_files.reset();
+ return parsing_main_entry(input_file);
+ }
+ void make_xml_files(const xmlNodePtr p_node) {
+ assert(p_node != NULL);
+ xmlNodePtr node = p_node->xmlChildrenNode;
+ while (node != NULL) {
+ if (0 == xmlStrcmp(node->name, (const xmlChar *)"files")) {
+ parsing_files_node(node);
+ }
+ node = node->next;
+ }
+ }
+
+ void parsing_files_node(const xmlNodePtr p_node) {
+ assert(p_node != NULL);
+ xmlNodePtr node = p_node->xmlChildrenNode;
+
+ while (node != NULL) {
+ if (0 == xmlStrcmp(node->name, (const xmlChar *)"input-mode-configure")) {
+ m_xml_files.input_mode_configure = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"layout")) {
+ m_xml_files.layout = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"key-label-property")) {
+ m_xml_files.key_label_property = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"modifier-decoration")) {
+ m_xml_files.modifier_decoration = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"default-configure")) {
+ m_xml_files.default_configure = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"autopopup-configure")) {
+ m_xml_files.autopopup_configure = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"magnifier-configure")) {
+ m_xml_files.magnifier_configure = (char*)xmlNodeGetContent(node);
+ } else if (0 == xmlStrcmp(node->name, (const xmlChar *)"nine-patch-file-list")) {
+ m_xml_files.nine_patch_file_list = (char*)xmlNodeGetContent(node);
+ }
+ node = node->next;
+ }
+ }
+ XMLFiles m_xml_files;
+};
+
+MainEntryParser::MainEntryParser() {
+ m_impl = new MainEntryParserImpl;
+}
+
+MainEntryParser::~MainEntryParser() {
+ if (m_impl) {
+ delete m_impl;
+ }
+}
+
+MainEntryParser*
+MainEntryParser::get_instance() {
+ static MainEntryParser instance;
+ return &instance;
+}
+
+int
+MainEntryParser::init(const char* path) {
+ return m_impl->parsing_main_entry(path);
+}
+
+int
+MainEntryParser::reload(const char* path) {
+ return m_impl->reload_main_entry(path);
+}
+
+XMLFiles&
+MainEntryParser::get_xml_files() {
+ return m_impl->m_xml_files;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <libxml/parser.h>
+
+#ifndef __MainEntryParser__H__
+#define __MainEntryParser__H__
+class XMLFiles{
+ public:
+ char* input_mode_configure;
+ char* layout;
+ char* default_configure;
+ char* autopopup_configure;
+ char* magnifier_configure;
+ char* key_label_property;
+ char* modifier_decoration;
+ char* nine_patch_file_list;
+
+ public:
+ XMLFiles() {
+ input_mode_configure = NULL;
+ layout = NULL;
+ key_label_property = NULL;
+ modifier_decoration = NULL;
+ default_configure = NULL;
+ autopopup_configure = NULL;
+ magnifier_configure = NULL;
+ nine_patch_file_list = NULL;
+ }
+ ~XMLFiles() {
+ reset();
+ }
+ void reset() {
+ if (input_mode_configure)
+ xmlFree(input_mode_configure);
+ if (layout)
+ xmlFree(layout);
+ if (key_label_property)
+ xmlFree(key_label_property);
+ if (modifier_decoration)
+ xmlFree(modifier_decoration);
+ if (default_configure)
+ xmlFree(default_configure);
+ if (autopopup_configure)
+ xmlFree(autopopup_configure);
+ if (magnifier_configure)
+ xmlFree(magnifier_configure);
+ if (nine_patch_file_list)
+ xmlFree(nine_patch_file_list);
+
+ input_mode_configure = NULL;
+ layout = NULL;
+ key_label_property = NULL;
+ modifier_decoration = NULL;
+ default_configure = NULL;
+ autopopup_configure = NULL;
+ magnifier_configure = NULL;
+ nine_patch_file_list = NULL;
+ }
+};
+
+class MainEntryParserImpl;
+class MainEntryParser {
+ MainEntryParserImpl *m_impl;
+ public:
+ /* parsing xml file, path is assigned */
+ int init(const char* path);
+ int reload(const char* path);
+
+ XMLFiles& get_xml_files();
+ public:
+ ~MainEntryParser();
+ static MainEntryParser *get_instance();
+ private:
+ MainEntryParser();
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __META_FIELD_H__
+#define __META_FIELD_H__
+//each field:
+//1. the name
+//2. the width of the field
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <vector>
+const int FIELD_SIZE_WIDTH = 2;
+class MetaData_Field{
+ public:
+ MetaData_Field():m_name(NULL), m_type(NULL), m_width(0) {
+ }
+ public:
+ const char* m_name;
+ const char* m_type;
+ int m_width;
+};
+
+const int RECORD_SIZE_WIDTH = 2;
+class MetaData_Record{
+ public:
+ MetaData_Record():m_name(NULL) {}
+ const char* m_name;
+ std::vector<MetaData_Field> vField;
+};
+
+class MetaData{
+ public:
+ MetaData():m_version(NULL) {}
+ const char* m_version;
+ std::vector<MetaData_Record> m_vec_metadata_record;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "metadata_bin_parser.h"
+Metadata_Bin_Parser::Metadata_Bin_Parser(const FileStorage& storage, int offset, int size) {
+ m_storage.get_storage(storage, offset, size);
+ parse();
+}
+Metadata_Bin_Parser::~Metadata_Bin_Parser() {
+}
+
+void
+Metadata_Bin_Parser::parse() {
+ // skip block_size
+ m_storage.advance(8);
+
+ metadata.m_version = m_storage.get_str();
+
+ unsigned short num = m_storage.get<sint_t>(RECORD_SIZE_WIDTH);
+ for (int i = 0; i < num; ++i) {
+ MetaData_Record temp;
+ decode_record(temp);
+ metadata.m_vec_metadata_record.push_back(temp);
+ }
+}
+void Metadata_Bin_Parser::decode_record(MetaData_Record& metadata_record) {
+ metadata_record.m_name = m_storage.get_str();
+ unsigned short field_num = 0;
+ field_num = m_storage.get<sint_t>(FIELD_NUM_WIDTH);
+ for (int i = 0; i < field_num; ++i) {
+ MetaData_Field temp;
+ temp.m_name = m_storage.get_str();
+ temp.m_type = m_storage.get_str();
+ temp.m_width = m_storage.get<sint_t>(FIELD_SIZE_WIDTH);
+ metadata_record.vField.push_back(temp);
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __METADATA_BIN_PARSER_H__
+#define __METADATA_BIN_PARSER_H__
+#include "metadata.h"
+#include "file_storage_impl.h"
+#include "string_collector.h"
+class Metadata_Bin_Parser{
+ public:
+ static const int FIELD_NUM_WIDTH = 2;
+ Metadata_Bin_Parser(const FileStorage& storage, int, int);
+ ~Metadata_Bin_Parser();
+ const MetaData* get_metadata()const {
+ return &metadata;
+ }
+ private:
+ void parse();
+ void decode_record(MetaData_Record& metadata_record);
+ MetaData metadata;
+ FileStorage m_storage;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __METADATA_PROVIDER_H__
+#define __METADATA_PROVIDER_H_
+#include "imetadata_provider.h"
+#include "metadata_bin_parser.h"
+#include <dlog.h>
+
+class Metadata_Provider:public IMetadata_Provider{
+ public:
+ Metadata_Provider(const Metadata_Bin_Parser* metadataParser):m_metadataParser(metadataParser) {
+ current_record_name = NULL;
+ curRecordIndex = -1;
+ }
+
+ int get_width(const char* field_name)const {
+ const MetaData* metadata = m_metadataParser->get_metadata();
+ const MetaData_Record& metadata_record = metadata->m_vec_metadata_record.at(curRecordIndex);
+ std::vector<MetaData_Field>::const_iterator it;
+ for (it = metadata_record.vField.begin(); it != metadata_record.vField.end(); ++it) {
+ if (0 == strcmp(it->m_name, field_name)) {
+ return it->m_width;
+ }
+ }
+
+ return 0;
+ }
+ void set_current_metadata_record(const char*record_name) {
+ assert(record_name != NULL);
+ if (current_record_name == NULL ||0 != strcmp(current_record_name, record_name)) {
+ current_record_name = record_name;
+ curRecordIndex = (int)find_metadata_record_index(record_name);
+ if (curRecordIndex == -1) {
+ LOGW("Can not find %s metadata record.", record_name);
+ }
+ }
+ }
+
+ private:
+ size_t find_metadata_record_index(const char* name)const {
+ if (name == NULL) return -1;
+
+ const MetaData* metadata = m_metadataParser->get_metadata();
+ for (size_t i = 0; i < metadata->m_vec_metadata_record.size(); ++i) {
+ const MetaData_Record& metadata_record = metadata->m_vec_metadata_record.at(i);
+
+ if (0 == strcmp(metadata_record.m_name, name)) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+ const Metadata_Bin_Parser *m_metadataParser;
+ const char* current_record_name;
+ int curRecordIndex;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "modifier_decoration_bin_parser.h"
+#include <memory.h>
+#include "put_record.h"
+
+BinModifierDecorationParser::BinModifierDecorationParser() {
+ memset(m_modifier_decoration_table, 0x00, sizeof(SclModifierDecoration) * MAX_SCL_MODIFIER_DECORATION_NUM);
+ parser_info_provider = NULL;
+}
+
+BinModifierDecorationParser::~BinModifierDecorationParser() {
+}
+
+BinModifierDecorationParser*
+BinModifierDecorationParser::get_instance() {
+ static BinModifierDecorationParser instance;
+ return &instance;
+}
+void
+BinModifierDecorationParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+
+ parsing_modifier_decoration_table();
+}
+
+/* recompute_layout will change the table */
+PSclModifierDecoration BinModifierDecorationParser::get_modifier_decoration_table() {
+ return m_modifier_decoration_table;
+}
+
+void
+BinModifierDecorationParser::parsing_modifier_decoration_table() {
+ PSclModifierDecoration cur = m_modifier_decoration_table;
+
+ Modifier_decoration_width record_width;
+ set_modifier_decoration_width(*parser_info_provider, record_width);
+
+ // skip data_size
+ m_storage.advance(8);
+
+ int size = m_storage.get<sint_t>(4);
+ for (int i = 0; i < size; ++i) {
+ cur->valid = (sclboolean)true;
+ m_storage.get<sint_t>(record_width.extract_background);
+ m_storage.get_str(&(cur->name), record_width.name, m_string_collector);
+ for (int m = 0; m < DISPLAYMODE_MAX; ++m) {
+ for (int n = 0; n < KEY_MODIFIER_MAX; ++n) {
+ m_storage.get_str(&(cur->bg_image_path[m][n]), record_width.bg_image_path, m_string_collector);
+ }
+ }
+
+ cur++;
+ }
+#ifdef __SCL_TXT_DEBUG
+ put_modifier_decoration(DECODE, m_modifier_decoration_table);
+#endif
+}
+
+int
+BinModifierDecorationParser::get_modifier_decoration_id(const char *name )
+{
+ if (name == NULL) return -1;
+
+ for (int i = 0; i < MAX_SCL_MODIFIER_DECORATION_NUM; ++i) {
+ if ( m_modifier_decoration_table[i].name ) {
+ if ( 0 == strcmp(m_modifier_decoration_table[i].name, name) ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BinModifierDecorationParser__H__
+#define __BinModifierDecorationParser__H__
+#include <libxml/parser.h>
+#include "sclres_type.h"
+#include "iparserinfo_provider.h"
+#include <vector>
+#include "string_collector.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+
+class BinModifierDecorationParser {
+ public:
+ ~BinModifierDecorationParser();
+ static BinModifierDecorationParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+ PSclModifierDecoration get_modifier_decoration_table();
+ int get_modifier_decoration_id(const char *name);
+ private:
+ BinModifierDecorationParser();
+ void parsing_modifier_decoration_table();
+
+ private:
+ SclModifierDecoration m_modifier_decoration_table[MAX_SCL_MODIFIER_DECORATION_NUM];
+ IParserInfo_Provider *parser_info_provider;
+
+ StringCollector m_string_collector;
+ FileStorage m_storage;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <memory.h>
+#include <libxml/parser.h>
+
+#include "modifier_decoration_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+
+static int get_key_modifier_state_prop(const char*);
+//UTILS
+typedef struct _Modifier_decoration_state_match_table {
+ int modifier_decoration_state;
+ const char* key;
+}Modifier_decoration_state_match_table_t;
+
+typedef struct _Key_modifier_state_match_table {
+ int key_modifier_state;
+ const char* key;
+}Key_modifier_state_match_table_t;
+
+static int
+get_key_modifier_state_prop(const char* key ) {
+ static Key_modifier_state_match_table_t table[] = {
+ {KEY_MODIFIER_NONE, "none" },
+ {KEY_MODIFIER_LONGKEY, "longkey" },
+ {KEY_MODIFIER_MULTITAP_START, "multitap_start" },
+ {KEY_MODIFIER_MULTITAP_REPEAT, "multitap_repeat" },
+ {KEY_MODIFIER_DIRECTION_LEFT, "direction_left" },
+ {KEY_MODIFIER_DIRECTION_RIGHT, "direction_right" },
+ {KEY_MODIFIER_DIRECTION_UP, "direction_up" },
+ {KEY_MODIFIER_DIRECTION_DOWN, "direction_down" },
+ {KEY_MODIFIER_DIRECTION_UP_LEFT, "direction_up_left" },
+ {KEY_MODIFIER_DIRECTION_UP_RIGHT, "direction_up_right" },
+ {KEY_MODIFIER_DIRECTION_DOWN_LEFT, "direction_down_left" },
+ {KEY_MODIFIER_DIRECTION_DOWN_RIGHT, "direction_down_right" },
+
+ {KEY_MODIFIER_DIRECTION_LEFT_LONG, "direction_left_long" },
+ {KEY_MODIFIER_DIRECTION_RIGHT_LONG, "direction_right_long" },
+ {KEY_MODIFIER_DIRECTION_UP_LONG, "direction_up_long" },
+ {KEY_MODIFIER_DIRECTION_DOWN_LONG, "direction_down_long" },
+ {KEY_MODIFIER_DIRECTION_UP_LEFT_LONG, "direction_up_left_long" },
+ {KEY_MODIFIER_DIRECTION_UP_RIGHT_LONG, "direction_up_right_long" },
+ {KEY_MODIFIER_DIRECTION_DOWN_LEFT_LONG, "direction_down_left_long" },
+ {KEY_MODIFIER_DIRECTION_DOWN_RIGHT_LONG, "direction_down_right_long" },
+
+ {KEY_MODIFIER_DIRECTION_LEFT_RETURN, "direction_left_return" },
+ {KEY_MODIFIER_DIRECTION_RIGHT_RETURN, "direction_right_return" },
+ {KEY_MODIFIER_DIRECTION_UP_RETURN, "direction_up_return" },
+ {KEY_MODIFIER_DIRECTION_DOWN_RETURN, "direction_down_return" },
+ {KEY_MODIFIER_DIRECTION_UP_LEFT_RETURN, "direction_up_left_return" },
+ {KEY_MODIFIER_DIRECTION_UP_RIGHT_RETURN, "direction_up_right_return" },
+ {KEY_MODIFIER_DIRECTION_DOWN_LEFT_RETURN, "direction_down_left_return" },
+ {KEY_MODIFIER_DIRECTION_DOWN_RIGHT_RETURN, "direction_down_right_return" },
+
+ {KEY_MODIFIER_DIRECTION_CURVE_UP_LEFT, "direction_curve_up_left" },
+ {KEY_MODIFIER_DIRECTION_CURVE_UP_RIGHT, "direction_curve_up_right" },
+ {KEY_MODIFIER_DIRECTION_CURVE_DOWN_LEFT, "direction_curve_down_left" },
+ {KEY_MODIFIER_DIRECTION_CURVE_DOWN_RIGHT, "direction_curve_down_right" },
+ {KEY_MODIFIER_DIRECTION_CURVE_LEFT_UP, "direction_curve_left_up" },
+ {KEY_MODIFIER_DIRECTION_CURVE_LEFT_DOWN, "direction_curve_left_down" },
+ {KEY_MODIFIER_DIRECTION_CURVE_RIGHT_UP, "direction_curve_right_up" },
+ {KEY_MODIFIER_DIRECTION_CURVE_RIGHT_DOWN, "direction_curve_right_down" }
+ };
+
+ int key_modifier_state = KEY_MODIFIER_NONE;
+
+ for (size_t i = 0; i < sizeof(table)/sizeof(Key_modifier_state_match_table_t); ++i) {
+ if (0 == strcmp(key, table[i].key) )
+ {
+ key_modifier_state = table[i].key_modifier_state;
+ break;
+ }
+ }
+ return key_modifier_state;
+}
+
+class ModifierDecorationParserImpl {
+ public:
+ ModifierDecorationParserImpl() {
+ memset(m_modifier_decoration_table, 0x00, sizeof(SclModifierDecoration) * MAX_SCL_MODIFIER_DECORATION_NUM);
+ }
+
+ ~ModifierDecorationParserImpl() {
+ reset();
+ }
+
+ void reset()
+ {
+ for (int i = 0; i < MAX_SCL_MODIFIER_DECORATION_NUM; ++i) {
+ SclModifierDecoration& cur_rec = m_modifier_decoration_table[i];
+ for (int display_state = 0; display_state < DISPLAYMODE_MAX; ++display_state) {
+ for (int key_modifier_state = 0; key_modifier_state < KEY_MODIFIER_MAX; ++key_modifier_state) {
+ if (cur_rec.bg_image_path[display_state][key_modifier_state])
+ delete cur_rec.bg_image_path[display_state][key_modifier_state];
+ cur_rec.bg_image_path[display_state][key_modifier_state] = NULL;
+ }
+ }
+ }
+ memset(m_modifier_decoration_table, 0x00, sizeof(SclModifierDecoration) * MAX_SCL_MODIFIER_DECORATION_NUM);
+ }
+ int reload_modifier_decoration_table(const char* input_file) {
+ reset();
+ return parsing_modifier_decoration_table(input_file);
+ }
+
+ int parsing_modifier_decoration_table(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "ModifierDecorationParser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"modifier_decoration_table"))
+ {
+ SCLLOG(SclLog::DEBUG, "ModifierDecorationParser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+
+ SclModifierDecoration* cur_rec = m_modifier_decoration_table;
+
+ int size = 0;
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"modifier_decoration_record")) {
+ parsing_modifier_decoration_record(cur_node, cur_rec);
+ size++;
+ cur_rec++;
+ if (size >= MAX_SCL_MODIFIER_DECORATION_NUM) {
+ SCLLOG(SclLog::ERROR, "No Space for modifier decoration record.");
+ break;
+ }
+ }
+
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+
+ void parsing_modifier_decoration_record(const xmlNodePtr cur_node, const PSclModifierDecoration cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+
+ set_modifier_decoration_default_record(cur_rec);
+
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"name")) {
+ xmlChar* temp = xmlNodeGetContent(child_node);
+ cur_rec->name = (sclchar *)temp;
+ cur_rec->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"display_part_background")) {
+ cur_rec->extract_background = get_content_bool(child_node);
+ cur_rec->valid = TRUE;
+ } else if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"background_image_path")) {
+ parsing_background_image_record_node(child_node, cur_rec);
+ cur_rec->valid = TRUE;
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ void set_modifier_decoration_default_record(const PSclModifierDecoration cur_rec) {
+ cur_rec->valid = FALSE;
+ cur_rec->extract_background = false;
+ cur_rec->name = NULL;
+ for (int display_state = 0; display_state < DISPLAYMODE_MAX; ++display_state) {
+ for (int key_modifier_state = 0; key_modifier_state < KEY_MODIFIER_MAX; ++key_modifier_state) {
+ cur_rec->bg_image_path[display_state][key_modifier_state] = NULL;
+ }
+ }
+ }
+
+ void parsing_background_image_record_node(const xmlNodePtr cur_node, const PSclModifierDecoration cur_rec) {
+ assert(cur_node != NULL);
+ assert(cur_rec != NULL);
+ assert(0 == xmlStrcmp(cur_node->name, (const xmlChar*)"background_image_path"));
+ xmlNodePtr child_node = cur_node->xmlChildrenNode;
+
+ while (child_node != NULL) {
+ if (0 == xmlStrcmp(child_node->name, (const xmlChar*)"image")) {
+ /* FIXME */
+ int display_state = DISPLAYMODE_PORTRAIT;
+ xmlChar* display_state_xml = xmlGetProp(child_node, (const xmlChar*)"display_state");
+ if (display_state_xml != NULL) {
+ if (0 == xmlStrcmp(display_state_xml, (const xmlChar*)"landscape")) {
+ display_state = DISPLAYMODE_LANDSCAPE;
+ }
+ xmlFree(display_state_xml);
+ }
+
+ int key_modifier_state = KEY_MODIFIER_NONE;
+ xmlChar* key_modifier_state_xml = xmlGetProp(child_node, (const xmlChar*)"key_modifier_state");
+ if (key_modifier_state_xml != NULL) {
+ key_modifier_state = get_key_modifier_state_prop((const char*)key_modifier_state_xml);
+ xmlFree(key_modifier_state_xml);
+ }
+
+ if (display_state != -1 && key_modifier_state != -1) {
+ sclchar* key = (sclchar*)xmlNodeGetContent(child_node);
+ cur_rec->bg_image_path[display_state][key_modifier_state] = key;
+ //Warning:: Donot xmlFree key
+ }
+ }
+ child_node = child_node->next;
+ }
+ }
+
+ SclModifierDecoration m_modifier_decoration_table[MAX_SCL_MODIFIER_DECORATION_NUM];
+};
+
+ModifierDecorationParser*
+ModifierDecorationParser::get_instance() {
+ static ModifierDecorationParser instance;
+ return &instance;
+}
+
+ModifierDecorationParser::ModifierDecorationParser() {
+ m_impl = new ModifierDecorationParserImpl;
+}
+
+ModifierDecorationParser::~ModifierDecorationParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~ModifierDecorationParser() has called");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+int
+ModifierDecorationParser::init(const char* file) {
+ return m_impl->parsing_modifier_decoration_table(file);
+}
+
+int
+ModifierDecorationParser::reload(const char* file) {
+ return m_impl->reload_modifier_decoration_table(file);
+}
+
+/* recompute_layout will change the table */
+PSclModifierDecoration
+ModifierDecorationParser::get_modifier_decoration_table() {
+ return m_impl->m_modifier_decoration_table;
+}
+
+int
+ModifierDecorationParser::get_modifier_decoration_id(const char *name)
+{
+ if (name == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_modifier_decoration_id() has failed");
+ return -1;
+ }
+
+ PSclModifierDecoration modifier_decoration_table = get_modifier_decoration_table();
+ if (modifier_decoration_table == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_modifier_decoration_id() has failed");
+ return -1;
+ }
+ for (int i = 0; i < MAX_SCL_MODIFIER_DECORATION_NUM; ++i) {
+ if (modifier_decoration_table[i].name) {
+ if (0 == strcmp(modifier_decoration_table[i].name, name)) {
+ return i;
+ }
+ }
+ }
+
+ SCLLOG(SclLog::DEBUG, "get_modifier_decoration_id() has failed");
+ return -1;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ModifierDecorationParser__H__
+#define __ModifierDecorationParser__H__
+#include "sclres_type.h"
+
+class ModifierDecorationParserImpl;
+
+class ModifierDecorationParser {
+ ModifierDecorationParserImpl *m_impl;
+ public:
+ int init(const char* file);
+ int reload(const char* file);
+ PSclModifierDecoration get_modifier_decoration_table();
+ int get_modifier_decoration_id(const char *name);
+ public:
+ ~ModifierDecorationParser();
+ static ModifierDecorationParser *get_instance();
+ private:
+ ModifierDecorationParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "nine_patch_file_list_bin_parser.h"
+#include <memory.h>
+#include <assert.h>
+#include "put_record.h"
+
+BinNinePatchFileParser::BinNinePatchFileParser() {
+ m_size = 0;
+ memset(m_nine_patch_file_list, 0x00, sizeof(SclNinePatchInfo) * MAX_NINE_PATCH_FILE_LIST);
+ parser_info_provider = NULL;
+}
+
+BinNinePatchFileParser::~BinNinePatchFileParser() {
+ m_size = 0;
+}
+BinNinePatchFileParser* BinNinePatchFileParser::get_instance() {
+ static BinNinePatchFileParser instance;
+ return &instance;
+}
+void BinNinePatchFileParser::init(const FileStorage& storage, int offset, int size, IParserInfo_Provider* provider) {
+ m_storage.set_str_provider(provider);
+ m_storage.get_storage(storage, offset, size);
+ this->parser_info_provider = provider;
+
+ parsing_nine_patch_file_list();
+}
+
+void BinNinePatchFileParser::parsing_nine_patch_file_list() {
+ Nine_patch_width record_width;
+ set_nine_patch_width(*parser_info_provider, record_width);
+
+ // skip data_size
+ m_storage.advance(8);
+
+ SclNinePatchInfo* cur = m_nine_patch_file_list;
+ m_size = m_storage.get<sint_t>(4);
+ for (int i = 0; i < m_size; ++i) {
+ char* temp = NULL;
+ m_storage.get_str(&(temp), record_width.image_path, m_string_collector);
+ cur->image_path = (char*)temp;
+
+ cur->left = m_storage.get<sint_t>(record_width.left);
+ cur->right = m_storage.get<sint_t>(record_width.right);
+ cur->top = m_storage.get<sint_t>(record_width.top);
+ cur->bottom = m_storage.get<sint_t>(record_width.bottom);
+ cur++;
+ }
+#ifdef __SCL_TXT_DEBUG
+ put_nine_patch_info(DECODE, m_nine_patch_file_list);
+#endif
+}
+
+SclNinePatchInfo*
+BinNinePatchFileParser::get_nine_patch_list() {
+ return m_nine_patch_file_list;
+}
+bool
+BinNinePatchFileParser::get_nine_patch_info(const char* filename, SclNinePatchInfo *info) {
+ if (filename == NULL) return false;
+
+ for (int i = 0; i < MAX_NINE_PATCH_FILE_LIST && i < m_size; ++i) {
+ if ( m_nine_patch_file_list[i].image_path != NULL &&
+ 0 == strcmp(m_nine_patch_file_list[i].image_path, filename) ) {
+ if (info) {
+ *info = m_nine_patch_file_list[i];
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __BinNinePatchFileParser__H__
+#define __BinNinePatchFileParser__H__
+#include "iparserinfo_provider.h"
+#include "sclres_type.h"
+#include "string_collector.h"
+#include "file_storage_impl.h"
+#include "_auto_metadata.h"
+
+class BinNinePatchFileParser {
+ static const int MAX_NINE_PATCH_FILE_LIST = 128;
+ public:
+ ~BinNinePatchFileParser();
+ static BinNinePatchFileParser *get_instance();
+ void init(const FileStorage& storage, int, int, IParserInfo_Provider*);
+ bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info);
+ SclNinePatchInfo* get_nine_patch_list();
+ private:
+ BinNinePatchFileParser();
+ void parsing_nine_patch_file_list();
+ private:
+ SclNinePatchInfo m_nine_patch_file_list[MAX_NINE_PATCH_FILE_LIST];
+ int m_size;
+ StringCollector m_string_collector;
+ FileStorage m_storage;
+ IParserInfo_Provider* parser_info_provider;
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <memory.h>
+#include <assert.h>
+#include <libxml/parser.h>
+
+#include "nine_patch_file_list_parser.h"
+#include "xml_parser_utils.h"
+#include "simple_debug.h"
+
+class NinePatchFileListParserImpl {
+ public:
+ NinePatchFileListParserImpl() {
+ m_size = 0;
+ memset(m_nine_patch_file_list, 0x00, sizeof(SclNinePatchInfo) * MAX_NINE_PATCH_FILE_LIST);
+ }
+ ~NinePatchFileListParserImpl() {
+ reset();
+ }
+
+ void reset() {
+ for (int i = 0; i < m_size; ++i) {
+ if (m_nine_patch_file_list[i].image_path)
+ xmlFree(m_nine_patch_file_list[i].image_path);
+ m_nine_patch_file_list[i].image_path = NULL;
+ }
+ m_size = 0;
+ memset(m_nine_patch_file_list, 0x00, sizeof(SclNinePatchInfo) * MAX_NINE_PATCH_FILE_LIST);
+ }
+
+ int reload_nine_patch_file_list(const char* input_file) {
+ reset();
+ return parsing_nine_patch_file_list(input_file);
+ }
+
+ int parsing_nine_patch_file_list(const char* input_file) {
+ xmlDocPtr doc;
+ xmlNodePtr cur_node;
+
+ doc = xmlReadFile(input_file, NULL, 0);
+ if (doc == NULL) {
+ SCLLOG(SclLog::DEBUG, "Could not load file: %s.", input_file);
+ return -1;
+ }
+
+ cur_node = xmlDocGetRootElement(doc);
+ if (cur_node == NULL) {
+ SCLLOG(SclLog::DEBUG, "Nine_Patch_File_Parser: empty document.\n");
+ xmlFreeDoc(doc);
+ return -1;
+ }
+ if (0 != xmlStrcmp(cur_node->name, (const xmlChar*)"nine_patch_file_list"))
+ {
+ SCLLOG(SclLog::DEBUG, "Nine_Patch_File_Parser: root name error: %s\n!", (char *)cur_node->name);
+ xmlFreeDoc(doc);
+ return -1;
+ }
+
+ cur_node = cur_node->xmlChildrenNode;
+
+ assert(m_size == 0);
+ while (cur_node != NULL) {
+ if (0 == xmlStrcmp(cur_node->name, (const xmlChar *)"file")) {
+ assert(m_size >= 0 && m_size < MAX_NINE_PATCH_FILE_LIST);
+ if (m_size >= 0 && m_size < MAX_NINE_PATCH_FILE_LIST) {
+ m_nine_patch_file_list[m_size].image_path = (char*)xmlNodeGetContent(cur_node);
+ get_prop_number(cur_node, "left", &(m_nine_patch_file_list[m_size].left));
+ get_prop_number(cur_node, "right", &(m_nine_patch_file_list[m_size].right));
+ get_prop_number(cur_node, "top", &(m_nine_patch_file_list[m_size].top));
+ get_prop_number(cur_node, "bottom", &(m_nine_patch_file_list[m_size].bottom));
+ if (m_nine_patch_file_list[m_size].image_path == NULL) {
+ SCLLOG(SclLog::ERROR, "NinePatchFileParser: image_path should be not NULL");
+ }
+ m_size++;
+ if (m_size >= MAX_NINE_PATCH_FILE_LIST) {
+ SCLLOG(SclLog::ERROR, "No Space for nine patch file list record.");
+ break;
+ }
+ }
+ }
+
+ cur_node = cur_node->next;
+ }
+ xmlFreeDoc(doc);
+
+ return 0;
+ }
+ SclNinePatchInfo m_nine_patch_file_list[MAX_NINE_PATCH_FILE_LIST];
+ int m_size;
+};
+
+NinePatchFileParser::NinePatchFileParser() {
+ m_impl = new NinePatchFileListParserImpl;
+}
+
+NinePatchFileParser::~NinePatchFileParser() {
+ if (m_impl) {
+ SCLLOG(SclLog::MESSAGE, "~NinePatchFileParser() has called.");
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+NinePatchFileParser*
+NinePatchFileParser::get_instance() {
+ static NinePatchFileParser instance;
+ return &instance;
+}
+
+int
+NinePatchFileParser::init(const char* file) {
+ return m_impl->parsing_nine_patch_file_list(file);
+}
+
+int
+NinePatchFileParser::reload(const char* file) {
+ return m_impl->reload_nine_patch_file_list(file);
+}
+
+bool
+NinePatchFileParser::get_nine_patch_info(const char* filename, SclNinePatchInfo *info) {
+ if (filename == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_nine_patch_info() has failed.");
+ return false;
+ }
+
+ SclNinePatchInfo *nine_patch_list = get_nine_patch_list();
+ if (nine_patch_list == NULL) {
+ SCLLOG(SclLog::DEBUG, "get_nine_patch_info() has failed.");
+ return false;
+ }
+
+ for (int i = 0; i < MAX_NINE_PATCH_FILE_LIST && i < m_impl->m_size; ++i) {
+ if ( nine_patch_list[i].image_path != NULL &&
+ 0 == strcmp(nine_patch_list[i].image_path, filename) ) {
+ if (info) {
+ *info = nine_patch_list[i];
+ }
+ return true;
+ }
+ }
+
+ SCLLOG(SclLog::DEBUG, "get_nine_patch_info() has failed.");
+ return false;
+}
+
+SclNinePatchInfo*
+NinePatchFileParser::get_nine_patch_list() {
+ return m_impl->m_nine_patch_file_list;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __NinePatchFileParser__H__
+#define __NinePatchFileParser__H__
+#include "sclres_type.h"
+
+const int MAX_NINE_PATCH_FILE_LIST = 128;
+class NinePatchFileListParserImpl;
+
+class NinePatchFileParser {
+ NinePatchFileListParserImpl *m_impl;
+ public:
+ int init(const char* file);
+ int reload(const char* file);
+ SclNinePatchInfo* get_nine_patch_list();
+ bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info);
+ public:
+ ~NinePatchFileParser();
+ static NinePatchFileParser *get_instance();
+ private:
+ NinePatchFileParser();
+};
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __PARSERINFO_PROVIDER_H__
+#define __PARSERINFO_PROVIDER_H__
+#include "iparserinfo_provider.h"
+#include "istring_provider.h"
+#include "imetadata_provider.h"
+
+class ParserInfo_Provider: public IParserInfo_Provider{
+ public:
+ ParserInfo_Provider(IMetadata_Provider* metadataProvider,
+ const IString_Provider* stringProvider) :m_metadataProvider(metadataProvider),
+ m_stringProvider(stringProvider) {}
+ void set_current_metadata_record(const char* record_name) {
+ assert(m_metadataProvider);
+ if (m_metadataProvider != NULL) {
+ m_metadataProvider->set_current_metadata_record(record_name);
+ }
+ }
+ int get_width(const char* field_name)const {
+ assert(m_metadataProvider != NULL);
+ if (m_metadataProvider != NULL)
+ return m_metadataProvider->get_width(field_name);
+
+ return 0 ;
+ }
+
+ const char* get_string_by_id(const int id)const {
+ if (m_stringProvider != NULL) {
+ return m_stringProvider->get_string_by_id(id);
+ }
+ return NULL;
+ }
+
+ private:
+ IMetadata_Provider *m_metadataProvider;
+ const IString_Provider *m_stringProvider;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <memory.h>
+#include "sclactionstate.h"
+#include "scldebug.h"
+
+using namespace scl;
+
+CSCLActionState::CSCLActionState()
+{
+ SCL_DEBUG();
+
+ reset();
+}
+
+CSCLActionState::~CSCLActionState()
+{
+ SCL_DEBUG();
+}
+
+CSCLActionState*
+CSCLActionState::get_instance()
+{
+ static CSCLActionState instance;
+ return &instance;
+}
+
+
+void
+CSCLActionState::reset()
+{
+ m_cur_action_state = ACTION_STATE_BASE_INIT;
+ memset(m_action_buffer, 0x00, sizeof(m_action_buffer));
+}
+
+void
+CSCLActionState::clear_action_buf()
+{
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclconfig.h"
+
+#ifndef __SCL_ACTIONSTATE_H__
+#define __SCL_ACTIONSTATE_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+#define MAX_ACTION_BUF 50
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLActionState
+{
+private:
+ CSCLActionState();
+public:
+ virtual ~CSCLActionState();
+
+ /* for singleton */
+ static CSCLActionState* get_instance();
+
+ /* reset the action state to init status */
+ void reset();
+ void clear_action_buf();
+ SCLActionState get_cur_action_state() {
+ return m_cur_action_state;
+ }
+ void set_cur_action_state(SCLActionState state) {
+ m_cur_action_state = state;
+ }
+
+public:
+ /* stores the state information */
+ SCLActionState m_action_buffer[MAX_ACTION_BUF];
+ SCLActionState m_cur_action_state;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_ACTIONSTATE_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclanimator-nui.h"
+#include "scldebug.h"
+
+#include <Ecore.h>
+#include <Elementary.h>
+
+#include "sclutils.h"
+#include "sclwindows.h"
+
+using namespace scl;
+
+/**
+ * Constructor
+ */
+CSCLAnimatorImplNui::CSCLAnimatorImplNui()
+{
+ SCL_DEBUG();
+
+ m_highlight_ui_object = NULL;
+ m_highlight_ui_object_alternate = NULL;
+}
+
+/**
+ * De-constructor
+ */
+CSCLAnimatorImplNui::~CSCLAnimatorImplNui()
+{
+ SCL_DEBUG();
+}
+
+void CSCLAnimatorImplNui::init()
+{
+}
+
+void CSCLAnimatorImplNui::fini()
+{
+ if (m_highlight_ui_object) {
+ evas_object_del(m_highlight_ui_object);
+ m_highlight_ui_object = NULL;
+ }
+ if (m_highlight_ui_object_alternate) {
+ evas_object_del(m_highlight_ui_object_alternate);
+ m_highlight_ui_object_alternate = NULL;
+ }
+}
+
+
+sclboolean
+CSCLAnimatorImplNui::check_animation_supported()
+{
+ /* EFL Backend finished implementing animation support */
+ return TRUE;
+}
+
+void
+CSCLAnimatorImplNui::animator_timer(SclAnimationState *state)
+{
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (state && windows && utils) {
+ switch (state->desc.type) {
+ case ANIMATION_TYPE_HIGHLIGHT_UI: {
+ if (state->active) {
+ SclRectangle rect = state->rect_cur;
+ if (m_highlight_ui_object == NULL) {
+ Evas_Object *window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ Evas *evas = evas_object_evas_get(window_object);
+ m_highlight_ui_object = evas_object_image_add(evas);
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ utils->get_composed_path(composed_path, IMG_PATH_PREFIX, SCL_HIGHLIGHT_UI_IMAGE);
+ evas_object_image_file_set(m_highlight_ui_object, composed_path, NULL);
+ }
+ evas_object_move(m_highlight_ui_object, rect.x, rect.y);
+ evas_object_image_fill_set(m_highlight_ui_object, 0, 0, rect.width, rect.height);
+ evas_object_resize(m_highlight_ui_object, rect.width, rect.height);
+ evas_object_raise(m_highlight_ui_object);
+ evas_object_show(m_highlight_ui_object);
+
+ sclboolean circular = FALSE;
+ if (state->desc.circular) {
+ if (m_highlight_ui_object_alternate == NULL) {
+ Evas_Object *window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ Evas *evas = evas_object_evas_get(window_object);
+ m_highlight_ui_object_alternate = evas_object_image_add(evas);
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ utils->get_composed_path(composed_path, IMG_PATH_PREFIX, SCL_HIGHLIGHT_UI_IMAGE);
+ evas_object_image_file_set(m_highlight_ui_object_alternate, composed_path, NULL);
+ }
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ if (rect.x < 0) {
+ evas_object_move(m_highlight_ui_object_alternate,
+ window_context->geometry.width + rect.x, rect.y);
+ evas_object_image_fill_set(m_highlight_ui_object_alternate,
+ 0, 0, rect.width, rect.height);
+ evas_object_resize(m_highlight_ui_object_alternate,
+ rect.width, rect.height);
+ evas_object_raise(m_highlight_ui_object_alternate);
+ evas_object_show(m_highlight_ui_object_alternate);
+ circular = TRUE;
+ } else if (rect.x + rect.width > window_context->geometry.width) {
+ evas_object_move(m_highlight_ui_object_alternate,
+ -(window_context->geometry.width - rect.x), rect.y);
+ evas_object_image_fill_set(m_highlight_ui_object_alternate,
+ 0, 0, rect.width, rect.height);
+ evas_object_resize(m_highlight_ui_object_alternate,
+ rect.width, rect.height);
+ evas_object_raise(m_highlight_ui_object_alternate);
+ evas_object_show(m_highlight_ui_object_alternate);
+ circular = TRUE;
+ }
+ }
+ }
+ if (!circular) {
+ if (m_highlight_ui_object_alternate) {
+ evas_object_hide(m_highlight_ui_object_alternate);
+ }
+ } else {
+ if (m_highlight_ui_object_alternate) {
+ sclint window_layer = 29000;
+ if (!windows->is_base_window(state->desc.window_from) ||
+ !windows->is_base_window(state->desc.window_to)) {
+ window_layer = 29010;
+ }
+ evas_object_layer_set(m_highlight_ui_object_alternate, window_layer + 1);
+ }
+ }
+
+ sclint window_layer = 29000;
+ if (!windows->is_base_window(state->desc.window_from) ||
+ !windows->is_base_window(state->desc.window_to)) {
+ window_layer = 29010;
+ }
+ evas_object_layer_set(m_highlight_ui_object, window_layer + 1);
+ } else {
+ evas_object_hide(m_highlight_ui_object);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclanimator.h"
+
+#ifndef __SCL_ANIMATOR_NUI_H__
+#define __SCL_ANIMATOR_NUI_H__
+
+#include <Evas.h>
+
+namespace scl
+{
+class CSCLAnimatorImplNui : public CSCLAnimatorImpl
+{
+public :
+ CSCLAnimatorImplNui();
+ ~CSCLAnimatorImplNui();
+
+ void init();
+ void fini();
+
+ sclboolean check_animation_supported();
+ void animator_timer(SclAnimationState *state);
+
+private:
+ Evas_Object *m_highlight_ui_object;
+ Evas_Object *m_highlight_ui_object_alternate;
+};
+} /* End of scl namespace */
+#endif //__SCL_ANIMATOR_NUI_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclanimator.h"
+#ifdef __WIN32__
+#include "sclanimator-win32.h"
+#elif defined(__EFL__)
+#include "sclanimator-efl.h"
+#elif defined(__NUI__)
+#include "sclanimator-nui.h"
+#elif __GTK__
+#include "sclanimator-gtk.h"
+#else
+#include "sclanimator-cairo.h"
+#endif
+#include "scldebug.h"
+
+#include "sclevents.h"
+#include "sclwindows.h"
+
+using namespace scl;
+
+CSCLAnimator::CSCLAnimator()
+{
+ SCL_DEBUG();
+ m_impl = NULL;
+}
+
+CSCLAnimator::~CSCLAnimator()
+{
+ SCL_DEBUG();
+
+ if (m_impl) {
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+void CSCLAnimator::init()
+{
+ CSCLAnimatorImpl *impl = get_scl_animator_impl();
+ if (impl) {
+ impl->init();
+ }
+}
+
+void CSCLAnimator::fini()
+{
+ CSCLAnimatorImpl *impl = get_scl_animator_impl();
+ if (impl) {
+ impl->fini();
+ }
+}
+
+sclboolean CSCLAnimator::check_animation_supported()
+{
+ sclboolean ret = FALSE;
+
+ CSCLAnimatorImpl *impl = get_scl_animator_impl();
+ if (impl) {
+ ret = impl->check_animation_supported();
+ }
+ return ret;
+}
+
+CSCLAnimatorImpl* CSCLAnimator::get_scl_animator_impl()
+{
+ SCL_DEBUG();
+ if (m_impl == 0) {
+#ifdef __WIN32__
+ m_impl = new CSCLAnimatorImplWin32;
+#elif defined(__EFL__)
+ m_impl = new CSCLAnimatorImplEfl;
+#elif defined(__NUI__)
+ m_impl = new CSCLAnimatorImplNui;
+#elif __GTK__
+ m_impl = new CSCLAnimatorImplGtk;
+#else
+ m_impl = new CSCLAnimatorImplCairo;
+#endif
+ }
+ return m_impl;
+}
+
+CSCLAnimator* CSCLAnimator::get_instance()
+{
+ static CSCLAnimator instance;
+ return &instance;
+}
+
+sclint
+CSCLAnimator::create_animator(SclAnimationDesc *desc)
+{
+ static sclint animator_id = 0;
+
+ if (desc) {
+ animator_id++;
+ /* Just in case for overflow */
+ if (animator_id < 0) animator_id = 0;
+
+ SclAnimationState state;
+ state.active = FALSE;
+ state.rect_cur = desc->rect_from;
+ state.step = 0;
+
+ state.desc = *desc;
+
+ destroy_animator(animator_id);
+ m_animators[animator_id] = state;
+ } else {
+ return NOT_USED;
+ }
+
+ return animator_id;
+}
+
+sclboolean
+CSCLAnimator::destroy_animator(sclint id)
+{
+ sclboolean ret = TRUE;
+
+ std::map<sclint, SclAnimationState>::iterator iter;
+ iter = m_animators.find(id);
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ state->active = FALSE;
+ m_animators.erase(iter->first);
+ } else {
+ ret = FALSE;
+ }
+
+ sclboolean destroy_timer = TRUE;
+ for (iter = m_animators.begin();iter != m_animators.end();std::advance(iter, 1)) {
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ if (state->active) {
+ destroy_timer = FALSE;
+ }
+ }
+ }
+
+ if (destroy_timer) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ if (events) {
+ events->destroy_timer(SCL_TIMER_ANIMATION);
+ }
+ }
+
+ return ret;
+}
+
+sclint
+CSCLAnimator::find_animator_by_type(SCLAnimationType type)
+{
+ sclint ret = NOT_USED;
+
+ for (std::map<sclint, SclAnimationState>::iterator iter = m_animators.begin();
+ iter != m_animators.end();std::advance(iter, 1)) {
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ if (state->desc.type == type) {
+ ret = iter->first;
+ }
+ }
+ }
+
+ return ret;
+}
+
+
+SclAnimationState*
+CSCLAnimator::get_animation_state(sclint id)
+{
+ SclAnimationState *ret = NULL;
+
+ std::map<sclint, SclAnimationState>::iterator iter = m_animators.find(id);
+ if (iter != m_animators.end()) {
+ ret = &(iter->second);
+ } else {
+ ret = NULL;
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLAnimator::start_animator(sclint id)
+{
+ sclboolean ret = TRUE;
+
+ std::map<sclint, SclAnimationState>::iterator iter = m_animators.find(id);
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ state->active = TRUE;
+ } else {
+ ret = FALSE;
+ }
+
+ /*
+ sclboolean start_timer = TRUE;
+ for(std::map<sclint, SclAnimationState>::iterator iter = m_animators.begin();
+ iter != m_animators.end();std::advance(iter, 1)) {
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ if (state->active) {
+ start_timer = FALSE;
+ }
+ }
+ }
+
+ if (start_timer) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ if (events) {
+ events->create_timer(SCL_TIMER_ANIMATION, SCL_ANIMATION_TIMER_INTERVAL, 0);
+ }
+ }
+ */
+ CSCLEvents *events = CSCLEvents::get_instance();
+ if (events) {
+ events->destroy_timer(SCL_TIMER_ANIMATION);
+ events->create_timer(SCL_TIMER_ANIMATION, SCL_ANIMATION_TIMER_INTERVAL, 0);
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLAnimator::stop_animator(sclint id)
+{
+ sclboolean ret = TRUE;
+
+ std::map<sclint, SclAnimationState>::iterator iter;
+ iter = m_animators.find(id);
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ state->active = FALSE;
+ m_animators.erase(iter->first);
+ } else {
+ ret = FALSE;
+ }
+
+ sclboolean destroy_timer = TRUE;
+ for (iter = m_animators.begin();iter != m_animators.end();std::advance(iter, 1)) {
+ if (iter != m_animators.end()) {
+ SclAnimationState *state = &(iter->second);
+ if (state->active) {
+ destroy_timer = FALSE;
+ }
+ }
+ }
+
+ if (destroy_timer) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ if (events) {
+ events->destroy_timer(SCL_TIMER_ANIMATION);
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLAnimator::animator_timer_highlight_ui(SclAnimationState *state)
+{
+ sclboolean ret = TRUE;
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (state && windows) {
+ SclRectangle rect_from = state->desc.rect_from;
+ SclRectangle rect_to = state->desc.rect_to;
+
+ sclint delta_x = 0; /* We will calculate the X considering circulation */
+ sclint delta_y = rect_to.y - rect_from.y;
+ sclint delta_width = rect_to.width - rect_from.width;
+ sclint delta_height = rect_to.height - rect_from.height;
+
+ state->rect_cur.y = rect_from.y +
+ ((delta_y) * state->step * SCL_ANIMATION_TIMER_INTERVAL) / state->desc.length;
+ state->rect_cur.width = rect_from.width +
+ ((delta_width) * state->step * SCL_ANIMATION_TIMER_INTERVAL) / state->desc.length;
+ state->rect_cur.height = rect_from.height +
+ ((delta_height) * state->step * SCL_ANIMATION_TIMER_INTERVAL) / state->desc.length;
+
+ if (state->desc.circular) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ if (rect_from.x > rect_to.x) {
+ delta_x = rect_to.x;
+ delta_x += (base_window_context->geometry.width - rect_from.x);
+ } else {
+ delta_x = -(rect_from.x);
+ delta_x -= (base_window_context->geometry.width - rect_to.x);
+ }
+
+ state->rect_cur.x = rect_from.x +
+ ((delta_x) * state->step * SCL_ANIMATION_TIMER_INTERVAL) / state->desc.length;
+
+ if (state->rect_cur.x + state->rect_cur.width <= 0) {
+ /* Make the highlight UI come out from the right side of the window */
+ state->rect_cur.x += base_window_context->geometry.width;
+ } else if (state->rect_cur.x > base_window_context->geometry.width) {
+ state->rect_cur.x -= base_window_context->geometry.width;
+ }
+ }
+ } else {
+ delta_x = rect_to.x - rect_from.x;
+
+ state->rect_cur.x = rect_from.x +
+ ((delta_x) * state->step * SCL_ANIMATION_TIMER_INTERVAL) / state->desc.length;
+ }
+ }
+
+ return ret;
+}
+sclboolean
+CSCLAnimator::animator_timer()
+{
+ sclboolean destroy_timer = TRUE;
+ for (std::map<sclint, SclAnimationState>::iterator iter = m_animators.begin();
+ iter != m_animators.end();std::advance(iter, 1)) {
+ if (iter != m_animators.end()) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclAnimationState *state = &(iter->second);
+ if (state && state->active && windows) {
+ state->step++;
+ if (SCL_ANIMATION_TIMER_INTERVAL * state->step >= state->desc.length) {
+ state->active = FALSE;
+ } else {
+ if (state->desc.type == ANIMATION_TYPE_HIGHLIGHT_UI) {
+ animator_timer_highlight_ui(state);
+ }
+ }
+
+ CSCLAnimatorImpl *impl = get_scl_animator_impl();
+ if (impl) {
+ impl->animator_timer(state);
+ }
+
+ if (state->active == FALSE) {
+ windows->update_window(state->desc.window_to,
+ state->desc.rect_to.x, state->desc.rect_to.y,
+ state->desc.rect_to.width, state->desc.rect_to.height);
+ } else {
+ destroy_timer = FALSE;
+ }
+ }
+ }
+ }
+ if (destroy_timer) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ if (events) {
+ events->destroy_timer(SCL_TIMER_ANIMATION);
+ }
+ }
+ return TRUE;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+
+#include <map>
+
+#ifndef __SCL_ANIMATOR_H__
+#define __SCL_ANIMATOR_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+
+/* Currently this SCL Animation class is not designed for specific animations, not for general use.
+ Should refine later to provide general animation behavior */
+typedef enum {
+ ANIMATION_TYPE_NONE,
+ ANIMATION_TYPE_HIGHLIGHT_UI,
+
+ ANIMATION_TYPE_MAX
+}SCLAnimationType;
+
+typedef struct {
+ SCLAnimationType type;
+ sclint length;
+
+ sclwindow window_from;
+ sclwindow window_to;
+
+ SclRectangle rect_from;
+ SclRectangle rect_to;
+
+ sclboolean circular;
+}SclAnimationDesc;
+
+typedef struct {
+ sclboolean active;
+
+ SclAnimationDesc desc;
+ sclint step;
+
+ SclRectangle rect_cur;
+}SclAnimationState;
+
+
+class CSCLAnimatorImpl
+{
+public:
+ CSCLAnimatorImpl() {}
+ virtual ~CSCLAnimatorImpl() {}
+
+ virtual void init() = 0;
+ virtual void fini() = 0;
+
+ /* By default, animation is not supported */
+ virtual sclboolean check_animation_supported() { return FALSE; }
+ virtual void animator_timer(SclAnimationState *state) = 0;
+
+ friend class CSCLAnimator;
+private:
+};
+
+class CSCLAnimator
+{
+private:
+ CSCLAnimator();
+public :
+ virtual ~CSCLAnimator();
+
+ static CSCLAnimator* get_instance();
+
+ void init();
+ void fini();
+
+ /* Some backends may not provide animation feature */
+ sclboolean check_animation_supported();
+
+ sclint create_animator(SclAnimationDesc *desc);
+ sclboolean destroy_animator(sclint id);
+
+ sclint find_animator_by_type(SCLAnimationType type);
+
+ SclAnimationState* get_animation_state(sclint id);
+
+ sclboolean start_animator(sclint id);
+ sclboolean stop_animator(sclint id);
+
+ sclboolean animator_timer();
+
+protected :
+ CSCLAnimatorImpl* get_scl_animator_impl();
+
+ sclboolean animator_timer_highlight_ui(SclAnimationState *state);
+private :
+ CSCLAnimatorImpl* m_impl;
+
+ std::map<sclint, SclAnimationState> m_animators;
+};
+
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_ANIMATOR_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_BACKENDCALLBACK_H__
+#define __SCL_BACKENDCALLBACK_H__
+
+#include "sclgraphicsinfo.h"
+
+using namespace scl;
+
+//SCL_BEGIN_DECLS
+/* FIXME : Need to check the dependency cause by the next include statement */
+
+//typedef void (*scl_ui_draw_text_cb)(const char *str, int x, int y, int w, int h, int fontsize, void* user_data);
+
+struct ISCLUIGraphicsBackendCallback {
+ //virtual void on_draw_text(const char *str, int x, int y, int w, int h, int fontsize, void* user_data) { }
+ virtual void on_draw_text(const SclFontInfo& font_info, const SclColor& color, const char *str, int pos_x, int pos_y, int w, int h,
+ SCLLabelAlignment align, int padding_x, int padding_y, int inner_width, int inner_height, void* user_data) { }
+
+ /*
+ const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y, sclint width, sclint height,
+ SCLLabelAlignment align, sclint padding_x, sclint padding_y,
+ sclint inner_width, sclint inner_height)
+ */
+
+ virtual void on_draw_image(const char *image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, void* user_data) { }
+
+ virtual void on_draw_rectangle(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a, void* user_data) { }
+
+ virtual void update_window(int x, int w, int width, int height, void* user_data) { }
+
+ //virtual void on_draw_image(const char *str, int x, int y, int w, int h, int fontsize, void* user_data) { }
+};
+
+#endif //__SCL_BACKENDCALLBACK_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_CONFIG_H__
+#define __SCL_CONFIG_H__
+
+#ifndef EXAPI
+#define EXAPI __attribute__ ((visibility("default")))
+#endif
+
+namespace scl
+{
+
+#ifndef IMG_PATH_PREFIX
+#define IMG_PATH_PREFIX "image"
+#endif
+
+/* Display direction definition */
+typedef enum _SCLDisplayMode {
+ DISPLAYMODE_PORTRAIT = 0, /* portrait display mode */
+ DISPLAYMODE_LANDSCAPE, /* landscape display mode */
+ DISPLAYMODE_MAX, /* maximum count of display mode */
+}SCLDisplayMode;
+
+/* Rotation definition */
+typedef enum _SCLRotation {
+ ROTATION_0 = 0, /* No rotation */
+ ROTATION_90_CW, /* 90 degree, clockwise */
+ ROTATION_180, /* 180 degree */
+ ROTATION_90_CCW, /* 90 degree, counter-clockwise (Same as 270 degree, clockwise) */
+ ROTATION_MAX,
+}SCLRotation;
+
+/**@brief Layout and Input mode Style definition */
+typedef enum _SCLLayoutStyle {
+ LAYOUT_STYLE_BASE = 0,
+ LAYOUT_STYLE_POPUP,
+ LAYOUT_STYLE_POPUP_GRAB,
+ MAX_LAYOUT_STYLE
+}SCLLayoutStyle;
+
+/* Key Define */
+
+/**@brief Button Type definition */
+typedef enum _SCLButtonType {
+ BUTTON_TYPE_NORMAL = 0, /**< Normal key */
+ BUTTON_TYPE_GRAB, /**< Focus grab */
+ /* No button gets focus when cursor moves out of this button's area */
+ BUTTON_TYPE_SELFISH,
+ /* A button that fires click event when dragged into the button's area */
+ BUTTON_TYPE_DRAG, /**< Drag button */
+ /* A button with variant value - ex> [a] -> [b] */
+ BUTTON_TYPE_MULTITAP, /**< Multi-tap key */
+ /* A multitap with automatic commitment - ex> ([a] -> a[b]) , ([p] -> p[i] -> pi[n] -> pin[g])*/
+ BUTTON_TYPE_ROTATION, /**< Rotation key */
+ BUTTON_TYPE_DIRECTION, /**< Direction decided by whole mouse movement from inital point */
+ BUTTON_TYPE_RELATIVE_DIRECTION, /**< Direction decided by recent mouse movement */
+ BUTTON_TYPE_TOGGLE, /** A button that has toggled state */
+ BUTTON_TYPE_UIITEM, /** Not a button, just for displaying image */
+ MAX_BUTTON_TYPE /* maximum number of Key type */
+}SCLButtonType;
+
+/* Values used for extra_option field of SclLayoutKeyProperties structure, in case of BUTTON_TYPE_DIRECTION type button */
+#define DIRECTION_EXTRA_OPTION_4_DIRECTIONS 0
+#define DIRECTION_EXTRA_OPTION_8_DIRECTIONS 1
+#define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_LONG 2
+#define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG 3
+#define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN 4
+#define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN 5
+#define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE 6
+
+/**@brief Key Type definition */
+typedef enum _SCLKeyType {
+ KEY_TYPE_NONE = 0, /**< none */
+ KEY_TYPE_CHAR, /**< key that can be displayed independently */
+ KEY_TYPE_CONTROL, /**< key to use as control */
+ KEY_TYPE_MODECHANGE, /**< key to change mode*/
+ KEY_TYPE_STRING, /**< key to be displayed as string */
+ KEY_TYPE_USER, /**< key to be processed by user custom function */
+ MAX_KEY_TYPE /* maximum number of Key type */
+}SCLKeyType;
+
+/**@brief Key Event Type definition */
+typedef enum _SCLEventType {
+ EVENT_TYPE_NONE = 0, /**< none */
+ EVENT_TYPE_PRESS, /**< button press event */
+ EVENT_TYPE_MOVE, /**< button move event */
+ EVENT_TYPE_RELEASE, /**< button release event */
+ EVENT_TYPE_LONGPRESS, /**< button longpress event */
+ EVENT_TYPE_REPEAT, /**< button repeat event */
+ MAX_EVENT_TYPE /* maximum number of Key type */
+}SCLEventType;
+
+
+/**@brief Key Modifier definition */
+typedef enum _SCLKeyModifier {
+ KEY_MODIFIER_NONE = 0, /**< none */
+ KEY_MODIFIER_LONGKEY, /**< longkey event */
+ KEY_MODIFIER_MULTITAP_START, /**< multitap started */
+ KEY_MODIFIER_MULTITAP_REPEAT, /**< multitap repeated */
+ KEY_MODIFIER_MULTITAP_RELEASE, /**< multitap released */
+
+ KEY_MODIFIER_DIRECTION_LEFT, /**< drag left */
+ KEY_MODIFIER_DIRECTION_RIGHT, /**< drag right */
+ KEY_MODIFIER_DIRECTION_UP, /**< drag up */
+ KEY_MODIFIER_DIRECTION_DOWN, /**< drag down */
+ KEY_MODIFIER_DIRECTION_UP_LEFT, /**< drag up left */
+ KEY_MODIFIER_DIRECTION_UP_RIGHT, /**< drag up right */
+ KEY_MODIFIER_DIRECTION_DOWN_LEFT, /**< drag down left */
+ KEY_MODIFIER_DIRECTION_DOWN_RIGHT, /**< drag down right */
+
+ KEY_MODIFIER_DIRECTION_LEFT_LONG, /**< drag left */
+ KEY_MODIFIER_DIRECTION_RIGHT_LONG, /**< drag right */
+ KEY_MODIFIER_DIRECTION_UP_LONG, /**< drag up */
+ KEY_MODIFIER_DIRECTION_DOWN_LONG, /**< drag down */
+ KEY_MODIFIER_DIRECTION_UP_LEFT_LONG, /**< drag up left */
+ KEY_MODIFIER_DIRECTION_UP_RIGHT_LONG, /**< drag up right */
+ KEY_MODIFIER_DIRECTION_DOWN_LEFT_LONG, /**< drag down left */
+ KEY_MODIFIER_DIRECTION_DOWN_RIGHT_LONG, /**< drag down right */
+
+ KEY_MODIFIER_DIRECTION_LEFT_RETURN, /**< drag left */
+ KEY_MODIFIER_DIRECTION_RIGHT_RETURN, /**< drag right */
+ KEY_MODIFIER_DIRECTION_UP_RETURN, /**< drag up */
+ KEY_MODIFIER_DIRECTION_DOWN_RETURN, /**< drag down */
+ KEY_MODIFIER_DIRECTION_UP_LEFT_RETURN, /**< drag up left */
+ KEY_MODIFIER_DIRECTION_UP_RIGHT_RETURN, /**< drag up right */
+ KEY_MODIFIER_DIRECTION_DOWN_LEFT_RETURN, /**< drag down left */
+ KEY_MODIFIER_DIRECTION_DOWN_RIGHT_RETURN, /**< drag down right */
+
+ KEY_MODIFIER_DIRECTION_CURVE_UP_LEFT, /**< drag up left */
+ KEY_MODIFIER_DIRECTION_CURVE_UP_RIGHT, /**< drag up right */
+ KEY_MODIFIER_DIRECTION_CURVE_DOWN_LEFT, /**< drag down left */
+ KEY_MODIFIER_DIRECTION_CURVE_DOWN_RIGHT, /**< drag down right */
+ KEY_MODIFIER_DIRECTION_CURVE_LEFT_UP, /**< drag left up */
+ KEY_MODIFIER_DIRECTION_CURVE_LEFT_DOWN, /**< drag left down */
+ KEY_MODIFIER_DIRECTION_CURVE_RIGHT_UP, /**< drag right up */
+ KEY_MODIFIER_DIRECTION_CURVE_RIGHT_DOWN, /**< drag right down */
+
+ KEY_MODIFIER_TOGGLED, /**< toggled state */
+
+ KEY_MODIFIER_MAX /* maximum number of Key type */
+}SCLKeyModifier;
+
+
+/**@brief Popup Type definition */
+typedef enum _SCLPopupType {
+ /**< doesn't use popup */
+ POPUP_TYPE_NONE = 0,
+ /**< to use popup (It is used in extention character sign. After to be selected, this action is continued until selecting another area) */
+ POPUP_TYPE_BTN_RELEASE_POPUP,
+ /**< to use popup (It is used in extention character sign. After to be selected, this action disappears instantly) */
+ POPUP_TYPE_BTN_RELEASE_POPUP_ONCE,
+ /**< to use popup (it is used in extention character sign. This action disappears at Drag-Up */
+ POPUP_TYPE_BTN_PRESS_POPUP_DRAG,
+ /**< to use popup (it is used in extention character sign. This action disappears at Drag-Up */
+ POPUP_TYPE_BTN_LONGPRESS_POPUP,
+ /**< to use popup (it is used in extention character sign. This action disappears at Drag-Up */
+ POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE,
+ /**< to use popup (for multi-tap char) */
+ POPUP_TYPE_AUTO_POPUP,
+ /* maximum number of popup type */
+ MAX_POPUP_TYPE
+}SCLPopupType;
+
+/**@brief Candidate position style definition */
+typedef enum _SCLCandidatePosition {
+ CAND_POS_ABOVE_KEYPAD = 0,
+ CAND_POS_BELOW_TEXT,
+ CAND_POS_MANUAL,
+ MAX_CANDIDATE_POSITION
+}SCLCandidatePosition;
+
+/**@brief Candidate style definition */
+typedef enum _SCLCandidateStyle {
+ CAND_STYLE_DEFAULT = 0,
+ CAND_STYLE_A,
+ CAND_STYLE_B,
+ CAND_STYLE_C,
+ MAX_CANDIDATE_STYLE
+}SCLCandidateStyle;
+
+/**@brief Magnifier display style definition */
+typedef enum _SCLMagnifierStyle {
+ MAGNIFIER_STYLE_LABEL_ONLY = 0,
+ MAGNIFIER_STYLE_SEL_AREA_CAPTURE,
+ MAX_MAGNIFIER_STYLE
+}SCLMagnifierStyle;
+
+/**@brief Preview window position type definition */
+typedef enum _SCLPreviewPosition {
+ PREVIEW_POS_CENTER_OF_APPL_AREA = 0,
+ PREVIEW_POS_ABOVE_SELECTED_BUTTON,
+ PREVIEW_POS_MANUAL,
+ MAX_PREVIEW_POSITION
+}SCLPreviewPosition;
+
+/**@brief Action state definition */
+typedef enum _SCLActionState {
+ ACTION_STATE_BASE_INIT = 0,
+ ACTION_STATE_BASE_PRESS,
+ ACTION_STATE_BASE_MOVING,
+ ACTION_STATE_BASE_RELEASE,
+ ACTION_STATE_BASE_LONGKEY,
+ ACTION_STATE_BASE_REPEATKEY,
+ ACTION_STATE_POPUP_INIT,
+ ACTION_STATE_POPUP_PRESS,
+ ACTION_STATE_POPUP_MOVING,
+ ACTION_STATE_POPUP_RELEASE,
+ ACTION_STATE_POPUP_LONGKEY,
+ ACTION_STATE_POPUP_REPEATKEY,
+ MAX_ACTION_STATE
+}SCLActionState;
+
+/**@brief Button state definition */
+typedef enum _SCLButtonState {
+ BUTTON_STATE_NORMAL = 0, /**< normal state */
+ BUTTON_STATE_PRESSED, /**< pressed state */
+ BUTTON_STATE_DISABLED, /**< disabled state */
+ BUTTON_STATE_TOGGLED, /**< toggled state */
+ //BUTTON_STATE_HIGHLIGHT, /**< highlighted state */
+ //BUTTON_STATE_LONGKEY, /**< londkey state */
+ SCL_BUTTON_STATE_MAX /* maximum number of button state */
+}SCLButtonState;
+
+
+/**@brief Drag Direction definition */
+typedef enum _SCLDragType {
+ DRAG_NONE = 0, /* doesn't use Drag */
+ DRAG_LEFT, /* drag to left side */
+ DRAG_RIGHT, /* drag to right side */
+ DRAG_UP, /* drag to upper side */
+ DRAG_DOWN, /* drag to down side */
+ DRAG_LEFT_TOP, /* drag to left top side */
+ DRAG_RIGHT_TOP, /* drag to right top side */
+ DRAG_LEFT_BOTTOM, /* drag to left bottom side */
+ DRAG_RIGHT_BOTTOM, /* drag to right bottom side */
+ MAX_DRAG, /* maximum number of drag type */
+}SCLDragType;
+
+/**@brief Label alignment definition */
+typedef enum _SCLLabelAlignment {
+ LABEL_ALIGN_LEFT_TOP = 0,
+ LABEL_ALIGN_CENTER_TOP,
+ LABEL_ALIGN_RIGHT_TOP,
+ LABEL_ALIGN_LEFT_MIDDLE,
+ LABEL_ALIGN_CENTER_MIDDLE,
+ LABEL_ALIGN_RIGHT_MIDDLE,
+ LABEL_ALIGN_LEFT_BOTTOM,
+ LABEL_ALIGN_CENTER_BOTTOM,
+ LABEL_ALIGN_RIGHT_BOTTOM,
+ MAX_LABEL_ALIGNMENT
+}SCLLabelAlignment;
+
+/**@brief Shadow direction definition */
+typedef enum _SCLShadowDirection {
+ SHADOW_DIRECTION_NONE = 0,
+ SHADOW_DIRECTION_LEFT_TOP ,
+ SHADOW_DIRECTION_CENTER_TOP,
+ SHADOW_DIRECTION_RIGHT_TOP,
+ SHADOW_DIRECTION_LEFT_MIDDLE,
+ SHADOW_DIRECTION_CENTER_MIDDLE,
+ SHADOW_DIRECTION_RIGHT_MIDDLE,
+ SHADOW_DIRECTION_LEFT_BOTTOM,
+ SHADOW_DIRECTION_CENTER_BOTTOM,
+ SHADOW_DIRECTION_RIGHT_BOTTOM,
+ MAX_SHADOW_DIRECTION
+}SCLShadowDirection;
+
+/**@brief timer id */
+typedef enum _SCLTimer {
+ SCL_TIMER_AUTOPOPUP = 100,
+ SCL_TIMER_SHORT_LONGKEY,
+ SCL_TIMER_LONGKEY,
+ SCL_TIMER_REPEATKEY,
+ SCL_TIMER_USERAREA,
+ SCL_TIMER_BUTTON_DELAY,
+ SCL_TIMER_POPUP_TIMEOUT,
+ SCL_TIMER_ANIMATION,
+ SCL_TIMER_AUTOTEST,
+ SCL_TIMER_MULTITAP,
+}SCLTimer;
+
+/**@brief Feedback style */
+typedef enum _SCLFeedbackStyle {
+ FEEDBACK_STYLE_SOUND,
+ FEEDBACK_STYLE_VIBRATION,
+ MAX_FEEDBACK_STYLE
+}SCLFeedbackStyle;
+
+/**@brief Touch Offset */
+typedef enum _SCLTouchOffsetLevel {
+ TOUCH_OFFSET_LEVEL_1,
+ TOUCH_OFFSET_LEVEL_2,
+ TOUCH_OFFSET_LEVEL_3,
+ MAX_TOUCH_OFFSET_LEVEL
+}SCLTouchOffsetLevel;
+
+/* Type Limitation definition */
+#define MAX_SIZE_OF_LAYOUT_NAME 255
+#define MAX_SIZE_OF_MULTITAP_CHAR 10
+#define MAX_SIZE_OF_LABEL_FOR_ONE 9
+#define MAX_SIZE_OF_LAYOUT 10
+#define MAX_SIZE_OF_CANDIDATE 50
+#define MAX_PRIVATE_KEY 100
+#define MAX_DISABLED_KEY 100
+#define MAX_SIZE_OF_AUTOPOPUP_STRING 20
+#define MAX_SIZE_OF_MAGNIFIER_STRING 4
+#define MAX_SIZE_OF_SUBLAYOUT_STRING 32
+
+/**@brief Window Decorator Images */
+typedef enum _SCLWindowDecorator {
+ WND_DECORATOR_TOP_LEFT,
+ WND_DECORATOR_TOP_CENTER,
+ WND_DECORATOR_TOP_RIGHT,
+ WND_DECORATOR_MIDDLE_LEFT,
+ WND_DECORATOR_MIDDLE_CENTER,
+ WND_DECORATOR_MIDDLE_RIGHT,
+ WND_DECORATOR_BOTTOM_LEFT,
+ WND_DECORATOR_BOTTOM_CENTER,
+ WND_DECORATOR_BOTTOM_RIGHT,
+ MAX_WND_DECORATOR,
+}SCLWindowDecorator;
+
+/**@brief Highligh moving direction */
+typedef enum _SCLHighlightNavigationDirection {
+ HIGHLIGHT_NAVIGATE_NONE,
+ HIGHLIGHT_NAVIGATE_LEFT,
+ HIGHLIGHT_NAVIGATE_RIGHT,
+ HIGHLIGHT_NAVIGATE_UP,
+ HIGHLIGHT_NAVIGATE_DOWN,
+ HIGHLIGHT_NAVIGATE_MAX
+}SCLHighlightNavigationDirection;
+
+/**@brief SCL Notification to ISEs */
+typedef enum _SCLUINotiType {
+ SCL_UINOTITYPE_POPUP_OPENING,
+ SCL_UINOTITYPE_POPUP_OPENED,
+ SCL_UINOTITYPE_POPUP_CLOSING,
+ SCL_UINOTITYPE_POPUP_CLOSED,
+ SCL_UINOTITYPE_GESTURE_FLICK,
+ SCL_UINOTITYPE_SHIFT_STATE_CHANGE,
+ SCL_UINOTITYPE_INPUT_MODE_CHANGE,
+ SCL_UINOTITYPE_HIGHLIGHT_NAVIGATE,
+ MAX_NOTITYPE,
+}SCLUINotiType;
+
+/**@brief Current dragging state */
+typedef enum _SCLDragState {
+ SCL_DRAG_STATE_NONE,
+ SCL_DRAG_STATE_LEFT,
+ SCL_DRAG_STATE_RIGHT,
+ SCL_DRAG_STATE_UP,
+ SCL_DRAG_STATE_DOWN,
+ SCL_DRAG_STATE_INVALID,
+ SCL_DRAG_STATE_RETURN,
+ SCL_DRAG_STATE_MAX,
+} SCLDragState;
+
+typedef enum _SCLMultitouchType {
+ SCL_MULTI_TOUCH_TYPE_EXCLUSIVE, /* On a new PRESS event, previous touch events will be forcefully released */
+ SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS, /* On a new PRESS event, previous touch events will be forcefully settled */
+ SCL_MULTI_TOUCH_TYPE_COOPERATIVE, /* New touch events do not affect previous touch events */
+ SCL_MULTI_TOUCH_TYPE_GRAB_SUB_EVENTS, /* New touch events are considered to be sub events, not generating button events */
+} SCLMultiTouchType;
+
+/* Shift flag */
+typedef enum _SCLShiftState {
+ SCL_SHIFT_STATE_OFF,
+ SCL_SHIFT_STATE_ON,
+ SCL_SHIFT_STATE_LOCK,
+ SCL_SHIFT_STATE_MAX,
+} SCLShiftState;
+
+/* Shift Multi-touch state */
+typedef enum _SCLShiftMultitouchState {
+ SCL_SHIFT_MULTITOUCH_OFF, /* Shift button is set to OFF state */
+ SCL_SHIFT_MULTITOUCH_ON_PRESSED, /* When OFF state, shift button is just pressed */
+ SCL_SHIFT_MULTITOUCH_ON_KEY_ENTERED, /* While the shift button is in pressed state, another key was entered */
+ SCL_SHIFT_MULTITOUCH_ON_RELEASED, /* Shift button was released without any other key stroke */
+ SCL_SHIFT_MULTITOUCH_LOCK, /* Shift button is set to LOCK state */
+ SCL_SHIFT_MULTITOUCH_MAX,
+} SCLShiftMultitouchState;
+
+/* UI Parser types */
+typedef enum _SCLParserType {
+ SCL_PARSER_TYPE_XML,
+ SCL_PARSER_TYPE_BINARY_XML,
+} SCLParserType;
+
+/* Starting Coordinates Options */
+typedef enum _SCLStartingCoordinatesOption {
+ SCL_STARTING_COORDINATES_OPTION_ALL, /* Draw everything relative to the starting coordinate */
+ SCL_STARTING_COORDINATES_OPTION_BUTTONS_ONLY, /* Affect starting coordinates only to the buttons */
+} SCLStartingCoordinatesOption;
+
+/* SCL predefined Identifiers */
+#define SCL_SHIFT_STATE_OFF_HINT_STRING "Shift Off"
+#define SCL_SHIFT_STATE_ON_HINT_STRING "Shift On"
+#define SCL_SHIFT_STATE_LOCK_HINT_STRING "Shift Lock"
+
+#define SCL_INPUTMODE_AUTOPOPUP 10000
+#define SCL_LAYOUT_AUTOPOPUP 10000
+#define SCL_LAYOUT_AUTOPOPUP_NAME "Hidden Text Popup"
+
+#define SCL_LABEL_PROPERTY_AUTOPOPUP 10000
+#define SCL_LABEL_PROPERTY_CANDIDATE 10001
+#define SCL_LABEL_PROPERTY_ZOOMING 10002
+#define SCL_LABEL_PROPERTY_PREVIEW 10003
+
+#define SCL_LABEL_OVERLENGTH_TEXT_RESIZE_RATE 0.9f
+
+#define SCL_LONGKEY_DURATION 800
+#define SCL_LONGKEY_CANCEL_DIST -1
+#define SCL_AUTOPOPUP_KEY_DURATION 500
+#define SCL_REPEATKEY_DURATION 150
+#define SCL_REPEATKEY_WORD_DELETION_START_DURATION 100
+#define SCL_REPEATKEY_ACCELERATION 10
+#define SCL_REPEATKEY_MIN_DURATION 50
+
+#define SCL_BUTTON_MIN_DURATION 100
+#define SCL_MULTITAP_DEFAULT_DURATION 1000
+
+#define SCL_DIRECTION_RECOG_DIST 60
+#define SCL_DIRECTION_RECOG_DIST_SIDE 20
+#define SCL_DIRECTION_LONG_RECOG_DIST 50
+#define SCL_DIRECTION_RELATIVE_RECOG_DIST 10
+#define SCL_DIRECTION_RELATIVE_DIFFDIR_RECOG_DIST 30
+
+#define SCL_DRAG_CURVE_RECOG_DIST 70
+#define SCL_DRAG_CURVE_4_DIRECTION_ANGLE_VALUE 1.0f // ratio between x and y for determining 4 direction, 3 means atan(1/3) degree
+#define SCL_DRAG_CURVE_FINAL_ANGLE_VALUE 3.0f // ratio between x and y for determining final drag curve, 3 means atan(1/3) degree
+
+#define SCL_DRAG_RETURN_RECOG_THRESHOLD_RETURN 1.1f // In RETURN drag state, apply this value for checking drag return action
+#define SCL_DRAG_RETURN_RECOG_THRESHOLD_OTHER 0.9f // In non-NONE drag state, apply this value for checking drag return action
+#define SCL_DRAG_RETURN_RECOG_DIST_BACKWARD 20
+#define SCL_DRAG_RETURN_RECOG_ANGLE_BACKWARD (M_PI * 3) / 4
+
+#define SCL_AUTOTEST_TIMER_INTERVAL 20
+#define SCL_AUTOTEST_TIMER_INITIAL_INTERVAL 3000
+#define SCL_AUTOTEST_NUM 500
+
+#define SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_X 15
+#define SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_Y 20
+
+#define SCL_FLICK_GESTURE_RECOG_THRESHOLD 200
+#define SCL_FLICK_GESTURE_RECOG_TIME 500
+
+#define SCL_AUTO_DETECT_PORTRAIT_LANDSCAPE TRUE
+
+/* FIXME : This should be configurable also */
+#define SCL_HIGHLIGHT_UI_IMAGE "B09_Qwerty_btn_highlight.png"
+
+#define SCL_ANIMATION_TIMER_INTERVAL (1000 / 30) // 30 frames per second
+#define SCL_ANIMATION_TIME 300 // Animation for 300 ms
+
+typedef enum _SCLDebugMode {
+ DEBUGMODE_DISABLED,
+ DEBUGMODE_DISPLAY_INTERNAL,
+ DEBUGMODE_AUTOTEST,
+}SCLDebugMode;
+
+}
+
+#endif //__SCL_CONFIG_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "sclcontext.h"
+#include "scldebug.h"
+#include "sclwindows.h"
+#include "sclutils.h"
+#include "sclresourcecache.h"
+#include "sclres.h"
+#include <algorithm>
+
+//#include "sclresource.h"
+
+using namespace scl;
+
+CSCLContext::CSCLContext()
+{
+ SCL_DEBUG();
+
+ reset();
+}
+
+CSCLContext::~CSCLContext()
+{
+ SCL_DEBUG();
+}
+
+CSCLContext*
+CSCLContext::get_instance()
+{
+ static CSCLContext instance;
+ return &instance;
+}
+
+void
+CSCLContext::reset()
+{
+ SCL_DEBUG();
+
+ m_display_mode = DISPLAYMODE_PORTRAIT;
+ m_input_mode = 0;
+
+ m_shift_state = SCL_SHIFT_STATE_OFF;
+ m_shift_multi_touch_state = SCL_SHIFT_MULTITOUCH_OFF;
+
+ m_rotation = ROTATION_0;
+ m_prev_display_mode = DISPLAYMODE_PORTRAIT;
+ m_prev_input_mode = NOT_USED;
+
+ m_hidden = false;
+ m_caps_lock_mode = false;
+
+ m_magnifier_enabled = TRUE;
+ m_sound_enabled = TRUE;
+ m_vibration_enabled = TRUE;
+ m_shift_multi_touch_enabled = TRUE;
+ m_highlight_ui_enabled = FALSE;
+ m_highlight_ui_animation_enabled = FALSE;
+
+ m_tts_enabled = FALSE;
+ m_cur_highlighted_key = 0;
+ m_cur_highlighted_window = SCLWINDOW_INVALID;
+
+ m_multi_touch_context.clear();
+ m_last_touch_device_id = SCLTOUCHDEVICE_INVALID;
+
+ m_last_pressed_window = SCLWINDOW_INVALID;
+ m_last_pressed_key = NOT_USED;
+
+ m_last_event_fired_window = SCLWINDOW_INVALID;
+ m_last_event_fired_key = NOT_USED;
+
+ memset(m_cur_sub_layout, 0x00, sizeof(m_cur_sub_layout));
+}
+
+sclshort
+CSCLContext::get_popup_layout(sclwindow window) const
+{
+ SCL_DEBUG();
+
+ sclshort ret = NOT_USED;
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return ret;
+
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+
+ if (window_context) {
+ ret = window_context->layout;
+ }
+
+ return ret;
+}
+
+void
+CSCLContext::set_popup_layout(sclwindow window, sclshort val)
+{
+ SCL_DEBUG();
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return;
+
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+
+ if (window_context) {
+ window_context->layout = val;
+ }
+}
+
+void
+CSCLContext::set_base_layout(sclshort val)
+{
+ SCL_DEBUG();
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return;
+
+ //SclWindowContext *window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ window_context->layout = val;
+ }
+}
+
+sclshort
+CSCLContext::get_base_layout() const
+{
+ SCL_DEBUG();
+
+ sclshort ret = NOT_USED;
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return ret;
+
+ //SclWindowContext *window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ ret = window_context->layout;
+ }
+
+ return ret;
+}
+
+scl16
+CSCLContext::get_cur_pressed_event_id(scltouchdevice touch_id)
+{
+ scl16 ret = NOT_USED;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->event_id;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_pressed_event_id(scltouchdevice touch_id, scl16 id)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->event_id = id;
+ }
+}
+
+scl8
+CSCLContext::get_cur_pressed_key(scltouchdevice touch_id)
+{
+ scl8 ret = NOT_USED;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_pressed_key;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_pressed_key(scltouchdevice touch_id, scl8 val)
+{
+ MultiTouchContext *window_context = find_multi_touch_context(touch_id);
+ if (window_context) {
+ window_context->cur_pressed_key = val;
+ }
+}
+
+sclwindow
+CSCLContext::get_cur_pressed_window(scltouchdevice touch_id)
+{
+ sclwindow ret = SCLWINDOW_INVALID;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_pressed_window;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_pressed_window(scltouchdevice touch_id, sclwindow val)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->cur_pressed_window = val;
+ }
+}
+
+SclPoint
+CSCLContext::get_cur_pressed_point(scltouchdevice touch_id)
+{
+ SclPoint ret = {0, 0};
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_pressed_point;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_pressed_point(scltouchdevice touch_id, sclint x, sclint y)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->cur_pressed_point.x = x;
+ multi_touch_context->cur_pressed_point.y = y;
+ set_farthest_move_point(touch_id, x, y); // reset farthest move point
+ }
+}
+
+SclPoint
+CSCLContext::get_cur_moving_point(scltouchdevice touch_id)
+{
+ SclPoint ret = {0, 0};
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_moving_point;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_moving_point(scltouchdevice touch_id, sclint x, sclint y)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->cur_moving_point.x = x;
+ multi_touch_context->cur_moving_point.y = y;
+ }
+}
+
+sclwindow
+CSCLContext::get_cur_moving_window(scltouchdevice touch_id)
+{
+ sclwindow ret = SCLWINDOW_INVALID;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_moving_window;
+ }
+ return ret;
+}
+
+
+void
+CSCLContext::set_cur_moving_window(scltouchdevice touch_id, sclwindow window)
+{
+ MultiTouchContext *window_context = find_multi_touch_context(touch_id);
+ if (window_context) {
+ window_context->cur_moving_window = window;
+ }
+}
+
+struct timeval
+CSCLContext::get_cur_pressed_time(scltouchdevice touch_id)
+{
+ struct timeval ret = {0, 0};
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_pressed_time;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_pressed_time(scltouchdevice touch_id)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ gettimeofday(&(multi_touch_context->cur_pressed_time), NULL);
+ }
+}
+
+SclPoint
+CSCLContext::get_farthest_move_point(scltouchdevice touch_id)
+{
+ SclPoint ret = {0, 0};
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->farthest_move_point;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_farthest_move_point(scltouchdevice touch_id, sclint x, sclint y)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ multi_touch_context->farthest_move_dist =
+ utils->get_approximate_distance(x, y,
+ multi_touch_context->cur_pressed_point.x, multi_touch_context->cur_pressed_point.y);
+ }
+
+ multi_touch_context->farthest_move_point.x = x;
+ multi_touch_context->farthest_move_point.y = y;
+ }
+}
+
+sclint
+CSCLContext::get_farthest_move_dist(scltouchdevice touch_id)
+{
+ sclint ret = 0;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->farthest_move_dist;
+ }
+ return ret;
+}
+
+SCLDragState
+CSCLContext::get_cur_drag_state(scltouchdevice touch_id)
+{
+ SCLDragState ret = SCL_DRAG_STATE_NONE;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_drag_state;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_drag_state(scltouchdevice touch_id, SCLDragState state)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->cur_drag_state = state;
+ }
+}
+
+SCLKeyModifier
+CSCLContext::get_cur_key_modifier(scltouchdevice touch_id)
+{
+ SCLKeyModifier ret = KEY_MODIFIER_NONE;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->cur_key_modifier;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_cur_key_modifier(scltouchdevice touch_id, SCLKeyModifier modifier)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->cur_key_modifier = modifier;
+ }
+}
+
+scl8
+CSCLContext::get_prev_pressed_key(scltouchdevice touch_id)
+{
+ scl8 ret = NOT_USED;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->prev_pressed_key;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_prev_pressed_key(scltouchdevice touch_id, scl8 val)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->prev_pressed_key = val;
+ }
+}
+
+sclwindow
+CSCLContext::get_prev_pressed_window(scltouchdevice touch_id)
+{
+ sclwindow ret = SCLWINDOW_INVALID;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->prev_pressed_window;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_prev_pressed_window(scltouchdevice touch_id, sclwindow val)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->prev_pressed_window = val;
+ }
+}
+
+SclPoint
+CSCLContext::get_prev_moving_point(scltouchdevice touch_id)
+{
+ SclPoint ret = {0, 0};
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->prev_moving_point;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_prev_moving_point(scltouchdevice touch_id, sclint x, sclint y)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->prev_moving_point.x = x;
+ multi_touch_context->prev_moving_point.y = y;
+ }
+}
+
+SCLDragState
+CSCLContext::get_prev_drag_state(scltouchdevice touch_id)
+{
+ SCLDragState ret = SCL_DRAG_STATE_NONE;
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ ret = multi_touch_context->prev_drag_state;
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_prev_drag_state(scltouchdevice touch_id, SCLDragState state)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ multi_touch_context->prev_drag_state = state;
+ }
+}
+
+void
+CSCLContext::create_multi_touch_context(scltouchdevice touch_id, sclboolean is_sub_event)
+{
+ MultiTouchContext new_multi_touch_context;
+ memset(&new_multi_touch_context, 0x00, sizeof(MultiTouchContext));
+ new_multi_touch_context.used = TRUE;
+ new_multi_touch_context.cur_pressed_key = NOT_USED;
+ new_multi_touch_context.cur_pressed_window = SCLWINDOW_INVALID;
+ new_multi_touch_context.event_id = 0;
+ new_multi_touch_context.prev_pressed_key = NOT_USED;
+ new_multi_touch_context.prev_pressed_window = SCLWINDOW_INVALID;
+ new_multi_touch_context.cur_pressed_point.x = new_multi_touch_context.cur_pressed_point.y = 0;
+ new_multi_touch_context.cur_pressed_time.tv_sec = new_multi_touch_context.cur_pressed_time.tv_usec = 0;
+ new_multi_touch_context.cur_drag_state = SCL_DRAG_STATE_NONE;
+ new_multi_touch_context.is_sub_event = is_sub_event;
+ m_multi_touch_context[touch_id] = new_multi_touch_context;
+
+ m_multi_touch_seq.insert(m_multi_touch_seq.end(), touch_id);
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ for (std::list<scltouchdevice>::iterator iter = m_multi_touch_seq.begin();iter != m_multi_touch_seq.end();std::advance(iter, 1)) {
+ utils->log("LIST : %d\n", *iter);
+ }
+ utils->log("\n");
+ }
+}
+
+void
+CSCLContext::destroy_multi_touch_context(scltouchdevice touch_id)
+{
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ memset(multi_touch_context, 0x00, sizeof(MultiTouchContext));
+ m_multi_touch_context.erase(touch_id);
+ }
+
+ sclboolean bFound = TRUE;
+ std::list<scltouchdevice>::iterator iter;
+ do {
+ iter = std::find(m_multi_touch_seq.begin(), m_multi_touch_seq.end(), touch_id);
+ if (iter != m_multi_touch_seq.end()) {
+ m_multi_touch_seq.erase(iter);
+ } else {
+ bFound = FALSE;
+ }
+ } while (bFound);
+
+ /*
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ for(iter = m_multi_touch_seq.begin();iter != m_multi_touch_seq.end();std::advance(iter, 1)) {
+ utils->log("LIST : %d\n", *iter);
+ }
+ utils->log("\n");
+ }
+ */
+}
+
+MultiTouchContext*
+CSCLContext::find_multi_touch_context(scltouchdevice touch_id)
+{
+ MultiTouchContext* ret = NULL;
+ std::map<scltouchdevice, MultiTouchContext>::iterator iter = m_multi_touch_context.find(touch_id);
+ if (iter != m_multi_touch_context.end()) {
+ ret = &(iter->second);
+ }
+
+ return ret;
+}
+
+sclint
+CSCLContext::get_multi_touch_context_num()
+{
+ return m_multi_touch_seq.size();
+}
+
+sclboolean
+CSCLContext::get_multi_touch_event(sclint order, SclUIEventDesc *desc)
+{
+ sclboolean ret = FALSE;
+ sclint index = 0;
+
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ if (!cache) return ret;
+ for (std::list<scltouchdevice>::iterator list_iter = m_multi_touch_seq.begin();
+ !ret && list_iter != m_multi_touch_seq.end();std::advance(list_iter, 1)) {
+ if (index == order) {
+ MultiTouchContext *multi_touch_context = find_multi_touch_context(*list_iter);
+ if (multi_touch_context) {
+ const SclLayoutKeyCoordinate *coordinate =
+ cache->get_cur_layout_key_coordinate(multi_touch_context->cur_pressed_window,
+ multi_touch_context->cur_pressed_key);
+
+ if (coordinate) {
+ SCLShiftState shift_index = get_shift_state();
+ if (shift_index >= SCL_SHIFT_STATE_MAX) shift_index = SCL_SHIFT_STATE_OFF;
+ desc->key_event = coordinate->key_event[shift_index][0];
+ desc->key_value = coordinate->key_value[shift_index][0];
+ desc->key_type = coordinate->key_type;
+ } else {
+ desc->key_event = 0;
+ desc->key_value = NULL;
+ desc->key_type = KEY_TYPE_NONE;
+ }
+ desc->key_modifier = multi_touch_context->cur_key_modifier;
+
+ desc->touch_id = (*list_iter);
+ desc->mouse_pressed_point = multi_touch_context->cur_pressed_point;
+ desc->mouse_current_point = multi_touch_context->cur_moving_point;
+ desc->mouse_farthest_point = multi_touch_context->farthest_move_point;
+
+ desc->touch_event_order = index;
+
+ desc->event_type = EVENT_TYPE_NONE;
+
+ ret = TRUE;
+ }
+ }
+ index++;
+ }
+
+ return ret;
+}
+
+sclint
+CSCLContext::get_multi_touch_event_order(scltouchdevice touch_id)
+{
+ sclint ret = -1;
+ sclint iSeqIndex = 0;
+
+ for (std::list<scltouchdevice>::iterator list_iter = m_multi_touch_seq.begin();
+ (ret == -1) && list_iter != m_multi_touch_seq.end();std::advance(list_iter, 1)) {
+ if (touch_id == (*list_iter)) {
+ ret = iSeqIndex;
+ } else {
+ iSeqIndex++;
+ }
+ }
+
+ return ret;
+}
+
+sclchar* CSCLContext::get_cur_sublayout()
+{
+ return m_cur_sub_layout;
+}
+
+sclboolean CSCLContext::set_cur_sublayout(const sclchar* sublayout)
+{
+ sclboolean ret = FALSE;
+ if (sublayout) {
+ strncpy(m_cur_sub_layout, sublayout, MAX_SIZE_OF_SUBLAYOUT_STRING);
+ m_cur_sub_layout[MAX_SIZE_OF_SUBLAYOUT_STRING - 1] = '\0';
+ } else {
+ m_cur_sub_layout[0] = '\0';
+ }
+ return ret;
+}
+
+void
+CSCLContext::set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label)
+{
+ if (scl_check_arrindex(index, MAX_SIZE_OF_LABEL_FOR_ONE)) {
+ MagnifierCustomLabelIdx label_index;
+ label_index.touch_id = touch_id;
+ label_index.index = index;
+ if (label) {
+ m_custom_magnifier_label[label_index] = std::string(label);
+ } else {
+ MagnifierCustomLabelIdxMap::iterator iter = m_custom_magnifier_label.find(label_index);
+ if (iter != m_custom_magnifier_label.end()) {
+ m_custom_magnifier_label.erase(iter);
+ }
+ }
+ }
+}
+
+const sclchar*
+CSCLContext::get_custom_magnifier_label(scltouchdevice touch_id, sclint index)
+{
+ MagnifierCustomLabelIdx label_index;
+ label_index.touch_id = touch_id;
+ label_index.index = index;
+
+ const sclchar* ret = NULL;
+
+ if (scl_check_arrindex(index, MAX_SIZE_OF_LABEL_FOR_ONE)) {
+ MagnifierCustomLabelIdxMap::iterator iter = m_custom_magnifier_label.find(label_index);
+ if (iter != m_custom_magnifier_label.end()) {
+ ret = (iter->second).c_str();
+ }
+ }
+
+ return ret;
+}
+
+SCLShiftState CSCLContext::get_shift_state() const
+{
+ SCLShiftState ret = SCL_SHIFT_STATE_OFF;
+ if (m_shift_state < SCL_SHIFT_STATE_MAX) {
+ ret = m_shift_state;
+ }
+ return ret;
+}
+
+void CSCLContext::set_shift_state(SCLShiftState val)
+{
+ if (val < SCL_SHIFT_STATE_MAX) {
+ m_shift_state = val;
+ if (val == SCL_SHIFT_STATE_OFF) {
+ m_shift_multi_touch_state = SCL_SHIFT_MULTITOUCH_OFF;
+ } else if (val == SCL_SHIFT_STATE_ON) {
+ m_shift_multi_touch_state = SCL_SHIFT_MULTITOUCH_ON_RELEASED;
+ } else if (val == SCL_SHIFT_STATE_LOCK) {
+ m_shift_multi_touch_state = SCL_SHIFT_MULTITOUCH_LOCK;
+ }
+ }
+}
+
+sclboolean CSCLContext::get_caps_lock_mode() const
+{
+ return m_caps_lock_mode;
+}
+
+void CSCLContext::set_caps_lock_mode(sclboolean val)
+{
+ m_caps_lock_mode = val;
+}
+
+SCLShiftMultitouchState CSCLContext::get_shift_multi_touch_state() const
+{
+ SCLShiftMultitouchState ret = SCL_SHIFT_MULTITOUCH_OFF;
+ if (m_shift_multi_touch_state < SCL_SHIFT_MULTITOUCH_MAX) {
+ ret = m_shift_multi_touch_state;
+ }
+ return ret;
+}
+
+void CSCLContext::set_shift_multi_touch_state(SCLShiftMultitouchState val)
+{
+ if (val < SCL_SHIFT_MULTITOUCH_MAX) {
+ m_shift_multi_touch_state = val;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_CONTEXT_H__
+#define __SCL_CONTEXT_H__
+
+//SCL_BEGIN_DECLS
+#include <sys/time.h>
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "scleventcallback.h"
+#include <map>
+#include <list>
+#include <string>
+
+namespace scl
+{
+
+typedef struct { // A context information dependant on each multitouch events
+ sclboolean used;
+
+ scl8 cur_pressed_key;
+ sclwindow cur_pressed_window;
+ SclPoint cur_pressed_point;
+ struct timeval cur_pressed_time;
+
+ sclwindow cur_moving_window;
+ SclPoint cur_moving_point;
+
+ SCLDragState cur_drag_state;
+ SCLKeyModifier cur_key_modifier;
+
+ SclPoint farthest_move_point;
+ sclint farthest_move_dist;
+
+ scl8 prev_pressed_key;
+ sclwindow prev_pressed_window;
+
+ SclPoint prev_moving_point;
+ SCLDragState prev_drag_state;
+
+ scl16 event_id;
+
+ sclboolean is_sub_event;
+} MultiTouchContext;
+
+typedef struct { // A struct for identifying Magnifier custom label information
+ scltouchdevice touch_id;
+ sclint index;
+} MagnifierCustomLabelIdx;
+class MagnifierCustomLabelIdxCompare { // Comparison class for MagnifierCustomLabelIdx
+public:
+ bool operator()(const MagnifierCustomLabelIdx x, const MagnifierCustomLabelIdx y) {
+ if (x.touch_id != y.touch_id) {
+ return x.touch_id > y.touch_id;
+ } else {
+ return x.index > y.index;
+ }
+ }
+};
+typedef std::map<MagnifierCustomLabelIdx, std::string, MagnifierCustomLabelIdxCompare> MagnifierCustomLabelIdxMap;
+
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLContext
+{
+private:
+ CSCLContext();
+public:
+ virtual ~CSCLContext();
+
+ /* reset to the default context status */
+ void reset();
+
+ /* for singleton */
+ static CSCLContext* get_instance();
+
+ SCLDisplayMode get_display_mode() const {
+ return m_display_mode;
+ }
+ void set_display_mode(SCLDisplayMode val) {
+ m_prev_display_mode = m_display_mode;
+ m_display_mode = val;
+ }
+
+ scl8 get_input_mode() const {
+ return m_input_mode;
+ }
+ void set_input_mode(scl8 val) {
+ m_prev_input_mode = m_input_mode;
+ m_input_mode = val;
+ }
+
+ sclshort get_base_layout() const;
+ void set_base_layout(sclshort val);
+
+ sclshort get_popup_layout(sclwindow window) const;
+ void set_popup_layout(sclwindow window, sclshort val);
+
+ SCLShiftState get_shift_state() const;
+ void set_shift_state(SCLShiftState val);
+
+ sclboolean get_caps_lock_mode() const;
+ void set_caps_lock_mode(sclboolean val);
+
+ SCLShiftMultitouchState get_shift_multi_touch_state() const;
+ void set_shift_multi_touch_state(SCLShiftMultitouchState val);
+
+ SCLDisplayMode get_prev_display_mode() const {
+ return m_prev_display_mode;
+ }
+ scl8 get_prev_inputmode() const {
+ return m_prev_input_mode;
+ }
+
+ sclboolean get_hidden_state() const {
+ return m_hidden;
+ }
+ void set_hidden_state(sclboolean val) {
+ m_hidden = val;
+ }
+
+ SCLRotation get_rotation() const {
+ return m_rotation;
+ }
+ void set_rotation(SCLRotation val) {
+ m_rotation = val;
+ }
+
+ void set_magnifier_enabled(sclboolean enabled) {
+ m_magnifier_enabled = enabled;
+ }
+ sclboolean get_magnifier_enabled() {
+ return m_magnifier_enabled;
+ }
+ void set_sound_enabled(sclboolean enabled) {
+ m_sound_enabled = enabled;
+ }
+ sclboolean get_sound_enabled() {
+ return m_sound_enabled;
+ }
+ void set_vibration_enabled(sclboolean enabled) {
+ m_vibration_enabled = enabled;
+ }
+ sclboolean get_vibration_enabled() {
+ return m_vibration_enabled;
+ }
+ void set_shift_multi_touch_enabled(sclboolean enabled) {
+ m_shift_multi_touch_enabled = enabled;
+ }
+ sclboolean get_shift_multi_touch_enabled() {
+ return m_shift_multi_touch_enabled;
+ }
+ void set_highlight_ui_enabled(sclboolean enabled) {
+ m_highlight_ui_enabled = enabled;
+ }
+ sclboolean get_highlight_ui_enabled() {
+ return m_highlight_ui_enabled;
+ }
+ void set_highlight_ui_animation_enabled(sclboolean enabled) {
+ m_highlight_ui_animation_enabled = enabled;
+ }
+ sclboolean get_highlight_ui_animation_enabled() {
+ return m_highlight_ui_animation_enabled;
+ }
+
+ scl8 get_last_pressed_key() {
+ return m_last_pressed_key;
+ }
+ void set_last_pressed_key(scl8 val) {
+ m_last_pressed_key = val;
+ }
+ sclwindow get_last_pressed_window() {
+ return m_last_pressed_window;
+ }
+ void set_last_pressed_window(sclwindow window) {
+ m_last_pressed_window = window;
+ }
+
+ scl8 get_last_event_fired_key() {
+ return m_last_event_fired_key;
+ }
+ void set_last_event_fired_key(scl8 val) {
+ m_last_event_fired_key = val;
+ }
+ sclwindow get_last_event_fired_window() {
+ return m_last_event_fired_window;
+ }
+ void set_last_event_fired_window(sclwindow window) {
+ m_last_event_fired_window = window;
+ }
+
+ scltouchdevice get_last_touch_device_id() const {
+ return m_last_touch_device_id;
+ }
+ void set_last_touch_device_id(scltouchdevice touch_id) {
+ m_last_touch_device_id = touch_id;
+ }
+
+ void set_tts_enabled(sclboolean enabled) {
+ m_tts_enabled = enabled;
+ }
+
+ sclboolean get_tts_enabled() {
+ return m_tts_enabled;
+ }
+
+ void set_cur_highlighted_key(scl8 val) {
+ m_cur_highlighted_key = val;
+ }
+
+ scl8 get_cur_highlighted_key() {
+ return m_cur_highlighted_key;
+ }
+
+ void set_cur_highlighted_window(sclwindow window) {
+ m_cur_highlighted_window = window;
+ }
+
+ sclwindow get_cur_highlighted_window() {
+ return m_cur_highlighted_window;
+ }
+
+ void create_multi_touch_context(scltouchdevice touch_id, sclboolean is_sub_event = FALSE);
+ void destroy_multi_touch_context(scltouchdevice touch_id);
+ MultiTouchContext* find_multi_touch_context(scltouchdevice touch_id);
+
+ scl16 get_cur_pressed_event_id(scltouchdevice touch_id);
+ void set_cur_pressed_event_id(scltouchdevice touch_id, scl16 id);
+ scl8 get_cur_pressed_key(scltouchdevice touch_id);
+ void set_cur_pressed_key(scltouchdevice touch_id, scl8 val);
+ sclwindow get_cur_pressed_window(scltouchdevice touch_id);
+ void set_cur_pressed_window(scltouchdevice touch_id, sclwindow window);
+ SclPoint get_cur_pressed_point(scltouchdevice touch_id);
+ void set_cur_pressed_point(scltouchdevice touch_id, sclint x, sclint y);
+ struct timeval get_cur_pressed_time(scltouchdevice touch_id);
+ void set_cur_pressed_time(scltouchdevice touch_id);
+
+ void set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label);
+ const sclchar* get_custom_magnifier_label(scltouchdevice touch_id, sclint index);
+
+ SclPoint get_cur_moving_point(scltouchdevice touch_id);
+ void set_cur_moving_point(scltouchdevice touch_id, sclint x, sclint y);
+ sclwindow get_cur_moving_window(scltouchdevice touch_id);
+ void set_cur_moving_window(scltouchdevice touch_id, sclwindow window);
+ SclPoint get_farthest_move_point(scltouchdevice touch_id);
+ void set_farthest_move_point(scltouchdevice touch_id, sclint x, sclint y);
+ sclint get_farthest_move_dist(scltouchdevice touch_id);
+
+ SCLDragState get_cur_drag_state(scltouchdevice touch_id);
+ void set_cur_drag_state(scltouchdevice touch_id, SCLDragState state);
+ SCLKeyModifier get_cur_key_modifier(scltouchdevice touch_id);
+ void set_cur_key_modifier(scltouchdevice touch_id, SCLKeyModifier modifier);
+
+ scl8 get_prev_pressed_key(scltouchdevice touch_id);
+ void set_prev_pressed_key(scltouchdevice touch_id, scl8 val);
+ sclwindow get_prev_pressed_window(scltouchdevice touch_id);
+ void set_prev_pressed_window(scltouchdevice touch_id, sclwindow window);
+
+ SclPoint get_prev_moving_point(scltouchdevice touch_id);
+ void set_prev_moving_point(scltouchdevice touch_id, sclint x, sclint y);
+ SCLDragState get_prev_drag_state(scltouchdevice touch_id);
+ void set_prev_drag_state(scltouchdevice touch_id, SCLDragState state);
+
+ sclint get_multi_touch_context_num();
+ sclboolean get_multi_touch_event(sclint order, SclUIEventDesc *desc);
+ sclint get_multi_touch_event_order(scltouchdevice touch_id);
+
+ sclchar* get_cur_sublayout();
+ sclboolean set_cur_sublayout(const sclchar* sublayout);
+
+protected:
+ /* stores the current context */
+ SCLDisplayMode m_display_mode;
+ scl8 m_input_mode;
+
+ /* stores the last context */
+ SCLDisplayMode m_prev_display_mode;
+ scl8 m_prev_input_mode;
+
+ sclboolean m_hidden;
+ SCLShiftState m_shift_state;
+ sclboolean m_caps_lock_mode;
+ SCLShiftMultitouchState m_shift_multi_touch_state;
+
+ sclchar m_cur_sub_layout[MAX_SIZE_OF_SUBLAYOUT_STRING];
+
+ SCLRotation m_rotation;
+
+ sclboolean m_magnifier_enabled;
+ sclboolean m_sound_enabled;
+ sclboolean m_vibration_enabled;
+ sclboolean m_shift_multi_touch_enabled;
+ sclboolean m_highlight_ui_enabled;
+ sclboolean m_highlight_ui_animation_enabled;
+
+ sclwindow m_last_pressed_window;
+ scl8 m_last_pressed_key;
+
+ sclwindow m_last_event_fired_window;
+ scl8 m_last_event_fired_key;
+
+ sclboolean m_tts_enabled;
+ scl8 m_cur_highlighted_key;
+ sclwindow m_cur_highlighted_window;
+
+ scltouchdevice m_last_touch_device_id;
+ std::map<scltouchdevice, MultiTouchContext> m_multi_touch_context;
+ std::list<scltouchdevice> m_multi_touch_seq;
+
+ MagnifierCustomLabelIdxMap m_custom_magnifier_label;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_CONTEXT_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <time.h>
+#include <math.h>
+#include <assert.h>
+#include <vector>
+
+#include "sclcontroller.h"
+#include "scldebug.h"
+#include "sclresourcecache.h"
+#include "sclactionstate.h"
+#include "scluibuilder.h"
+#include "sclkeydefines.h"
+#include "sclfeedback.h"
+#include "sclerroradjustment.h"
+#include "sclimageproxy.h"
+#include "sclres_manager.h"
+#include "scleventhandler.h"
+#include "sclanimator.h"
+#include "sclkeyfocushandler.h"
+#include <dlog.h>
+
+//#define DIRECTLY_DRAW_ON_EVENTS
+
+using namespace scl;
+
+static sclboolean
+_play_tts_for_input_mode_name(int mode) {
+ SCL_DEBUG();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context && context->get_tts_enabled() == FALSE) {
+ return FALSE;
+ }
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return FALSE;
+
+ const SclInputModeConfigure *pinput_mode_table = sclres_manager->get_input_mode_configure_table();
+ if (NULL == pinput_mode_table) {
+ return FALSE;
+ }
+
+ const char* name = pinput_mode_table[mode].name;
+ if (NULL == name) {
+ return FALSE;
+ }
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils)
+ utils->play_tts(name);
+ return TRUE;
+}
+
+static sclboolean
+_play_tts_for_layout_autopopup_name() {
+ SCL_DEBUG();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context && context->get_tts_enabled() == FALSE) {
+ return FALSE;
+ }
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils)
+ utils->play_tts(SCL_LAYOUT_AUTOPOPUP_NAME);
+ return TRUE;
+}
+
+CSCLController::CSCLController()
+{
+ SCL_DEBUG();
+
+ m_long_key_duration = SCL_LONGKEY_DURATION;
+ m_long_key_cancel_distance = SCL_LONGKEY_CANCEL_DIST;
+ m_repeat_key_duration = SCL_REPEATKEY_DURATION;
+ m_autopopup_key_duration = SCL_AUTOPOPUP_KEY_DURATION;
+
+ m_button_delay_duration = SCL_BUTTON_MIN_DURATION;
+ m_multitap_delay_duration = SCL_MULTITAP_DEFAULT_DURATION;
+
+ m_key_repeated_num = 0;
+
+ m_debug_mode = DEBUGMODE_DISABLED;
+ m_debug_variable = 0;
+
+ m_input_events_disabled = FALSE;
+}
+
+CSCLController::~CSCLController()
+{
+ SCL_DEBUG();
+}
+
+CSCLController*
+CSCLController::get_instance()
+{
+ static CSCLController instance;
+ return &instance;
+}
+
+void
+CSCLController::init()
+{
+ SCL_DEBUG();
+}
+
+//#define TEST_NEWBACKEND
+#ifdef TEST_NEWBACKEND
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+#include <vector>
+typedef enum {
+ EFLOBJECT_NONE,
+ EFLOBJECT_IMAGE,
+ EFLOBJECT_CLIPOBJECT,
+ EFLOBJECT_TEXTBLOCK,
+} EFLOBJECT_TYPE;
+
+ typedef struct {
+ EFLOBJECT_TYPE type;
+ SclRectangle position;
+ Evas_Object *object;
+ char *etc_info;
+ sclboolean extracted;
+ void *data;
+ } EFLObject;
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+ typedef struct {
+ sclboolean used;
+
+ Evas_Object *image;
+ Evas_Object *clipper;
+
+ sclwindow window;
+ sclchar image_path[_POSIX_PATH_MAX];
+ sclint imgPathHash;
+ sclint dest_x;
+ sclint dest_y;
+ sclint dest_width;
+ sclint dest_height;
+ sclint src_x;
+ sclint src_y;
+ sclint src_width;
+ sclint src_height;
+ sclboolean extrace_image;
+ } ImageCache;
+
+ typedef struct {
+ sclboolean used;
+
+ Evas_Object *text;
+
+ sclwindow window;
+ scl::SclFontInfo font_info;
+ SclColor color;
+ sclchar str[_POSIX_PATH_MAX];;
+ sclint strHash;
+ sclint pos_x;
+ sclint pos_y;
+ sclint width;
+ sclint height;
+ SCLLabelAlignment align;
+ sclshort padding_x;
+ sclshort padding_y;
+ sclbyte inner_width;
+ sclbyte inner_height;
+ } TextCache;
+
+extern std::vector<ImageCache> g_ImageCache;
+extern std::vector<TextCache> g_TextCache;
+#else
+#endif
+
+/**
+ * Sets the current input mode to the given mode
+ */
+sclboolean
+CSCLController::process_input_mode_change(const sclbyte mode)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!utils || !context || !windows || !cache || !sclres_manager) return FALSE;
+
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ if (!sclres_input_mode_configure) return FALSE;
+
+ if (context && windows && cache && utils) {
+ if (mode == context->get_input_mode() || mode == (sclbyte)NOT_USED) {
+ /* ButtonContext does not get initialized if we don't call here */
+ cache->recompute_layout(windows->get_base_window());
+ return FALSE;
+ }
+
+ context->set_input_mode(mode);
+ /* FIXME : NEWXML temporary commenting out */
+ //context->set_base_layout(sclres_input_mode_configure[mode].layouts[context->get_display()]);
+
+ _play_tts_for_input_mode_name(mode);
+
+ sclwindow window = windows->get_base_window();
+ handle_engine_signal(SCL_SIG_INPMODE_CHANGE, window);
+
+#ifdef TEST_NEWBACKEND
+ SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ if (window_context) {
+ if (window_context->etc_info) {
+ Eina_List *list = (Eina_List*)(window_context->etc_info);
+ Eina_List *iter = NULL;
+ Eina_List *iter_next = NULL;
+ void *data = NULL;
+ int iIndex = 0;
+
+ EINA_LIST_FOREACH_SAFE(list, iter, iter_next, data) {
+ if (data) {
+ EFLObject *object = (EFLObject*)(data);
+ if (object) {
+ Evas_Object* eo = object->object;
+ if (object->extracted) {
+ void *data = evas_object_image_data_get(eo, 1);
+ if (data) {
+ free(data);
+ }
+ }
+
+ sclint loop;
+ for (loop = 0;loop < (sclint)g_ImageCache.size();loop++) {
+ if (g_ImageCache[loop].image == object->object) {
+ g_ImageCache[loop].used = FALSE;
+ }
+ }
+ for (loop = 0;loop < (sclint)g_TextCache.size();loop++) {
+ if (g_TextCache[loop].text == object->object) {
+ g_TextCache[loop].used = FALSE;
+ }
+ }
+
+ if (eo) {
+ evas_object_del(eo);
+ object->object = NULL;
+ }
+ delete object;
+ }
+ list = eina_list_remove_list(list, iter);
+ }
+ iIndex++;
+ }
+ window_context->etc_info = list;
+ }
+ }
+#endif
+ }
+
+ return ret;
+}
+
+/**
+ * Sets the current display mode to the given mode
+ */
+sclboolean
+CSCLController::process_rotation_change(const SCLRotation rotation)
+{
+ SCL_DEBUG();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!sclres_manager) return FALSE;
+
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ if (!sclres_input_mode_configure) return FALSE;
+
+ if (context && windows) {
+ SCLDisplayMode mode;
+ if (rotation == ROTATION_90_CW || rotation == ROTATION_90_CCW) {
+ mode = DISPLAYMODE_LANDSCAPE;
+ } else {
+ mode = DISPLAYMODE_PORTRAIT;
+ }
+
+ //if (mode == context->get_display()) return FALSE;
+ context->set_display_mode(mode);
+ context->set_rotation(rotation);
+ /* FIXME : NEWXML temporary commenting out */
+ //context->set_base_layout(sclres_input_mode_configure[context->get_input_mode()].layouts[context->get_display()]);
+
+ sclwindow window = windows->get_base_window();
+ handle_engine_signal(SCL_SIG_DISP_CHANGE, window);
+ windows->update_window(window);
+
+ /* Moved to here since the new WMSync requires the rotation call be invoked as the
+ last step of display change process */
+ /* Make sure to set window's rotation degree before sending engine signal, which adjusts the size of main window */
+ windows->set_window_rotation(NULL, rotation);
+ }
+ return TRUE;
+}
+
+/**
+ * Checks if the given button with given touch_id needs magnifier window
+ */
+sclboolean
+CSCLController::check_magnifier_available(sclwindow window, sclbyte key_index, scltouchdevice touch_id)
+{
+ sclboolean ret = FALSE;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ const SclLayout *layout = NULL;
+ SclButtonContext *button_context = NULL;
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ if (context && cache) {
+ layout = cache->get_cur_layout(window);
+ button_context = cache->get_cur_button_context(window, key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ if (layout && coordinate && button_context && context->get_magnifier_enabled()) {
+ if (coordinate->key_type != KEY_TYPE_CONTROL &&
+ coordinate->key_type != KEY_TYPE_MODECHANGE &&
+ coordinate->key_type != KEY_TYPE_NONE) {
+ ret = TRUE;
+
+ /* Do not show if current layout does not allow magnifier */
+ if (!(layout->use_magnifier_window)) {
+ //utils->log("show_magnifier !(layout->use_magnifier_window \n");
+ ret = FALSE;
+ }
+
+ /* Do not show if there's nothing to show */
+ const sclchar* custom_label = NULL;
+ for (sclint label_index = 0;label_index < MAX_SIZE_OF_LABEL_FOR_ONE && !custom_label;label_index++) {
+ const sclchar *temp_label = context->get_custom_magnifier_label(touch_id, label_index);
+ if (temp_label) {
+ custom_label = temp_label;
+ }
+ }
+ if (!custom_label) {
+ //if (coordinate->key_value[shift_index][button_context->multikeyIdx] == NULL) {
+ if (coordinate->label[shift_index][button_context->multitap_index] == NULL) {
+ //utils->log("show_magnifier coordinate->key_value[shift][button_context->multikeyIdx] == NULL \n");
+ ret = FALSE;
+ //} else if (strlen(coordinate->key_value[shift_index][button_context->multikeyIdx]) == 0) {
+ } else if (strlen(coordinate->label[shift_index][button_context->multitap_index]) == 0) {
+ //utils->log("show_magnifier coordinate->key_value[shift][button_context->multikeyIdx]) == 0 \n");
+ ret = FALSE;
+ }
+ }
+
+ if (touch_id != context->get_last_touch_device_id()) {
+ ret = FALSE;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::process_button_pressed_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+ sclboolean redraw = FALSE;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLFeedback *feedback = CSCLFeedback::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!sclres_manager) return FALSE;
+
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ PSclLayout sclres_layout = sclres_manager->get_layout_table();
+ if (!sclres_input_mode_configure || !sclres_layout) return FALSE;
+
+ SclButtonContext *button_context = NULL;
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ if (context && cache) {
+ button_context = cache->get_cur_button_context(window, key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ }
+
+ if (context && cache && windows && events && utils && feedback && handler && button_context && coordinate) {
+ /* First check if this button is enabled in current active sublayout */
+ sclboolean sub_layout_match = TRUE;
+ if (coordinate->sub_layout && context->get_cur_sublayout()) {
+ if (strncmp(coordinate->sub_layout, context->get_cur_sublayout(), MAX_SIZE_OF_SUBLAYOUT_STRING) != 0) {
+ sub_layout_match = FALSE;
+ }
+ }
+
+ /* If this button is pressed */
+ if ( x >= coordinate->x - coordinate->add_hit_left &&
+ x < coordinate->x + coordinate->width + coordinate->add_hit_right &&
+ y >= coordinate->y - coordinate->add_hit_top &&
+ y < coordinate->y + coordinate->height + coordinate->add_hit_bottom &&
+ /* Process the event only if the this item's sublayout id is active one */
+ sub_layout_match ) {
+ /* If currently shift mode is ON, and the last key was multitap, this means the shift did not
+ turned off because of multitap button. So we need to turn it off here forcibly */
+ sclwindow last_win = context->get_last_event_fired_window();
+ scl8 last_key = context->get_last_event_fired_key();
+ LOGD("last_win : %p last_key : :%d", last_win, last_key);
+ const SclLayoutKeyCoordinate *last_coordinate = cache->get_cur_layout_key_coordinate(last_win, last_key);
+ if (last_coordinate) {
+ LOGD("last_coordinate->button_type : %d", last_coordinate->button_type);
+ if (last_coordinate->button_type == BUTTON_TYPE_MULTITAP && context->get_shift_state() == SCL_SHIFT_STATE_ON) {
+ /* And if the multitap button was different from the one we are dealing with... */
+ LOGD("last_win %p window %p last_key %d key_index %d", last_win, window, last_key, key_index);
+ if (last_win != window || last_key != key_index) {
+ SclNotiShiftStateChangeDesc desc;
+ desc.ui_event_desc = NULL;
+ desc.shift_state = SCL_SHIFT_STATE_OFF;
+
+ SCLEventReturnType ret = handler->on_event_notification(SCL_UINOTITYPE_SHIFT_STATE_CHANGE, &desc);
+ if (ret == SCL_EVENT_PASS_ON) {
+ context->set_shift_state(SCL_SHIFT_STATE_OFF);
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+ }
+
+ /* If newly pressed key has type MULTI_TOUCH_TYPE_EXCLUSIVE, release all existing pressed events */
+ if (actual_event) {
+ if (coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_EXCLUSIVE) {
+ /* When calling mouse_release, the seq order of current multitouch events will be changed,
+ so we put all the multitouch events into a vector and use them afterwards forreleasing */
+ sclint loop = 0;
+ sclint multi_touch_context_num = context->get_multi_touch_context_num();
+ std::vector<SclUIEventDesc> multi_touch_events;
+ for (loop = 0;loop < multi_touch_context_num;loop++) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(loop, &desc);
+ multi_touch_events.push_back(desc);
+ }
+ for (loop = 0;loop < multi_touch_context_num;loop++) {
+ SclUIEventDesc desc = multi_touch_events[loop];
+ if (desc.touch_id != touch_id) {
+ mouse_release(context->get_cur_moving_window(desc.touch_id),
+ context->get_cur_moving_point(desc.touch_id).x,
+ context->get_cur_moving_point(desc.touch_id).y,
+ desc.touch_id, FALSE);
+ }
+ }
+ }
+ }
+
+ /* Make an unique ID for timer */
+ const scl16 uniqId = utils->get_unique_id();
+
+ context->set_cur_pressed_event_id(touch_id, uniqId);
+ context->set_cur_pressed_key(touch_id, key_index);
+ context->set_cur_pressed_window(touch_id, window);
+
+ button_context->state = BUTTON_STATE_PRESSED;
+
+ if (context->get_highlight_ui_enabled()) {
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+ if (focus_handler) {
+ sclwindow prev_window = focus_handler->get_current_focus_window();
+ scl8 prev_key = focus_handler->get_current_focus_key();
+ const SclLayoutKeyCoordinate *prev_coordinate =
+ cache->get_cur_layout_key_coordinate(prev_window, prev_key);
+
+ focus_handler->set_current_focus(window, key_index);
+
+ if (prev_coordinate) {
+ windows->update_window(prev_window,
+ prev_coordinate->x, prev_coordinate->y, prev_coordinate->width, prev_coordinate->height);
+ }
+ }
+ }
+
+ redraw = TRUE;
+ ret = TRUE;
+
+#ifndef DIRECTLY_DRAW_ON_EVENTS
+ /* If the window doesn't get exposed before corresponding release event,
+ * the inverted state of a button will never be drawn onto screen.
+ * To prevent such a case, we draw the inverted state of button forcefully and directly,
+ * without waiting for expose event */
+ /*CSCLGraphics *grps = CSCLGraphics::get_instance();
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ scldrawctx draw_ctx = grps->begin_paint(window, TRUE);
+ builder->draw_button(window, draw_ctx, key_index, button_context->state, TRUE);
+ grps->end_paint(window, draw_ctx);*/
+#endif
+
+ /* for feedback */
+ feedback->button_pressed(window, key_index);
+
+ /* Special routine for autopopup */
+ if (coordinate->popup_type == POPUP_TYPE_AUTO_POPUP) {
+ events->create_timer(SCL_TIMER_AUTOPOPUP, m_autopopup_key_duration, uniqId);
+ } else {
+ /* for long key & repeat key */
+ events->create_timer(SCL_TIMER_LONGKEY, m_long_key_duration, uniqId);
+ }
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_value = coordinate->key_value[shift_index][0];
+ key_event_desc.key_event = coordinate->key_event[shift_index][0];
+ key_event_desc.key_type = coordinate->key_type;
+ key_event_desc.key_modifier = KEY_MODIFIER_NONE;
+ key_event_desc.event_type = EVENT_TYPE_PRESS;
+
+ SclPoint curpoint = {x, y};
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = curpoint;
+ key_event_desc.mouse_current_point = curpoint;
+ key_event_desc.mouse_farthest_point = curpoint;
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ SCLEventReturnType processed = handler->on_event_drag_state_changed(key_event_desc);
+
+ /* Only if the handler didn't return SCL_EVENT_DONE */
+ if (processed == SCL_EVENT_PASS_ON) {
+ /* Now process normal behaviours of each button type */
+ switch (coordinate->button_type) {
+ case BUTTON_TYPE_NORMAL:
+ case BUTTON_TYPE_GRAB:
+ case BUTTON_TYPE_SELFISH:
+ case BUTTON_TYPE_DIRECTION:
+ case BUTTON_TYPE_RELATIVE_DIRECTION: {
+ /* Send click event right away if this button uses repeat key */
+ if (coordinate->use_repeat_key) {
+ handler->on_event_key_clicked(key_event_desc);
+ }
+ }
+ break;
+ case BUTTON_TYPE_MULTITAP: {
+ }
+ break;
+ case BUTTON_TYPE_ROTATION: {
+ }
+ break;
+ case BUTTON_TYPE_DRAG: {
+ /* Drag buttons fires click event immediately when they are pressed */
+ handler->on_event_key_clicked(key_event_desc);
+ }
+ break;
+ case BUTTON_TYPE_UIITEM: break;
+ case MAX_BUTTON_TYPE: break;
+ default: break;
+ }
+ switch (coordinate->popup_type) {
+ case POPUP_TYPE_BTN_PRESS_POPUP_DRAG: {
+ SclNotiPopupOpeningDesc desc;
+ desc.ui_event_desc = &key_event_desc;
+ desc.input_mode = coordinate->popup_input_mode[SCL_DRAG_STATE_NONE];
+ if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENING, &desc)) {
+ sclint popup_input_mode = sclres_manager->get_inputmode_id(desc.input_mode);
+ SCLDisplayMode display_mode = context->get_display_mode();
+ /* FIXME */
+ //if (scl_check_arrindex(popup_input_mode, MAX_INPUT_MODE_POPUP) &&
+ if (scl_check_arrindex(popup_input_mode, MAX_SCL_INPUT_MODE) &&
+ scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ sclshort popupLayoutId =
+ sclres_manager->get_layout_id(sclres_input_mode_configure[popup_input_mode].layouts[display_mode]);
+ SclRectangle popupRect;
+ SclRectangle baseWndRect;
+ SclLayout *layout = NULL;
+ /* FIXME */
+ //if (scl_check_arrindex(popupLayoutId, MAX_LAYOUT)) {
+ if (scl_check_arrindex(popupLayoutId, MAX_SCL_LAYOUT)) {
+ layout = &sclres_layout[popupLayoutId];
+ }
+ if (layout) {
+ windows->get_window_rect(windows->get_base_window(), &baseWndRect);
+ popupRect.x = coordinate->x + coordinate->popup_relative_x + baseWndRect.x;
+ popupRect.y = coordinate->y + coordinate->popup_relative_y + baseWndRect.y;
+ //popupRect.width = utils->get_scale_x(layout->width);
+ //popupRect.height= utils->get_scale_y(layout->height);
+ if (!(sclres_manager->loaded(popupLayoutId))) {
+ sclres_manager->load(popupLayoutId);
+ }
+ popupRect.width = layout->width;
+ popupRect.height = layout->height;
+ windows->close_all_popups();
+
+ SclWindowOpener opener;
+ opener.window = window;
+ opener.key = key_index;
+
+ sclwindow popup_window = windows->open_popup(opener,
+ popupRect,
+ popup_input_mode,
+ popupLayoutId,
+ coordinate->popup_type,
+ sclres_input_mode_configure[popup_input_mode].use_virtual_window,
+ sclres_input_mode_configure[popup_input_mode].use_dim_window,
+ coordinate->extract_offset_x,
+ coordinate->extract_offset_y,
+ sclres_input_mode_configure[popup_input_mode].timeout);
+
+ SclNotiPopupOpenedDesc opened_desc;
+ opened_desc.ui_event_desc = &key_event_desc;
+ opened_desc.input_mode = desc.input_mode;
+ opened_desc.window = popup_window;
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENED, &opened_desc);
+
+ windows->hide_window(windows->get_magnifier_window());
+ /* FIXME : The parent key should be turned back to NORMAL state when RELEASED,
+ in case of POPUP_TYPE_BTN_PRESS_POPUP_DRAG type. Temporarily setting NORMAL here. */
+ button_context->state = BUTTON_STATE_NORMAL;
+ _play_tts_for_input_mode_name(popup_input_mode);
+ }
+ }
+ }
+ }
+ break;
+ case POPUP_TYPE_BTN_RELEASE_POPUP:
+ case POPUP_TYPE_BTN_RELEASE_POPUP_ONCE:
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP:
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE:
+ case POPUP_TYPE_AUTO_POPUP:
+ case POPUP_TYPE_NONE:
+ case MAX_POPUP_TYPE:
+ default:
+ /* Nothing to do in here */
+ break;
+ }
+ }
+
+ /* Shows the magnifier window(the magnifier window will display when a kind of button type is character) */
+ //if (windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP) == windows->get_base_window()) {
+ if (coordinate->use_magnifier) {
+ sclboolean showMagnifier = check_magnifier_available(window, key_index, touch_id);
+
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+ if (showMagnifier && magnifier_configure) {
+ SclPoint pos = {0, 0};
+ /* calculates x position to be set */
+ pos.x = (coordinate->x + (coordinate->width / 2)) -
+ (magnifier_configure->width * utils->get_custom_scale_rate_x() / 2);
+
+ /* calculates y position to be set */
+ sclint scnWidth, scnHeight;
+ utils->get_screen_resolution(&scnWidth, &scnHeight);
+
+ pos.y = coordinate->y - magnifier_configure->height * utils->get_custom_scale_rate_y();
+
+ /* FIXME : Temporary way of clearing magnifier window */
+ /*SclWindowContext *window_context = windows->get_window_context(windows->get_magnifier_window(), FALSE);
+ sclboolean clearmagwin = FALSE;
+ if (window_context) {
+ clearmagwin = !(window_context->hidden);
+ }
+ static int clearnum = 0;
+ if (key_index == prevkey && window == prevwin) {
+ clearmagwin = FALSE;
+ }
+ if (clearmagwin) {
+ if (++clearnum > 1) {
+ clearmagwin = FALSE;
+ }
+ } else {
+ clearnum = 0;
+ }
+
+ if (clearmagwin) {
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ sclchar composed_path[_POSIX_PATH_MAX] = {0,};
+ scldrawctx draw_ctx = graphics->begin_paint(windows->get_magnifier_window());
+ utils->get_composed_path(composed_path, scl_magnifier_configure.bg_image_path);
+ graphics->draw_image(windows->get_magnifier_window(), draw_ctx, composed_path, 0, 0);
+ graphics->end_paint(windows->get_magnifier_window(), draw_ctx);
+ }
+ */
+ windows->hide_window(windows->get_magnifier_window());
+
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ pos.x += window_context->geometry.x;
+ pos.y += window_context->geometry.y;
+ }
+
+ if (pos.x < 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x()) {
+ pos.x = 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x();
+ }
+ if (pos.x > scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x()) {
+ pos.x = scnWidth + magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ }
+ pos.y += magnifier_configure->padding_y * utils->get_custom_scale_rate_y();
+ pos.x += coordinate->magnifier_offset_x;
+ pos.y += coordinate->magnifier_offset_y;
+ windows->move_window(windows->get_magnifier_window(), pos.x, pos.y);
+ //windows->resize_window(windows->get_magnifier_window(), utils->get_scale_x(scl_magnifier_configure.width), utils->get_scale_y(scl_magnifier_configure.height));
+ /*If we use transient_for them the ISE will occur some crash. It needs to check X11 */
+ /*windows->set_parent(windows->get_base_window(), windows->get_magnifier_window());*/
+
+ windows->show_window(windows->get_magnifier_window(), TRUE);
+ //windows->update_window(windows->get_magnifier_window());
+ }
+#if 0
+ static int fFirst = true;
+ if (fFirst) {
+ windows->show_window(windows->get_magnifier_window());
+ fFirst = false;
+ } else {
+ windows->update_window(windows->get_magnifier_window());
+ }
+#endif
+ /* We cannot use move_resize_window. It had occured some wrong behavior */
+ /*windows->move_resize_window(windows->get_magnifier_window(), pos.x, pos.y, scl_magnifier_configure.width, scl_magnifier_configure.height);*/
+ if (!showMagnifier) {
+ windows->hide_window(windows->get_magnifier_window());
+ }
+ }
+ } else {
+ /* COMMENTED OUT FOR TESTING MULTITOUCH!! */
+ ///* In case the current button is not the given key index */
+ //if (button_context->state == BUTTON_STATE_PRESSED) {
+ // /* Even if the press event occurs outside of this button's physical area, reset its context */
+ // button_context->state = BUTTON_STATE_NORMAL;
+ // redraw = TRUE;
+ //}
+ /* BUTTON_TYPE_MULTITAP type button should restore its multikey index when another button is clicked */
+ if (coordinate->button_type & BUTTON_TYPE_MULTITAP) {
+ button_context->multitap_index = 0;
+ }
+ }
+
+ /* If there is any need for redrawing */
+ if (redraw) {
+#ifdef DIRECTLY_DRAW_ON_EVENTS
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ if (builder) {
+ builder->draw_button(window, NULL, key_index, button_context->state, TRUE);
+ }
+#else
+ if (windows) {
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+#endif
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::process_button_long_pressed_event(sclwindow window, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!sclres_manager) return FALSE;
+
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ PSclLayout sclres_layout = sclres_manager->get_layout_table();
+
+ if (!sclres_input_mode_configure || !sclres_layout) return FALSE;
+
+ if (context && cache && handler && windows && state) {
+ const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ SclButtonContext *button_context = cache->get_cur_button_context(window, key_index);
+
+ /* Should return FALSE if this key does not have any longkey related property */
+ if (coordinate) {
+ if (actual_event) {
+ if (coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS) {
+ /* When calling mouse_release, the seq order of current multitouch events will be changed,
+ so we put all the multitouch events into a vector and use them afterwards for releasing */
+ sclboolean finished = FALSE;
+ sclint loop = 0;
+ sclint multi_touch_context_num = context->get_multi_touch_context_num();
+ std::vector<SclUIEventDesc> multitouch_events;
+ for (loop = 0;loop < multi_touch_context_num;loop++) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(loop, &desc);
+ multitouch_events.push_back(desc);
+ }
+ for (loop = 0;loop < multi_touch_context_num && !finished;loop++) {
+ SclUIEventDesc desc = multitouch_events[loop];
+ if (desc.touch_id != touch_id) {
+ sclwindow cur_pressed_window = context->get_cur_pressed_window(desc.touch_id);
+ scl8 cur_pressed_key = context->get_cur_pressed_key(desc.touch_id);
+ const SclLayoutKeyCoordinate *cur_pressed_coordinate =
+ cache->get_cur_layout_key_coordinate(cur_pressed_window, cur_pressed_key);
+ if (cur_pressed_coordinate) {
+ if (cur_pressed_coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS) {
+ mouse_release(context->get_cur_moving_window(desc.touch_id),
+ context->get_cur_moving_point(desc.touch_id).x,
+ context->get_cur_moving_point(desc.touch_id).y,
+ desc.touch_id, FALSE);
+ }
+ }
+ } else {
+ finished = TRUE;
+ }
+ }
+ }
+ }
+ }
+
+ /* Should return FALSE if this key does not have any longkey related property */
+ if (coordinate) {
+ if (coordinate->popup_type == POPUP_TYPE_BTN_LONGPRESS_POPUP ||
+ coordinate->popup_type == POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE ) {
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_type = coordinate->long_key_type;
+ if (coordinate->long_key_value == NULL && coordinate->long_key_event == 0) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ key_event_desc.key_value = coordinate->key_value[shift_index][0];
+ key_event_desc.key_event = coordinate->key_event[shift_index][0];
+ } else {
+ key_event_desc.key_value = coordinate->long_key_value;
+ key_event_desc.key_event = coordinate->long_key_event;
+ }
+ key_event_desc.key_modifier = KEY_MODIFIER_LONGKEY;
+
+ key_event_desc.event_type = EVENT_TYPE_LONGPRESS;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ SCLEventReturnType processed = handler->on_event_drag_state_changed(key_event_desc);
+
+ /* Only if the handler didn't return SCL_EVENT_DONE */
+ if (processed == SCL_EVENT_PASS_ON) {
+ SclRectangle popupRect;
+ SclRectangle baseWndRect;
+ windows->get_window_rect(windows->get_base_window(), &baseWndRect);
+ popupRect.x = coordinate->x + coordinate->popup_relative_x + baseWndRect.x;
+ popupRect.y = coordinate->y + coordinate->popup_relative_y + baseWndRect.y;
+
+ SclNotiPopupOpeningDesc desc;
+ desc.ui_event_desc = &key_event_desc;
+ desc.input_mode = coordinate->popup_input_mode[SCL_DRAG_STATE_NONE];
+ if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENING, &desc)) {
+ sclint popup_input_mode = sclres_manager->get_inputmode_id(desc.input_mode);
+ SCLDisplayMode display_mode = context->get_display_mode();
+ /* FIXME */
+ //if (scl_check_arrindex(popup_input_mode, MAX_INPUT_MODE_POPUP) &&
+ if (scl_check_arrindex(popup_input_mode, MAX_SCL_INPUT_MODE) &&
+ scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ SclLayout *layout = NULL;
+ sclshort popupLayoutId =
+ sclres_manager->get_layout_id(sclres_input_mode_configure[popup_input_mode].layouts[display_mode]);
+ /* FIXME */
+ //if (scl_check_arrindex(popupLayoutId, MAX_LAYOUT)) {
+ if (scl_check_arrindex(popupLayoutId, MAX_SCL_LAYOUT)) {
+ layout = &sclres_layout[popupLayoutId];
+ }
+ if (layout) {
+ //popupRect.width = utils->get_scale_x(layout->width);
+ //popupRect.height= utils->get_scale_y(layout->height);
+ if (!(sclres_manager->loaded(popupLayoutId))) {
+ sclres_manager->load(popupLayoutId);
+ }
+ popupRect.width = layout->width;
+ popupRect.height = layout->height;
+
+ SclWindowOpener opener;
+ opener.window = window;
+ opener.key = key_index;
+
+ sclwindow popup_window = windows->open_popup(
+ opener,
+ popupRect,
+ popup_input_mode,
+ popupLayoutId,
+ coordinate->popup_type,
+ sclres_input_mode_configure[popup_input_mode].use_virtual_window,
+ sclres_input_mode_configure[popup_input_mode].use_dim_window,
+ coordinate->extract_offset_x,
+ coordinate->extract_offset_y,
+ sclres_input_mode_configure[popup_input_mode].timeout);
+
+ SclNotiPopupOpenedDesc opened_desc;
+ opened_desc.ui_event_desc = &key_event_desc;
+ opened_desc.input_mode = desc.input_mode;
+ opened_desc.window = popup_window;
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENED, &opened_desc);
+
+ windows->hide_window(windows->get_magnifier_window());
+ _play_tts_for_input_mode_name(popup_input_mode);
+ ret = TRUE;
+ }
+ }
+ }
+ }
+ } else if (coordinate->long_key_value) {
+ if (strlen(coordinate->long_key_value) > 0) {
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_LONGKEY);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_LONGKEY);
+ }
+ ret = TRUE;
+
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+ if (coordinate->use_long_key_magnifier && magnifier_configure) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclPoint pos = {0, 0};
+
+ const SclLayout* layout = cache->get_cur_layout(window);
+ if (utils && layout) {
+ sclint scnWidth, scnHeight;
+ utils->get_screen_resolution(&scnWidth, &scnHeight);
+
+ //SclWindowContext *window_context = windows->get_window_context(window, TRUE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ pos.x = window_context->geometry.x + (coordinate->x + (coordinate->width / 2)) -
+ (magnifier_configure->width * utils->get_custom_scale_rate_x() / 2);
+ pos.y = window_context->geometry.y + coordinate->y -
+ magnifier_configure->height * utils->get_custom_scale_rate_y();
+ }
+ if (pos.x < 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x()) {
+ pos.x = 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x();
+ }
+ if (pos.x > scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x()) {
+ pos.x = scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ }
+ pos.y += magnifier_configure->padding_y * utils->get_custom_scale_rate_y();
+ pos.x += coordinate->magnifier_offset_x;
+ pos.y += coordinate->magnifier_offset_y;
+ windows->move_window(windows->get_magnifier_window(), pos.x, pos.y);
+ windows->update_window(windows->get_magnifier_window());
+ windows->show_window(windows->get_magnifier_window(), TRUE);
+ }
+ }
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_type = coordinate->long_key_type;
+ key_event_desc.key_value = coordinate->long_key_value;
+ key_event_desc.key_event = coordinate->long_key_event;
+ key_event_desc.key_modifier = KEY_MODIFIER_LONGKEY;
+
+ key_event_desc.event_type = EVENT_TYPE_LONGPRESS;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ handler->on_event_key_clicked(key_event_desc);
+ //}
+ }
+ }
+ }
+ if (ret) {
+ context->set_cur_key_modifier(touch_id, KEY_MODIFIER_LONGKEY);
+ if (coordinate && button_context) {
+ if (coordinate->button_type & BUTTON_TYPE_MULTITAP) {
+ button_context->multitap_index = 0;
+ }
+ }
+ }
+ }
+ /* Longkey processing in here */
+ return ret;
+}
+
+sclboolean
+CSCLController::process_button_repeat_pressed_event(sclwindow window, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+
+ if (context && cache && windows && handler) {
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ if (coordinate) {
+ switch (coordinate->button_type) {
+ case BUTTON_TYPE_NORMAL:
+ case BUTTON_TYPE_GRAB:
+ case BUTTON_TYPE_SELFISH:
+ case BUTTON_TYPE_DIRECTION:
+ case BUTTON_TYPE_RELATIVE_DIRECTION: {
+ /* This is for enabling backspace key in search layout*/
+ //if (coordinate->key_type != KEY_TYPE_MODECHANGE && coordinate->key_type != KEY_TYPE_COMPOSITION) {
+ //if (coordinate->key_type != KEY_TYPE_MODECHANGE || coordinate->key_event[0][0] == MVK_BackSpace) {
+ if (coordinate->key_type != KEY_TYPE_MODECHANGE) {
+ sclulong repeatKeyEvent = coordinate->key_event[shift_index][0];
+
+ /* In case of Delete key, Change from Char deletion to Word deletion
+ when the input acceleration speed is reached to Max */
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+ if (default_configure) {
+ if (default_configure->use_word_deletion) {
+ scllong interval = m_repeat_key_duration - (m_key_repeated_num * SCL_REPEATKEY_ACCELERATION);
+ if (repeatKeyEvent == MVK_BackSpace &&
+ interval <= SCL_REPEATKEY_WORD_DELETION_START_DURATION) {
+ repeatKeyEvent = MVK_3270_DeleteWord;
+ }
+ }
+ }
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_value = coordinate->key_value[shift_index][0];
+ key_event_desc.key_event = repeatKeyEvent;
+ key_event_desc.key_type = coordinate->key_type;
+ key_event_desc.key_modifier = KEY_MODIFIER_NONE;
+
+ key_event_desc.event_type = EVENT_TYPE_REPEAT;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ handler->on_event_key_clicked(key_event_desc);
+ }
+ }
+ break;
+ case BUTTON_TYPE_UIITEM: break;
+ case MAX_BUTTON_TYPE: break;
+ default: break;
+ }
+ }
+ }
+
+ /* Longkey processing in here */
+ return TRUE;
+}
+
+sclboolean
+CSCLController::process_button_move_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLFeedback *feedback = CSCLFeedback::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ SclButtonContext *button_context = NULL;
+
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ if (cache) {
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ button_context = cache->get_cur_button_context(window, key_index);
+ }
+
+ if (button_context && coordinate && feedback && utils && context && handler && cache && events && windows) {
+ /* If this key is the key previously pressed, add threshold value for avoiding unintended moving */
+ sclint thresholdX = 0;
+ sclint thresholdY = 0;
+ if (context->get_cur_pressed_window(touch_id) == window && context->get_cur_pressed_key(touch_id) == key_index) {
+ thresholdX = utils->get_scaled_x(SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_X);
+ thresholdY = utils->get_scaled_y(SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_Y);
+ }
+
+ /* First check if this button is enabled in current active sublayout */
+ sclboolean subLayoutMatch = TRUE;
+ if (coordinate->sub_layout && context->get_cur_sublayout()) {
+ if (strncmp(coordinate->sub_layout, context->get_cur_sublayout(), MAX_SIZE_OF_SUBLAYOUT_STRING) != 0) {
+ subLayoutMatch = FALSE;
+ }
+ }
+ if ( x >= coordinate->x - coordinate->add_hit_left - thresholdX &&
+ x < coordinate->x + coordinate->width + coordinate->add_hit_right + thresholdX&&
+ y >= coordinate->y - coordinate->add_hit_top - thresholdY &&
+ y < coordinate->y + coordinate->height + coordinate->add_hit_bottom + thresholdY &&
+ subLayoutMatch ) {
+ ret = TRUE;
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ const SclLayout* layout = cache->get_cur_layout(windows->get_base_window());
+
+ sclwindow pressed_window = context->get_cur_pressed_window(touch_id);
+ scl8 pressed_key = context->get_cur_pressed_key(touch_id);
+ SclButtonContext *pressed_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ const SclLayoutKeyCoordinate *pressed_coordinate =
+ cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ if (pressed_context == NULL || pressed_coordinate == NULL) {
+ return FALSE;
+ }
+
+ if (key_index != pressed_key || window != pressed_window) {
+ /* When the focus has moved to another button, destroy all the timers */
+ events->destroy_all_timer();
+
+ if (check_event_transition_enabled(pressed_coordinate, coordinate)) {
+ if (layout) {
+ const scl16 uniqId = utils->get_unique_id();
+ context->set_cur_pressed_event_id(touch_id, uniqId);
+ /* Special routine for autopopup */
+ if (coordinate->popup_type == POPUP_TYPE_AUTO_POPUP) {
+ events->create_timer(SCL_TIMER_AUTOPOPUP, m_autopopup_key_duration, uniqId);
+ } else {
+ /* for long key & repeat key */
+ events->create_timer(SCL_TIMER_LONGKEY, m_long_key_duration, uniqId);
+ }
+
+ context->set_cur_pressed_window(touch_id, window);
+ context->set_cur_pressed_key(touch_id, key_index);
+
+ sclboolean showMagnifier = check_magnifier_available(window, key_index, touch_id);
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (showMagnifier && magnifier_configure && window_context) {
+ SclPoint pos = {0, 0};
+ /* calculates x position to be set */
+ pos.x = window_context->geometry.x;
+ pos.x += (coordinate->x + (coordinate->width / 2)) -
+ (magnifier_configure->width * utils->get_custom_scale_rate_x() / 2);
+
+ /* calculates y position to be set */
+ pos.y = window_context->geometry.y;
+ pos.y += coordinate->y - magnifier_configure->height * utils->get_custom_scale_rate_y();
+
+ if (pos.x < window_context->geometry.x - magnifier_configure->padding_x * utils->get_custom_scale_rate_x()) {
+ pos.x = window_context->geometry.x - magnifier_configure->padding_x * utils->get_custom_scale_rate_x();
+ }
+ if (pos.x > window_context->geometry.x + window_context->geometry.width +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x()) {
+ pos.x = window_context->geometry.x + window_context->geometry.width +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ }
+ pos.x += coordinate->magnifier_offset_x;
+ pos.y += magnifier_configure->padding_y * utils->get_custom_scale_rate_y();
+ pos.y += coordinate->magnifier_offset_y;
+ if (windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP) == windows->get_base_window()) {
+ windows->move_window(windows->get_magnifier_window(), pos.x, pos.y);
+ windows->update_window(windows->get_magnifier_window());
+ }
+ }
+
+ /* for feedback */
+ feedback->button_moved(window, key_index);
+
+ button_context->state = BUTTON_STATE_PRESSED;
+ if (pressed_context) {
+ /* But, if this button should be in pressed state in other multitouch id, do not initialize it */
+ sclboolean found = FALSE;
+ for (sclint loop = 0;loop < context->get_multi_touch_context_num() && !found;loop++) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(loop, &desc);
+ if (desc.touch_id != touch_id) {
+ MultiTouchContext *multi_touch_context =
+ context->find_multi_touch_context(desc.touch_id);
+ if (multi_touch_context) {
+ if (multi_touch_context->cur_pressed_window == pressed_window &&
+ multi_touch_context->cur_pressed_key == pressed_key) {
+ found = TRUE;
+ }
+ }
+ }
+ }
+ if (!found) {
+ pressed_context->state = BUTTON_STATE_NORMAL;
+ }
+ }
+ /* If the window doesn't get exposed before corresponding release event,
+ * the inverted state of a button will never be drawn onto screen.
+ * To prevent such a case, we draw the inverted state of button forcefully and directly,
+ * without waiting for expose event */
+ /* Redrawing pressed button does not work properly, commented out */
+ /*
+ CSCLGraphics *grps = CSCLGraphics::get_instance();
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ scldrawctx draw_ctx;
+ if (pressed_window != SCLWINDOW_INVALID && pressed_key != NOT_USED) {
+ draw_ctx = grps->begin_paint(pressed_window, TRUE);
+ builder->draw_button(pressed_window, draw_ctx, pressed_key, FALSE);
+ grps->end_paint(pressed_window, draw_ctx);
+ }
+ draw_ctx = grps->begin_paint(window, TRUE);
+ builder->draw_button(window, draw_ctx, key_index, TRUE);
+ grps->end_paint(window, draw_ctx);
+ */
+
+ switch (coordinate->button_type) {
+ case BUTTON_TYPE_DRAG: {
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_value = coordinate->key_value[shift_index][0];
+ key_event_desc.key_event = coordinate->key_event[shift_index][0];
+ key_event_desc.key_type = coordinate->key_type;
+ key_event_desc.key_modifier = KEY_MODIFIER_NONE;
+
+ key_event_desc.event_type = EVENT_TYPE_MOVE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+ sclboolean processed = handler->on_event_drag_state_changed(key_event_desc);
+ if (processed && context->get_magnifier_enabled() && magnifier_configure) {
+ SclPoint zoomwinpos = {0, 0};
+ /* calculates x position to be set */
+ zoomwinpos.x = (coordinate->x + (coordinate->width / 2)) -
+ (magnifier_configure->width * utils->get_custom_scale_rate_x() / 2);
+
+ /* calculates y position to be set */
+ sclint scnWidth, scnHeight;
+ utils->get_screen_resolution(&scnWidth, &scnHeight);
+
+ zoomwinpos.y = coordinate->y -
+ magnifier_configure->height * utils->get_custom_scale_rate_y();
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ zoomwinpos.x += window_context->geometry.x;
+ zoomwinpos.y += window_context->geometry.y;
+ }
+ if (zoomwinpos.x < 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x()) {
+ zoomwinpos.x = 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x();
+ }
+ if (zoomwinpos.x > scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x()) {
+ zoomwinpos.x = scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ }
+ zoomwinpos.y += magnifier_configure->padding_y * utils->get_custom_scale_rate_y();
+ zoomwinpos.x += coordinate->magnifier_offset_x;
+ zoomwinpos.y += coordinate->magnifier_offset_y;
+ windows->move_window(windows->get_magnifier_window(), zoomwinpos.x, zoomwinpos.y);
+ windows->show_window(windows->get_magnifier_window(), 0);
+ }
+
+ handler->on_event_key_clicked(key_event_desc);
+ if (!(windows->is_base_window(window))) {
+ /* When press event occured in popup window, reset POPUP_TIMEOUT timer */
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->timeout > 0) {
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+ events->create_timer(SCL_TIMER_POPUP_TIMEOUT, window_context->timeout, 0, TRUE);
+ }
+ }
+ }
+ }
+ break;
+ case BUTTON_TYPE_NORMAL: break;
+ case BUTTON_TYPE_GRAB: break;
+ case BUTTON_TYPE_SELFISH: break;
+ case BUTTON_TYPE_MULTITAP: break;
+ case BUTTON_TYPE_ROTATION: break;
+ case BUTTON_TYPE_DIRECTION: break;
+ case BUTTON_TYPE_RELATIVE_DIRECTION: break;
+ case BUTTON_TYPE_UIITEM: break;
+ case MAX_BUTTON_TYPE: break;
+ default:
+ break;
+ }
+
+#ifdef DIRECTLY_DRAW_ON_EVENTS
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ if (builder) {
+ if (button_context) {
+ builder->draw_button(window, NULL, key_index, button_context->state);
+ }
+ if (pressedContext) {
+ builder->draw_button(pressed_window, NULL, pressed_key, pressedContext->state, TRUE);
+ }
+ }
+#else
+ windows->update_window(window,
+ coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ if (pressed_coordinate) {
+ windows->update_window(pressed_window, pressed_coordinate->x, pressed_coordinate->y,
+ pressed_coordinate->width, pressed_coordinate->height);
+ }
+#endif
+ }
+
+ //utils->log("Now Moving : %d %d\n", pos.x, pos.y);
+ } else {
+ /* If the focus went out from our SELFISH button */
+ if (pressed_coordinate->button_type == BUTTON_TYPE_SELFISH) {
+ pressed_context->state = BUTTON_STATE_NORMAL;
+ windows->update_window(pressed_window, pressed_coordinate->x, pressed_coordinate->y,
+ pressed_coordinate->width, pressed_coordinate->height);
+ /* And if this SELFISH button was the last button pressed */
+ if (touch_id == context->get_last_touch_device_id()) {
+ windows->hide_window(windows->get_magnifier_window());
+ }
+ }
+ }
+ } else {
+ /* If the focus came back into our SELFISH button */
+ if (pressed_coordinate->button_type == BUTTON_TYPE_SELFISH && pressed_context->state != BUTTON_STATE_PRESSED) {
+ pressed_context->state = BUTTON_STATE_PRESSED;
+ windows->update_window(pressed_window, pressed_coordinate->x, pressed_coordinate->y,
+ pressed_coordinate->width, pressed_coordinate->height);
+ /* And if this SELFISH button was the last button pressed */
+ if (touch_id == context->get_last_touch_device_id()) {
+ sclboolean showMagnifier = check_magnifier_available(pressed_window, pressed_key, touch_id);
+
+ if (showMagnifier) {
+ windows->show_window(windows->get_magnifier_window());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::process_button_over_event(sclwindow window, sclint x, sclint y, sclbyte key_index)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLFeedback *feedback = CSCLFeedback::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ SclButtonContext *button_context = NULL;
+
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+ if (cache) {
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ button_context = cache->get_cur_button_context(window, key_index);
+ }
+
+ if (button_context && coordinate && feedback && utils && context && cache && events && windows) {
+ /* If this key is the key previously pressed, add threshold value for avoiding unintended moving */
+ sclboolean subLayoutMatch = TRUE;
+ if (coordinate->sub_layout && context->get_cur_sublayout()) {
+ if (strncmp(coordinate->sub_layout, context->get_cur_sublayout(), MAX_SIZE_OF_SUBLAYOUT_STRING) != 0) {
+ subLayoutMatch = FALSE;
+ }
+ }
+ if ( x >= coordinate->x - coordinate->add_hit_left &&
+ x < coordinate->x + coordinate->width + coordinate->add_hit_right &&
+ y >= coordinate->y - coordinate->add_hit_top &&
+ y < coordinate->y + coordinate->height + coordinate->add_hit_bottom &&
+ subLayoutMatch ) {
+ ret = TRUE;
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ const SclLayout* layout = cache->get_cur_layout(windows->get_base_window());
+
+ sclwindow highlighted_window = context->get_cur_highlighted_window();
+ scl8 highlighted_key = context->get_cur_highlighted_key();
+ SclButtonContext *cur_context = cache->get_cur_button_context(window, key_index);
+
+ if (cur_context == NULL) {
+ return FALSE;
+ }
+ if (key_index != highlighted_key || window != highlighted_window) {
+ SECURE_LOGD("%d != %d || %p != %p", key_index, highlighted_key, window, highlighted_window);
+ if (layout) {
+ if (coordinate->key_type != KEY_TYPE_NONE) {
+ if (context->get_tts_enabled()) {
+ const sclchar *targetstr = coordinate->hint_string[shift_index][button_context->multitap_index];
+ if (targetstr == NULL) {
+ targetstr = coordinate->label[shift_index][0];
+ }
+ if (targetstr == NULL) {
+ targetstr = coordinate->key_value[shift_index][button_context->multitap_index];
+ }
+ /*if(state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY ) {
+ targetstr = coordinate->long_key_value;
+ }*/
+ const sclchar *sayit = cache->find_substituted_string(targetstr);
+ utils->play_tts(sayit);
+ }
+ }
+ }
+
+ context->set_cur_highlighted_window(window);
+ context->set_cur_highlighted_key(key_index);
+ }
+ }
+ }
+
+ return ret;
+}
+SCLKeyModifier
+CSCLController::get_drag_key_modifier(sclint deltax, sclint deltay, sclfloat dist, sclboolean check_farthest,
+ scltouchdevice touch_id, sclbyte extra_option) {
+ typedef struct {
+ double lowerbound;
+ double upperbound;
+ SCLKeyModifier modifier;
+ } DIRECTIONINFO;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ SCLKeyModifier key_modifier = KEY_MODIFIER_NONE;
+
+ if (context) {
+ double theta = atan2(deltay , (deltax ? deltax : 1)); /* Avoid divide by 0 exception */
+ sclfloat ratio = fabs((sclfloat)deltay / (deltax ? deltax : 1));
+ SCLDragState cur_drag_state = context->get_cur_drag_state(touch_id);
+ if (extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS ||
+ extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG ||
+ extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN) { /* 8 directions */
+ /* If the theta is below 0, the direction is upward since the y coordinate grows downward */
+ /* The below angle values are customized for MoAKey, need to provide customizing API */
+ DIRECTIONINFO info[] = {
+ {-8 * (M_PI / 8), -7 * (M_PI / 8), KEY_MODIFIER_DIRECTION_LEFT},
+ {-7 * (M_PI / 8), -5 * (M_PI / 8), KEY_MODIFIER_DIRECTION_UP_LEFT},
+ {-5 * (M_PI / 8), -2.7 * (M_PI / 8), KEY_MODIFIER_DIRECTION_UP},
+ {-2.7 * (M_PI / 8), -1.5 * (M_PI / 8), KEY_MODIFIER_DIRECTION_UP_RIGHT},
+ {-1.5 * (M_PI / 8), 1 * (M_PI / 8), KEY_MODIFIER_DIRECTION_RIGHT},
+ { 1 * (M_PI / 8), 3 * (M_PI / 8), KEY_MODIFIER_DIRECTION_DOWN_RIGHT},
+ { 3 * (M_PI / 8), 5 * (M_PI / 8), KEY_MODIFIER_DIRECTION_DOWN},
+ { 5 * (M_PI / 8), 7 * (M_PI / 8), KEY_MODIFIER_DIRECTION_DOWN_LEFT},
+ { 7 * (M_PI / 8), 8 * (M_PI / 8), KEY_MODIFIER_DIRECTION_LEFT},
+ };
+ for (size_t loop = 0; loop < sizeof(info) / sizeof(DIRECTIONINFO); loop++) {
+ if (theta >= info[loop].lowerbound && theta <= info[loop].upperbound) {
+ key_modifier = info[loop].modifier;
+ }
+ }
+ } else { /* 4 directions */
+ /* If the state was dragging to one of 4 directions and the final release point is
+ * far enough from inital press point, and the angle is in between out predefined angle value */
+ if (extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE &&
+ cur_drag_state != SCL_DRAG_STATE_NONE && cur_drag_state != SCL_DRAG_STATE_INVALID &&
+ dist > SCL_DRAG_CURVE_RECOG_DIST &&
+ ratio > (1 / SCL_DRAG_CURVE_FINAL_ANGLE_VALUE) &&
+ ratio < SCL_DRAG_CURVE_FINAL_ANGLE_VALUE) {
+ if (cur_drag_state == SCL_DRAG_STATE_DOWN) {
+ if (deltax > 0) key_modifier = KEY_MODIFIER_DIRECTION_CURVE_DOWN_RIGHT;
+ else key_modifier = KEY_MODIFIER_DIRECTION_CURVE_DOWN_LEFT;
+ }
+ if (cur_drag_state == SCL_DRAG_STATE_UP) {
+ if (deltax > 0) key_modifier = KEY_MODIFIER_DIRECTION_CURVE_UP_RIGHT;
+ else key_modifier = KEY_MODIFIER_DIRECTION_CURVE_UP_LEFT;
+ }
+ if (cur_drag_state == SCL_DRAG_STATE_LEFT) {
+ if (deltay > 0) key_modifier = KEY_MODIFIER_DIRECTION_CURVE_LEFT_DOWN;
+ else key_modifier = KEY_MODIFIER_DIRECTION_CURVE_LEFT_UP;
+ }
+ if (cur_drag_state == SCL_DRAG_STATE_RIGHT) {
+ if (deltay > 0) key_modifier = KEY_MODIFIER_DIRECTION_CURVE_RIGHT_DOWN;
+ else key_modifier = KEY_MODIFIER_DIRECTION_CURVE_RIGHT_UP;
+ }
+ } else {
+ DIRECTIONINFO info[] = {
+ {-4 * (M_PI / 4), -3 * (M_PI / 4), KEY_MODIFIER_DIRECTION_LEFT},
+ {-3 * (M_PI / 4), -1 * (M_PI / 4), KEY_MODIFIER_DIRECTION_UP},
+ {-1 * (M_PI / 4), 1 * (M_PI / 4), KEY_MODIFIER_DIRECTION_RIGHT},
+ { 1 * (M_PI / 4), 3 * (M_PI / 4), KEY_MODIFIER_DIRECTION_DOWN},
+ { 3 * (M_PI / 4), 4 * (M_PI / 4), KEY_MODIFIER_DIRECTION_LEFT},
+ };
+ for (size_t loop = 0; loop < sizeof(info) / sizeof(DIRECTIONINFO); loop++) {
+ if (theta >= info[loop].lowerbound && theta <= info[loop].upperbound) {
+ key_modifier = info[loop].modifier;
+ }
+ }
+ }
+ }
+
+ if (extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG ||
+ extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_LONG) {
+ if (key_modifier >= KEY_MODIFIER_DIRECTION_LEFT &&
+ key_modifier <= KEY_MODIFIER_DIRECTION_DOWN_RIGHT) {
+ key_modifier = (SCLKeyModifier)(key_modifier + 8); // Add LONG attribute;
+ }
+ }
+ if (check_farthest || context->get_cur_drag_state(touch_id) == SCL_DRAG_STATE_RETURN) {
+ if (key_modifier >= KEY_MODIFIER_DIRECTION_LEFT &&
+ key_modifier <= KEY_MODIFIER_DIRECTION_DOWN_RIGHT) {
+ key_modifier = (SCLKeyModifier)(key_modifier + 16); // Add RETURN attribute;
+ }
+ }
+ }
+
+ return key_modifier;
+}
+
+sclboolean
+CSCLController::process_button_release_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+ sclboolean redraw = FALSE;
+ sclboolean fire_event = FALSE;
+ SCLKeyModifier key_modifier = KEY_MODIFIER_NONE;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLFeedback *feedback = CSCLFeedback::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return FALSE;
+
+ PSclLayout sclres_layout = sclres_manager->get_layout_table();
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ if (!sclres_layout || !sclres_input_mode_configure) return FALSE;
+
+ SclButtonContext *button_context = NULL;
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ if (cache) {
+ button_context = cache->get_cur_button_context(window, key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ }
+
+ const SclLayoutKeyCoordinate *targetCoordinate = NULL;
+
+ if (utils && feedback && windows && context && state && handler && cache && button_context && coordinate) {
+ scl8 savedInputMode = context->get_input_mode();
+
+ sclwindow pressed_window = context->get_cur_pressed_window(touch_id);
+ scl8 pressed_key = context->get_cur_pressed_key(touch_id);
+
+ if (actual_event) {
+ if (coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS) {
+ /* When calling mouse_release, the seq order of current multitouch events will be changed,
+ so we put all the multitouch events into a vector and use them afterwards for releasing */
+ sclboolean finished = FALSE;
+ sclint loop = 0;
+ sclint multi_touch_context_num = context->get_multi_touch_context_num();
+ std::vector<SclUIEventDesc> multi_touch_events;
+ for (loop = 0;loop < multi_touch_context_num;loop++) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(loop, &desc);
+ multi_touch_events.push_back(desc);
+ }
+ for (loop = 0;loop < multi_touch_context_num && !finished;loop++) {
+ SclUIEventDesc desc = multi_touch_events[loop];
+ if (desc.touch_id != touch_id) {
+ sclwindow cur_pressed_window = context->get_cur_pressed_window(desc.touch_id);
+ scl8 cur_pressed_key = context->get_cur_pressed_key(desc.touch_id);
+ const SclLayoutKeyCoordinate *cur_pressed_coordinate =
+ cache->get_cur_layout_key_coordinate(cur_pressed_window, cur_pressed_key);
+ if (cur_pressed_coordinate) {
+ if (cur_pressed_coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS) {
+ mouse_release(context->get_cur_moving_window(desc.touch_id),
+ context->get_cur_moving_point(desc.touch_id).x,
+ context->get_cur_moving_point(desc.touch_id).y,
+ desc.touch_id, FALSE);
+ }
+ }
+ } else {
+ finished = TRUE;
+ }
+ }
+ }
+ }
+
+ /* If this key is the key previously pressed, add threshold value for avoiding unintended moving */
+ sclint thresholdX = 0;
+ sclint thresholdY = 0;
+ if (context) {
+ if (context->get_cur_pressed_window(touch_id) == window && context->get_cur_pressed_key(touch_id) == key_index) {
+ thresholdX = utils->get_scaled_x(SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_X);
+ thresholdY = utils->get_scaled_y(SCL_MOUSE_BUTTON_CHANGE_THRESHOLD_Y);
+ }
+ }
+
+ /* Check if the pressed button's type is directional button */
+ if (coordinate->button_type == BUTTON_TYPE_DIRECTION || coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ if (context) {
+ if (context->get_cur_pressed_window(touch_id) == window && context->get_cur_pressed_key(touch_id) == key_index) {
+ ret = TRUE;
+ sclboolean check_farthest = FALSE;
+
+ sclint startx = x;
+ sclint starty = y;
+
+ /* If the buttontype is RELATIVE_DIRECTION, get the distance from last move point */
+ if (coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ startx = context->get_prev_moving_point(touch_id).x;
+ starty = context->get_prev_moving_point(touch_id).y;
+ } else {
+ startx = context->get_cur_pressed_point(touch_id).x;
+ starty = context->get_cur_pressed_point(touch_id).y;
+ }
+
+ sclint deltax = x - startx;
+ sclint deltay = y - starty;
+
+ sclfloat dist = utils->get_distance(x, y, startx, starty);
+ sclfloat direction_recog_dist = SCL_DIRECTION_RECOG_DIST * utils->get_smallest_scale_rate();
+ if (coordinate->is_side_button) {
+ direction_recog_dist = SCL_DIRECTION_RECOG_DIST_SIDE * utils->get_smallest_scale_rate();
+ };
+ if (coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ direction_recog_dist = SCL_DIRECTION_RELATIVE_RECOG_DIST * utils->get_smallest_scale_rate();
+ }
+ if (context->get_cur_drag_state(touch_id) == SCL_DRAG_STATE_RETURN &&
+ coordinate->button_type != BUTTON_TYPE_RELATIVE_DIRECTION) {
+ if (coordinate->extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN ||
+ coordinate->extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN ||
+ coordinate->extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE) {
+ deltax = context->get_farthest_move_point(touch_id).x - context->get_cur_pressed_point(touch_id).x;
+ deltay = context->get_farthest_move_point(touch_id).y - context->get_cur_pressed_point(touch_id).y;
+ dist = utils->get_distance(context->get_farthest_move_point(touch_id), context->get_cur_pressed_point(touch_id));
+ check_farthest = TRUE;
+ }
+ }
+ if (coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ key_modifier = context->get_cur_key_modifier(touch_id);
+ } else if (dist > direction_recog_dist) {
+ key_modifier = get_drag_key_modifier(deltax, deltay, dist, check_farthest, touch_id, coordinate->extra_option);
+ }
+ }
+ }
+ }
+
+ /* First check if this button is enabled in current active sublayout */
+ sclboolean subLayoutMatch = TRUE;
+ if (coordinate->sub_layout && context->get_cur_sublayout()) {
+ if (strncmp(coordinate->sub_layout, context->get_cur_sublayout(), MAX_SIZE_OF_SUBLAYOUT_STRING) != 0) {
+ subLayoutMatch = FALSE;
+ }
+ }
+ /* Check if the event occured inside this button's rectangle */
+ if ( x >= coordinate->x - coordinate->add_hit_left - thresholdX &&
+ x < coordinate->x + coordinate->width + coordinate->add_hit_right + thresholdX &&
+ y >= coordinate->y - coordinate->add_hit_top - thresholdY &&
+ y < coordinate->y + coordinate->height + coordinate->add_hit_bottom + thresholdY &&
+ subLayoutMatch ) {
+ ret = TRUE;
+ }
+
+ if (ret) {
+ /* for feedback */
+ feedback->button_released(window, key_index);
+
+ /* If this button's index is the same as the one initially pressed */
+ if (pressed_window == window && pressed_key == key_index) {
+ fire_event = TRUE;
+ targetCoordinate = coordinate;
+ } else {
+ const SclLayoutKeyCoordinate *pressed_coordinate =
+ cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ if (pressed_coordinate) {
+ if (check_event_transition_enabled(pressed_coordinate, coordinate)) {
+ fire_event = TRUE;
+ targetCoordinate = pressed_coordinate;
+ } else {
+ ret = FALSE;
+ }
+ }
+ }
+ }
+
+ /* In case of mode change buttons, event should be fired only when it was pressed lastly */
+ if (fire_event) {
+ if (coordinate->key_type == KEY_TYPE_MODECHANGE) {
+ if (touch_id != context->get_last_touch_device_id()) {
+ fire_event = FALSE;
+ }
+ }
+ }
+
+ /* If this key's modifier is LONGKEY, this means the event is already fired so skip this one */
+ if (context->get_cur_key_modifier(touch_id) == KEY_MODIFIER_LONGKEY) {
+ fire_event = FALSE;
+ }
+
+ /* Don't fire any events if we're in longkey state */
+ if (state->get_cur_action_state() != ACTION_STATE_BASE_LONGKEY &&
+ state->get_cur_action_state() != ACTION_STATE_BASE_REPEATKEY &&
+ state->get_cur_action_state() != ACTION_STATE_POPUP_LONGKEY &&
+ state->get_cur_action_state() != ACTION_STATE_POPUP_REPEATKEY) {
+ if (ret) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ SclUIEventDesc key_event_desc;
+ if (targetCoordinate) {
+ key_event_desc.key_type = targetCoordinate->key_type;
+
+ key_event_desc.key_value = targetCoordinate->key_value[shift_index][button_context->multitap_index];
+ key_event_desc.key_event = targetCoordinate->key_event[shift_index][button_context->multitap_index];
+ }
+ key_event_desc.key_modifier = key_modifier;
+
+ key_event_desc.event_type = EVENT_TYPE_RELEASE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ if (handler->on_event_drag_state_changed(key_event_desc) != SCL_EVENT_PASS_ON) {
+ fire_event = FALSE;
+ }
+ }
+ if (fire_event) {
+ if (targetCoordinate) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_type = targetCoordinate->key_type;
+
+ key_event_desc.event_type = EVENT_TYPE_RELEASE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ switch (targetCoordinate->button_type) {
+ case BUTTON_TYPE_NORMAL:
+ case BUTTON_TYPE_GRAB :
+ case BUTTON_TYPE_SELFISH:
+ case BUTTON_TYPE_DIRECTION :
+ case BUTTON_TYPE_RELATIVE_DIRECTION: {
+ SclButtonContext *pressed_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ if (pressed_context) {
+ if (!(targetCoordinate->use_repeat_key) && pressed_context->state == BUTTON_STATE_PRESSED) {
+ key_event_desc.key_value = targetCoordinate->key_value[shift_index][0];
+ key_event_desc.key_event = targetCoordinate->key_event[shift_index][0];
+ key_event_desc.key_modifier = key_modifier;
+ handler->on_event_key_clicked(key_event_desc);
+ }
+ }
+ }
+ break;
+ case BUTTON_TYPE_MULTITAP:
+ case BUTTON_TYPE_ROTATION: {
+ if (targetCoordinate->button_type == BUTTON_TYPE_MULTITAP) {
+ if (window == context->get_last_event_fired_window() &&
+ key_index == context->get_last_event_fired_key()) {
+ key_modifier = KEY_MODIFIER_MULTITAP_REPEAT;
+ } else {
+ key_modifier = KEY_MODIFIER_MULTITAP_START;
+ }
+ } else {
+ key_modifier = KEY_MODIFIER_NONE;
+ }
+ if (button_context->multitap_index < MAX_SIZE_OF_MULTITAP_CHAR) {
+ key_event_desc.key_value = coordinate->key_value[shift_index][button_context->multitap_index];
+ key_event_desc.key_event = coordinate->key_event[shift_index][button_context->multitap_index];
+ key_event_desc.key_modifier = key_modifier;
+ if (SCL_EVENT_PASS_ON == handler->on_event_key_clicked(key_event_desc)) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ events->destroy_timer(SCL_TIMER_MULTITAP);
+ events->create_timer(SCL_TIMER_MULTITAP, m_multitap_delay_duration, 0);
+ }
+ }
+ /* Check if the multikey index is in valid range, and increase by one */
+ if (button_context->multitap_index >= MAX_SIZE_OF_MULTITAP_CHAR - 1) {
+ button_context->multitap_index = 0;
+ } else {
+ sclbyte orgindex = button_context->multitap_index;
+ button_context->multitap_index = 0;
+ if (targetCoordinate->key_value[shift_index][orgindex + 1]) {
+ if (strlen(targetCoordinate->key_value[shift_index][orgindex + 1]) > 0) {
+ button_context->multitap_index = orgindex + 1;
+ }
+ }
+ }
+ }
+ break;
+ case BUTTON_TYPE_DRAG : {
+ }
+ break;
+ case BUTTON_TYPE_TOGGLE : {
+ SclButtonContext *pressed_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ if (pressed_context) {
+ if (!(targetCoordinate->use_repeat_key) && pressed_context->state == BUTTON_STATE_PRESSED) {
+ key_event_desc.key_value = targetCoordinate->key_value[shift_index][0];
+ key_event_desc.key_event = targetCoordinate->key_event[shift_index][0];
+ if (pressed_context->toggled) {
+ key_event_desc.key_modifier = KEY_MODIFIER_NONE;
+ } else {
+ key_event_desc.key_modifier = KEY_MODIFIER_TOGGLED;
+ }
+ if (SCL_EVENT_PASS_ON == handler->on_event_key_clicked(key_event_desc)) {
+ pressed_context->toggled = !(pressed_context->toggled);
+ }
+ }
+ }
+ }
+ case BUTTON_TYPE_UIITEM: break;
+ case MAX_BUTTON_TYPE: break;
+ default: break;
+ }
+ switch (coordinate->popup_type) {
+ case POPUP_TYPE_BTN_RELEASE_POPUP:
+ case POPUP_TYPE_BTN_RELEASE_POPUP_ONCE: {
+ SCLDragState dragstate = context->get_cur_drag_state(touch_id);
+ sclint popup_input_mode = NOT_USED;
+
+ SclNotiPopupOpeningDesc desc;
+ desc.ui_event_desc = &key_event_desc;
+
+ if (scl_check_arrindex(dragstate, SCL_DRAG_STATE_MAX)) {
+ desc.input_mode = coordinate->popup_input_mode[dragstate];
+ popup_input_mode = sclres_manager->get_inputmode_id(coordinate->popup_input_mode[dragstate]);
+ /* FIXME */
+ //if (!scl_check_arrindex(popup_input_mode, MAX_INPUT_MODE_POPUP)) {
+ if (!scl_check_arrindex(popup_input_mode, MAX_SCL_INPUT_MODE)) {
+ desc.input_mode = coordinate->popup_input_mode[SCL_DRAG_STATE_NONE];
+ }
+ }
+ if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENING, &desc)) {
+ popup_input_mode = sclres_manager->get_inputmode_id(desc.input_mode);
+ SCLDisplayMode display_mode = context->get_display_mode();
+ /* FIXME */
+ //if (scl_check_arrindex(popup_input_mode, MAX_INPUT_MODE_POPUP) &&
+ if (scl_check_arrindex(popup_input_mode, MAX_SCL_INPUT_MODE) &&
+ scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ sclshort popupLayoutId =
+ sclres_manager->get_layout_id(sclres_input_mode_configure[popup_input_mode].layouts[display_mode]);
+ if (popupLayoutId == NOT_USED) {
+ // deal with NOT_USED
+ LOGD("popupLayoutID is not used.");
+ }
+ SclLayout *layout = NULL;
+ /* FIXME */
+ //if (scl_check_arrindex(popupLayoutId, MAX_LAYOUT)) {
+ if (scl_check_arrindex(popupLayoutId, MAX_SCL_LAYOUT)) {
+ layout = &sclres_layout[popupLayoutId];
+ }
+ if (layout) {
+ SclRectangle popupRect;
+ SclRectangle baseWndRect;
+ windows->get_window_rect(windows->get_base_window(), &baseWndRect);
+ popupRect.x = coordinate->x + coordinate->popup_relative_x + baseWndRect.x;
+ popupRect.y = coordinate->y + coordinate->popup_relative_y + baseWndRect.y;
+
+ //popupRect.width = utils->get_scale_x(layout->width);
+ //popupRect.height= utils->get_scale_y(layout->height);
+ if (!(sclres_manager->loaded(popupLayoutId))) {
+ sclres_manager->load(popupLayoutId);
+ }
+ popupRect.width = layout->width;
+ popupRect.height = layout->height;
+
+ /* Let's make sure this popup window does not go beyond the screen area */
+ sclint scr_w, scr_h;
+ utils->get_screen_resolution(&scr_w, &scr_h);
+
+ if (popupRect.x + popupRect.width > scr_w) {
+ popupRect.x = scr_w - popupRect.width;
+ }
+ if (popupRect.y + popupRect.height > scr_h) {
+ popupRect.y = scr_h - popupRect.height;
+ }
+
+ SclWindowOpener opener;
+ opener.window = window;
+ opener.key = key_index;
+
+ sclwindow popup_window = windows->open_popup(
+ opener,
+ popupRect,
+ popup_input_mode,
+ popupLayoutId,
+ coordinate->popup_type,
+ sclres_input_mode_configure[popup_input_mode].use_virtual_window,
+ sclres_input_mode_configure[popup_input_mode].use_dim_window,
+ coordinate->extract_offset_x,
+ coordinate->extract_offset_y,
+ sclres_input_mode_configure[popup_input_mode].timeout);
+
+ SclNotiPopupOpenedDesc opened_desc;
+ opened_desc.ui_event_desc = &key_event_desc;
+ opened_desc.input_mode = desc.input_mode;
+ opened_desc.window = popup_window;
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENED, &opened_desc);
+
+ windows->hide_window(windows->get_magnifier_window());
+ _play_tts_for_input_mode_name(popup_input_mode);
+ }
+ }
+ }
+ }
+ break;
+ case POPUP_TYPE_AUTO_POPUP:
+ case POPUP_TYPE_BTN_PRESS_POPUP_DRAG:
+ case POPUP_TYPE_NONE:
+ /* Nothing to do in here */
+ break;
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE: break;
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP: break;
+ case MAX_POPUP_TYPE: break;
+ default: break;
+ }
+ }
+
+ context->set_last_event_fired_window(window);
+ context->set_last_event_fired_key(key_index);
+ }
+ } else {
+ if (targetCoordinate) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_type = targetCoordinate->key_type;
+
+ key_event_desc.key_value = targetCoordinate->key_value[shift_index][button_context->multitap_index];
+ key_event_desc.key_event = targetCoordinate->key_event[shift_index][button_context->multitap_index];
+ key_event_desc.key_modifier = key_modifier;
+
+ key_event_desc.event_type = EVENT_TYPE_RELEASE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ handler->on_event_drag_state_changed(key_event_desc);
+ }
+ }
+
+ /* If this button was pressed, initialize the button context regardless of event */
+ if (button_context->state == BUTTON_STATE_PRESSED) {
+ /* But, if this button should be in pressed state in other multitouch id, do not initialize */
+ sclboolean found = FALSE;
+ for (sclint loop = 0;loop < context->get_multi_touch_context_num() && !found;loop++) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(loop, &desc);
+ if (desc.touch_id != touch_id) {
+ MultiTouchContext *multi_touch_context = context->find_multi_touch_context(desc.touch_id);
+ if (multi_touch_context) {
+ if (multi_touch_context->cur_pressed_window == window &&
+ multi_touch_context->cur_pressed_key == key_index) {
+ found = TRUE;
+ }
+ }
+ }
+ }
+ if (!found) {
+ button_context->state = BUTTON_STATE_NORMAL;
+ redraw = TRUE;
+ }
+ }
+
+ /* If this button needs to be redrawn */
+ if (redraw) {
+#ifdef DIRECTLY_DRAW_ON_EVENTS
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ if (builder) {
+ builder->draw_button(window, NULL, key_index, button_context->state, TRUE);
+ }
+#else
+ if (savedInputMode == context->get_input_mode()) {
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+
+#endif
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::mouse_press(sclwindow window, sclint x, sclint y, scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+
+ if (m_input_events_disabled) return FALSE;
+
+ //utils->log("Controller::mouse_press : %d %d\n", x, y);
+
+ /* Adjust x,y coordinate by touch offset */
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ sclint button_index = NOT_USED;
+ SclWindowContext *window_context = NULL;
+ if (windows && cache) {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ x += layout->mouse_manipulate_x;
+ y += layout->mouse_manipulate_y;
+ }
+ window_context = windows->get_window_context(window);
+ /* If the dim window is virtual and currently active, let's just skip this event */
+ if (windows->is_base_window(window)) {
+ SclWindowContext *dim_window_context = windows->get_window_context(windows->get_dim_window());
+ if (dim_window_context) {
+ LOGD("dim window is_virtual:%d, hidden:%d", dim_window_context->is_virtual, dim_window_context->hidden);
+ if (/*dim_window_context->is_virtual &&*/ !(dim_window_context->hidden)) {
+ window = windows->get_dim_window();
+ window_context = dim_window_context;
+ }
+ }
+ }
+ }
+
+ if (cache && state && windows && context && window_context) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+ if (default_configure) {
+ adjustment->apply_touch_offset(default_configure->touch_offset_level[display_mode], &x, &y);
+ }
+
+ sclboolean isSubEvent = FALSE;
+ if (context->get_multi_touch_context_num() > 0) {
+ SclUIEventDesc desc;
+ context->get_multi_touch_event(0, &desc);
+ sclwindow pressed_window = context->get_cur_pressed_window(desc.touch_id);
+ scl8 pressed_key = context->get_cur_pressed_key(desc.touch_id);
+ SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+ if (coordinate) {
+ if (coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_GRAB_SUB_EVENTS) {
+ isSubEvent = TRUE;
+ if (utils)
+ utils->play_vibration(DEFAULT_VIBRATION_STYLE, DEFAULT_VIBRATION_DURATION);
+ }
+ }
+ }
+ context->create_multi_touch_context(touch_id, isSubEvent);
+ context->set_cur_pressed_window(touch_id, window);
+ context->set_cur_pressed_point(touch_id, x, y);
+ context->set_cur_pressed_time(touch_id);
+ context->set_cur_moving_window(touch_id, window);
+ context->set_cur_moving_point(touch_id, x, y);
+ context->set_last_touch_device_id(touch_id);
+ context->set_cur_drag_state(touch_id, SCL_DRAG_STATE_NONE);
+ context->set_cur_key_modifier(touch_id, KEY_MODIFIER_NONE);
+ for (sclint labelidx = 0;labelidx < MAX_SIZE_OF_LABEL_FOR_ONE;labelidx++) {
+ context->set_custom_magnifier_label(touch_id, labelidx, NULL);
+ }
+
+ /* If there is postponed update of button, update it now */
+ CSCLEvents *events = CSCLEvents::get_instance();
+ sclwindow last_win = context->get_last_pressed_window();
+ scl8 last_key = context->get_last_pressed_key();
+ if (last_win != SCLWINDOW_INVALID && last_key != NOT_USED) {
+ const SclLayoutKeyCoordinate* coords = cache->get_cur_layout_key_coordinate(last_win, last_key);
+ if (coords) {
+ windows->update_window(last_win, coords->x, coords->y, coords->width, coords->height);
+ }
+ }
+ context->set_prev_pressed_window(touch_id, SCLWINDOW_INVALID);
+ context->set_prev_pressed_key(touch_id, NOT_USED);
+ context->set_prev_drag_state(touch_id, SCL_DRAG_STATE_NONE);
+ context->set_prev_moving_point(touch_id, x, y);
+
+ /* Destroy key related timers */
+ events->destroy_timer(SCL_TIMER_BUTTON_DELAY);
+ events->destroy_timer(SCL_TIMER_AUTOPOPUP);
+ events->destroy_timer(SCL_TIMER_SHORT_LONGKEY);
+ events->destroy_timer(SCL_TIMER_LONGKEY);
+ events->destroy_timer(SCL_TIMER_REPEATKEY);
+ events->destroy_timer(SCL_TIMER_MULTITAP);
+
+ /* Do what has to be done when mouse gets pressed */
+ handle_engine_signal(SCL_SIG_MOUSE_PRESS, window);
+
+ /* Adjust event x and y positions as relative position to the virtual window */
+ if (window_context) {
+ /*if (window_context->isVirtual) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ x -= (window_context->x - base_window_context->x);
+ y -= (window_context->y - base_window_context->y);
+ }
+ }*/
+ }
+
+ if (!isSubEvent) {
+ sclboolean process_finished = FALSE;
+ do {
+ /* Iterate all the buttons and inform the event */
+ sclboolean ended = FALSE;
+ for (int loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (button_context && coordinate) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (process_button_pressed_event(window, x, y, loop, touch_id, actual_event)) {
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_PRESS);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_PRESS);
+ }
+ button_index = loop;
+ ret = TRUE;
+ }
+ }
+ }
+ }
+
+ /* For covering a missing area about 1 pixel */
+ if (!ret) {
+ for (int loop = 0;loop < MAX_KEY;loop++) {
+ SclButtonContext *button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (button_context && coordinate) {
+ if (!(button_context->used)) {
+ break;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (process_button_pressed_event(window, x+1, y+1, loop, touch_id, actual_event)) {
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_PRESS);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_PRESS);
+ }
+ button_index = loop;
+ break;
+ }
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (windows->is_base_window(window)) {
+ process_finished = TRUE;
+ } else if (button_index != NOT_USED) {
+ process_finished = TRUE;
+ } else {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ if (layout->use_sw_background && layout->bg_color.a == 0) {
+ /* If we could not find appropriate button in this popup window and the popup is transparent */
+ SclWindowContext *base_window_context =
+ windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ x = (window_context->geometry.x + x - base_window_context->geometry.x);
+ y = (window_context->geometry.y + y - base_window_context->geometry.y);
+ }
+ window = windows->get_base_window();
+ } else {
+ process_finished = TRUE;
+ }
+ } else {
+ process_finished = TRUE;
+ }
+ }
+ } while (!process_finished);
+ }
+
+ sclwindow skip_window = window;
+ if (ret && button_index != NOT_USED) {
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, button_index);
+ if (coordinate) {
+ sclboolean dont_close_popup = FALSE;
+ if (coordinate->dont_close_popup) {
+ dont_close_popup = TRUE;
+ }
+ /* If the button's popup type is drag type, the opened popup could be the one opened by this press event */
+ if (coordinate->popup_type == POPUP_TYPE_BTN_PRESS_POPUP_DRAG) {
+ /* Check the opened popup was opened by this button */
+ sclwindow popupwin = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ SclWindowContext *popup_window_context = windows->get_window_context(popupwin);
+ if (popup_window_context) {
+ SclWindowOpener opener = popup_window_context->opener;
+ if (opener.window == window && opener.key == button_index) {
+ dont_close_popup = TRUE;
+ }
+ }
+ }
+ if (dont_close_popup) {
+ skip_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ }
+ }
+ } else {
+ SclUIEventDesc key_event_desc;
+ key_event_desc.event_type = EVENT_TYPE_PRESS;
+
+ SclPoint curpoint = {x, y};
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = curpoint;
+ key_event_desc.mouse_current_point = curpoint;
+ key_event_desc.mouse_farthest_point = curpoint;
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ if (handler) {
+ handler->on_event_drag_state_changed(key_event_desc);
+ }
+ }
+ windows->close_all_popups(skip_window);
+
+ /* When press event occured in popup window, reset POPUP_TIMEOUT timer */
+ if (!(windows->is_base_window(window))) {
+ if (window_context->timeout > 0) {
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+ events->create_timer(SCL_TIMER_POPUP_TIMEOUT, window_context->timeout, 0, TRUE);
+ }
+ } else if (skip_window != window) { /* Or the pressed button has dont_close_popup property, reset POPUP_TIMEOUT timer */
+ //SclWindowContext *skip_window_context = windows->get_window_context(skip_window, FALSE);
+ SclWindowContext *skip_window_context = windows->get_window_context(skip_window);
+ if (skip_window_context) {
+ if (skip_window_context->timeout > 0) {
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+ events->create_timer(SCL_TIMER_POPUP_TIMEOUT, skip_window_context->timeout, 0, TRUE);
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+sclboolean
+CSCLController::mouse_release(sclwindow window, sclint x, sclint y, scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+
+ //if (m_input_events_disabled) return FALSE;
+
+ //utils->log("Controller::mouse_release : %d %d\n", x, y);
+ /* Adjust x,y coordinate by touch offset */
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ CSCLEvents *events = CSCLEvents::get_instance();
+
+ sclint button_index = NOT_USED;
+
+ if (cache && state && windows && context && utils && handler && events &&
+ context->find_multi_touch_context(touch_id)) {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ x += layout->mouse_manipulate_x;
+ y += layout->mouse_manipulate_y;
+ }
+
+ sclwindow skip_window = SCLWINDOW_INVALID;
+ SCLDisplayMode display_mode = context->get_display_mode();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+ if (default_configure) {
+ adjustment->apply_touch_offset(default_configure->touch_offset_level[display_mode], &x, &y);
+ }
+
+ context->set_cur_moving_window(touch_id, SCLWINDOW_INVALID);
+
+ sclwindow pressed_window = context->get_cur_pressed_window(touch_id);
+ scl8 pressed_key = context->get_cur_pressed_key(touch_id);
+ //SclWindowContext *window_context = windows->get_window_context(window, TRUE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ /* Adjust event x and y positions as relative position to the virtual window */
+ if (window_context) {
+ /*if (window_context->isVirtual) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ x -= (window_context->x - base_window_context->x);
+ y -= (window_context->y - base_window_context->y);
+ }
+ }*/
+ /* If the dim window is virtual and currently active, consider base window's event is occured in dim window */
+ if (windows->is_base_window(window)) {
+ SclWindowContext *dim_window_context = windows->get_window_context(windows->get_dim_window());
+ if (dim_window_context) {
+ if (dim_window_context->is_virtual && !(dim_window_context->hidden)) {
+ window = windows->get_dim_window();
+ window_context = dim_window_context;
+ }
+ }
+ }
+ }
+
+ /* Iterate all the buttons and inform the event */
+ sclboolean ended = FALSE;
+
+ /* FIXME : The routine below seems to be removed, which was originally requested by Vodafone,
+ * to slow down the speed of repeat key right before stopping repeatkey event */
+ /* if (state->get_cur_action_state() == ACTION_STATE_BASE_REPEATKEY) {
+ if (m_key_repeated_num > 10) {
+ utils->sleep(100);
+ process_button_repeat_pressed_event(pressed_window, pressed_key, touch_id);
+ }
+ ended = TRUE;
+ }*/
+
+ if (context->get_cur_pressed_window(touch_id) == window) {
+ if (abs(context->get_cur_pressed_point(touch_id).x - x) > utils->get_scaled_x(SCL_FLICK_GESTURE_RECOG_THRESHOLD) ||
+ abs(context->get_cur_pressed_point(touch_id).y - y) > utils->get_scaled_y(SCL_FLICK_GESTURE_RECOG_THRESHOLD) )
+ {
+ struct timeval t0 = context->get_cur_pressed_time(touch_id);
+ struct timeval t1;
+ gettimeofday(&t1, NULL);
+ float etime;
+ etime = ((t1.tv_sec * 1000000 + t1.tv_usec) - (t0.tv_sec * 1000000 + t0.tv_usec))/1000.0;
+ if (etime < SCL_FLICK_GESTURE_RECOG_TIME) {
+ SCLDragType drag_type = DRAG_NONE;
+ if (x > context->get_cur_pressed_point(touch_id).x + utils->get_scaled_x(SCL_FLICK_GESTURE_RECOG_THRESHOLD)) {
+ drag_type = DRAG_RIGHT;
+ }
+ if (x < context->get_cur_pressed_point(touch_id).x - utils->get_scaled_x(SCL_FLICK_GESTURE_RECOG_THRESHOLD)) {
+ drag_type = DRAG_LEFT;
+ }
+ if (y > context->get_cur_pressed_point(touch_id).y + utils->get_scaled_y(SCL_FLICK_GESTURE_RECOG_THRESHOLD)) {
+ drag_type = DRAG_DOWN;
+ }
+ if (y < context->get_cur_pressed_point(touch_id).y - utils->get_scaled_y(SCL_FLICK_GESTURE_RECOG_THRESHOLD)) {
+ drag_type = DRAG_UP;
+ }
+ SclNotiGestureFlickDesc desc;
+ SclUIEventDesc ui_event_desc;
+ ui_event_desc.key_value = NULL;
+ ui_event_desc.key_event = NOT_USED;
+ ui_event_desc.key_modifier = KEY_MODIFIER_NONE;
+ ui_event_desc.event_type = EVENT_TYPE_RELEASE;
+ ui_event_desc.touch_id = touch_id;
+ ui_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ ui_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ ui_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+ ui_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+ desc.ui_event_desc = &ui_event_desc;
+ desc.drag_type = drag_type;
+ if (handler->on_event_notification(SCL_UINOTITYPE_GESTURE_FLICK, &desc)) {
+ ended = TRUE;
+ }
+ }
+ }
+ }
+
+ /* FIXME : We should consider this kind of action in general manner, not only specific to autopopup */
+ /* And also, this kind of implementation only selects button that was highlighted at least once. */
+ // {
+ //SclWindowContext *pressed_window_context = windows->get_window_context(pressed_window, FALSE);
+ SclWindowContext *pressed_window_context = windows->get_window_context(pressed_window);
+ if (pressed_window_context) {
+ utils->log("PRESSED CTX : %p %d %d\n", pressed_window,
+ pressed_window_context->geometry.x, pressed_window_context->geometry.y);
+ //if (pressedCtx->popuptype == POPUP_TYPE_AUTO_POPUP) {
+ sclboolean grab_event = FALSE;
+ const SclLayout *pressed_layout = cache->get_cur_layout(pressed_window);
+ if (pressed_layout) {
+ if (pressed_layout->style == LAYOUT_STYLE_POPUP_GRAB) {
+ grab_event = TRUE;
+ }
+ /* If the topmost window has the POPUP_GRAB style, find the nearest button to the mouse pointer */
+ if (grab_event) {
+ /* If the layout's addGrab* values are defined, process this event only if the event occured inside grab area */
+ sclboolean in_grab_area = TRUE;
+ if (pressed_layout->add_grab_left != NOT_USED &&
+ x < (pressed_window_context->geometry.x - pressed_layout->add_grab_left)) {
+ in_grab_area = FALSE;
+ }
+ if (pressed_layout->add_grab_right != NOT_USED &&
+ x > (pressed_window_context->geometry.x + pressed_window_context->geometry.width
+ + pressed_layout->add_grab_right)) {
+ in_grab_area = FALSE;
+ }
+ if (pressed_layout->add_grab_top != NOT_USED &&
+ y < (pressed_window_context->geometry.y - pressed_layout->add_grab_top)) {
+ in_grab_area = FALSE;
+ }
+ if (pressed_layout->add_grab_bottom != NOT_USED &&
+ y > (pressed_window_context->geometry.y + pressed_window_context->geometry.height
+ + pressed_layout->add_grab_bottom)) {
+ in_grab_area = FALSE;
+ }
+ if (in_grab_area) {
+ SclLayoutKeyCoordinate *coord = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+ if (coord) {
+ x = coord->x + (coord->width / 2);
+ y = coord->y + (coord->height / 2);
+
+ for (int loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *button_context = cache->get_cur_button_context(pressed_window, loop);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(pressed_window, loop);
+ if (button_context && coordinate) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (process_button_release_event(pressed_window, x, y, loop, touch_id, actual_event)) {
+ ret = TRUE;
+ ended = TRUE;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // }
+
+ SclButtonContext *button_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ /* FIXME : The rule below would not be a general requirement. A policy is needed regarding this. */
+ /* Ignore base window's release event if a popup window is opened */
+ if (state->get_cur_action_state() == ACTION_STATE_POPUP_INIT ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_PRESS ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY) {
+ if (windows->is_base_window(window)) {
+ ended = TRUE;
+ /* In case of direction button, the release event on other window should be processed */
+ if (coordinate && window_context && pressed_window_context) {
+ if (coordinate->button_type == BUTTON_TYPE_DIRECTION || coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ sclint relx = (window_context->geometry.x + x) - pressed_window_context->geometry.x;
+ sclint rely = (window_context->geometry.y + y) - pressed_window_context->geometry.y;
+ if (process_button_release_event(pressed_window, relx, rely, pressed_key, touch_id, actual_event)) {
+ button_index = pressed_key;
+ ret = TRUE;
+ x = coordinate->x + (coordinate->width / 2);
+ y = coordinate->y + (coordinate->height / 2);
+ skip_window = pressed_window;
+ }
+ }
+ }
+ }
+ }
+
+ sclboolean process_finished = FALSE;
+ do {
+ MultiTouchContext *multi_touch_context = context->find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ if (!(multi_touch_context->is_sub_event)) {
+ /* First check if the event occured in pressed key's threshold area */
+ if (button_context && coordinate && !ended) {
+ if (button_context->used && button_context->state != BUTTON_STATE_DISABLED) {
+ if (process_button_release_event(pressed_window, x, y, pressed_key, touch_id, actual_event)) {
+ button_index = pressed_key;
+ ret = TRUE;
+ x = coordinate->x + (coordinate->width / 2);
+ y = coordinate->y + (coordinate->height / 2);
+ }
+ }
+ }
+ for (int loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *cur_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *cur_coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (cur_context && cur_coordinate) {
+ if (!(cur_context->used)) {
+ ended = TRUE;
+ } else if (cur_context->state != BUTTON_STATE_DISABLED &&
+ cur_coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (window != pressed_window || loop != pressed_key) {
+ if (process_button_release_event(window, x, y, loop, touch_id, actual_event)) {
+ button_index = loop;
+ ret = TRUE;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ process_finished = TRUE;
+
+ SclUIEventDesc key_event_desc;
+ key_event_desc.key_value = NULL;
+ key_event_desc.key_event = NOT_USED;
+ key_event_desc.key_modifier = KEY_MODIFIER_NONE;
+ key_event_desc.event_type = EVENT_TYPE_NONE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ handler->on_event_key_clicked(key_event_desc);
+ }
+ }
+
+ /* For covering a missing area about 1 pixel */
+ if (!ret) {
+ ended = FALSE;
+
+ if (state->get_cur_action_state() == ACTION_STATE_POPUP_INIT ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_PRESS ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY) {
+ if (windows->is_base_window(window)) {
+ ended = TRUE;
+ }
+ }
+
+ for (int loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *cur_context = cache->get_cur_button_context(window, loop);
+ if (cur_context && coordinate) {
+ if (!(cur_context->used)) {
+ ended = TRUE;
+ break;
+ } else if (cur_context->state != BUTTON_STATE_DISABLED &&
+ coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (process_button_release_event(window, x+1, y+1, loop, touch_id)) {
+ button_index = loop;
+ ret = TRUE;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (windows->is_base_window(window)) {
+ process_finished = TRUE;
+ } else if (button_index != NOT_USED) {
+ process_finished = TRUE;
+ } else {
+ if (layout && layout->use_sw_background && layout->bg_color.a == 0) {
+ /* If we could not find appropriate button in this popup window and the popup is transparent */
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context && window_context) {
+ x = (window_context->geometry.x + x - base_window_context->geometry.x);
+ y = (window_context->geometry.y + y - base_window_context->geometry.y);
+ }
+ window = windows->get_base_window();
+ } else {
+ process_finished = TRUE;
+ }
+ }
+ } while (!process_finished);
+
+ if (!ret) {
+ SclButtonContext *button_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ SclUIEventDesc key_event_desc;
+ if (coordinate && button_context) {
+ key_event_desc.key_type = coordinate->key_type;
+
+ key_event_desc.key_value = coordinate->key_value[shift_index][button_context->multitap_index];
+ key_event_desc.key_event = coordinate->key_event[shift_index][button_context->multitap_index];
+ }
+ key_event_desc.key_modifier = context->get_cur_key_modifier(touch_id);;
+
+ key_event_desc.event_type = EVENT_TYPE_RELEASE;
+ key_event_desc.touch_id = touch_id;
+ key_event_desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ key_event_desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ key_event_desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ key_event_desc.touch_event_order = context->get_multi_touch_event_order(touch_id);
+
+ handler->on_event_drag_state_changed(key_event_desc);
+ }
+
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_INIT);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_INIT);
+ }
+
+ /* Restore previously pressed button's context and redraw it */
+ if (button_context && coordinate) {
+ button_context->state = BUTTON_STATE_NORMAL;
+ /* Commented below line to postpone some of the feedback for releasing */
+ //windows->update_window(pressed_window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+
+ /* If there is postponed update of button, update it now */
+ sclwindow last_win = context->get_last_pressed_window();
+ scl8 last_key = context->get_last_pressed_key();
+ if (last_win != SCLWINDOW_INVALID && last_key != NOT_USED) {
+ const SclLayoutKeyCoordinate* coords = cache->get_cur_layout_key_coordinate(last_win, last_key);
+ if (coords) {
+ windows->update_window(last_win, coords->x, coords->y, coords->width, coords->height);
+ }
+ }
+
+ /* To postpone some of the feedback for releasing */
+ context->set_last_pressed_key(context->get_cur_pressed_key(touch_id));
+ context->set_last_pressed_window(context->get_cur_pressed_window(touch_id));
+
+ /* Do what has to be done when mouse gets released */
+ sclboolean signaled = FALSE;
+ if (coordinate) {
+ switch (coordinate->popup_type) {
+ case POPUP_TYPE_BTN_RELEASE_POPUP:
+ case POPUP_TYPE_BTN_RELEASE_POPUP_ONCE:
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP:
+ case POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE:
+ {
+ /* Fix me : We should consider z-order */
+ skip_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ handle_engine_signal(SCL_SIG_MOUSE_RELEASE, skip_window);
+ signaled = TRUE;
+ }
+ break;
+ case POPUP_TYPE_NONE: break;
+ case POPUP_TYPE_BTN_PRESS_POPUP_DRAG: break;
+ case POPUP_TYPE_AUTO_POPUP: break;
+ case MAX_POPUP_TYPE: break;
+ default: break;
+ }
+ }
+ if (!signaled) {
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->popup_type == POPUP_TYPE_BTN_RELEASE_POPUP ||
+ window_context->popup_type == POPUP_TYPE_BTN_LONGPRESS_POPUP) {
+ /* Don't close window if the clicked button is a child of ReleasePopup window */
+ skip_window = window;
+ handle_engine_signal(SCL_SIG_MOUSE_RELEASE, window);
+ signaled = TRUE;
+ }
+ }
+ if (!signaled) {
+ handle_engine_signal(SCL_SIG_MOUSE_RELEASE);
+ }
+ }
+
+ context->set_cur_pressed_key(touch_id, NOT_USED);
+ context->set_cur_pressed_window(touch_id, SCLWINDOW_INVALID);
+
+ if (ret && button_index != NOT_USED) {
+ const SclLayoutKeyCoordinate *cur_coordinate = cache->get_cur_layout_key_coordinate(window, button_index);
+ if (cur_coordinate) {
+ if (cur_coordinate->dont_close_popup) {
+ skip_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ }
+ }
+ } else {
+ if (pressed_window == windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP)) {
+ if (pressed_window_context) {
+ if (pressed_window_context->popup_type != POPUP_TYPE_BTN_RELEASE_POPUP_ONCE &&
+ pressed_window_context->popup_type != POPUP_TYPE_BTN_LONGPRESS_POPUP_ONCE &&
+ pressed_window_context->popup_type != POPUP_TYPE_AUTO_POPUP &&
+ pressed_window_context->popup_type != POPUP_TYPE_BTN_PRESS_POPUP_DRAG)
+ {
+ skip_window = pressed_window;
+ }
+ }
+ }
+ }
+ windows->close_all_popups(skip_window);
+
+ /* Destroy key related timers */
+ events->destroy_timer(SCL_TIMER_AUTOPOPUP);
+ events->destroy_timer(SCL_TIMER_SHORT_LONGKEY);
+ events->destroy_timer(SCL_TIMER_LONGKEY);
+ events->destroy_timer(SCL_TIMER_REPEATKEY);
+
+ /* If there are more than 1 active multitouch ids, don't play button_delay trick */
+ if (context->get_multi_touch_context_num() == 1) {
+ /* To postpone some of the feedback for releasing */
+ events->create_timer(SCL_TIMER_BUTTON_DELAY, m_button_delay_duration, 0);
+ } else {
+ last_win = context->get_last_pressed_window();
+ last_key = context->get_last_pressed_key();
+
+ if (last_win != SCLWINDOW_INVALID && last_key != NOT_USED) {
+ const SclLayoutKeyCoordinate* last_coordinate = cache->get_cur_layout_key_coordinate(last_win, last_key);
+ if (last_coordinate) {
+ windows->update_window(last_win,
+ last_coordinate->x, last_coordinate->y, last_coordinate->width, last_coordinate->height);
+ }
+ }
+
+ windows->hide_window(windows->get_magnifier_window());
+ context->set_last_pressed_window(SCLWINDOW_INVALID);
+ context->set_last_pressed_key(NOT_USED);
+ }
+ }
+
+ if (context) {
+ if (touch_id == context->get_last_touch_device_id()) {
+ context->set_last_touch_device_id(SCLTOUCHDEVICE_INVALID);
+ }
+ context->destroy_multi_touch_context(touch_id);
+ }
+
+ return ret;
+}
+
+SCLDragState get_drag_state(sclint deltax, sclint deltay)
+{
+ SCLDragState ret = SCL_DRAG_STATE_MAX;
+
+ sclfloat ratio = fabs((sclfloat)deltay / (deltax ? deltax : 1));
+ /* If tan(theta) is smaller than our predefined value */
+ if (ratio <= (1 / SCL_DRAG_CURVE_4_DIRECTION_ANGLE_VALUE)) {
+ if (deltax > 0) {
+ ret = SCL_DRAG_STATE_RIGHT;
+ } else {
+ ret = SCL_DRAG_STATE_LEFT;
+ }
+ } else if (ratio >= SCL_DRAG_CURVE_4_DIRECTION_ANGLE_VALUE) {
+ /* If tan(theta) is bigger than our predefined value */
+ if (deltay > 0) {
+ ret = SCL_DRAG_STATE_DOWN;
+ } else {
+ ret = SCL_DRAG_STATE_UP;
+ }
+ } else {
+ ret = SCL_DRAG_STATE_INVALID;
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::mouse_move(sclwindow window, sclint x, sclint y, scltouchdevice touch_id, sclboolean actual_event)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+
+ if (m_input_events_disabled) return FALSE;
+
+ //utils->log("Controller::mouse_move : %d %d\n", x, y);
+
+ /* Adjust x,y coordinate by touch offset */
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!sclres_manager) return FALSE;
+
+ PSclModifierDecoration sclres_modifier_decoration = sclres_manager->get_modifier_decoration_table();
+ if (!sclres_modifier_decoration) return FALSE;
+
+ if (cache && state && windows && context && utils && adjustment && sclres_manager) {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ x += layout->mouse_manipulate_x;
+ y += layout->mouse_manipulate_y;
+ }
+
+ if (!(context->find_multi_touch_context(touch_id))) return FALSE;
+
+ PSclDefaultConfigure default_configure = sclres_manager->get_default_configure();
+ if (default_configure) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ adjustment->apply_touch_offset(default_configure->touch_offset_level[display_mode], &x, &y);
+ }
+
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ /* Adjust event x and y positions as relative position to the virtual window */
+ if (window_context) {
+ /*if (window_context->isVirtual) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ x -= (window_context->x - base_window_context->x);
+ y -= (window_context->y - base_window_context->y);
+ }
+ }*/
+ /* If the dim window is virtual and currently active, let's just skip this event */
+ if (windows->is_base_window(window)) {
+ SclWindowContext *dim_window_context = windows->get_window_context(windows->get_dim_window());
+ if (dim_window_context) {
+ if (dim_window_context->is_virtual && !(dim_window_context->hidden)) {
+ return FALSE;
+ }
+ }
+ }
+ /* If the pressed event was occured in dim window, let's just skip this move event */
+ if (context->get_last_pressed_window() == windows->get_dim_window()) {
+ return FALSE;
+ }
+ }
+
+ sclwindow pressed_window = context->get_cur_pressed_window(touch_id);
+ scl8 pressed_key = context->get_cur_pressed_key(touch_id);
+ SclButtonContext *button_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ /* If the multitouch type is SETTLE_PREVIOUS and is not the last touch device, let's ignore move events */
+ if (coordinate) {
+ if (coordinate->multitouch_type == SCL_MULTI_TOUCH_TYPE_SETTLE_PREVIOUS) {
+ if (context->get_last_touch_device_id() != touch_id) {
+ return FALSE;
+ }
+ }
+ }
+
+ context->set_cur_moving_point(touch_id, x, y);
+ context->set_cur_moving_window(touch_id, window);
+
+ /* If in longkey state, do not process, just return */
+ if (state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY) {
+ return FALSE;
+ }
+ /* FIXME : The rule below would not be a general requirement. A policy is needed regarding this. */
+ /* And if the event occured in popup window, don't come back to base window */
+ if (state->get_cur_action_state() == ACTION_STATE_POPUP_INIT ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_PRESS ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY) {
+ if (windows->is_base_window(window)) {
+ return FALSE;
+ }
+ }
+
+ SclUIEventDesc desc;
+ SCLShiftState shift_index = context->get_shift_state();
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+ if (coordinate) {
+ desc.key_type = coordinate->key_type;
+ desc.key_value = coordinate->key_value[shift_index][0];
+ desc.key_event = coordinate->key_event[shift_index][0];
+ }
+ desc.event_type = EVENT_TYPE_MOVE;
+ desc.mouse_pressed_point = context->get_cur_pressed_point(touch_id);
+ desc.mouse_current_point = context->get_cur_moving_point(touch_id);
+ desc.mouse_farthest_point = context->get_farthest_move_point(touch_id);
+
+ if (handler && handler->on_event_drag_state_changed(desc) != SCL_EVENT_PASS_ON) {
+ return FALSE;
+ }
+
+ /* FIXME : Add a condition to skip this code if longkey timer is not active */
+ /* If the mouse has moved out of threshold value of longkey keypress area, destroy longkey timer */
+ if (m_long_key_cancel_distance > 0) {
+ sclfloat dist = utils->get_distance(x, y,
+ context->get_cur_pressed_point(touch_id).x, context->get_cur_pressed_point(touch_id).y);
+ if (m_long_key_cancel_distance < dist) {
+ events->destroy_timer(SCL_TIMER_LONGKEY);
+ }
+ }
+
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_MOVING);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_MOVING);
+ }
+
+ /* Iterate all the buttons and inform the event */
+ sclboolean ended = FALSE;
+
+ /* Check farthest move point and update it */
+ sclint originx = x;
+ sclint originy = y;
+ if (pressed_window != window) {
+ //SclWindowContext *pressed_window_context = windows->get_window_context(pressed_window, FALSE);
+ SclWindowContext *pressed_window_context = windows->get_window_context(pressed_window);
+ if (window_context && pressed_window_context) {
+ originx = (window_context->geometry.x - pressed_window_context->geometry.x) + x;
+ originy = (window_context->geometry.y - pressed_window_context->geometry.y) + y;
+ }
+ }
+ sclint startx = originx;
+ sclint starty = originy;
+
+ /* Check if we should recognize drag curve */
+ if (coordinate) {
+ startx = context->get_cur_pressed_point(touch_id).x;
+ starty = context->get_cur_pressed_point(touch_id).y;
+ sclint deltax = originx - startx;
+ sclint deltay = originy - starty;
+ sclfloat approximate_dist = utils->get_approximate_distance(originx, originy, startx, starty);
+
+ sclboolean update_magnifier = FALSE;
+ sclboolean drag_state_changed = FALSE;
+ SCLDragState cur_drag_state = context->get_cur_drag_state(touch_id);
+ SCLDragState next_drag_state = SCL_DRAG_STATE_NONE;
+ sclfloat direction_recog_dist = SCL_DIRECTION_RECOG_DIST * utils->get_smallest_scale_rate();
+ if (coordinate->is_side_button) {
+ direction_recog_dist = SCL_DIRECTION_RECOG_DIST_SIDE * utils->get_smallest_scale_rate();
+ };
+
+ if (coordinate->button_type == BUTTON_TYPE_DIRECTION) {
+ /* Do not check farthest move point if current drag state is SCL_DRAG_STATE_RETURN */
+ if (context->get_cur_drag_state(touch_id) != SCL_DRAG_STATE_RETURN) {
+ if (approximate_dist > context->get_farthest_move_dist(touch_id)) {
+ context->set_farthest_move_point(touch_id, originx, originy);
+ }
+ }
+
+ if (cur_drag_state == SCL_DRAG_STATE_RETURN) {
+ direction_recog_dist *= SCL_DRAG_RETURN_RECOG_THRESHOLD_RETURN;
+ } else if (cur_drag_state != SCL_DRAG_STATE_NONE) {
+ direction_recog_dist *= SCL_DRAG_RETURN_RECOG_THRESHOLD_OTHER;
+ }
+ if (approximate_dist > direction_recog_dist) {
+ next_drag_state = get_drag_state(deltax, deltay);
+ /* Disable longkey if dragging is recognized */
+ events->destroy_timer(SCL_TIMER_LONGKEY);
+ }
+ if (cur_drag_state != next_drag_state) {
+ drag_state_changed = TRUE;
+ }
+ if (cur_drag_state == SCL_DRAG_STATE_NONE) {
+ //if (nextDragState != SCL_DRAG_STATE_INVALID) {
+ cur_drag_state = next_drag_state;
+ //}
+ } else if (cur_drag_state != next_drag_state) {
+ if (next_drag_state == SCL_DRAG_STATE_NONE) {
+ cur_drag_state = SCL_DRAG_STATE_RETURN;
+ } else {
+ cur_drag_state = next_drag_state;
+ }
+ }
+
+ context->set_cur_drag_state(touch_id, cur_drag_state);
+ sclboolean check_farthest = FALSE;
+ sclshort display = context->get_display_mode();
+ if (!scl_check_arrindex(display, DISPLAYMODE_MAX)) display = 0;
+ sclfloat dist = utils->get_distance(originx, originy,
+ context->get_cur_pressed_point(touch_id).x, context->get_cur_pressed_point(touch_id).y);
+ if (dist < direction_recog_dist && context->get_cur_drag_state(touch_id) == SCL_DRAG_STATE_RETURN) {
+ if (coordinate->extra_option == DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN ||
+ coordinate->extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN ||
+ coordinate->extra_option == DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE) {
+ deltax = context->get_farthest_move_point(touch_id).x -
+ context->get_cur_pressed_point(touch_id).x;
+ deltay = context->get_farthest_move_point(touch_id).y -
+ context->get_cur_pressed_point(touch_id).y;
+ dist = utils->get_distance(context->get_farthest_move_point(touch_id),
+ context->get_cur_pressed_point(touch_id));
+ check_farthest = TRUE;
+ }
+ }
+ SCLKeyModifier key_modifier = get_drag_key_modifier(deltax, deltay, dist,
+ check_farthest, touch_id, coordinate->extra_option);
+ if (dist > direction_recog_dist) {
+ context->set_cur_key_modifier(touch_id, key_modifier);
+ }
+ /* If this button needs to be decorated when dragged */
+ if (coordinate->modifier_decorator) {
+ const SclModifierDecoration *decoration = NULL;
+ /* FIXME */
+ /*if (scl_check_arrindex(coordinate->modifier_decorator,
+ sizeof(sclres_modifier_decoration) / sizeof(SclModifierDecoration ))) {*/
+ scl8 decoration_id = sclres_manager->get_modifier_decoration_id(coordinate->modifier_decorator);
+ if (scl_check_arrindex(decoration_id, MAX_SCL_MODIFIER_DECORATION_NUM)) {
+ if (sclres_modifier_decoration[decoration_id].valid) {
+ decoration = &(sclres_modifier_decoration[decoration_id]);
+ }
+ }
+ /* Check if the button really needs to be redrawn (whether it has non-null bg_image_path information */
+ if (decoration) {
+ if (decoration->bg_image_path[display][key_modifier]) {
+ windows->update_window(window,
+ coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+ if (dist > direction_recog_dist) {
+ if (context->get_magnifier_enabled()) {
+ update_magnifier = TRUE;
+ }
+ }
+ } else if (coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ if (cur_drag_state != SCL_DRAG_STATE_NONE) {
+ startx = context->get_prev_moving_point(touch_id).x;
+ starty = context->get_prev_moving_point(touch_id).y;
+ approximate_dist = utils->get_approximate_distance(originx, originy, startx, starty);
+ direction_recog_dist = SCL_DIRECTION_RELATIVE_RECOG_DIST * utils->get_smallest_scale_rate();
+ }
+ deltax = originx - startx;
+ deltay = originy - starty;
+ //printf("DIST : %f, RECOG : %f\n", dist, direction_recog_dist);
+ if (approximate_dist > direction_recog_dist) {
+ next_drag_state = get_drag_state(deltax, deltay);
+ /* Disable longkey if dragging is recognized */
+ events->destroy_timer(SCL_TIMER_LONGKEY);
+
+ if (cur_drag_state != next_drag_state) {
+ drag_state_changed = TRUE;
+ }
+ if (next_drag_state != SCL_DRAG_STATE_NONE) {
+ cur_drag_state = next_drag_state;
+ }
+ context->set_cur_drag_state(touch_id, cur_drag_state);
+
+ startx = context->get_farthest_move_point(touch_id).x;
+ starty = context->get_farthest_move_point(touch_id).y;
+ deltax = originx - startx;
+ deltay = originy - starty;
+ sclfloat dist_farthest = utils->get_approximate_distance(originx, originy, startx, starty);
+ //printf("%d %d %d %d %f, %d %d\n", originx, originy, startx, starty, dist_farthest, cur_drag_state, next_drag_state);
+ /* Let's see how much we are away from the last farthest point */
+ sclfloat diffdir_recog_dist = SCL_DIRECTION_RELATIVE_DIFFDIR_RECOG_DIST * utils->get_smallest_scale_rate();
+ /* If we moved certain amount from the point where direction changed, process drag state change routine */
+ if (dist_farthest > diffdir_recog_dist || context->get_cur_drag_state(touch_id) == SCL_DRAG_STATE_NONE) {
+ sclshort display = context->get_display_mode();
+ SCLKeyModifier key_modifier = get_drag_key_modifier(deltax, deltay, dist_farthest,
+ FALSE, touch_id, coordinate->extra_option);
+ context->set_cur_key_modifier(touch_id, key_modifier);
+ /* If this button needs to be decorated when dragged */
+ if (coordinate->modifier_decorator) {
+ const SclModifierDecoration *decoration = NULL;
+ /* FIXME */
+ /*if (scl_check_arrindex(coordinate->modifier_decorator,
+ sizeof(sclres_modifier_decoration) / sizeof(SclModifierDecoration ))) {*/
+ scl8 decoration_id = sclres_manager->get_modifier_decoration_id(coordinate->modifier_decorator);
+ if (scl_check_arrindex(decoration_id, MAX_SCL_MODIFIER_DECORATION_NUM)) {
+ if (sclres_modifier_decoration[decoration_id].valid) {
+ decoration = &(sclres_modifier_decoration[decoration_id]);
+ }
+ }
+ /* Check if the button really needs to be redrawn (whether it has non-null bg_image_path information */
+ if (decoration) {
+ if (decoration->bg_image_path[display][key_modifier]) {
+ windows->update_window(window,
+ coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+
+ if (context->get_magnifier_enabled()) {
+ update_magnifier = TRUE;
+ }
+ }
+ context->set_prev_moving_point(touch_id, originx, originy);
+ }
+ if (drag_state_changed) {
+ /* When the dragging direction changes, save the current position as farthest point for future comparison */
+ context->set_farthest_move_point(touch_id, originx, originy);
+ LOGD("SET_FARTHEST : %d %d %d", originx, originy, context->get_cur_drag_state(touch_id));
+ }
+ }
+
+ if (update_magnifier) {
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+
+ const SclLayout *base_layout = cache->get_cur_layout(windows->get_base_window());
+ if (base_layout && magnifier_configure) {
+ SclPoint zoomwinpos = {0, 0};
+ /* calculates x position to be set */
+ zoomwinpos.x = (coordinate->x + (coordinate->width / 2)) -
+ (magnifier_configure->width * utils->get_custom_scale_rate_x() / 2);
+
+ /* calculates y position to be set */
+ sclint scnWidth, scnHeight;
+ utils->get_screen_resolution(&scnWidth, &scnHeight);
+
+ zoomwinpos.y = coordinate->y - magnifier_configure->height * utils->get_custom_scale_rate_y();
+ if (window_context) {
+ zoomwinpos.x += window_context->geometry.x;
+ zoomwinpos.y += window_context->geometry.y;
+ }
+ if (zoomwinpos.x < 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x()) {
+ zoomwinpos.x = 0 - magnifier_configure->padding_x * utils->get_custom_scale_rate_x();
+ }
+ if (zoomwinpos.x > scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x()) {
+ zoomwinpos.x = scnWidth +
+ magnifier_configure->padding_x * utils->get_custom_scale_rate_x() -
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ }
+ zoomwinpos.y += magnifier_configure->padding_y * utils->get_custom_scale_rate_y();
+
+ zoomwinpos.x += coordinate->magnifier_offset_x;
+ zoomwinpos.y += coordinate->magnifier_offset_y;
+ windows->move_window(windows->get_magnifier_window(), zoomwinpos.x, zoomwinpos.y);
+ windows->show_window(windows->get_magnifier_window(), 0);
+ }
+ }
+ }
+
+ sclboolean grab_event = FALSE;
+ if (layout) {
+ if (layout->style == LAYOUT_STYLE_POPUP_GRAB) {
+ grab_event = TRUE;
+ }
+ /* If the topmost window has the POPUP_GRAB style, find the nearest button to the mouse pointer */
+ if (grab_event && window_context) {
+ /* If the layout's addGrab* values are defined, process this event only if the event occured inside grab area */
+ sclboolean in_grab_area = TRUE;
+ if (layout->add_grab_left != NOT_USED && x < -(layout->add_grab_left)) {
+ in_grab_area = FALSE;
+ }
+ if (layout->add_grab_right != NOT_USED && x >
+ (window_context->geometry.width + layout->add_grab_right)) {
+ in_grab_area = FALSE;
+ }
+ if (layout->add_grab_top != NOT_USED && y < -(layout->add_grab_top)) {
+ in_grab_area = FALSE;
+ }
+ if (layout->add_grab_bottom != NOT_USED && y >
+ (window_context->geometry.height + layout->add_grab_bottom)) {
+ in_grab_area = FALSE;
+ }
+ if (in_grab_area) {
+ float min_dist = (float)((unsigned int)(-1));
+ int min_dist_index = NOT_USED;
+ for (int loop = 0;loop < MAX_KEY && !ended && !ret;loop++) {
+ button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *cur_coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (button_context && cur_coordinate) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ cur_coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ float dist = utils->get_approximate_distance(x, y,
+ cur_coordinate->x + (cur_coordinate->width / 2),
+ cur_coordinate->y + (cur_coordinate->height / 2));
+ if (dist < min_dist) {
+ min_dist_index = loop;
+ min_dist = dist;
+ }
+ }
+ }
+ }
+ /* When we found the nearest button, generate this event on the button */
+ if (min_dist_index != NOT_USED) {
+ const SclLayoutKeyCoordinate *min_coordinate =
+ cache->get_cur_layout_key_coordinate(window, min_dist_index);
+ if (min_coordinate) {
+ x = min_coordinate->x + (min_coordinate->width / 2);
+ y = min_coordinate->y + (min_coordinate->height / 2);
+ if (process_button_move_event(window, x, y, min_dist_index, touch_id, actual_event)) {
+ ret = TRUE;
+ }
+ }
+ }
+ }
+ } else {
+ MultiTouchContext *multi_touch_context = context->find_multi_touch_context(touch_id);
+ if (multi_touch_context) {
+ sclint button_index = NOT_USED;
+ if (!(multi_touch_context->is_sub_event)) {
+ sclboolean process_finished = FALSE;
+ do {
+ /* First check if the event occured in pressed key's threshold area */
+ if (button_context && coordinate) {
+ if (pressed_window == window) { // Check only when the window is the one initally pressed
+ if (button_context->used && button_context->state != BUTTON_STATE_DISABLED) {
+ if (process_button_move_event(pressed_window, x, y, pressed_key, touch_id, actual_event)) {
+ ret = TRUE;
+ x = coordinate->x + (coordinate->width / 2);
+ y = coordinate->y + (coordinate->height / 2);
+ button_index = pressed_key;
+ }
+ }
+ }
+ }
+ for (int loop = 0;loop < MAX_KEY && !ended && !ret;loop++) {
+ button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *cur_coordinate =
+ cache->get_cur_layout_key_coordinate(window, loop);
+ if (button_context && cur_coordinate) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ cur_coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (window != pressed_window || loop != pressed_key) {
+ if (process_button_move_event(window, x, y, loop, touch_id, actual_event)) {
+ ret = TRUE;
+ button_index = loop;
+ }
+ }
+ }
+ }
+ }
+
+ if (windows->is_base_window(window)) {
+ process_finished = TRUE;
+ } else if (button_index != NOT_USED) {
+ process_finished = TRUE;
+ } else {
+ const SclLayout *cur_layout = cache->get_cur_layout(window);
+ if (cur_layout && cur_layout->use_sw_background && cur_layout->bg_color.a == 0) {
+ /* If we could not find appropriate button in this popup window and the popup is transparent */
+ SclWindowContext *base_window_context =
+ windows->get_window_context(windows->get_base_window());
+ if (base_window_context && window_context) {
+ x = (window_context->geometry.x + x - base_window_context->geometry.x);
+ y = (window_context->geometry.y + y - base_window_context->geometry.y);
+ }
+ window = windows->get_base_window();
+ } else {
+ process_finished = TRUE;
+ }
+ }
+ } while (!process_finished);
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLController::mouse_over(sclwindow window, sclint x, sclint y)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+
+ if (m_input_events_disabled)
+ return FALSE;
+
+ /* Adjust x,y coordinate by touch offset */
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+ /* Iterate all the buttons and inform the event */
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (cache && state && windows && context && utils && adjustment && sclres_manager) {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ x += layout->mouse_manipulate_x;
+ y += layout->mouse_manipulate_y;
+ }
+
+ SCLDisplayMode cur_display_mode = context->get_display_mode();
+
+ const SclDefaultConfigure *default_configure = sclres_manager->get_default_configure();
+ if (default_configure) {
+ adjustment->apply_touch_offset(default_configure->touch_offset_level[cur_display_mode], &x, &y);
+ }
+
+ /* Iterate all the buttons and inform the event */
+ sclboolean ended = FALSE;
+
+ for (int loop = 0; loop < MAX_KEY && !ended && !ret; loop++) {
+ SclButtonContext *button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (button_context && coordinate) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else if (button_context->state != BUTTON_STATE_DISABLED &&
+ coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (process_button_over_event(window, x, y, loop)) {
+ ret = TRUE;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+
+/**
+ * Processes a timer event
+ * If return FALSE, the current timer will be stop
+ * ID : SCL_LOWORD(data)
+ * value : SCL_HIWORD(data)
+ */
+sclboolean
+CSCLController::timer_event(const scl32 data)
+{
+ SCL_DEBUG();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLEvents* events = CSCLEvents::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+
+ scl16 id = SCL_LOWORD(data); /* Timer ID */
+ scl16 value = SCL_HIWORD(data); /* event unique ID */
+
+ if (!windows || !context || !events || !state || !cache || !handler)
+ return FALSE;
+
+ switch (id) {
+ case SCL_TIMER_AUTOPOPUP: {
+ /* Checks whether my event id is availble */
+ if (context->get_cur_pressed_event_id(context->get_last_touch_device_id()) != value ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_INIT ||
+ //state->get_cur_action_state() == ACTION_STATE_BASE_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_INIT ||
+ //state->get_cur_action_state() == ACTION_STATE_POPUP_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY
+ ) {
+ /* Ignores if the event id is different */
+ events->destroy_timer(id);
+ return FALSE;
+ }
+
+ SclRectangle rect = {0, 0, 0, 0};
+ sclwindow window = context->get_cur_pressed_window(context->get_last_touch_device_id());
+ sclbyte key_index = context->get_cur_pressed_key(context->get_last_touch_device_id());
+
+ if (configure_autopopup_window(window, key_index, &rect)) {
+ /* Let's change out pressed button's state back to normal */
+ SclButtonContext *button_context = cache->get_cur_button_context(window, key_index);
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ if (button_context) {
+ if (button_context->state == BUTTON_STATE_PRESSED) {
+ button_context->state = BUTTON_STATE_NORMAL;
+ if (coordinate) {
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+ /* Hide magnifier window when opening autopopup window */
+ windows->hide_window(windows->get_magnifier_window());
+
+ sclwindow popup_window = SCLWINDOW_INVALID;
+
+ SclNotiPopupOpeningDesc desc;
+ desc.ui_event_desc = NULL;
+ desc.input_mode = SCL_LAYOUT_AUTOPOPUP_NAME;
+ if (SCL_EVENT_PASS_ON ==
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENING, &desc)) {
+ /* Currently, window does not support virtual window */
+ SclWindowOpener opener;
+ opener.window = window;
+ opener.key = key_index;
+
+ popup_window = windows->open_popup(
+ opener,
+ rect,
+ NOT_USED,
+ SCL_LAYOUT_AUTOPOPUP, POPUP_TYPE_AUTO_POPUP,
+ FALSE,
+ FALSE);
+
+ SclNotiPopupOpenedDesc opened_desc;
+ opened_desc.ui_event_desc = NULL;
+ opened_desc.input_mode = desc.input_mode;
+ opened_desc.window = popup_window;
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_OPENED, &opened_desc);
+ }
+
+ windows->hide_window(windows->get_magnifier_window());
+ _play_tts_for_layout_autopopup_name();
+
+ sclwindow moving_window = context->get_cur_moving_window(context->get_last_touch_device_id());
+ SclPoint moving_point = context->get_cur_moving_point(context->get_last_touch_device_id());
+ SclWindowContext *moving_window_context = windows->get_window_context(moving_window);
+ SclWindowContext *popup_window_context = windows->get_window_context(popup_window);
+ if (moving_window_context && popup_window_context) {
+ moving_point.x = (moving_window_context->geometry.x - popup_window_context->geometry.x) + moving_point.x;
+ moving_point.y = (moving_window_context->geometry.y - popup_window_context->geometry.y) + moving_point.y;
+ }
+ //printf("AUTOPOPUP : %d %d\n", moving_point.x, moving_point.y);
+
+ if (coordinate) {
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ events->destroy_timer(id);
+
+ return FALSE;
+ }
+ break;
+
+ case SCL_TIMER_LONGKEY: {
+ /* Checks whether my event id is availble */
+ if (context->get_cur_pressed_event_id(context->get_last_touch_device_id()) != value ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_INIT ||
+ //state->get_cur_action_state() == ACTION_STATE_BASE_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_BASE_REPEATKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_INIT ||
+ //state->get_cur_action_state() == ACTION_STATE_POPUP_MOVING ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_RELEASE ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_REPEATKEY
+ ) {
+ /* Ignores if the event id is different */
+ events->destroy_timer(id);
+ return FALSE;
+ }
+ /* Ignores if the event id is different */
+ sclwindow window = context->get_cur_pressed_window(context->get_last_touch_device_id());
+ sclbyte key_index = context->get_cur_pressed_key(context->get_last_touch_device_id());
+ if (process_button_long_pressed_event(window, key_index, context->get_last_touch_device_id())) {
+ /* The button processed long key event, now enter longkey mode not to fire any events before releasing */
+ handle_engine_signal(SCL_SIG_MOUSE_LONG_PRESS, window);
+ windows->update_window(windows->get_magnifier_window());
+/*
+ SclButtonContext *button_context = cache->get_cur_button_context(window, key_index);
+ if (button_context->state == BUTTON_STATE_PRESSED) {
+ button_context->state = BUTTON_STATE_NORMAL;
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ context->set_cur_pressed_window(context->get_last_touch_device_id(), SCLWINDOW_INVALID);
+ context->set_cur_pressed_key(context->get_last_touch_device_id(), NOT_USED);
+*/
+ } else {
+ /* Start the repeat key timer for NORMAL or GRAB buttons if longkey is not supported */
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ if (coordinate) {
+ /* This is for enabling backspace key in search layout*/
+ //if (coordinate->use_repeat_key) {
+ if (coordinate->use_repeat_key
+ || coordinate->key_event[0][0] == MVK_BackSpace) {
+ if (coordinate->button_type == BUTTON_TYPE_NORMAL ||
+ coordinate->button_type == BUTTON_TYPE_GRAB ||
+ coordinate->button_type == BUTTON_TYPE_SELFISH ||
+ coordinate->button_type == BUTTON_TYPE_DIRECTION ||
+ coordinate->button_type == BUTTON_TYPE_RELATIVE_DIRECTION) {
+ m_key_repeated_num = 0;
+ events->create_timer(SCL_TIMER_REPEATKEY, m_repeat_key_duration, value);
+ if (windows->is_base_window(window)) {
+ state->set_cur_action_state(ACTION_STATE_BASE_REPEATKEY);
+ } else {
+ state->set_cur_action_state(ACTION_STATE_POPUP_REPEATKEY);
+ }
+ }
+ }
+ }
+ }
+ events->destroy_timer(id);
+ return FALSE;
+ }
+ break;
+
+ case SCL_TIMER_REPEATKEY: {
+ /* Checks whether my event id is availble */
+ if (context->get_cur_pressed_event_id(context->get_last_touch_device_id()) != value ||
+ (state->get_cur_action_state() != ACTION_STATE_BASE_REPEATKEY &&
+ state->get_cur_action_state() != ACTION_STATE_POPUP_REPEATKEY)
+ ) {
+ /* Ignores if the event id is different */
+ events->destroy_timer(id);
+ return FALSE;
+ }
+ sclwindow window = context->get_cur_pressed_window(context->get_last_touch_device_id());
+ sclbyte key_index = context->get_cur_pressed_key(context->get_last_touch_device_id());
+ scllong interval = m_repeat_key_duration - (m_key_repeated_num * SCL_REPEATKEY_ACCELERATION);
+ if (interval < SCL_REPEATKEY_MIN_DURATION) {
+ interval = SCL_REPEATKEY_MIN_DURATION;
+ }
+ process_button_repeat_pressed_event(window, key_index, context->get_last_touch_device_id());
+ events->destroy_timer(id);
+ events->create_timer(SCL_TIMER_REPEATKEY, interval, value);
+ m_key_repeated_num++;
+ return FALSE;
+ }
+ break;
+ case SCL_TIMER_BUTTON_DELAY: {
+ /* If there is postponed update of button, update it now */
+ sclwindow last_window = context->get_last_pressed_window();
+ scl8 last_key = context->get_last_pressed_key();
+
+ if (last_window != SCLWINDOW_INVALID && last_key != NOT_USED) {
+ const SclLayoutKeyCoordinate* coords = cache->get_cur_layout_key_coordinate(last_window, last_key);
+ if (coords) {
+ windows->update_window(last_window, coords->x, coords->y, coords->width, coords->height);
+ }
+ }
+
+ windows->hide_window(windows->get_magnifier_window());
+ context->set_last_pressed_window(SCLWINDOW_INVALID);
+ context->set_last_pressed_key(NOT_USED);
+ events->destroy_timer(id);
+ return FALSE;
+ }
+ break;
+ case SCL_TIMER_POPUP_TIMEOUT: {
+ windows->close_all_popups(SCLWINDOW_INVALID, TRUE);
+ events->destroy_timer(id);
+
+ return FALSE;
+ }
+ break;
+ case SCL_TIMER_MULTITAP: {
+ SclUIEventDesc key_event_desc;
+ key_event_desc.event_type = EVENT_TYPE_RELEASE;
+ key_event_desc.key_modifier = KEY_MODIFIER_MULTITAP_RELEASE;
+ handler->on_event_key_clicked(key_event_desc);
+
+ events->destroy_timer(id);
+
+ /* We have to reset multitap button state when MULTITAP timer expired */
+ sclboolean ended = FALSE;
+ sclwindow window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ for (int loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *button_context = cache->get_cur_button_context(window, loop);
+ if (button_context) {
+ if (!(button_context->used)) {
+ ended = TRUE;
+ } else {
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (coordinate && coordinate->button_type == BUTTON_TYPE_MULTITAP) {
+ button_context->multitap_index = 0;
+ }
+ }
+ }
+ }
+
+ return FALSE;
+ }
+ break;
+ case SCL_TIMER_AUTOTEST: {
+ srand(time(NULL));
+
+ unsigned int seed = 0;
+ sclint rnd = rand_r(&seed) % 100;
+
+ const SclLayout *layout = cache->get_cur_layout(windows->get_base_window());
+
+ if (layout == NULL) {
+ return FALSE;
+ }
+ srand(time(NULL));
+ sclint x = (rand_r(&seed) % (layout->width));
+
+ srand(time(NULL));
+ sclint y = (rand_r(&seed) % (layout->height));
+
+ if (rnd < 80) {
+ events->generate_mouse_event(SCL_MOUSE_EVENT_PRESS, x, y);
+ events->generate_mouse_event(SCL_MOUSE_EVENT_RELEASE, x, y);
+ } else if (rnd < 90) {
+ events->generate_mouse_event(SCL_MOUSE_EVENT_MOVE, x, y);
+ } else if (rnd < 95) {
+ events->generate_mouse_event(SCL_MOUSE_EVENT_PRESS, x, y);
+ } else {
+ events->generate_mouse_event(SCL_MOUSE_EVENT_RELEASE, x, y);
+ }
+
+ m_debug_variable++;
+ if (m_debug_variable < SCL_AUTOTEST_NUM) events->create_timer(SCL_TIMER_AUTOTEST, SCL_AUTOTEST_TIMER_INTERVAL, 0, FALSE);
+ else m_debug_mode = DEBUGMODE_DISABLED;
+ return FALSE;
+ }
+ break;
+ case SCL_TIMER_ANIMATION: {
+ CSCLAnimator *animator = CSCLAnimator::get_instance();
+ if (animator) {
+ return animator->animator_timer();
+ }
+ return TRUE;
+ }
+
+ default: {
+ events->destroy_timer(id);
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+/* Handles signals to manage contexts mainly focusing on resetting variables and cleaning up states */
+void CSCLController::handle_engine_signal(SclInternalSignal signal, sclwindow targetWindow )
+{
+ SCL_DEBUG();
+
+ enum SIGACTIONS {
+ SIGACTION_RESIZE_RESOURCES,
+ SIGACTION_DESTROY_TIMERS,
+ SIGACTION_CLEAR_PRIVATEKEYS,
+ SIGACTION_RECOMPUTE_LAYOUT,
+ SIGACTION_FREE_IMAGES,
+ SIGACTION_CLOSE_POPUP,
+ SIGACTION_CLOSE_MAGNIFIER,
+ SIGACTION_UNSET_SHIFT,
+ SIGACTION_UNPRESS_KEYS,
+ SIGACTION_INIT_DISPLAY,
+ SIGACTION_INIT_INPUTMODE,
+
+ SIGACTION_MAXNUM
+ };
+ const sclboolean SIGNAL_TABLE[SIGACTION_MAXNUM][SCL_SIG_MAXNUM] = {
+ // START, SHOW, HIDE, INPCHNG, DISPCHNG, POPUPSHOW, POPUPHIDE, MOUSEPRES, M-LONGPRES, MOUSEREL, KEYEVT, FOCUSCHNG
+ // SIGACTION_RESIZE_RESOURCES
+ { TRUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // SIGACTION_DESTROY_TIMERS
+ { TRUE, TRUE, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_CLEAR_PRIVATEKEYS
+ { TRUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_RECOMPUTE_LAYOUT
+ { 0, TRUE, 0, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_FREE_IMAGES
+ { TRUE, 0, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, 0, 0 },
+ // SIGACTION_CLOSE_POPUP
+ { TRUE, TRUE, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_CLOSE_MAGNIFIER
+ { TRUE, TRUE, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_UNSET_SHIFT
+ { TRUE, 0 , 0 , TRUE, 0, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_UNPRESS_KEYS
+ { TRUE, TRUE, TRUE, TRUE, TRUE, 0, 0, 0, 0, 0, 0, TRUE },
+ // SIGACTION_INIT_DISPLAY
+ { TRUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ // SIGACTION_INIT_INPUTMODE
+ { TRUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TRUE },
+ };
+
+ scl_assert_return(signal >= 0 && signal < SCL_SIG_MAXNUM);
+
+ CSCLEvents* events = CSCLEvents::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLImageProxy *proxy = CSCLImageProxy::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ if (!events || !windows || !context || !proxy || !cache) return;
+
+ switch (signal) {
+ case SCL_SIG_SHOW:
+ {
+ if (context)
+ context->set_hidden_state(FALSE);
+ }
+ break;
+ case SCL_SIG_HIDE:
+ {
+ if (context)
+ context->set_hidden_state(TRUE);
+
+ if (windows)
+ windows->close_all_popups();
+ }
+ break;
+ case SCL_SIG_START:
+ case SCL_SIG_INPMODE_CHANGE:
+ case SCL_SIG_DISP_CHANGE:
+ case SCL_SIG_POPUP_SHOW:
+ case SCL_SIG_POPUP_HIDE:
+ case SCL_SIG_MOUSE_PRESS:
+ case SCL_SIG_MOUSE_LONG_PRESS:
+ case SCL_SIG_MOUSE_RELEASE:
+ case SCL_SIG_KEYEVENT:
+ default:
+ break;
+ }
+
+ int loop = 0;
+ for (loop = 0;loop < SIGACTION_MAXNUM;loop++) {
+ if (SIGNAL_TABLE[loop][signal] == TRUE) {
+ switch (loop) {
+ case SIGACTION_DESTROY_TIMERS:
+ events->destroy_all_timer();
+ break;
+ case SIGACTION_RECOMPUTE_LAYOUT: {
+ if (targetWindow != SCLWINDOW_INVALID) {
+ if (cache)
+ cache->recompute_layout(targetWindow);
+
+ // EFL testing
+ windows->update_window(targetWindow);
+ }
+ }
+ break;
+ case SIGACTION_FREE_IMAGES:
+ proxy->free_images();
+ break;
+ case SIGACTION_CLOSE_POPUP: {
+ /* If there is a popup still opened, don't destroy POPUP_TIMEOUT timer */
+ if (!(windows->close_all_popups(targetWindow))) {
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+ }
+ }
+ break;
+ case SIGACTION_CLOSE_MAGNIFIER: {
+ if (signal == SCL_SIG_HIDE) {
+ windows->hide_window(windows->get_magnifier_window(), TRUE);
+ } else {
+ windows->hide_window(windows->get_magnifier_window());
+ }
+ }
+ //events->create_timer(SCL_TIMER_BUTTON_DELAY, SCL_BUTTON_MIN_DURATION, 0);
+ break;
+ case SIGACTION_UNSET_SHIFT: {
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ if (handler) {
+ SclNotiShiftStateChangeDesc desc;
+ desc.ui_event_desc = NULL;
+ desc.shift_state = SCL_SHIFT_STATE_OFF;
+
+ if (SCL_EVENT_PASS_ON ==
+ handler->on_event_notification(SCL_UINOTITYPE_SHIFT_STATE_CHANGE, &desc)) {
+ if (context)
+ context->set_shift_state(SCL_SHIFT_STATE_OFF);
+ }
+ }
+ }
+ break;
+ case SIGACTION_UNPRESS_KEYS:
+ if (context) {
+ context->set_cur_pressed_key(context->get_last_touch_device_id(), NOT_USED);
+ context->set_cur_pressed_window(context->get_last_touch_device_id(), SCLWINDOW_INVALID);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * Sets the duration value for longkey
+ * If not set, it will use default longkey duration. see sclconfig
+ */
+sclboolean
+CSCLController::set_longkey_duration(scllong msc)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ if (msc > 0) {
+ m_long_key_duration = msc;
+ ret = TRUE;
+ }
+ return ret;
+}
+
+/**
+* Sets the distance value for cancel longkey
+* If not set, it will use default longkey duration. see sclconfig
+*/
+sclboolean
+CSCLController::set_longkey_cancel_dist(sclshort dist)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ if (dist > 0) {
+ m_long_key_cancel_distance = dist;
+ ret = TRUE;
+ }
+ return ret;
+}
+
+/**
+* Sets the duration value for repeatkey
+* If not set, it will use default repeatkey duration. see sclconfig
+*/
+sclboolean
+CSCLController::set_repeatkey_duration(scllong msc)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ if (msc > 0) {
+ m_repeat_key_duration = msc;
+ ret = TRUE;
+ }
+ return ret;
+}
+
+/**
+ * Sets the duration value for autopopup key
+ * If not set, it will use default short longkey duration. see sclconfig
+ */
+sclboolean
+CSCLController::set_autopopup_key_duration(scllong msc)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ if (msc > 0) {
+ m_autopopup_key_duration = msc;
+ ret = TRUE;
+ }
+ return ret;
+}
+
+/**
+ * Sets the amount value for button delay
+ * If not set, it will use default button delay amount. see sclconfig
+ */
+sclboolean
+CSCLController::set_button_delay_duration(scllong msc)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ if (msc > 0) {
+ m_button_delay_duration = msc;
+ ret = TRUE;
+ }
+ return ret;
+}
+
+/**
+ * Configures the variables for auto-popup window
+ * It will return rectangle area
+ * @return FALSE It's not available popup key
+ */
+sclboolean
+CSCLController::configure_autopopup_window(sclwindow window, sclbyte key_index, SclRectangle* rect)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+ scl_assert_return_false(key_index >= 0);
+
+ sclboolean ret = TRUE;
+
+ sclbyte num_keys, num_columns, num_rows;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ if (cache) {
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ }
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclAutoPopupConfigure autopopup_configure = NULL;
+ if (sclres_manager) {
+ autopopup_configure = sclres_manager->get_autopopup_configure();
+ }
+
+ if (utils && context && windows && cache && coordinate && rect && autopopup_configure) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (!scl_check_arrindex(shift_index, SCL_SHIFT_STATE_MAX)) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ if (utils->get_autopopup_window_variables(coordinate->autopopup_key_labels[shift_index],
+ &num_keys, &num_columns, &num_rows, &rect->width, &rect->height)) {
+ /* There is no need for an autopopup window if number of keys are equal to or less than 0 */
+ if (!(num_keys > 0)) {
+ ret = FALSE;
+ }
+ /* calculates y position to be set */
+ SclRectangle baseWndRect;
+ int scrwidth, scrheight;
+ utils->get_screen_resolution(&scrwidth, &scrheight);
+
+ windows->get_window_rect(windows->get_base_window(), &baseWndRect);
+ /* Let the autopopup have its position right above the pressed button, with center alignment) */
+ rect->x = baseWndRect.x + coordinate->x + (coordinate->width / 2) - (rect->width / 2);
+ rect->y = baseWndRect.y + coordinate->y - rect->height +
+ autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ /* First check the growing direction of this autopopup window */
+ if (coordinate->x < baseWndRect.width / 2) {
+ /* We're growing left to right, calculate the left start point */
+ rect->x = baseWndRect.x + coordinate->x + (coordinate->width / 2) -
+ (autopopup_configure->button_width * utils->get_custom_scale_rate_x() / 2) -
+ autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate();
+ if (rect->x + rect->width > baseWndRect.x + baseWndRect.width) {
+ sclint relocate_unit = autopopup_configure->button_width * utils->get_custom_scale_rate_x() +
+ autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate();
+ rect->x -= (((rect->x + rect->width - (baseWndRect.x + baseWndRect.width)) /
+ relocate_unit) + 1) * relocate_unit;
+ }
+ } else {
+ /* We're growing right to left, calculate the right end point */
+ rect->x = baseWndRect.x + coordinate->x + (coordinate->width / 2) +
+ (autopopup_configure->button_width * utils->get_custom_scale_rate_x() / 2) +
+ autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate();
+ rect->x -= rect->width;
+ if (rect->x < baseWndRect.x) {
+ sclint relocate_unit = autopopup_configure->button_width * utils->get_custom_scale_rate_x() +
+ autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate();
+ rect->x += (((baseWndRect.x - rect->x) /
+ relocate_unit) + 1) * relocate_unit;
+ }
+ }
+ //rect->y = (scrheight - layout->height) + coordinate->y - rect->height + autopopup_configure->decoration_size;
+ /* Check if the window goes out of screen boundary */
+ //if (rect->x + rect->width > scrwidth + utils->get_scale_x(scl_autopopup_configure.decoration_size)) rect->x = (scrwidth + utils->get_scale_x(scl_autopopup_configure.decoration_size)) - rect->width;
+ if (rect->x + rect->width > scrwidth) rect->x = (scrwidth) - rect->width;
+ if (rect->y + rect->height > scrheight) rect->y = scrheight - rect->height;
+ if (rect->x < 0 - autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate())
+ rect->x = 0 - autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ // restrict to 0
+ if (rect->x < 0) rect->x = 0;
+ if (rect->y < 0) rect->y = 0;
+ } else {
+ ret = FALSE;
+ }
+ }
+ return ret;
+}
+
+/**
+ * If the mouse was pressed on the button A and moved to B without releasing,
+ * this function decides whether we should allow event transition, meaning
+ * button A gets restored to its initial state and B gets pressed instead.
+ */
+sclboolean
+CSCLController::check_event_transition_enabled(const SclLayoutKeyCoordinate *btn_from, const SclLayoutKeyCoordinate *btn_to)
+{
+ sclboolean ret = FALSE;
+ sclbyte type_from = BUTTON_TYPE_NORMAL; /* To enable event transition even if no button is pressed currently */
+ sclbyte type_to = MAX_BUTTON_TYPE;
+
+ const sclboolean TRANSITION_TABLE[MAX_BUTTON_TYPE][MAX_BUTTON_TYPE] = {
+ // NORMAL GRAB SELFISH DRAG MULTITAP ROTATION DIRECTION R_DIRECTION TOGGLE UIITEM
+ // From : NORMAL
+ { TRUE, 0, 0, TRUE, TRUE, TRUE, 0, 0, TRUE, 0},
+ // From : GRAB
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ // From : SELFISH
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ // From : DRAG
+ { TRUE, 0, 0, TRUE, TRUE, TRUE, 0, 0, TRUE, 0},
+ // From : MULTITAP
+ { TRUE, 0, 0, TRUE, TRUE, TRUE, 0, 0, TRUE, 0},
+ // From : ROTATION
+ { TRUE, 0, 0, TRUE, TRUE, TRUE, 0, 0, TRUE, 0},
+ // From : DIRECTION
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ // From : R_DIRECTION
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ // From : UIITEM
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ // From : TOGGLE
+ { TRUE, 0, 0, TRUE, TRUE, TRUE, 0, 0, TRUE, 0},
+ };
+
+ if (btn_from) type_from = btn_from->button_type;
+ if (btn_to) type_to = btn_to->button_type;
+
+ scl_assert_return_false(type_from >= 0 && type_from < MAX_BUTTON_TYPE);
+ scl_assert_return_false(type_to >= 0 && type_to < MAX_BUTTON_TYPE);
+
+ if (type_from < MAX_BUTTON_TYPE && type_to < MAX_BUTTON_TYPE) {
+ ret = TRANSITION_TABLE[type_from][type_to];
+ }
+
+ return ret;
+}
+
+SCLDebugMode
+CSCLController::get_debug_mode()
+{
+#ifdef SCL_DEBUG_ON
+ return m_debug_mode;
+#else
+ return m_debug_mode;
+ return DEBUGMODE_DISABLED;
+#endif
+}
+
+void
+CSCLController::set_debug_mode(SCLDebugMode mode)
+{
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ m_debug_mode = mode;
+ m_debug_variable = 0;
+
+ if (m_debug_mode == DEBUGMODE_AUTOTEST) {
+ srand(time(NULL));
+ if (events && utils) {
+ events->create_timer(SCL_TIMER_AUTOTEST, SCL_AUTOTEST_TIMER_INITIAL_INTERVAL, 0, FALSE);
+ utils->log("mode : %d\n", mode);
+ }
+ }
+}
+
+void
+CSCLController::disable_input_events(sclboolean disabled)
+{
+ m_input_events_disabled = disabled;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgwes.h"
+#include "sclutils.h"
+#include "sclcontext.h"
+
+#ifndef __SCL_CONTROLLER_H__
+#define __SCL_CONTROLLER_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+enum SclInternalSignal {
+ SCL_SIG_START,
+ SCL_SIG_SHOW,
+ SCL_SIG_HIDE,
+ SCL_SIG_INPMODE_CHANGE,
+ SCL_SIG_DISP_CHANGE,
+ SCL_SIG_POPUP_SHOW,
+ SCL_SIG_POPUP_HIDE,
+ SCL_SIG_MOUSE_PRESS,
+ SCL_SIG_MOUSE_LONG_PRESS,
+ SCL_SIG_MOUSE_RELEASE,
+ SCL_SIG_KEYEVENT,
+ SCL_SIG_FOCUS_CHANGE,
+
+ SCL_SIG_MAXNUM
+};
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class EXAPI CSCLController
+{
+private:
+ CSCLController();
+public:
+ virtual ~CSCLController();
+
+ static CSCLController* get_instance();
+ void init();
+
+private:
+ sclboolean process_button_pressed_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event = TRUE);
+ sclboolean process_button_long_pressed_event(sclwindow window, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event = TRUE);
+ sclboolean process_button_repeat_pressed_event(sclwindow window, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event = TRUE);
+ sclboolean process_button_move_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event = TRUE);
+ sclboolean process_button_over_event(sclwindow window, sclint x, sclint y, sclbyte key_index);
+ sclboolean process_button_release_event(sclwindow window, sclint x, sclint y, sclbyte key_index,
+ scltouchdevice touch_id, sclboolean actual_event = TRUE);
+
+ sclboolean configure_autopopup_window(sclwindow window, sclbyte key_index, SclRectangle* rect);
+
+ sclboolean check_event_transition_enabled(const SclLayoutKeyCoordinate *btnFrom, const SclLayoutKeyCoordinate *btnTo);
+ sclboolean check_magnifier_available(sclwindow window, sclbyte key_index, scltouchdevice touch_id);
+
+ SCLKeyModifier get_drag_key_modifier(sclint deltax, sclint deltay, sclfloat dist,
+ sclboolean check_farthest, scltouchdevice touch_id, sclbyte extra_option);
+
+public:
+ void handle_engine_signal(SclInternalSignal signal, sclwindow skip_window = SCLWINDOW_INVALID);
+ sclboolean process_input_mode_change(const sclbyte mode);
+ sclboolean process_rotation_change(const SCLRotation rotation);
+
+ sclboolean mouse_press(sclwindow window, sclint x, sclint y, scltouchdevice touch_id = 0, sclboolean actual_event = TRUE);
+ sclboolean mouse_release(sclwindow window, sclint x, sclint y, scltouchdevice touch_id = 0, sclboolean actual_event = TRUE);
+ sclboolean mouse_move(sclwindow window, sclint x, sclint y, scltouchdevice touch_id = 0, sclboolean actual_event = TRUE);
+ sclboolean mouse_over(sclwindow window, sclint x, sclint y);
+ sclboolean timer_event(const scl32 id);
+
+ sclboolean set_longkey_duration(scllong msc);
+ sclboolean set_longkey_cancel_dist(sclshort dist);
+ sclboolean set_repeatkey_duration(scllong msc);
+ sclboolean set_autopopup_key_duration(scllong msc);
+
+ sclboolean set_button_delay_duration(scllong msc);
+
+ SCLDebugMode get_debug_mode();
+ void set_debug_mode(SCLDebugMode mode);
+
+ void disable_input_events(sclboolean disabled);
+
+protected:
+ /* Interval time(msc) for checking long key event */
+ scllong m_long_key_duration;
+ sclshort m_long_key_cancel_distance;
+ scllong m_repeat_key_duration;
+ scllong m_autopopup_key_duration;
+
+ scllong m_button_delay_duration;
+ scllong m_multitap_delay_duration;
+
+ SCLDebugMode m_debug_mode;
+ sclint m_debug_variable;
+
+ /* Better to move this variable to CSCLContext */
+ sclint m_key_repeated_num;
+
+ sclboolean m_input_events_disabled;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_CONTROLLER_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "scldebug.h"
+#include <sys/time.h>
+#include <string.h>
+
+
+#ifdef SCL_DEBUG_ON
+
+/* Measure elapased time */
+static float
+_SCL_DEBUG_ELAPSED_TIME(const char* str, struct timeval t0, struct timeval t1);
+
+/* Measure elapased time */
+float SCL_DEBUG_TIME(const char* fileStr, int line, const char* str)
+{
+ float etime = 0.0;
+ static struct timeval t0 = {
+ 0,
+ };
+ static struct timeval t1;
+ char *pFileStr = const_cast<char*>(fileStr);
+ if (pFileStr) {
+ if (strlen(fileStr) > 20) {
+ pFileStr += (strlen(fileStr) - 20);
+ }
+ gettimeofday(&t1, NULL);
+ if (t0.tv_usec != 0) {
+ etime = ((t1.tv_sec * 1000000 + t1.tv_usec) - (t0.tv_sec * 1000000 + t0.tv_usec))/1000000.0;
+ }
+ if (strncmp(str, "get_", 4) == 0) {
+ //printf("[%-20.20s]%04d [T:%u][E:" mc_red "%f" mc_normal "]" mc_normal " %s" mc_normal "\n", pFileStr, line, (t1.tv_sec * 1000000 + t1.tv_usec), etime, str);
+ } else {
+ printf("[%-20.20s]%04d [T:%lu][E:" mc_red "%f" mc_normal "]" mc_blue " %s" mc_normal "\n", pFileStr, line, (t1.tv_sec * 1000000 + t1.tv_usec), etime, str);
+ }
+ t0 = t1;
+ }
+ return etime;
+}
+
+/* Measure elapsed time */
+static float _SCL_DEBUG_ELAPSED_TIME(const char* str, struct timeval t0, struct timeval t1)
+{
+ float etime;
+ etime = ((t1.tv_sec * 1000000 + t1.tv_usec) - (t0.tv_sec * 1000000 + t0.tv_usec))/1000000.0;
+
+ printf("[%s] elap-time = " mc_green "%f ms" mc_normal " (%lu~%lu) \n", str, etime*1000, (t0.tv_sec * 1000000 + t0.tv_usec), (t1.tv_sec * 1000000 + t1.tv_usec));
+ return etime;
+}
+
+/* Measure elapsed time */
+float SCL_DEBUG_ELAPSED_TIME(const char* fileStr, int line, const char* str, int type)
+{
+ static struct timeval s_tv1;
+ static struct timeval s_tv2;
+ static int s_start_line = 0;
+ static int s_end_line = 0;
+ float etime = 0.0;
+ if (type == MEASURE_START) {
+ gettimeofday(&s_tv1, NULL);
+ s_start_line = line;
+ printf("[%-20.20s]%04d [T:%lu]" mc_blue " %s" mc_normal "\n", fileStr, line, (s_tv1.tv_sec * 1000000 + s_tv1.tv_usec), str);
+ } else if (type == MEASURE_END) {
+ gettimeofday(&s_tv2, NULL);
+ s_end_line = line;
+ char printStr[100];
+ snprintf(printStr, 100, "%s(Line:%d~%d)", str, s_start_line, s_end_line);
+ etime = _SCL_DEBUG_ELAPSED_TIME(printStr, s_tv1, s_tv2);
+ }
+ return etime;
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_DEBUG_H__
+#define __SCL_DEBUG_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#if 1
+#define SCL_DEBUG_ON
+ /* Definition for debug message trace */
+#define scldebugc(m_code) "\x1b[" # m_code
+#define scldebug_sync() (void)fflush(stdout)
+#define scldebug_puts(m_code) (void)fputs(m_code, stdout)
+#define scldebug_clear_screen() scldebug_puts(scldebugc(H) scldebugc(J))
+#define scldebug_move(m_x, m_y) scldebug_puts(scldebugc(m_y;m_x ## H))
+#define scldebug_move_x(m_y) scldebug_puts(scldebugc(;m_y ## H))
+#define scldebug_move_y(m_y) scldebug_puts(scldebugc(m_y ## d))
+#define scldebug_puts_xy(m_x, m_y, m_message) scldebug_puts(scldebugc(m_y;m_x ## H) m_message)
+#define mc_normal scldebugc(0m)
+#define mc_black scldebugc(1;30m)
+#define mc_red scldebugc(1;31m)
+#define mc_green scldebugc(1;32m)
+#define mc_yellow scldebugc(1;33m)
+#define mc_blue scldebugc(1;34m)
+#define mc_magenta scldebugc(1;35m)
+#define mc_cyan scldebugc(1;36m)
+#define mc_white scldebugc(1;37m)
+
+#define MEASURE_START 0
+#define MEASURE_END 1
+
+ /* assert macro */
+#define scl_assert(_e) \
+ if (!(_e)) printf(mc_red "scl assert!(%s) failed at file :%s, line %04d, func: %s" mc_normal "\n", #_e, __FILE__, __LINE__, __FUNCTION__);
+
+#define scl_assert_return(_e) \
+ if (!(_e)) { printf(mc_red "scl assert!(%s) failed at file :%s, line %04d, func: %s" mc_normal "\n", #_e, __FILE__, __LINE__, __FUNCTION__); \
+ return;}
+
+#define scl_assert_return_false(_e) \
+ if (!(_e)) {printf(mc_red "scl assert!(%s) failed at file :%s, line %04d, func: %s" mc_normal "\n", #_e, __FILE__, __LINE__, __FUNCTION__); \
+ return 0;}
+
+#define scl_assert_return_null scl_assert_return_false
+
+ /* Measure elapsed time */
+ float
+ SCL_DEBUG_TIME(const char* fileStr, int line, const char* str);
+
+ /* Measure elapsed time */
+ float
+ SCL_DEBUG_ELAPSED_TIME(const char* fileStr, int line, const char* str, int type);
+
+#define SCL_DEBUG_ELAPSED_TIME_START() SCL_DEBUG_ELAPSED_TIME(__FILE__, __LINE__, __FUNCTION__, MEASURE_START);
+
+#define SCL_DEBUG_ELAPSED_TIME_END() SCL_DEBUG_ELAPSED_TIME(__FILE__, __LINE__, __FUNCTION__, MEASURE_END);
+
+//#define SCL_DEBUG() SCL_DEBUG_TIME(__FILE__, __LINE__, __FUNCTION__ );
+#define SCL_DEBUG()
+
+#define SCL_DEBUG_START() \
+ static struct timeval t0;\
+ static struct timeval t1;\
+ gettimeofday(&t0, NULL);\
+ printf("[%-20.20s][%04d][" mc_blue "%s" mc_normal "]\n", __FILE__, __LINE__, __FUNCTION__);
+
+#define SCL_DEBUG_END() \
+ gettimeofday(&t1, NULL);\
+ float etime;\
+ etime = ((t1.tv_sec * 1000000 + t1.tv_usec) - (t0.tv_sec * 1000000 + t0.tv_usec))/1000000.0;\
+ printf("[%-20.20s][%04d][%s] E: " mc_green "%f" mc_normal " (S:%lu) \n", __FILE__, __LINE__, __FUNCTION__, etime, (t0.tv_sec * 1000000 + t0.tv_usec) );
+
+#define IO_TEST
+
+#else
+#define SCL_DEBUG_ELAPSED_TIME_START()
+#define SCL_DEBUG_ELAPSED_TIME_END()
+#define SCL_DEBUG()
+#define SCL_DEBUG_START()
+#define SCL_DEBUG_END()
+//#define IO_TEST
+
+#define scl_assert(_e)
+#define scl_assert_return(_e)
+#define scl_assert_return_false(_e)
+#define scl_assert_return_null scl_assert_return_false
+
+#endif
+
+#define scl_check_arrindex(idx, arrsize) (((idx) >= 0) && ((idx) < (arrsize)))
+#define scl_check_arrindex_unsigned(idx, arrsize) ((idx) < (arrsize))
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __SCL_DEBUG_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "sclerroradjustment.h"
+#include "scldebug.h"
+#include "sclresourcecache.h"
+#include "sclutils.h"
+
+#define OFFSET_MAX 10
+#define TWO 2
+
+using namespace scl;
+
+CSCLErrorAdjustment* CSCLErrorAdjustment::get_instance()
+{
+ static CSCLErrorAdjustment instance;
+ return &instance;
+}
+
+CSCLErrorAdjustment::CSCLErrorAdjustment()
+{
+ SCL_DEBUG();
+
+ m_enabled = TRUE;
+}
+
+CSCLErrorAdjustment::~CSCLErrorAdjustment()
+{
+ SCL_DEBUG();
+}
+
+void CSCLErrorAdjustment::enable_touch_offset(sclboolean enabled)
+{
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->log("TOUCH_OFFSET is %s!!!!\n", (enabled ? "enabled" : "disabled"));
+ }
+ m_enabled = enabled;
+}
+
+sclboolean
+CSCLErrorAdjustment::apply_touch_offset(SCLTouchOffsetLevel level, sclint *x, sclint *y)
+{
+ SCL_DEBUG();
+ CSCLEvents* events = CSCLEvents::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclPoint *pos;
+ pos = events->get_touch_event_offset();
+
+ if (m_enabled && utils) {
+ if (level == TOUCH_OFFSET_LEVEL_1) {
+ *x = *x + utils->get_scaled_x(pos->x);
+ } else if (level == TOUCH_OFFSET_LEVEL_2) {
+ *x = *x + utils->get_scaled_x(pos->x);
+ ///* CODE for landscape CODE for landscape*/
+ //if (*x < utils->get_scale_x(scl_layout[LYT_LANDSCAPE_QTY_DEFAULT].width/TWO)) {
+ // *x = *x + utils->get_scale_x(OFFSET_MAX +((*x - utils->get_scale_x(scl_layout[LYT_LANDSCAPE_QTY_DEFAULT].width/TWO)) /(utils->get_scale_x(scl_layout[LYT_LANDSCAPE_QTY_DEFAULT].width/TWO)/OFFSET_MAX)));
+ //} else {
+ // *x = *x - utils->get_scale_x(OFFSET_MAX -((*x - utils->get_scale_x(scl_layout[LYT_LANDSCAPE_QTY_DEFAULT].width/TWO)) /(utils->get_scale_x(scl_layout[LYT_LANDSCAPE_QTY_DEFAULT].width/TWO)/OFFSET_MAX)));
+ //}
+ }
+ *y = *y + utils->get_scaled_y(pos->y);
+ }
+
+ return TRUE;
+}
+
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "scltypes.h"
+#include "sclstructs.h"
+
+#ifndef __SCL_ERRORADJUSTMENT_H__
+#define __SCL_ERRORADJUSTMENT_H__
+
+//SCL_BEGIN_DECLS
+
+#define DEFAULT_VIBE_DURATION 100
+
+namespace scl
+{
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLErrorAdjustment
+{
+public:
+ CSCLErrorAdjustment();
+ CSCLErrorAdjustment(sclwindow parent);
+
+ virtual ~CSCLErrorAdjustment();
+ static CSCLErrorAdjustment* get_instance();
+
+private:
+public:
+ void enable_touch_offset(sclboolean enable);
+ sclboolean apply_touch_offset(SCLTouchOffsetLevel level, sclint *x, sclint *y);
+
+private:
+ sclboolean m_enabled;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_ERRORADJUSTMENT_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_EVENTCALLBACK_H__
+#define __SCL_EVENTCALLBACK_H__
+
+//SCL_BEGIN_DECLS
+/* FIXME : Need to check the dependency cause by the next include statement */
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+
+namespace scl
+{
+
+struct SclUIEventDesc {
+ SclUIEventDesc() {
+ key_value = NULL;
+ key_event = 0;
+ key_type = KEY_TYPE_NONE;
+ key_modifier = KEY_MODIFIER_NONE;
+ touch_id = 0;
+ touch_event_order = 0;
+ mouse_pressed_point.x = 0;
+ mouse_pressed_point.y = 0;
+ mouse_current_point.x = 0;
+ mouse_current_point.y = 0;
+ mouse_farthest_point.x = 0;
+ mouse_farthest_point.y = 0;
+ event_type = EVENT_TYPE_NONE;
+ mouse_pressed_point.x = 0;
+ mouse_pressed_point.y = 0;
+ mouse_current_point.x = 0;
+ mouse_current_point.y = 0;
+ mouse_farthest_point.x = 0;
+ mouse_farthest_point.y = 0;
+ }
+ const sclchar *key_value;
+ sclulong key_event;
+ SCLKeyType key_type;
+ SCLKeyModifier key_modifier;
+
+ /* Extra information for advanced event processing */
+ scltouchdevice touch_id;
+ sclint touch_event_order;
+
+ SclPoint mouse_pressed_point;
+ SclPoint mouse_current_point;
+ SclPoint mouse_farthest_point;
+
+ SCLEventType event_type;
+};
+
+struct SclNotiDesc {
+ SclUIEventDesc *ui_event_desc;
+};
+
+struct SclNotiPopupOpeningDesc : SclNotiDesc {
+ const char *input_mode;
+}; // SCL_UINOTITYPE_POPUP_OPENING
+
+struct SclNotiPopupOpenedDesc : SclNotiDesc {
+ sclwindow window;
+ const char *input_mode;
+}; // SCL_UINOTITYPE_POPUP_OPENED
+
+struct SclNotiPopupClosingDesc : SclNotiDesc {
+ sclwindow window;
+ const char *input_mode;
+ sclboolean timed_out;
+}; // SCL_UINOTITYPE_POPUP_CLOSING
+
+struct SclNotiPopupClosedDesc : SclNotiDesc {
+ sclwindow window;
+ const char *input_mode;
+ sclboolean timed_out;
+}; // SCL_UINOTITYPE_POPUP_CLOSED
+
+struct SclNotiGestureFlickDesc : SclNotiDesc {
+ SCLDragType drag_type;
+}; // SCL_UINOTITYPE_GESTURE_FLICK
+
+struct SclNotiShiftStateChangeDesc : SclNotiDesc {
+ SCLShiftState shift_state;
+}; // SCL_UINOTITYPE_SHIFT_STATE_CHANGE
+
+struct SclNotiInputModeChangeDesc : SclNotiDesc {
+ const char *input_mode;
+}; // SCL_UINOTITYPE_INPUT_MODE_CHANGE
+
+struct SclNotiHighlightNavigateDesc : SclNotiDesc {
+ SCLHighlightNavigationDirection direction;
+ sclwindow window_from;
+ scl8 key_from;
+ sclwindow window_to;
+ scl8 key_to;
+}; // SCL_UINOTITYPE_HIGHLIGHT_NAVIGATE
+
+/**
+* @brief The callback interface to handle SCL events
+*
+* ISE developers can inherit this interface and register it to the SCLCore class
+* to handle SCL events as they want.
+*/
+struct ISCLUIEventCallback {
+ virtual SCLEventReturnType on_event_key_clicked(SclUIEventDesc ui_event_desc) { return SCL_EVENT_PASS_ON; }
+ virtual SCLEventReturnType on_event_drag_state_changed(SclUIEventDesc ui_event_desc) { return SCL_EVENT_PASS_ON; }
+ virtual SCLEventReturnType on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info) { return SCL_EVENT_PASS_ON; }
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_EVENTCALLBACK_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclresourcecache.h"
+#include "scleventhandler.h"
+#include "scldebug.h"
+#include "sclkeydefines.h"
+#include "scluiimpl.h"
+
+using namespace scl;
+
+CSCLEventHandler::CSCLEventHandler()
+{
+ SCL_DEBUG();
+
+ m_default_event_callback = NULL;
+ m_cur_input_mode_event_callback = NULL;
+}
+
+CSCLEventHandler::~CSCLEventHandler()
+{
+ SCL_DEBUG();
+}
+
+CSCLEventHandler*
+CSCLEventHandler::get_instance()
+{
+ static CSCLEventHandler instance;
+ return &instance;
+}
+
+static void handle_shift_button_click_event(SclUIEventDesc ui_event_desc)
+{
+ CSCLUIImpl *uiimpl = CSCLUIImpl::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ if (uiimpl && context) {
+ if (ui_event_desc.key_type == KEY_TYPE_CONTROL && ui_event_desc.key_event == MVK_Shift_L) {
+ switch (uiimpl->get_shift_state()) {
+ case SCL_SHIFT_STATE_OFF: {
+ uiimpl->set_shift_state(SCL_SHIFT_STATE_ON);
+ }
+ break;
+ case SCL_SHIFT_STATE_ON: {
+ /* The default next state should be LOCK state */
+ SCLShiftState next_state = SCL_SHIFT_STATE_LOCK;
+ if (context->get_shift_multi_touch_enabled()) {
+ if (context) {
+ if (context->get_shift_multi_touch_state() == SCL_SHIFT_MULTITOUCH_ON_PRESSED) {
+ /* If the shift multi touch state is ON_PRESSED, don't leave ON state now */
+ next_state = SCL_SHIFT_STATE_ON;
+ } else if (context->get_shift_multi_touch_state() == SCL_SHIFT_MULTITOUCH_ON_KEY_ENTERED) {
+ /* If some keys were already entered while shift key was in pressed state, move to OFF */
+ next_state = SCL_SHIFT_STATE_OFF;
+ }
+ }
+ }
+ uiimpl->set_shift_state(next_state);
+ }
+ break;
+ case SCL_SHIFT_STATE_LOCK: {
+ uiimpl->set_shift_state(SCL_SHIFT_STATE_OFF);
+ }
+ break;
+ case SCL_SHIFT_STATE_MAX:
+ default:
+ break;
+ }
+ }
+ }
+}
+
+static void handle_shift_state_on_button_click_event(SclUIEventDesc ui_event_desc)
+{
+ CSCLUIImpl *uiimpl = CSCLUIImpl::get_instance();
+
+ /* do not need the libscl-ui auto-captial the shift state */
+ if (FALSE == uiimpl->get_autocapital_shift_state()) {
+ return;
+ }
+
+ CSCLContext *context = CSCLContext::get_instance();
+
+ sclboolean turn_shift_off = TRUE;
+ if (ui_event_desc.key_event == MVK_Shift_L || ui_event_desc.key_event == MVK_Caps_Lock) {
+ turn_shift_off = FALSE;
+ }
+ if (ui_event_desc.key_type == KEY_TYPE_MODECHANGE) {
+ turn_shift_off = FALSE;
+ }
+ if (ui_event_desc.key_modifier == KEY_MODIFIER_MULTITAP_START ||
+ ui_event_desc.key_modifier == KEY_MODIFIER_MULTITAP_REPEAT) {
+ turn_shift_off = FALSE;
+ }
+ /* If we are in ON_PRESSED or ON_KEY_ENTERED mode of shift multi touch state, do not turn it off now */
+ if (context) {
+ if (context->get_shift_multi_touch_enabled() && turn_shift_off) {
+ if (context->get_shift_multi_touch_state() == SCL_SHIFT_MULTITOUCH_ON_PRESSED) {
+ context->set_shift_multi_touch_state(SCL_SHIFT_MULTITOUCH_ON_KEY_ENTERED);
+ turn_shift_off = FALSE;
+ } else if (context->get_shift_multi_touch_state() == SCL_SHIFT_MULTITOUCH_ON_KEY_ENTERED) {
+ turn_shift_off = FALSE;
+ }
+ }
+ }
+ if (turn_shift_off) {
+ if (uiimpl->get_shift_state() == SCL_SHIFT_STATE_ON) {
+ uiimpl->set_shift_state(SCL_SHIFT_STATE_OFF);
+ }
+ }
+}
+
+static void handle_mode_change_button_click_event(SclUIEventDesc ui_event_desc)
+{
+ CSCLUIImpl *uiimpl = CSCLUIImpl::get_instance();
+
+ if (uiimpl) {
+ if (ui_event_desc.key_type == KEY_TYPE_MODECHANGE) {
+ uiimpl->set_input_mode(ui_event_desc.key_value);
+ }
+ }
+}
+
+SCLEventReturnType
+CSCLEventHandler::on_event_key_clicked(SclUIEventDesc ui_event_desc)
+{
+ SCLEventReturnType ret = SCL_EVENT_PASS_ON;
+
+ pre_process_ui_event(ui_event_desc);
+
+ if (m_cur_input_mode_event_callback) {
+ ret = m_cur_input_mode_event_callback->on_event_key_clicked(ui_event_desc);
+ }
+ if (ret == SCL_EVENT_PASS_ON) {
+ if (m_default_event_callback) {
+ ret = m_default_event_callback->on_event_key_clicked(ui_event_desc);
+ }
+ }
+
+ if (ret == SCL_EVENT_PASS_ON) {
+ /* Here we can put the fallback processing of this UIEvent */
+
+ /* General requirement - 1 */
+ /* When the SHIFT button was clicked, we change the shift state to OFF -> ON -> LOCK -> OFF ... */
+ handle_shift_button_click_event(ui_event_desc);
+
+ /* General requirement - 2 */
+ /* If a key was clicked but it is neither a SHIFT nor a CAPSLOCK, we just turn the shift off, if it is on */
+ handle_shift_state_on_button_click_event(ui_event_desc);
+
+ /* General requirement - 3 */
+ /* If the key type is KEY_TYPE_MODECHANGE, change the current input mode to given key_value */
+ handle_mode_change_button_click_event(ui_event_desc);
+ }
+
+ return ret;
+}
+
+SCLEventReturnType
+CSCLEventHandler::on_event_drag_state_changed(SclUIEventDesc ui_event_desc)
+{
+ SCLEventReturnType ret = SCL_EVENT_PASS_ON;
+
+ pre_process_ui_event(ui_event_desc);
+
+ if (m_cur_input_mode_event_callback) {
+ ret = m_cur_input_mode_event_callback->on_event_drag_state_changed(ui_event_desc);
+ }
+ if (ret == SCL_EVENT_PASS_ON) {
+ if (m_default_event_callback) {
+ ret = m_default_event_callback->on_event_drag_state_changed(ui_event_desc);
+ }
+ }
+
+ if (ret == SCL_EVENT_PASS_ON) {
+ /* Here we can put the fallback processing of this UIEvent */
+ CSCLUIImpl *uiimpl = CSCLUIImpl::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ /* General requirement - 1 */
+ /* When the SHIFT button was 'pressed' and shift button multitouch action is enabled,
+ we change the current shift multitouch state to 'ON_PRESSED' */
+ if (uiimpl && context) {
+ if (context->get_shift_multi_touch_enabled()) {
+ if (ui_event_desc.event_type == EVENT_TYPE_PRESS) {
+ if (context) {
+ if (ui_event_desc.key_event == MVK_Shift_L) {
+ if (context->get_shift_multi_touch_state() == SCL_SHIFT_MULTITOUCH_OFF) {
+ uiimpl->set_shift_state(SCL_SHIFT_STATE_ON);
+ context->set_shift_multi_touch_state(SCL_SHIFT_MULTITOUCH_ON_PRESSED);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+SCLEventReturnType
+CSCLEventHandler::on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info)
+{
+ SCLEventReturnType ret = SCL_EVENT_PASS_ON;
+
+ if (m_cur_input_mode_event_callback) {
+ ret = m_cur_input_mode_event_callback->on_event_notification(noti_type, etc_info);
+ }
+ if (ret == SCL_EVENT_PASS_ON) {
+ if (m_default_event_callback) {
+ ret = m_default_event_callback->on_event_notification(noti_type, etc_info);
+ }
+ }
+
+ if (ret == SCL_EVENT_PASS_ON) {
+ /* Here we can put the fallback processing of this UIEvent */
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLEventHandler::set_input_mode(const sclchar *input_mode)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+ SclNotiInputModeChangeDesc desc;
+ desc.input_mode = input_mode;
+ if (SCL_EVENT_PASS_ON == on_event_notification(SCL_UINOTITYPE_INPUT_MODE_CHANGE, &desc)) {
+ m_cur_input_mode_event_callback = NULL;
+
+ if (input_mode) {
+ std::string id = input_mode;
+ std::map<std::string, ISCLUIEventCallback*>::iterator iter = m_input_mode_event_callbacks.find(input_mode);
+ if (iter != m_input_mode_event_callbacks.end()) {
+ m_cur_input_mode_event_callback = (iter->second);
+ }
+ }
+
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+void
+CSCLEventHandler::set_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode)
+{
+ SCL_DEBUG();
+
+ scl_assert_return(callback);
+
+ if (input_mode) {
+ std::string id = input_mode;
+ m_input_mode_event_callbacks[id] = callback;
+ } else {
+ m_default_event_callback = callback;
+ }
+}
+
+void
+CSCLEventHandler::pre_process_ui_event(SclUIEventDesc &ui_event_desc)
+{
+ SCL_DEBUG();
+
+ typedef struct {
+ const sclchar *key_value;
+ sclulong key_event;
+ } KEY_VALUE_EVENT_CONVERT_TABLE;
+
+ KEY_VALUE_EVENT_CONVERT_TABLE control_keys[] = {
+ {"Space", MVK_space },
+ {"BackSpace", MVK_BackSpace },
+ {"Shift", MVK_Shift_L },
+ {"CapsLock", MVK_Caps_Lock },
+ {"Enter", MVK_Return },
+ {"Left", MVK_Left },
+ {"Right", MVK_Right },
+ {"Up", MVK_Up },
+ {"Down", MVK_Down },
+ {"Escape", MVK_Escape },
+ };
+
+ /* Translate key_values only when key_event is 0 and key_value is not NULL */
+ if (ui_event_desc.key_value && ui_event_desc.key_event == 0) {
+ if (ui_event_desc.key_type == KEY_TYPE_CHAR) {
+ /* If the key_value is a string with length 1, and the first character has value between
+ SCL_ISCHAR range, provide the corresponding ASCII code in key_event field */
+ if (ui_event_desc.key_value[0] != '\0' && ui_event_desc.key_value[1] == '\0') {
+ if (SCL_ISCHAR(ui_event_desc.key_value[0])) {
+ ui_event_desc.key_event = static_cast<sclulong>(ui_event_desc.key_value[0]);
+ }
+ }
+ } else if (ui_event_desc.key_type == KEY_TYPE_CONTROL) {
+ const scluint control_keys_size = sizeof(control_keys) / sizeof(KEY_VALUE_EVENT_CONVERT_TABLE);
+
+ for (scluint loop = 0;loop < control_keys_size;loop++) {
+ if (strncmp(control_keys[loop].key_value, ui_event_desc.key_value, strlen(control_keys[loop].key_value)) == 0) {
+ ui_event_desc.key_event = control_keys[loop].key_event;
+ }
+ }
+ } else if (ui_event_desc.key_type == KEY_TYPE_STRING) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ ui_event_desc.key_value = cache->find_substituted_string(ui_event_desc.key_value);
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgwes.h"
+#include "sclutils.h"
+#include "sclcontext.h"
+#include "scleventcallback.h"
+
+#ifndef __SCL_EVENT_HANDLER_H__
+#define __SCL_EVENT_HANDLER_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+/**
+ * @brief The default event handler class
+ *
+ */
+class CSCLEventHandler : public ISCLUIEventCallback
+{
+private:
+ CSCLEventHandler();
+public:
+ virtual ~CSCLEventHandler();
+
+ static CSCLEventHandler* get_instance();
+
+ sclboolean set_input_mode(const sclchar *input_mode);
+ void set_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode);
+
+ SCLEventReturnType on_event_key_clicked(SclUIEventDesc ui_event_desc);
+ SCLEventReturnType on_event_drag_state_changed(SclUIEventDesc ui_event_desc);
+ SCLEventReturnType on_event_notification(SCLUINotiType noti_type, SclNotiDesc *etc_info);
+
+ void pre_process_ui_event(SclUIEventDesc &ui_event_desc);
+
+protected:
+ ISCLUIEventCallback* m_default_event_callback;
+ ISCLUIEventCallback* m_cur_input_mode_event_callback;
+
+ std::map<std::string, ISCLUIEventCallback*> m_input_mode_event_callbacks;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_EVENT_HANDLER_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclevents-nui.h"
+#include "scldebug.h"
+#include "sclcontroller.h"
+#include "sclgraphics.h"
+#include "scluibuilder.h"
+#include "sclerroradjustment.h"
+#include "sclresource.h"
+#include "sclresourcecache.h"
+#include "sclres_manager.h"
+
+#include <Elementary.h>
+#include <Eldbus.h>
+#include <dlog.h>
+#ifdef WAYLAND
+#define EFL_BETA_API_SUPPORT
+#include <Ecore_Wl2.h>
+#else
+#include <Ecore_X.h>
+#endif
+
+#include "sclkeyfocushandler.h"
+
+using namespace scl;
+
+#ifdef USING_KEY_GRAB
+#define HANDLE_KEY_EVENTS
+#endif
+
+#define E_PROP_TOUCH_INPUT "X_TouchInput"
+
+#ifdef WAYLAND
+#define E_KEYBOARD_SERVICE_BUS_NAME "org.tizen.keyboard"
+#define E_KEYBOARD_SERVICE_NAVI_IFC_NAME "org.tizen.KBGestureNavigation"
+#define E_KEYBOARD_SERVICE_NAVI_OBJ_PATH "/org/tizen/KBGestureNavigation"
+static Eldbus_Connection *eldbus_conn = NULL;
+static Eldbus_Object *eldbus_bus_obj = NULL;
+
+typedef enum _Gesture {
+ ONE_FINGER_HOVER = 0,
+ ONE_FINGER_SINGLE_TAP = 15,
+ ONE_FINGER_DOUBLE_TAP = 16
+} Gesture;
+
+typedef struct
+{
+ Gesture type; // Type of recognized gesture
+ int x;
+ int y;
+} Gesture_Info;
+#endif
+
+static sclboolean mouse_pressed = FALSE; /* Checks whether mouse is pressed or not */
+static sclwindow pressed_window = SCLWINDOW_INVALID;
+
+/* If the gap between two timestamps are bigger than 1 sec, do not compare */
+const unsigned int _touch_event_timestamp_compare_range = 1000;
+/* If the gap between two timestamps are smaller than 50 msec, do not process */
+const unsigned int _touch_event_timestamp_valid_threshold = 50;
+extern unsigned int g_timestamp_last_base_window_resized;
+
+#define MIN_XY_DIFF 14
+
+static Eina_Bool mouse_press(void *data, int type, void *event_info);
+static Eina_Bool mouse_move(void *data, int type, void *event_info);
+static Eina_Bool mouse_release(void *data, int type, void *event_info);
+
+#ifndef WAYLAND
+static Eina_Bool client_message_cb(void *data, int type, void *event);
+#endif
+
+#ifdef HANDLE_KEY_EVENTS
+static Eina_Bool key_pressed(void *data, int type, void *event_info);
+#endif
+
+static sclboolean get_window_rect(const sclwindow window, SclRectangle *rect)
+{
+ SCL_DEBUG();
+ sclboolean ret = FALSE;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ if (windows && context && utils && rect) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ sclint scr_w, scr_h;
+ /* get window size */
+ if (window_context && utils->get_screen_resolution(&scr_w, &scr_h)) {
+ switch (context->get_rotation()) {
+ case ROTATION_90_CW:
+ {
+ rect->height = window_context->geometry.width;
+ rect->width = window_context->geometry.height;
+ rect->y = scr_w - rect->height - window_context->geometry.x;
+ rect->x = window_context->geometry.y;
+ }
+ break;
+ case ROTATION_180:
+ {
+ rect->width = window_context->geometry.width;
+ rect->height = window_context->geometry.height;
+ rect->x = scr_w - window_context->geometry.x - rect->width;
+ rect->y = scr_h - window_context->geometry.y - rect->height;
+ }
+ break;
+ case ROTATION_90_CCW:
+ {
+ rect->height = window_context->geometry.width;
+ rect->width = window_context->geometry.height;
+ rect->y = window_context->geometry.x;
+ rect->x = scr_h - window_context->geometry.y - rect->width;
+ }
+ break;
+ default:
+ {
+ rect->x = window_context->geometry.x;
+ rect->y = window_context->geometry.y;
+ rect->width = window_context->geometry.width;
+ rect->height = window_context->geometry.height;
+ }
+ break;
+ }
+ ret = TRUE;
+ } else {
+ rect->x = rect->y = rect->width = rect->height = 0;
+ }
+ }
+ return ret;
+}
+
+#ifdef WAYLAND
+/* In wayland, root.x / root.y is not available, so need to apply virtual offset
+ when event occurred on a virtual window */
+static void apply_virtual_offset(SclRectangle rect, int *adjustx, int *adjusty)
+{
+ int virtual_offset_x = 0;
+ int virtual_offset_y = 0;
+ SclRectangle base_rect = {0, 0, 0, 0};
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ if (get_window_rect(windows->get_base_window(), &base_rect)) {
+ virtual_offset_x = rect.x - base_rect.x;
+ virtual_offset_y = rect.y - base_rect.y;
+ }
+ if (adjustx && adjusty) {
+ *adjustx -= virtual_offset_x;
+ *adjusty -= virtual_offset_y;
+ }
+ }
+}
+#endif
+
+/**
+ * Constructor
+ */
+CSCLEventsImplNui::CSCLEventsImplNui()
+{
+ SCL_DEBUG();
+
+ m_mouse_down_handler = NULL;
+ m_mouse_move_handler = NULL;
+ m_mouse_up_handler = NULL;
+
+#ifndef WAYLAND
+ m_xclient_msg_handler = NULL;
+#endif
+ m_key_pressed_handler = NULL;
+}
+
+#ifdef WAYLAND
+static void gesture_cb(void *data, const Eldbus_Message *msg)
+{
+ LOGD("GestureDetected callback");
+ int g_type;
+ static int last_pos_x = -1;
+ static int last_pos_y = -1;
+
+ if (!msg) {
+ LOGD("Incoming message is empty");
+ return;
+ }
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (!windows || !controller) return;
+
+ sclwindow base_window = windows->get_base_window();
+ SclWindowContext *window_context = windows->get_window_context(base_window);
+
+ if (!window_context) return;
+ if (window_context->hidden) return;
+
+ LOGD("window_context->geometry.x=%d y=%d w=%d h=%d",
+ window_context->geometry.x, window_context->geometry.y,
+ window_context->geometry.width, window_context->geometry.height);
+
+ Gesture_Info *info = (Gesture_Info *)calloc(sizeof(Gesture_Info), 1);
+ if (!info) {
+ LOGD("Memory alloc failed for Gesture_Info");
+ return;
+ }
+ if (!eldbus_message_arguments_get(msg, "iii", &g_type, &info->x,
+ &info->y)) {
+ LOGD("Getting message arguments failed");
+ free(info);
+ return;
+ }
+
+ info->type = (Gesture)g_type;
+ LOGD("Incoming gesture name is %d : %d %d", info->type, info->x, info->y);
+
+ if (info->type == ONE_FINGER_HOVER || info->type == ONE_FINGER_SINGLE_TAP) {
+ if (info->y >= window_context->geometry.y) {
+ last_pos_x = info->x;
+ last_pos_y = info->y - window_context->geometry.y;
+ LOGD("hover last_pos_x=%d last_pos_y=%d", last_pos_x, last_pos_y);
+ controller->mouse_over(base_window, last_pos_x, last_pos_y);
+ }
+ } else if (info->type == ONE_FINGER_DOUBLE_TAP) {
+ if (info->y >= window_context->geometry.y) {
+ last_pos_x = info->x;
+ last_pos_y = info->y - window_context->geometry.y;
+ LOGD("double last_pos_x=%d last_pos_y=%d", last_pos_x, last_pos_y);
+ controller->mouse_press(base_window, last_pos_x, last_pos_y);
+ controller->mouse_release(base_window, last_pos_x, last_pos_y);
+ }
+ }
+ free(info);
+}
+
+static void gestures_tracker_register()
+{
+ Eldbus_Proxy *proxy = NULL;
+
+ if (eldbus_conn)
+ return;
+
+ eldbus_init();
+ LOGD("Registering callback for GestureDetected signal");
+ if (!(eldbus_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION))) {
+ LOGW("Error: Unable to get session bus");
+ return;
+ }
+
+ eldbus_bus_obj = eldbus_object_get(eldbus_conn, E_KEYBOARD_SERVICE_BUS_NAME, E_KEYBOARD_SERVICE_NAVI_OBJ_PATH);
+ if (!eldbus_bus_obj) {
+ LOGW("Error: Getting object failed");
+ goto obj_err;
+ }
+
+ proxy = eldbus_proxy_get(eldbus_bus_obj, E_KEYBOARD_SERVICE_NAVI_IFC_NAME);
+ if (!proxy) {
+ LOGW("Error: Getting proxy failed");
+ goto proxy_err;
+ }
+
+ if (!eldbus_proxy_signal_handler_add(proxy, "KBGestureDetected", gesture_cb, NULL))
+ LOGW("No signal handler returned");
+
+ LOGD("Callback registration successful");
+ return;
+
+proxy_err:
+ eldbus_object_unref(eldbus_bus_obj);
+ eldbus_bus_obj = NULL;
+obj_err:
+ eldbus_connection_unref(eldbus_conn);
+ eldbus_conn = NULL;
+}
+
+static void gestures_tracker_unregister()
+{
+ if (eldbus_bus_obj) {
+ eldbus_object_unref(eldbus_bus_obj);
+ eldbus_bus_obj = NULL;
+ }
+
+ if (eldbus_conn) {
+ eldbus_connection_unref(eldbus_conn);
+ eldbus_conn = NULL;
+
+ eldbus_shutdown();
+ }
+}
+#endif
+/**
+ * De-constructor
+ */
+CSCLEventsImplNui::~CSCLEventsImplNui()
+{
+ SCL_DEBUG();
+
+ fini();
+}
+
+void CSCLEventsImplNui::init()
+{
+ /* Initializes all window resources */
+ m_mouse_down_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, mouse_press, NULL);
+ m_mouse_move_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, mouse_move, NULL);
+ m_mouse_up_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, mouse_release, NULL);
+
+#ifndef WAYLAND
+ m_xclient_msg_handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, client_message_cb, NULL);
+#else
+ gestures_tracker_register();
+#endif
+
+#ifdef HANDLE_KEY_EVENTS
+ m_key_pressed_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_pressed, NULL);
+#endif
+}
+
+void CSCLEventsImplNui::fini()
+{
+ if (m_mouse_down_handler) ecore_event_handler_del(m_mouse_down_handler);
+ m_mouse_down_handler = NULL;
+ if (m_mouse_move_handler) ecore_event_handler_del(m_mouse_move_handler);
+ m_mouse_move_handler = NULL;
+ if (m_mouse_up_handler) ecore_event_handler_del(m_mouse_up_handler);
+ m_mouse_up_handler = NULL;
+#ifdef HANDLE_KEY_EVENTS
+ if (m_key_pressed_handler) ecore_event_handler_del(m_key_pressed_handler);
+#endif
+ m_key_pressed_handler = NULL;
+#ifndef WAYLAND
+ if (m_xclient_msg_handler) ecore_event_handler_del(m_xclient_msg_handler);
+#else
+ gestures_tracker_unregister();
+#endif
+}
+
+/** Here x and y contains "actual" x and y position relative to portrait root window,
+ and window_context->width,height contains the window's orientation dependant width and height */
+SclPoint get_rotated_local_coords(sclint x, sclint y, SCLRotation rotation, SclRectangle *rect) {
+ SclPoint ret = {0, 0};
+
+ if (rect) {
+ switch (rotation) {
+ case ROTATION_90_CW:
+ {
+ ret.x = (rect->y + rect->width) - y;
+ ret.y = x - rect->x;
+ }
+ break;
+ case ROTATION_180:
+ {
+ ret.x = (rect->x + rect->width) - x;
+ ret.y = (rect->y + rect->height) - y;
+ }
+ break;
+ case ROTATION_90_CCW:
+ {
+ ret.x = y - rect->y;
+ ret.y = (rect->x + rect->height) - x;
+ }
+ break;
+ default:
+ {
+ ret.x = x - rect->x;
+ ret.y = y - rect->y;
+ }
+ break;
+ }
+ }
+ return ret;
+}
+
+static Eina_Bool check_timestamp_outdated(unsigned int timestamp)
+{
+ /* Skip events that were generated nearly at the same time when our base window resized */
+ timestamp -= _touch_event_timestamp_valid_threshold;
+ unsigned int gap = (g_timestamp_last_base_window_resized > timestamp) ?
+ (g_timestamp_last_base_window_resized - timestamp) :
+ (timestamp - g_timestamp_last_base_window_resized);
+ if (gap < _touch_event_timestamp_compare_range) {
+ if (g_timestamp_last_base_window_resized > timestamp) {
+ /* This event was generated before the base window resize event, ignore */
+ LOGD("Skipping event since turned out to be outdated : %u, %u",
+ g_timestamp_last_base_window_resized, timestamp);
+ return EINA_TRUE;
+ }
+ }
+ return EINA_FALSE;
+}
+
+//void mouse_press (void *data, Evas *e, Evas_Object *object, void *event_info)
+static Eina_Bool mouse_press(void *data, int type, void *event_info)
+{
+ SCL_DEBUG();
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_base_window;
+ Ecore_Wl2_Window *wl_magnifier_window;
+ Ecore_Wl2_Window *wl_window;
+#endif
+
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+
+ Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button*)event_info;
+
+ if (ev && check_timestamp_outdated(ev->timestamp)) {
+ return TRUE;
+ }
+
+ if (controller && windows && context && utils && adjustment && ev) {
+ LOGD("mouse_press : %d %d, %d %d, %d %d\n", ev->root.x, ev->root.y, ev->x, ev->y,
+ g_timestamp_last_base_window_resized, ev->timestamp);
+
+ sclbyte index = 0;
+ sclboolean processed = FALSE;
+ sclwindow window = SCLWINDOW_INVALID;
+
+#ifndef WAYLAND
+ Ecore_X_Window inputWindow = 0;
+ Ecore_X_Atom inputAtom = ecore_x_atom_get("DeviceMgr Input Window");
+ ecore_x_window_prop_xid_get(ecore_x_window_root_first_get(),
+ inputAtom, ECORE_X_ATOM_WINDOW, &inputWindow, 1);
+ if (inputWindow == 0) {
+ utils->log("Error : input window NULL!");
+ }
+
+ unsigned int touch_input = 0;
+ int res = ecore_x_window_prop_card32_get(inputWindow,
+ ecore_x_atom_get(E_PROP_TOUCH_INPUT), &touch_input, 1);
+
+ utils->log("E_PROP_TOUCH_INPUT : %d %d\n", res, touch_input);
+
+ if (1 == res) {
+ if (1 == touch_input) {
+ adjustment->enable_touch_offset(TRUE);
+ } else if (0 == touch_input) {
+ adjustment->enable_touch_offset(FALSE);
+ }
+ }
+#endif
+ sclboolean is_scl_window = FALSE;
+#ifdef WAYLAND
+ sclboolean is_magnifier_window = FALSE;
+ wl_base_window = (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_base_window()));
+ wl_magnifier_window = (Ecore_Wl2_Window*)(elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_magnifier_window())));
+ if (wl_base_window && (unsigned int)ecore_wl2_window_id_get(wl_base_window) == ev->window) {
+ is_scl_window = TRUE;
+ } else if (wl_magnifier_window && (unsigned int)ecore_wl2_window_id_get(wl_magnifier_window) == ev->window) {
+ is_scl_window = TRUE;
+ is_magnifier_window = TRUE;
+#else
+ if (elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_base_window())) == ev->window) {
+ is_scl_window = TRUE;
+ } else if (elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_magnifier_window())) == ev->window) {
+ is_scl_window = TRUE;
+#endif
+ } else {
+ do {
+ window = windows->get_nth_window_in_Z_order_list(index);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->is_virtual) {
+ is_scl_window = TRUE;
+#ifdef WAYLAND
+ } else if ((wl_window = (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(window)))) {
+ if ((unsigned int)ecore_wl2_window_id_get(wl_window) == ev->window)
+ is_scl_window = TRUE;
+#else
+ } else if (elm_win_xwindow_get(static_cast<Evas_Object*>(window)) == ev->window) {
+ is_scl_window = TRUE;
+#endif
+ }
+ }
+ index++;
+ } while (index < MAX_ZORDER_NUM && window != SCLWINDOW_INVALID);
+ index = 0;
+ }
+ if (!is_scl_window) return TRUE;
+
+ SclRectangle rect = {0, 0, 0, 0};
+ do {
+ window = windows->get_nth_window_in_Z_order_list(index);
+ if (window) {
+ // Update the position of the target window
+ //windows->get_window_context(window, TRUE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ windows->get_window_rect(window, &(window_context->geometry));
+ if (get_window_rect(window, &rect)) {
+#ifdef WAYLAND
+ int root_x = 0;
+ int root_y = 0;
+ if (is_magnifier_window) {
+ SclRectangle magnifier_rect = { 0, 0, 0, 0 };
+ if (get_window_rect(windows->get_magnifier_window(), &magnifier_rect)) {
+ root_x = ev->x + magnifier_rect.x;
+ root_y = ev->y + magnifier_rect.y;
+ }
+ } else {
+ root_x = ev->x + rect.x;
+ root_y = ev->y + rect.y;
+ }
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+ int adjust_x = root_x;
+ int adjust_y = root_y;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+
+ if (default_configure) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ if (scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ adjustment->apply_touch_offset(
+ default_configure->touch_offset_level[display_mode],
+ &adjust_x, &adjust_y);
+ }
+ }
+
+ sclint win_width = rect.width;
+ sclint win_height = rect.height;
+ if (context->get_display_mode() != DISPLAYMODE_PORTRAIT) {
+ rect.height = win_width;
+ rect.width = win_height;
+ }
+
+ /* Check whether will-be-adjusted coordinate is within the window area */
+ sclboolean process_event = FALSE;
+ if ((adjust_x >= rect.x && adjust_x <= (rect.x + win_width)) &&
+ (adjust_y >= rect.y && adjust_y <= (rect.y + win_height))) {
+ process_event = TRUE;
+ }
+ if (process_event) {
+ /* Now convert the global coordinate to appropriate local coordinate */
+ SclPoint coords = get_rotated_local_coords(
+ root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_press(window, coords.x, coords.y, ev->multi.device);
+ mouse_pressed = TRUE;
+ processed = TRUE;
+ pressed_window = window;
+ }
+ }
+ }
+ }
+ index++;
+ } while (index < MAX_ZORDER_NUM && window != SCLWINDOW_INVALID && !processed);
+
+ if (!processed) {
+ window = pressed_window;
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context && get_window_rect(window, &rect)) {
+ if (context->get_rotation() == ROTATION_90_CW || context->get_rotation() == ROTATION_90_CCW) {
+ sclint temp = rect.width;
+ rect.width = rect.height;
+ rect.height = temp;
+ }
+
+ // Now convert the global coordinate to appropriate local coordinate
+#ifdef WAYLAND
+ int root_x = ev->x + rect.x;
+ int root_y = ev->y + rect.y;
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+
+ SclPoint coords = get_rotated_local_coords(root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_press(window, coords.x, coords.y, ev->multi.device);
+ mouse_pressed = TRUE;
+ processed = TRUE;
+ }
+ }
+ }
+
+ return TRUE;
+
+ /*CSCLContext *context = CSCLContext::get_instance();
+ controller->mouse_press((sclwindow)data, ev->output.x, ev->output.y);
+ mouse_pressed = TRUE;*/
+
+ //LOGD("=-=-=-=- mouse_press : %p %d %d\n", data, ev->output.x, ev->output.y);
+}
+
+//void mouse_release (void *data, Evas *e, Evas_Object *object, void *event_info)
+static Eina_Bool mouse_release(void *data, int type, void *event_info)
+{
+ SCL_DEBUG();
+
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ //Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up*)event_info;
+ Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button*)event_info;
+
+ //if (!mouse_pressed) return FALSE;
+ if (ev && check_timestamp_outdated(ev->timestamp)) {
+ return TRUE;
+ }
+
+ if (controller && windows && context && ev) {
+ LOGD("mouse_release : %d %d, %d %d\n", ev->root.x, ev->root.y, ev->x, ev->y);
+
+ sclbyte index = 0;
+ sclboolean processed = FALSE;
+ sclwindow window = SCLWINDOW_INVALID;
+ SclRectangle rect;
+ sclboolean dimwinevent = FALSE;
+ SclWindowContext *dim_window_context = windows->get_window_context(windows->get_dim_window());
+ if (dim_window_context) {
+ if (!(dim_window_context->is_virtual)) {
+ if (elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_dim_window())) == ev->window) {
+ dimwinevent = TRUE;
+ }
+ }
+ }
+ if (dimwinevent) {
+ controller->mouse_press(windows->get_dim_window(), ev->root.x, ev->root.y, ev->multi.device);
+ } else {
+ do {
+ window = windows->get_nth_window_in_Z_order_list(index);
+ if (window) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ windows->get_window_rect(window, &(window_context->geometry));
+ if (get_window_rect(window, &rect)) {
+#ifdef WAYLAND
+ int root_x = 0;
+ int root_y = 0;
+ Ecore_Wl2_Window *wl_magnifier_window =
+ (Ecore_Wl2_Window*)(elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_magnifier_window())));
+ if (wl_magnifier_window &&
+ (unsigned int)ecore_wl2_window_id_get(wl_magnifier_window) == ev->window) {
+ SclRectangle magnifier_rect = { 0, 0, 0, 0 };
+ if (get_window_rect(windows->get_magnifier_window(), &magnifier_rect)) {
+ root_x = ev->x + magnifier_rect.x;
+ root_y = ev->y + magnifier_rect.y;
+ }
+ } else {
+ root_x = ev->x + rect.x;
+ root_y = ev->y + rect.y;
+ }
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+ int adjust_x = root_x;
+ int adjust_y = root_y;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+
+ if (default_configure) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+ if (adjustment && scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ adjustment->apply_touch_offset(
+ default_configure->touch_offset_level[display_mode],
+ &adjust_x, &adjust_y);
+ }
+ }
+
+ sclint win_width = rect.width;
+ sclint win_height = rect.height;
+ if (context->get_display_mode() != DISPLAYMODE_PORTRAIT) {
+ rect.height = win_width;
+ rect.width = win_height;
+ }
+
+ /* Check whether will-be-adjusted coordinate is within the window area */
+ sclboolean process_event = FALSE;
+ if ((adjust_x >= rect.x && adjust_x <= (rect.x + win_width)) &&
+ (adjust_y >= rect.y && adjust_y <= (rect.y + win_height))) {
+ process_event = TRUE;
+ }
+ if (process_event) {
+ /* Now convert the global coordinate to appropriate local coordinate */
+ SclPoint coords = get_rotated_local_coords(
+ root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_release(window, coords.x, coords.y, ev->multi.device);
+ processed = TRUE;
+ }
+ }
+ }
+ }
+ index++;
+ } while (index < MAX_ZORDER_NUM && window != SCLWINDOW_INVALID && !processed);
+ }
+
+ if (!processed) {
+ window = pressed_window;
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context && get_window_rect(window, &rect)) {
+ if (context->get_rotation() == ROTATION_90_CW || context->get_rotation() == ROTATION_90_CCW) {
+ sclint temp = rect.width;
+ rect.width = rect.height;
+ rect.height = temp;
+ }
+
+ /* Now convert the global coordinate to appropriate local coordinate */
+#ifdef WAYLAND
+ int root_x = ev->x + rect.x;
+ int root_y = ev->y + rect.y;
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+
+ SclPoint coords = get_rotated_local_coords(root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_release(window, coords.x, coords.y, ev->multi.device);
+ processed = TRUE;
+ }
+ }
+
+ mouse_pressed = FALSE;
+ }
+
+ return TRUE;
+ //CSCLController *controller = CSCLController::get_instance();
+ //CSCLWindows *windows = CSCLWindows::get_instance();
+ //controller->mouse_release((sclwindow)data, (int)ev->output.x, (int)ev->output.y);
+ //controller->mouse_release((sclwindow)data, (int)ev->x, (int)ev->y);
+}
+
+#ifdef HANDLE_KEY_EVENTS
+static Eina_Bool key_pressed(void *data, int type, void *event_info)
+{
+ LOGD("=-=-=-=- key_pressed \n");
+ CSCLController *controller = CSCLController::get_instance();
+ Ecore_Event_Key *ev = (Ecore_Event_Key *)event_info;
+ const char *ckey_val = ev->key;
+ LOGD("=-=-=-=- ev->key(char) = %c \n", ev->key);
+ LOGD("=-=-=-=- ev->key(string) = %s \n", ev->key);
+ LOGD("=-=-=-=- ev->keyname(char) = %c \n", ev->keyname);
+ LOGD("=-=-=-=- ev->keyname(string) = %s \n", ev->keyname);
+ LOGD("=-=-=-=- ev->string(char) = %c \n", ev->string);
+ LOGD("=-=-=-=- ev->string(string) = %s \n", ev->string);
+
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ SclButtonContext *prev_button_context = NULL;
+ const SclLayoutKeyCoordinate *prevcoordinate = NULL;
+ SclButtonContext *button_context = NULL;
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ sclwindow window = windows->get_base_window();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ sclbyte current_key_index = focus_handler->get_current_key_index();
+ sclbyte key_index = current_key_index;
+
+ if (strcmp(ev->keyname, "Right") == 0) {
+ key_index = focus_handler->get_next_key_index(NAVIGATE_RIGHT);
+ } else if (strcmp(ev->keyname, "Left") == 0) {
+ key_index = focus_handler->get_next_key_index(NAVIGATE_LEFT);
+ } else if (strcmp(ev->keyname, "Up") == 0) {
+ key_index = focus_handler->get_next_key_index(NAVIGATE_UP);
+ } else if (strcmp(ev->keyname, "Down") == 0) {
+ key_index = focus_handler->get_next_key_index(NAVIGATE_DOWN);
+ } else if ((strcmp(ev->keyname, "Return") == 0) || (strcmp(ev->keyname, "Enter") == 0)) {
+ button_context = cache->get_cur_button_context(window, current_key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(window, current_key_index);
+ button_context->state = BUTTON_STATE_NORMAL;
+ controller->mouse_press(window, coordinate->x, coordinate->y, TRUE);
+ controller->mouse_release(window, coordinate->x, coordinate->y, TRUE);
+ if (KEY_TYPE_MODECHANGE != coordinate->key_type) {
+ button_context->state = BUTTON_STATE_PRESSED;
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ } else {
+ focus_handler->init_key_index();
+ }
+ return TRUE;
+ }
+
+ if (current_key_index != key_index) {
+ button_context = cache->get_cur_button_context(window, key_index);
+ prev_button_context = cache->get_cur_button_context(window, current_key_index);
+ prevcoordinate = cache->get_cur_layout_key_coordinate(window, current_key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ prev_button_context->state = BUTTON_STATE_NORMAL;
+ button_context->state = BUTTON_STATE_PRESSED;
+ sclshort x, y, width, height;
+ if (prevcoordinate->x < coordinate->x) {
+ x = prevcoordinate->x;
+ } else {
+ x = coordinate->x;
+ }
+
+ if (prevcoordinate->y < coordinate->y) {
+ y = prevcoordinate->y;
+ } else {
+ y = coordinate->y;
+ }
+
+ if (prevcoordinate->x + prevcoordinate->width > coordinate->x + coordinate->width) {
+ width = prevcoordinate->x + prevcoordinate->width - x;
+ } else {
+ width = coordinate->x + coordinate->width - x;
+ }
+
+ if (prevcoordinate->y + prevcoordinate->height > coordinate->y + coordinate->height) {
+ height = prevcoordinate->y + prevcoordinate->height - y;
+ } else {
+ height = coordinate->y + coordinate->height - y;
+ }
+ windows->update_window(window, x, y, width, height);
+
+ } else {
+ }
+
+ return TRUE;
+}
+#endif /*HANDLE_KEY_EVENTS*/
+
+//int mouse_move (void *data, Evas *e, Evas_Object *object, void *event_info)
+static Eina_Bool mouse_move(void *data, int type, void *event_info)
+{
+ SCL_DEBUG();
+
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ //Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move*)event_info;
+ Ecore_Event_Mouse_Move *ev = (Ecore_Event_Mouse_Move*)event_info;
+
+ //if (!mouse_pressed) return FALSE;
+ if (ev && check_timestamp_outdated(ev->timestamp)) {
+ return TRUE;
+ }
+
+ if (controller && windows && context && cache && ev) {
+ sclbyte index = 0;
+ sclboolean processed = FALSE;
+ sclwindow window = SCLWINDOW_INVALID;
+ SclRectangle rect;
+
+ LOGD("mouse_move : %d %d, %d %d\n", ev->root.x, ev->root.y, ev->x, ev->y);
+
+ if (context->get_cur_pressed_window(ev->multi.device) != SCLWINDOW_INVALID &&
+ get_window_rect(context->get_cur_pressed_window(ev->multi.device), &rect)) {
+ sclint winwidth = rect.width;
+ sclint winheight = rect.height;
+ if (context->get_display_mode() != DISPLAYMODE_PORTRAIT) {
+ rect.height = winwidth;
+ rect.width = winheight;
+ }
+#ifdef WAYLAND
+ int root_x = 0;
+ int root_y = 0;
+
+ Ecore_Wl2_Window *wl_base_window =
+ (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_base_window()));
+ Ecore_Wl2_Window *wl_magnifier_window =
+ (Ecore_Wl2_Window*)(elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_magnifier_window())));
+ if (wl_base_window && (unsigned int)ecore_wl2_window_id_get(wl_base_window) == ev->window) {
+ SclRectangle base_rect;
+ if (get_window_rect(windows->get_base_window(), &base_rect)) {
+ root_x = ev->x + base_rect.x;
+ root_y = ev->y + base_rect.y;
+ }
+ } else if (wl_magnifier_window && (unsigned int)ecore_wl2_window_id_get(wl_magnifier_window) == ev->window) {
+ SclRectangle magnifier_rect = { 0, 0, 0, 0 };
+ if (get_window_rect(windows->get_magnifier_window(), &magnifier_rect)) {
+ root_x = ev->x + magnifier_rect.x;
+ root_y = ev->y + magnifier_rect.y;
+ }
+ } else {
+ root_x = ev->x + rect.x;
+ root_y = ev->y + rect.y;
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+
+ SclPoint coords = get_rotated_local_coords(root_x, root_y, context->get_rotation(), &rect);
+
+ controller->mouse_move(context->get_cur_pressed_window(ev->multi.device), coords.x, coords.y, ev->multi.device);
+ processed = TRUE;
+ } else {
+ do {
+ window = windows->get_nth_window_in_Z_order_list(index);
+ if (window) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ windows->get_window_rect(window, &(window_context->geometry));
+ if (get_window_rect(window, &rect)) {
+#ifdef WAYLAND
+ int root_x = ev->x + rect.x;
+ int root_y = ev->y + rect.y;
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+ int adjust_x = root_x;
+ int adjust_y = root_y;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+ if (default_configure) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+ if (adjustment && scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ adjustment->apply_touch_offset(
+ default_configure->touch_offset_level[display_mode],
+ &adjust_x, &adjust_y);
+ }
+ }
+
+ sclint win_width = rect.width;
+ sclint win_height = rect.height;
+ if (context->get_display_mode() != DISPLAYMODE_PORTRAIT) {
+ rect.height = win_width;
+ rect.width = win_height;
+ }
+
+ sclboolean process_event = FALSE;
+ if ((adjust_x >= rect.x && adjust_x <= (rect.x + win_width)) &&
+ (adjust_y >= rect.y && adjust_y <= (rect.y + win_height))) {
+ process_event = TRUE;
+ }
+ /* Process this event regardless of the coordinate if the top window has the POPUP_GRAB layout style */
+ if (index == SCL_WINDOW_Z_TOP) {
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ if (layout->style == LAYOUT_STYLE_POPUP_GRAB) {
+ process_event = TRUE;
+ }
+ }
+ }
+ if (process_event) {
+ /* Now convert the global coordinate to appropriate local coordinate */
+ SclPoint coords = get_rotated_local_coords(
+ root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_move(window, coords.x, coords.y, ev->multi.device);
+ processed = TRUE;
+ }
+ }
+ }
+ }
+ index++;
+ } while (index < MAX_ZORDER_NUM && window != SCLWINDOW_INVALID && !processed);
+ }
+
+ if (!processed) {
+ window = pressed_window;
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context && get_window_rect(window, &rect)) {
+ /* Now convert the global coordinate to appropriate local coordinate */
+#ifdef WAYLAND
+ int root_x = ev->x + rect.x;
+ int root_y = ev->y + rect.y;
+ if (window_context->is_virtual) {
+ apply_virtual_offset(rect, &root_x, &root_y);
+ }
+#else
+ int root_x = ev->root.x;
+ int root_y = ev->root.y;
+#endif
+
+ SclPoint coords = get_rotated_local_coords(root_x, root_y, context->get_rotation(), &rect);
+ controller->mouse_move(window, coords.x, coords.y, ev->multi.device);
+ processed = TRUE;
+ }
+ }
+ }
+ //CSCLController *controller = CSCLController::get_instance();
+ //CSCLWindows *windows = CSCLWindows::get_instance();
+ //controller->mouse_move((sclwindow)data, (int)ev->cur.output.x, (int)ev->cur.output.y);
+ //controller->mouse_move((sclwindow)data, (int)ev->x, (int)ev->y);
+
+ return TRUE;
+}
+
+/**
+ * Regists a event callback func to given window.
+ * In this function, it should call several event functions of CSCLController class whenever an event has occurred
+ * The below list shows what event function should be called.
+ * - mouse_press (when the user presses mouse button)
+ * - mouse_release (when the user releases mouse button)
+ * - mouse_move (when the user drags mouse button)
+ * - show_base_layout (when the expost event has occurred)
+ */
+void
+CSCLEventsImplNui::connect_window_events(const sclwindow wnd, const sclint evt)
+{
+ SCL_DEBUG();
+
+ //evas_object_event_callback_add((Evas_Object*)wnd, EVAS_CALLBACK_MOUSE_DOWN, mouse_press, NULL);
+ /*evas_object_event_callback_add((Evas_Object*)wnd, EVAS_CALLBACK_MOUSE_UP, mouse_release, NULL);
+ evas_object_event_callback_add((Evas_Object*)wnd, EVAS_CALLBACK_MOUSE_MOVE, mouse_move, NULL);*/
+}
+
+#ifndef WAYLAND
+static Eina_Bool
+client_message_cb(void *data, int type, void *event)
+{
+ Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *)event;
+ if (ev->message_type == ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+
+ static int last_pos_x = -10000;
+ static int last_pos_y = -10000;
+
+ if (windows && controller) {
+ Evas_Object *base_win = (Evas_Object *)windows->get_base_window();
+ if (base_win == NULL) return FALSE;
+
+ if ((unsigned int)ev->data.l[0] == elm_win_xwindow_get(base_win)) {
+ if ((unsigned int)ev->data.l[1] == ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE) {
+ // 1 finger double tap
+ controller->mouse_press(base_win, last_pos_x, last_pos_y);
+ controller->mouse_release(base_win, last_pos_x, last_pos_y);
+ } else if ((unsigned int)ev->data.l[1] == ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ) {
+ // 1 finger tap
+ // 1 finger touch & move
+ last_pos_x = ev->data.l[2];
+ last_pos_y = ev->data.l[3];
+ controller->mouse_over(base_win, last_pos_x, last_pos_y);
+ }
+ }
+ }
+ }
+ return ECORE_CALLBACK_PASS_ON;
+}
+#endif
+
+Eina_Bool timer_event(void *data)
+{
+ SCL_DEBUG();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+
+ scl32 sendData = static_cast<scl32>(reinterpret_cast<uintptr_t>(data) & 0xffffffff);
+
+ if (controller && utils) {
+ scl16 id = SCL_LOWORD(sendData); /* Timer ID */
+ Eina_Bool ret = controller->timer_event(sendData);
+ if (!ret) {
+ utils->log("Returning Timer : %d %d\n", id, ret);
+ }
+ return ret;
+ }
+ return TRUE;
+}
+
+/**
+ * Creates a timer
+ * In this function, it should call timer_event of CSCLController class
+ */
+void
+CSCLEventsImplNui::create_timer(const scl16 id, const scl32 interval, scl16 value, sclboolean addToMap)
+{
+ SCL_DEBUG();
+ sclint data = SCL_MAKELONG(id, value);
+ Ecore_Timer *pTimer = ecore_timer_add((double)interval / 1000.0, timer_event, (void*)(uintptr_t)data);
+ if (pTimer) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->log("Created Timer : %d %p\n", id, pTimer);
+ }
+ if (addToMap) {
+ idMap[id] = pTimer;
+ }
+ }
+}
+
+/**
+ * Destroys the given ID's timer
+ */
+void
+CSCLEventsImplNui::destroy_timer(const scl32 id)
+{
+ SCL_DEBUG();
+ //for ( std::map<int, Ecore_Timer*>::iterator idx = idMap.begin(); idx != idMap.end(); ++idx) {
+ std::map<int, Ecore_Timer*>::iterator idx = idMap.find(id);
+ //if ((*idx).first == id) {
+ if (idx != idMap.end()) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->log("Destroyed Timer : %d %p\n", (*idx).first, (*idx).second);
+ }
+ ecore_timer_del((*idx).second);
+ idMap.erase((*idx).first);
+ //break;
+ }
+ //}
+}
+
+/**
+ * Destroys all of created timer
+ */
+void
+CSCLEventsImplNui::destroy_all_timer()
+{
+ SCL_DEBUG();
+ for ( std::map<int, Ecore_Timer*>::iterator idx = idMap.begin(); idx != idMap.end(); ++idx ) {
+ ecore_timer_del((*idx).second);
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->log("Destroyed Timer : %d %p\n", (*idx).first, (*idx).second);
+ }
+ }
+ idMap.clear();
+}
+
+void
+CSCLEventsImplNui::generate_mouse_event(SCLMouseEvent type, scl16 x, scl16 y)
+{
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclWindowContext *window_context = NULL;
+
+ static const sclint MAX_DEVICES = 100;
+ static sclboolean pressed[MAX_DEVICES] = { FALSE };
+ if (windows) {
+ switch (type) {
+ case SCL_MOUSE_EVENT_PRESS:
+ {
+ sclboolean generated = FALSE;
+ for (sclint loop = 0; !generated && loop < MAX_DEVICES; loop++) {
+ if (pressed[loop] != TRUE) {
+ pressed[loop] = TRUE;
+ Ecore_Event_Mouse_Button evt;
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_base_window;
+ wl_base_window = (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_base_window()));
+ if (wl_base_window)
+ evt.window = (unsigned int)ecore_wl2_window_id_get(wl_base_window);
+#else
+ evt.window = elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_base_window()));
+#endif
+ //window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ evt.x = evt.root.x = x + window_context->geometry.x;
+ evt.y = evt.root.y = y + window_context->geometry.y;
+ evt.multi.device = loop;
+ mouse_press(NULL, 0, &evt);
+ }
+ generated = TRUE;
+ }
+ }
+ }
+ break;
+ case SCL_MOUSE_EVENT_RELEASE:
+ {
+ sclboolean generated = FALSE;
+ for (sclint loop = 0; !generated && loop < MAX_DEVICES; loop++) {
+ if (pressed[loop] == TRUE) {
+ pressed[loop] = FALSE;
+ Ecore_Event_Mouse_Button evt;
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_base_window;
+ wl_base_window = (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_base_window()));
+ if (wl_base_window)
+ evt.window = (unsigned int)ecore_wl2_window_id_get(wl_base_window);
+#else
+ evt.window = elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_base_window()));
+#endif
+ //window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ evt.x = evt.root.x = x + window_context->geometry.x;
+ evt.y = evt.root.y = y + window_context->geometry.y;
+ evt.multi.device = loop;
+ mouse_release(NULL, 0, &evt);
+ }
+ generated = TRUE;
+ }
+ }
+ }
+ break;
+ case SCL_MOUSE_EVENT_MOVE:
+ {
+ sclboolean generated = FALSE;
+ for (sclint loop = 0; !generated && loop < MAX_DEVICES; loop++) {
+ if (pressed[loop] == TRUE) {
+ Ecore_Event_Mouse_Move evt;
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_base_window;
+ wl_base_window = (Ecore_Wl2_Window*)elm_win_wl_window_get(static_cast<Evas_Object*>(windows->get_base_window()));
+ if (wl_base_window)
+ evt.window = (unsigned int)ecore_wl2_window_id_get(wl_base_window);
+#else
+ evt.window = elm_win_xwindow_get(static_cast<Evas_Object*>(windows->get_base_window()));
+#endif
+ //window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ evt.x = evt.root.x = x + window_context->geometry.x;
+ evt.y = evt.root.y = y + window_context->geometry.y;
+ evt.multi.device = loop;
+ mouse_move(NULL, 0, &evt);
+ }
+ generated = TRUE;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclevents.h"
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+#include <map>
+
+
+#ifndef __SCL_EVENTS_NUI_H__
+#define __SCL_EVENTS_NUI_H__
+
+namespace scl
+{
+class CSCLEventsImplNui : public CSCLEventsImpl
+{
+public :
+ CSCLEventsImplNui();
+ ~CSCLEventsImplNui();
+
+ void init();
+ void fini();
+
+ /* Implementation about interface functions */
+ void connect_window_events(const sclwindow wnd, const sclint evt);
+ void create_timer(const scl16 id, const scl32 interval, scl16 value, sclboolean addToMap);
+ void destroy_timer(const scl32 id);
+ void destroy_all_timer();
+
+ void generate_mouse_event(SCLMouseEvent type, scl16 x, scl16 y);
+
+private:
+ std::map<int, Ecore_Timer*> idMap;
+
+ Ecore_Event_Handler *m_mouse_down_handler;
+ Ecore_Event_Handler *m_mouse_move_handler;
+ Ecore_Event_Handler *m_mouse_up_handler;
+ Ecore_Event_Handler *m_key_pressed_handler;
+};
+} /* End of scl namespace */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclevents.h"
+#ifdef __WIN32__
+#include "sclevents-win32.h"
+#elif defined(__EFL__)
+#include "sclevents-efl.h"
+#elif defined(__NUI__)
+#include "sclevents-nui.h"
+#else
+#include "sclevents-gtk.h"
+#endif
+#include "scldebug.h"
+#include "sclwindows.h"
+
+#include "sclcontroller.h"
+#include "sclresourcecache.h"
+#include "sclkeyfocushandler.h"
+#include <dlog.h>
+
+using namespace scl;
+
+CSCLEvents::CSCLEvents()
+{
+ SCL_DEBUG();
+ m_impl = 0;
+ m_touch_event_offset.x = m_touch_event_offset.y = 0;
+}
+
+CSCLEvents::~CSCLEvents()
+{
+ SCL_DEBUG();
+
+ if (m_impl) {
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+void CSCLEvents::init()
+{
+ CSCLEventsImpl *impl = get_scl_events_impl();
+ if (impl) {
+ impl->init();
+ }
+}
+
+void CSCLEvents::fini()
+{
+ CSCLEventsImpl *impl = get_scl_events_impl();
+ if (impl) {
+ impl->fini();
+ }
+}
+
+CSCLEventsImpl* CSCLEvents::get_scl_events_impl()
+{
+ SCL_DEBUG();
+ if (m_impl == 0) {
+#ifdef __WIN32__
+ m_impl = new CSCLEventsImplWin32;
+#elif defined(__EFL__)
+ m_impl = new CSCLEventsImplEfl;
+#elif defined(__NUI__)
+ m_impl = new CSCLEventsImplNui;
+#else
+ m_impl = new CSCLEventsImplGtk;
+#endif
+ }
+ return m_impl;
+}
+
+CSCLEvents* CSCLEvents::get_instance()
+{
+ static CSCLEvents instance;
+ return &instance;
+}
+
+void
+CSCLEvents::connect_window_events(sclwindow wnd, const sclint evt )
+{
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return;
+
+ //SclWindowContext *window_context = windows->get_window_context(wnd, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(wnd);
+ if (window_context) {
+ if (!(window_context->is_virtual)) {
+ get_scl_events_impl()->connect_window_events(wnd, evt);
+ }
+ }
+}
+
+void
+CSCLEvents::set_touch_event_offset(const SclPoint pos)
+{
+ m_touch_event_offset = pos;
+}
+
+SclPoint*
+CSCLEvents::get_touch_event_offset()
+{
+ return &m_touch_event_offset;
+}
+
+sclboolean
+CSCLEvents::process_key_event(const char *key)
+{
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context && !(context->get_highlight_ui_enabled()))
+ return FALSE;
+
+ const char *keyname = key;
+ LOGD("=-=-=-=- key_pressed \n");
+ CSCLController *controller = CSCLController::get_instance();
+ LOGD("=-=-=-=- keyname(char) = %s \n", keyname);
+
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ const SclLayoutKeyCoordinate *prevcoordinate = NULL;
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ if (!windows || !focus_handler || !cache || !controller) return FALSE;
+
+ sclwindow current_focus_window = focus_handler->get_current_focus_window();
+ scl8 current_key_index = focus_handler->get_current_focus_key();
+ sclwindow focus_window = current_focus_window;
+ scl8 key_index = current_key_index;
+
+ if (strcmp(keyname, "Right") == 0) {
+ focus_handler->process_navigation(HIGHLIGHT_NAVIGATE_RIGHT);
+ focus_window = focus_handler->get_current_focus_window();
+ key_index = focus_handler->get_current_focus_key();
+ } else if (strcmp(keyname, "Left") == 0) {
+ focus_handler->process_navigation(HIGHLIGHT_NAVIGATE_LEFT);
+ focus_window = focus_handler->get_current_focus_window();
+ key_index = focus_handler->get_current_focus_key();
+ } else if (strcmp(keyname, "Up") == 0) {
+ focus_handler->process_navigation(HIGHLIGHT_NAVIGATE_UP);
+ focus_window = focus_handler->get_current_focus_window();
+ key_index = focus_handler->get_current_focus_key();
+ if ((current_key_index == key_index) && (current_focus_window == focus_window))
+ {
+ return false;
+ }
+ } else if (strcmp(keyname, "Down") == 0) {
+ focus_handler->process_navigation(HIGHLIGHT_NAVIGATE_DOWN);
+ focus_window = focus_handler->get_current_focus_window();
+ key_index = focus_handler->get_current_focus_key();
+ } else if ((strcmp(keyname, "Return") == 0) || (strcmp(keyname, "Enter") == 0)) {
+ if (cache)
+ coordinate = cache->get_cur_layout_key_coordinate(current_focus_window, current_key_index);
+ //button_context->state = BUTTON_STATE_NORMAL;
+ if (coordinate && controller) {
+ controller->mouse_press(current_focus_window, coordinate->x, coordinate->y, TRUE);
+ controller->mouse_release(current_focus_window, coordinate->x, coordinate->y, TRUE);
+ if (KEY_TYPE_MODECHANGE != coordinate->key_type) {
+ //button_context->state = BUTTON_STATE_PRESSED;
+ //windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ } else {
+ focus_handler->init_key_index();
+ }
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ return FALSE;
+ }
+
+ sclboolean ret = FALSE;
+ if (current_key_index != key_index || current_focus_window != focus_window) {
+ if (cache) {
+ prevcoordinate = cache->get_cur_layout_key_coordinate(current_focus_window, current_key_index);
+ coordinate = cache->get_cur_layout_key_coordinate(focus_window, key_index);
+ }
+ //prev_button_context->state = BUTTON_STATE_NORMAL;
+ //button_context->state = BUTTON_STATE_PRESSED;
+ if (coordinate && prevcoordinate) {
+ if (current_focus_window == focus_window) {
+ sclshort x, y, width, height;
+ if (prevcoordinate->x < coordinate->x) {
+ x = prevcoordinate->x;
+ } else {
+ x = coordinate->x;
+ }
+
+ if (prevcoordinate->y < coordinate->y) {
+ y = prevcoordinate->y;
+ } else {
+ y = coordinate->y;
+ }
+
+ if (prevcoordinate->x + prevcoordinate->width > coordinate->x + coordinate->width) {
+ width = prevcoordinate->x + prevcoordinate->width - x;
+ } else {
+ width = coordinate->x + coordinate->width - x;
+ }
+
+ if (prevcoordinate->y + prevcoordinate->height > coordinate->y + coordinate->height) {
+ height = prevcoordinate->y + prevcoordinate->height - y;
+ } else {
+ height = coordinate->y + coordinate->height - y;
+ }
+ windows->update_window(focus_window, x, y, width, height);
+ } else {
+ windows->update_window(focus_window,
+ coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ windows->update_window(current_focus_window,
+ prevcoordinate->x, prevcoordinate->y, prevcoordinate->width, prevcoordinate->height);
+ }
+ }
+ ret = TRUE;
+ }
+ return ret;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+
+#ifndef __SCL_EVENTS_H__
+#define __SCL_EVENTS_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+
+/**@brief window event definition */
+typedef enum _SCLCbEvent {
+ SCL_EVENT_MOUSE = 1 << 1, /**< for mouse event */
+ SCL_EVENT_EXPOSE = 1 << 2 /**< for expose */
+}SCLCbEvent;
+
+/**@brief window event definition */
+typedef enum _SCLMouseEvent {
+ SCL_MOUSE_EVENT_PRESS,
+ SCL_MOUSE_EVENT_MOVE,
+ SCL_MOUSE_EVENT_RELEASE,
+}SCLMouseEvent;
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLEventsImpl
+{
+public :
+ CSCLEventsImpl() {}
+ virtual ~CSCLEventsImpl() {}
+
+ virtual void init() = 0;
+ virtual void fini() = 0;
+
+ virtual void connect_window_events(const sclwindow wnd, const sclint evt) = 0;
+ virtual void create_timer(const scl16 id, const scl32 interval, scl16 value, sclboolean addToMap) = 0;
+ virtual void destroy_timer(const scl32 id) = 0;
+ virtual void destroy_all_timer() = 0;
+
+ virtual void generate_mouse_event(SCLMouseEvent type, scl16 x, scl16 y) = 0;
+};
+
+class CSCLEvents
+{
+public :
+ CSCLEvents();
+ virtual ~CSCLEvents();
+
+ static CSCLEvents* get_instance();
+
+ void init();
+ void fini();
+
+ void connect_window_events(sclwindow wnd, const sclint evt);
+
+ void create_timer(const scl16 id, const scl32 interval, scl16 value, sclboolean addToMap = TRUE) {
+ get_scl_events_impl()->destroy_timer(id);
+ get_scl_events_impl()->create_timer(id, interval, value, addToMap);
+ }
+
+ void destroy_timer(const scl32 id) {
+ get_scl_events_impl()->destroy_timer(id);
+ }
+
+ void destroy_all_timer() {
+ get_scl_events_impl()->destroy_all_timer();
+ }
+
+ void set_touch_event_offset(const SclPoint pos);
+ SclPoint* get_touch_event_offset();
+
+ virtual void generate_mouse_event(SCLMouseEvent type, scl16 x, scl16 y) {
+ get_scl_events_impl()->generate_mouse_event(type, x, y);
+ }
+
+ sclboolean process_key_event(const char *key);
+
+protected :
+ CSCLEventsImpl* get_scl_events_impl();
+
+private :
+ CSCLEventsImpl* m_impl;
+ SclPoint m_touch_event_offset;
+};
+
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_EVENTS_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "sclfeedback.h"
+#include "scldebug.h"
+#include "sclresourcecache.h"
+#include "sclutils.h"
+#include "sclcontext.h"
+
+using namespace scl;
+
+CSCLFeedback* CSCLFeedback::get_instance()
+{
+ static CSCLFeedback instance;
+ return &instance;
+}
+
+CSCLFeedback::CSCLFeedback()
+{
+ SCL_DEBUG();
+}
+
+CSCLFeedback::~CSCLFeedback()
+{
+ SCL_DEBUG();
+}
+
+sclboolean
+CSCLFeedback::show_feedback(SCLFeedbackStyle style)
+{
+ SCL_DEBUG();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ if (utils && context) {
+ switch (style) {
+ case FEEDBACK_STYLE_SOUND:
+ if (context->get_sound_enabled()) {
+ utils->play_sound(DEFAULT_SOUND_STYLE);
+ }
+ break;
+ case FEEDBACK_STYLE_VIBRATION:
+ if (context->get_vibration_enabled()) {
+ utils->play_vibration(DEFAULT_VIBRATION_STYLE, DEFAULT_VIBRATION_DURATION);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return TRUE;
+}
+
+sclboolean
+CSCLFeedback::button_pressed(sclwindow window, sclbyte key_index)
+{
+ SCL_DEBUG();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ if (utils && context && coordinate) {
+ if (coordinate->sound_style) {
+ if (context->get_sound_enabled()) {
+ utils->play_sound(coordinate->sound_style);
+ }
+ }
+ if (coordinate->vibe_style) {
+ if (context->get_vibration_enabled()) {
+ utils->play_vibration(coordinate->vibe_style, DEFAULT_VIBRATION_DURATION);
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+sclboolean
+CSCLFeedback::button_moved(sclwindow window, sclbyte key_index)
+{
+ SCL_DEBUG();
+ return TRUE;
+}
+
+sclboolean
+CSCLFeedback::button_released(sclwindow window, sclbyte key_index)
+{
+ SCL_DEBUG();
+ return TRUE;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "scltypes.h"
+#include "sclstructs.h"
+
+#ifndef __SCL_FEEDBACK_H__
+#define __SCL_FEEDBACK_H__
+
+//SCL_BEGIN_DECLS
+
+#define DEFAULT_VIBRATION_DURATION 100
+#define DEFAULT_VIBRATION_STYLE "DEFAULT_VIBRATION"
+#define DEFAULT_SOUND_STYLE "DEFAULT_SOUND"
+
+namespace scl
+{
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLFeedback
+{
+public:
+ CSCLFeedback();
+ CSCLFeedback(sclwindow parent);
+
+ virtual ~CSCLFeedback();
+ static CSCLFeedback* get_instance();
+
+private:
+ sclboolean show_feedback(SCLFeedbackStyle style);
+
+public:
+ sclboolean button_pressed(sclwindow window, sclbyte key_index);
+ sclboolean button_moved(sclwindow window, sclbyte key_index);
+ sclboolean button_released(sclwindow window, sclbyte key_index);
+protected:
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_FEEDBACK_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgraphics.h"
+#include "sclfontproxy.h"
+#include "scldebug.h"
+
+using namespace scl;
+
+/**
+* Constructor
+*/
+CSCLFontProxy::CSCLFontProxy()
+{
+ SCL_DEBUG();
+
+ for (int loop = 0;loop < FONT_PROXY_SIZE;loop++) {
+ m_font_cache_items[loop].font = NULL;
+ memset(m_font_cache_items[loop].font_name, 0x00, sizeof(m_font_cache_items[loop].font_name));
+ m_font_cache_items[loop].font_size = 0;
+ m_font_cache_items[loop].is_italic = FALSE;
+ m_font_cache_items[loop].is_bold = FALSE;
+ }
+}
+
+/**
+* De-constructor
+*/
+CSCLFontProxy::~CSCLFontProxy()
+{
+ SCL_DEBUG();
+ free_fonts();
+}
+
+CSCLFontProxy* CSCLFontProxy::get_instance()
+{
+ static CSCLFontProxy instance;
+ return &instance;
+}
+
+sclfont
+CSCLFontProxy::get_font(const SclFontInfo& info)
+{
+ SCL_DEBUG();
+
+ sclfont ret = NULL;
+
+ for (int loop = 0;loop < FONT_PROXY_SIZE && ret == NULL;loop++) {
+ if (
+ strcmp(info.font_name, m_font_cache_items[loop].font_name) == 0 &&
+ info.font_size == m_font_cache_items[loop].font_size &&
+ info.is_italic == m_font_cache_items[loop].is_italic &&
+ info.is_bold == m_font_cache_items[loop].is_bold
+ ) {
+ ret = m_font_cache_items[loop].font;
+ break;
+ }
+ }
+
+ if (ret == NULL) {
+ sclboolean isEmpty = FALSE;
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ ret = graphics->create_font(info);
+
+ if (ret) {
+ for (int loop = 0;loop < FONT_PROXY_SIZE && !isEmpty;loop++) {
+ if (m_font_cache_items[loop].font == NULL) {
+ isEmpty = TRUE;
+ strncpy(m_font_cache_items[loop].font_name, info.font_name, MAX_FONT_NAME_LEN);
+ m_font_cache_items[loop].font_name[MAX_FONT_NAME_LEN] = '\0';
+ m_font_cache_items[loop].font_size = info.font_size;
+ m_font_cache_items[loop].is_italic = info.is_italic;
+ m_font_cache_items[loop].is_bold = info.is_bold;
+ m_font_cache_items[loop].font = ret;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+void
+CSCLFontProxy::free_fonts()
+{
+ SCL_DEBUG();
+
+ for (int loop = 0;loop < FONT_PROXY_SIZE;loop++) {
+ if (m_font_cache_items[loop].font) {
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ graphics->destroy_font(m_font_cache_items[loop].font);
+ m_font_cache_items[loop].font = NULL;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_FONT_PROXY_H__
+#define __SCL_FONT_PROXY_H__
+
+#include "sclgraphics.h"
+
+namespace scl
+{
+class CSCLFontProxy
+{
+private:
+ CSCLFontProxy();
+public :
+ virtual ~CSCLFontProxy();
+
+ static CSCLFontProxy* get_instance();
+
+ sclfont get_font(const SclFontInfo& info);
+ void free_fonts();
+
+private:
+ typedef struct _SclFontCacheItem {
+ sclchar font_name[MAX_FONT_NAME_LEN + 1];
+ sclshort font_size;
+ sclboolean is_italic;
+ sclboolean is_bold;
+ sclfont font;
+ } SclFontCacheItem;
+
+ static const sclint FONT_PROXY_SIZE = 128;
+ SclFontCacheItem m_font_cache_items[FONT_PROXY_SIZE];
+};
+} /* End of scl namespace */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgraphics-nui.h"
+#include "sclimageproxy.h"
+#include "sclfontproxy.h"
+#include "scldebug.h"
+#include "sclwindows.h"
+#include "sclresourcecache.h"
+#include "sclwindows-nui.h"
+#include "sclutils.h"
+
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+#include <Elementary.h>
+//#include <list>
+#include <vector>
+#include <dlog.h>
+
+//#define EXTRACT_PARTIMAGE
+
+#ifdef TEST_NEWBACKEND
+std::vector<ImageCache> g_ImageCache;
+std::vector<TextCache> g_TextCache;
+sclint hash_string(const sclchar* str) {
+ sclint ret = 0;
+ sclint len = strlen(str);
+ for (sclint loop = 0;loop < len && str[loop];loop++) {
+ ret = ((loop + 1) * str[loop]);
+ }
+
+ return ret;
+}
+#else
+#endif
+using namespace scl;
+
+extern void mouse_press(void *data, Evas *e, Evas_Object *object, void *event_info);
+extern void mouse_release(void *data, Evas *e, Evas_Object *object, void *event_info);
+extern void mouse_move(void *data, Evas *e, Evas_Object *object, void *event_info);
+
+static std::map<std::string, SclNinePatchInfo> _nine_patch_map;
+
+/**
+ * Constructor
+ */
+CSCLGraphicsImplNui::CSCLGraphicsImplNui()
+{
+ SCL_DEBUG();
+ /* Initializes all window resources */
+ m_highlight_ui_object = NULL;
+ m_backend_callback = NULL;
+ m_backend_callback_data = NULL;
+}
+
+/**
+ * De-constructor
+ */
+CSCLGraphicsImplNui::~CSCLGraphicsImplNui()
+{
+ SCL_DEBUG();
+
+ fini();
+}
+
+void CSCLGraphicsImplNui::init()
+{
+ m_highlight_ui_object = NULL;
+ m_backend_callback = NULL;
+ m_backend_callback_data = NULL;
+}
+
+void CSCLGraphicsImplNui::fini()
+{
+ if (m_highlight_ui_object) {
+ evas_object_del(m_highlight_ui_object);
+ m_highlight_ui_object = NULL;
+ }
+
+ m_backend_callback = NULL;
+ m_backend_callback_data = NULL;
+}
+
+Evas_Object* extract_partimage_from_fullimage(
+ Evas_Object* fullimage,
+ int img_x, int img_y,
+ int cell_x, int cell_y,
+ int cell_cx, int cell_cy)
+{
+ unsigned int *data;
+ unsigned int *t_data;
+ int i, j;
+ int w, h;
+ Evas_Object *image_ob;
+
+ if (fullimage == NULL) {
+ return NULL;
+ }
+ evas_object_image_size_get(fullimage, &w, &h);
+
+ data = (unsigned int*)evas_object_image_data_get(fullimage, 0);
+ if (data == NULL) {
+ return NULL;
+ }
+
+ t_data = (unsigned int*)malloc(sizeof(unsigned int)*cell_cx*cell_cy);
+ if (t_data == NULL) {
+ return NULL;
+ }
+
+ for (i=img_y; i < img_y+cell_cy; i++) {
+ for (j=img_x; j < img_x+cell_cx; j++) {
+ t_data[(i-img_y)*cell_cx+(j-img_x)] = data[i*w+j];
+ }
+ }
+
+ image_ob = evas_object_image_add(evas_object_evas_get(fullimage));
+ if (image_ob == NULL) {
+ free(t_data);
+ return NULL;
+ }
+ evas_object_image_size_set(image_ob, cell_cx, cell_cy);
+ evas_object_image_data_set(image_ob, t_data);
+ evas_object_image_fill_set(image_ob, 0, 0, cell_cx, cell_cy);
+ evas_object_resize(image_ob, cell_cx, cell_cy);
+
+ evas_object_show(image_ob);
+
+ return image_ob;
+}
+
+static sclboolean check_nine_patch_png_file(const char *image_path)
+{
+ sclboolean found = FALSE;
+ for (sclint loop = strlen(image_path);!found && loop > 0;loop--) {
+ if (image_path[loop] == '.') {
+ found = TRUE;
+ if (loop >= 2) { // for checking prefix ".#" and ".9"
+ if (strcasecmp(image_path + loop - 2, ".#.png") == 0 ||
+ strcasecmp(image_path + loop - 2, ".9.png") == 0) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+SclNinePatchInfo get_nine_patch_info_from_png_file(Evas_Object *image_data, sclint w, sclint h)
+{
+ /* FIXME : Assuming we're dealing with 32bit image, need to check if there's any other cases */
+ SclNinePatchInfo ret = {0};
+ unsigned int *data = (unsigned int*)evas_object_image_data_get(image_data, EINA_FALSE);
+ if (data) {
+ int x, y;
+ sclboolean found;
+ found = FALSE;
+ for (x = 0;x < w && !found;x++) {
+ if (data[x] > 0) {
+ found = TRUE;
+ ret.left = x;
+ }
+ }
+ found = FALSE;
+ for (x = w - 1;x >= 0 && !found;x--) {
+ if (data[x] > 0) {
+ found = TRUE;
+ ret.right = w - (x + 1);
+ }
+ }
+ found = FALSE;
+ for (y = 0;y < h && !found;y++) {
+ if (data[y * w] > 0) {
+ found = TRUE;
+ ret.top = y;
+ }
+ }
+ found = FALSE;
+ for (y = h - 1;y >= 0 && !found;y--) {
+ if (data[y * w] > 0) {
+ found = TRUE;
+ ret.bottom = h - (y + 1);
+ }
+ }
+ }
+ return ret;
+}
+
+#if 0
+/**
+ * Returns Evas_Object representing window
+ */
+static Evas_Object *get_evas_window_object(sclwindow window)
+{
+ SclWindowContext *window_context = NULL;
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (!window || !windows)
+ return NULL;
+
+ Evas_Object *window_object = (Evas_Object*)window;
+
+ window_context = windows->get_window_context(window);
+
+ if (window_context && window_context->is_virtual) {
+ window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ }
+
+ return window_object;
+}
+
+/**
+ * Callback called on accessibility action
+ */
+static Eina_Bool access_action(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEvents* events = CSCLEvents::get_instance();
+
+ if (!windows || !events || !obj)
+ return EINA_FALSE;
+
+ Evas_Coord ex, ey, ew, eh;
+ evas_object_geometry_get(obj, &ex, &ey, &ew, &eh);
+ scl16 x = ex + ew / 2;
+ scl16 y = ey + eh / 2;
+
+ LOGD("access_action callback x: %d, y: %d", x, y);
+
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());;
+ if (window_context) {
+ x -= window_context->geometry.x;
+ y -= window_context->geometry.y;
+ }
+
+ //simulate button press
+ events->generate_mouse_event(SCL_MOUSE_EVENT_PRESS, x, y);
+ events->generate_mouse_event(SCL_MOUSE_EVENT_RELEASE, x, y);
+ return EINA_TRUE;
+}
+#endif
+
+/**
+ * Register drawing as atspi object
+ */
+void CSCLGraphicsImplNui::register_atspi_object(sclwindow window, scldrawing drawing, const sclchar* name)
+{
+ SCL_DEBUG();
+
+ // FIXME
+#if 0
+ Evas_Object *window_object = get_evas_window_object(window);
+ Evas_Object *drawing_object = static_cast<Evas_Object*>(drawing);
+
+ if (!drawing_object || !window_object || !name)
+ return;
+
+ Evas_Object * access_object = elm_access_object_register(drawing_object, window_object);
+ if (!access_object)
+ return;
+
+ elm_atspi_accessible_name_set(access_object, name);
+ elm_atspi_accessible_role_set(access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
+ elm_access_action_cb_set(access_object, ELM_ACCESS_ACTION_ACTIVATE, access_action, name);
+#endif
+}
+
+extern sclint magnifierx, magnifiery;
+scldrawing
+CSCLGraphicsImplNui::draw_image(sclwindow window, const scldrawctx draw_ctx, sclchar* image_path, SclImageCachedInfo *cachedinfo,
+ sclint dest_x, sclint dest_y, sclint dest_width, sclint dest_height,
+ sclint src_x, sclint src_y, sclint src_width, sclint src_height, sclboolean extrace_image)
+{
+ SCL_DEBUG();
+
+ scl_assert_return_null(image_path);
+
+ LOGI("image path(%s), x(%d), y(%d), w(%d), h(%d)", image_path, dest_x, dest_y, dest_width, dest_height);
+
+ if (m_backend_callback) {
+ LOGI("call draw image callback");
+ SCL_DEBUG_ELAPSED_TIME_START();
+ m_backend_callback->on_draw_image(image_path, dest_x, dest_y, dest_width, dest_height, src_x, src_y, src_width, src_height, m_backend_callback_data);
+ SCL_DEBUG_ELAPSED_TIME_END();
+ }
+ else {
+ LOGW("### No draw image callback ###");
+ }
+
+ return NULL;
+
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclWindowContext *window_context = NULL;
+ SclWindowContext *target_window_context = NULL;
+ if (windows && window) {
+ //window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ //target_window_context = windows->get_window_context(draw_ctx, FALSE);
+ target_window_context = windows->get_window_context(draw_ctx);
+ }
+
+ if (window_context && target_window_context && image_path && utils && cache && windows) {
+ sclboolean is_highlight_ui = FALSE;
+ sclchar buf[_POSIX_PATH_MAX] = {0};
+ utils->get_decomposed_path(buf, IMG_PATH_PREFIX, image_path);
+ if (strcmp(buf, SCL_HIGHLIGHT_UI_IMAGE) == 0) {
+ is_highlight_ui = TRUE;
+ }
+
+ if (strlen(image_path) > 0) {
+#ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ if (window == windows->get_magnifier_window()) {
+ dest_x += magnifierx;
+ dest_y += magnifiery;
+ }
+#endif
+#ifdef TEST_NEWBACKEND
+ sclboolean bFound = FALSE;
+ sclboolean bOrgSizeMinusOne = (src_width == -1 && src_height == -1);
+ sclint hashval = hash_string(image_path);
+ /*for(std::list<ImageCache>::iterator iter = g_ImageCache.begin();
+ bFound && iter != g_ImageCache.end();std::advance(iter, 1)) {*/
+ for (sclint loop = 0;loop < (sclint)g_ImageCache.size() && !bFound;loop++) {
+ if (
+ /* (*iter).used &&
+ window == (*iter).window &&
+ hashval == (*iter).imgPathHash &&
+ dest_x == (*iter).dest_x &&
+ dest_y == (*iter).dest_y &&
+ dest_width == (*iter).dest_width &&
+ dest_height == (*iter).dest_height &&
+ src_x == (*iter).src_x &&
+ src_y == (*iter).src_y &&
+ src_width == (*iter).src_width &&
+ src_height == (*iter).src_height &&
+ extrace_image == (*iter).extrace_image*/
+ g_ImageCache[loop].used &&
+ window == g_ImageCache[loop].window &&
+ hashval == g_ImageCache[loop].imgPathHash &&
+ dest_x == g_ImageCache[loop].dest_x &&
+ dest_y == g_ImageCache[loop].dest_y &&
+ dest_width == g_ImageCache[loop].dest_width &&
+ dest_height == g_ImageCache[loop].dest_height &&
+ src_x == g_ImageCache[loop].src_x &&
+ src_y == g_ImageCache[loop].src_y &&
+ src_width == g_ImageCache[loop].src_width &&
+ src_height == g_ImageCache[loop].src_height &&
+ extrace_image == g_ImageCache[loop].extrace_image
+ )
+ {
+ //if (strcmp(image_path, (*iter).image_path) == 0) {
+ if (strcmp(image_path, g_ImageCache[loop].image_path) == 0) {
+ bFound = TRUE;
+ //evas_object_show((*iter).image);
+ evas_object_show(g_ImageCache[loop].image);
+ evas_object_raise(g_ImageCache[loop].image);
+ if (g_ImageCache[loop].clipper) {
+ evas_object_show(g_ImageCache[loop].clipper);
+ evas_object_raise(g_ImageCache[loop].clipper);
+ }
+ }
+ }
+ }
+ if (!bFound) {
+#endif
+ EFLObject *clip_object = NULL;
+
+ Evas_Object *window_object = (Evas_Object*)window;
+ if (window_context->is_virtual) {
+ window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ }
+
+ Evas *evas = evas_object_evas_get(window_object);
+ Evas_Object *image_object = NULL;
+ if (is_highlight_ui && m_highlight_ui_object) {
+ image_object = m_highlight_ui_object;
+ const SclNinePatchInfo *nine_patch_info = utils->get_nine_patch_info(image_path);
+ if (nine_patch_info) {
+ evas_object_image_border_set(image_object,
+ nine_patch_info->left, nine_patch_info->right, nine_patch_info->top, nine_patch_info->bottom);
+ }
+ evas_object_move(image_object, dest_x, dest_y);
+ evas_object_raise(image_object);
+ evas_object_show(image_object);
+ } else {
+ EFLObject *object = new EFLObject;
+ if (object) {
+ image_object = evas_object_image_add(evas);
+ object->extracted = FALSE;
+
+ if (image_object) {
+ int image_width = 0;
+ int image_height = 0;
+ evas_object_image_file_set(image_object, image_path, NULL);
+ evas_object_image_size_get(image_object, &image_width, &image_height);
+
+ sclboolean is_nine_patch_png = check_nine_patch_png_file(image_path);
+ if (is_nine_patch_png) {
+ std::map<std::string, SclNinePatchInfo>::iterator it = _nine_patch_map.find(image_path);
+ if (it != _nine_patch_map.end()) {
+ evas_object_image_border_set(image_object,
+ (*it).second.left, (*it).second.right, (*it).second.top, (*it).second.bottom);
+ } else {
+ SclNinePatchInfo info = get_nine_patch_info_from_png_file(image_object, image_width, image_height);
+ evas_object_image_border_set(image_object, info.left, info.right, info.top, info.bottom);
+ _nine_patch_map[std::string(image_path)] = info;
+ }
+ } else if (cachedinfo) {
+ evas_object_image_border_set(image_object,
+ cachedinfo->nine_patch_left,
+ cachedinfo->nine_patch_right,
+ cachedinfo->nine_patch_top,
+ cachedinfo->nine_patch_bottom);
+ } else {
+ const SclNinePatchInfo *nine_patch_info = utils->get_nine_patch_info(image_path);
+ if (nine_patch_info) {
+ evas_object_image_border_set(image_object,
+ nine_patch_info->left, nine_patch_info->right, nine_patch_info->top, nine_patch_info->bottom);
+ }
+ }
+ const SclLayout *layout = cache->get_cur_layout(window);
+ if (layout) {
+ if (layout->display_mode == DISPLAYMODE_PORTRAIT) {
+ image_width = utils->get_scaled_x(image_width);
+ image_height = utils->get_scaled_y(image_height);
+ } else {
+ image_width = utils->get_scaled_y(image_width);
+ image_height = utils->get_scaled_x(image_height);
+ }
+ }
+ if (src_width == -1 && src_height == -1) {
+ src_width = image_width;
+ src_height = image_height;
+ }
+ if ((src_width > 0 && src_height > 0) &&
+ (image_width != dest_width || image_height != dest_height) && extrace_image) {
+ #ifdef EXTRACT_PARTIMAGE
+ Evas_Object *newobj = extract_partimage_from_fullimage(image_object, src_x, src_y, 0, 0, src_width, src_height);
+ object->extracted = TRUE;
+ evas_object_del(image_object);
+ image_object = newobj;
+ evas_object_move(image_object, dest_x, dest_y);
+ if (dest_width > 0 && dest_height > 0) {
+ evas_object_image_fill_set(image_object, 0, 0, dest_width, dest_height);
+ evas_object_resize(image_object, dest_width, dest_height);
+ }
+ #else
+ //evas_object_move(image_object, src_x - dest_x, src_y - dest_y);
+ evas_object_move(image_object, dest_x - src_x, dest_y - src_y);
+ evas_object_image_fill_set(image_object, 0, 0, image_width, image_height);
+ evas_object_resize(image_object, image_width, image_height);
+
+ Evas_Object *clipper = evas_object_rectangle_add(evas);
+ evas_object_color_set(clipper, 255, 255, 255, 255);
+ //evas_object_color_set(clipper, 0, 0, 0, 0);
+ evas_object_move(clipper, dest_x, dest_y);
+ evas_object_resize(clipper, dest_width, dest_height);
+ evas_object_clip_set(image_object, clipper);
+ evas_object_show(clipper);
+
+ clip_object = new EFLObject;
+ if (clip_object) {
+ clip_object->object = clipper;
+ clip_object->type = EFLOBJECT_CLIPOBJECT;
+ clip_object->position.x = dest_x;
+ clip_object->position.y = dest_y;
+ clip_object->position.width = dest_width;
+ clip_object->position.height = dest_height;
+ clip_object->etc_info = image_path;
+ clip_object->extracted = FALSE;
+ clip_object->data = NULL;
+ }
+ #endif
+ } else {
+ evas_object_move(image_object, dest_x, dest_y);
+ if (dest_width > 0 && dest_height > 0) {
+ if (is_nine_patch_png) {
+ evas_object_image_fill_set(image_object, -1, -1, dest_width + 2, dest_height + 2);
+ } else {
+ evas_object_image_fill_set(image_object, 0, 0, dest_width, dest_height);
+ }
+ evas_object_resize(image_object, dest_width, dest_height);
+ }
+ }
+ evas_object_raise(image_object);
+ evas_object_show(image_object);
+
+ //evas_object_event_callback_add((Evas_Object*)image_object, EVAS_CALLBACK_MOUSE_DOWN, mouse_press, window);
+ /*evas_object_event_callback_add((Evas_Object*)image_object, EVAS_CALLBACK_MOUSE_UP, mouse_release, window);
+ evas_object_event_callback_add((Evas_Object*)image_object, EVAS_CALLBACK_MOUSE_MOVE, mouse_move, window);*/
+
+ object->object = image_object;
+ object->type = EFLOBJECT_IMAGE;
+ object->position.x = dest_x;
+ object->position.y = dest_y;
+ object->position.width = dest_width;
+ object->position.height = dest_height;
+ object->etc_info = image_path;
+ object->data = clip_object;
+
+ if (is_highlight_ui) {
+ delete object;
+ } else {
+ target_window_context->etc_info =
+ eina_list_append((Eina_List*)(target_window_context->etc_info), object);
+ if (clip_object) {
+ target_window_context->etc_info =
+ eina_list_append((Eina_List*)(target_window_context->etc_info), clip_object);
+ }
+ }
+
+ /* FIXME : this is for placing the background image at the lowest depth */
+ sclint window_layer = 29000;
+ if (!windows->is_base_window(reinterpret_cast<sclwindow>(draw_ctx))) {
+ window_layer = 29010;
+ }
+ //SclRectangle rt;
+ //windows->get_window_rect(window, &rt);
+ //if (rt.width == dest_width && rt.height == dest_height) {
+ if (window_context->geometry.width == dest_width &&
+ window_context->geometry.height == dest_height) {
+ //evas_object_lower(image_object);
+ evas_object_layer_set(image_object, window_layer + 0);
+ } else {
+ evas_object_layer_set(image_object, window_layer + 1);
+ }
+ return image_object;
+ } else {
+ delete object;
+ object = NULL;
+ }
+ }
+ }
+#ifdef TEST_NEWBACKEND
+ ImageCache cache;
+ cache.used = true;
+ cache.window = window;
+ strncpy(cache.image_path, image_path, sizeof(cache.image_path));
+ cache.imgPathHash = hashval;
+ cache.dest_x = dest_x;
+ cache.dest_y = dest_y;
+ cache.dest_width = dest_width;
+ cache.dest_height = dest_height;
+ cache.src_x = src_x;
+ cache.src_y = src_y;
+ if (bOrgSizeMinusOne) {
+ cache.src_width = -1;
+ cache.src_height = -1;
+ } else {
+ cache.src_width = src_width;
+ cache.src_height = src_height;
+ }
+ cache.extrace_image = extrace_image;
+ cache.image = object->object;
+ if (clip_object) {
+ cache.clipper = clip_object->object;
+ } else {
+ cache.clipper = NULL;
+ }
+
+ //g_ImageCache.insert(g_ImageCache.end(), cache);
+ sclboolean bInserted = FALSE;
+ for (sclint loop = 0;loop < (sclint)g_ImageCache.size() && !bInserted;loop++) {
+ if (!g_ImageCache[loop].used) {
+ g_ImageCache[loop] = cache;
+ }
+ }
+ if (!bInserted) {
+ g_ImageCache.push_back(cache);
+ }
+ }
+#endif
+ }
+ }
+ return NULL;
+}
+
+sclimage
+CSCLGraphicsImplNui::load_image(const sclchar *image_path)
+{
+ SCL_DEBUG();
+ return NULL;
+}
+
+void
+CSCLGraphicsImplNui::unload_image(sclimage image_data)
+{
+ SCL_DEBUG();
+}
+
+/**
+ * Initializes the drawing context for double-buffering.
+ * This func should be called before using a drawing primitive at first.
+ */
+scldrawctx
+CSCLGraphicsImplNui::begin_paint(const sclwindow window, const sclboolean force_draw /* = FALSE */)
+{
+ SCL_DEBUG();
+
+ scldrawctx drawctx = reinterpret_cast<scldrawctx>(window);
+ LOGD("");
+
+ return drawctx;
+}
+
+/**
+ * Notices that drawing tasks have done.
+ */
+void
+CSCLGraphicsImplNui::end_paint(const sclwindow window, scldrawctx draw_ctx)
+{
+ //Evas_Object *window_object = (Evas_Object*)window;
+ //Evas *evas = evas_object_evas_get(window_object);
+ //evas_render_idle_flush(evas);
+
+ LOGD("");
+}
+
+sclfont
+CSCLGraphicsImplNui::create_font(const SclFontInfo& info)
+{
+ return NULL;
+}
+
+void
+CSCLGraphicsImplNui::destroy_font(sclfont font)
+{
+}
+
+/**
+ * Draws the given text on cairo-surface
+ */
+scldrawing
+CSCLGraphicsImplNui::draw_text(sclwindow window, const scldrawctx draw_ctx, const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y, sclint width, sclint height,
+ SCLLabelAlignment align, sclint padding_x, sclint padding_y,
+ sclint inner_width, sclint inner_height)
+{
+ SCL_DEBUG();
+ /*
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclWindowContext *window_context = NULL;
+ SclWindowContext *target_window_context = NULL;
+ */
+
+ LOGD("str(%s), x(%d), y(%d), w(%d), h(%d), pad_x(%d), pad_y(%d), fontsize(%d)", str, pos_x, pos_y, width, height, padding_x, padding_y, font_info.font_size);
+
+ if (m_backend_callback) {
+ LOGI("call draw text callback");
+ SCL_DEBUG_ELAPSED_TIME_START();
+ m_backend_callback->on_draw_text(font_info, color, str, pos_x, pos_y, width, height, align, padding_x, padding_y, inner_width, inner_height, m_backend_callback_data); //draw_text_cb_data);
+ SCL_DEBUG_ELAPSED_TIME_END();
+ }
+ else {
+ LOGW("### No draw text callback ###");
+ }
+
+ /*
+ if (draw_text_cb) {
+ LOGI("call draw text callback");
+ draw_text_cb(str, pos_x, pos_y, width, height, font_info.font_size, draw_text_cb_data);
+ }
+ else
+ LOGW("### No draw text callback ###");
+ */
+
+#if 0
+ if (windows && window) {
+ //window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ //target_window_context = windows->get_window_context(draw_ctx, FALSE);
+ target_window_context = windows->get_window_context(draw_ctx);
+ }
+
+ if (window_context && target_window_context && str && windows) {
+ if (strlen(str) > 0) {
+#ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ if (window == windows->get_magnifier_window()) {
+ pos_x += magnifierx;
+ pos_y += magnifiery;
+ }
+#endif
+#ifdef TEST_NEWBACKEND
+ sclboolean bFound = FALSE;
+ sclint hashval = hash_string(str);
+ sclint org_posx = pos_x;
+ sclint org_posy = pos_y;
+ /*for(std::list<TextCache>::iterator iter = g_TextCache.begin();
+ bFound && iter != g_TextCache.end();std::advance(iter, 1)) {*/
+ for (sclint loop = 0;loop < (sclint)g_TextCache.size() && !bFound;loop++) {
+ if (
+ /*
+ (*iter).used &&
+ window == (*iter).window &&
+ strncmp(font_info.font_name, (*iter).font_info.font_name, MAX_FONT_NAME_LEN) == 0 &&
+ font_info.font_size == (*iter).font_info.font_size &&
+ font_info.is_bold == (*iter).font_info.is_bold &&
+ font_info.is_italic == (*iter).font_info.is_italic &&
+ memcmp(&color, &((*iter).color), sizeof(SclColor)) == 0 &&
+ hashval == (*iter).strHash &&
+ pos_x == (*iter).pos_x&&
+ pos_y == (*iter).pos_y &&
+ width == (*iter).width &&
+ height == (*iter).height &&
+ align == (*iter).align &&
+ padding_x == (*iter).padding_x &&
+ padding_y == (*iter).padding_y &&
+ inner_width == (*iter).inner_width &&
+ inner_height == (*iter).inner_height */
+
+ g_TextCache[loop].used &&
+ window == g_TextCache[loop].window &&
+ strncmp(font_info.font_name, g_TextCache[loop].font_info.font_name, MAX_FONT_NAME_LEN) == 0 &&
+ font_info.font_size == g_TextCache[loop].font_info.font_size &&
+ font_info.is_bold == g_TextCache[loop].font_info.is_bold &&
+ font_info.is_italic == g_TextCache[loop].font_info.is_italic &&
+ memcmp(&color, &(g_TextCache[loop].color), sizeof(SclColor)) == 0 &&
+ hashval == g_TextCache[loop].strHash &&
+ pos_x == g_TextCache[loop].pos_x&&
+ pos_y == g_TextCache[loop].pos_y &&
+ width == g_TextCache[loop].width &&
+ height == g_TextCache[loop].height &&
+ align == g_TextCache[loop].align &&
+ padding_x == g_TextCache[loop].padding_x &&
+ padding_y == g_TextCache[loop].padding_y &&
+ inner_width == g_TextCache[loop].inner_width &&
+ inner_height == g_TextCache[loop].inner_height
+ )
+ {
+ //if (strcmp(str, (*iter).str) == 0) {
+ if (strcmp(str, g_TextCache[loop].str) == 0) {
+ bFound = TRUE;
+ //evas_object_show((*iter).text);
+ evas_object_show(g_TextCache[loop].text);
+ evas_object_raise(g_TextCache[loop].text);
+ }
+ }
+ }
+ if (!bFound) {
+#endif
+
+ EFLObject *object = new EFLObject;
+ if (object) {
+ object->extracted = FALSE;
+ Evas_Object *window_object = (Evas_Object*)window;
+ if (window_context->is_virtual) {
+ window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ }
+ Evas *evas = evas_object_evas_get(window_object);
+ Evas_Object *text_object = evas_object_textblock_add(evas);
+
+ if (text_object) {
+ if (inner_width > 0 || inner_height > 0) {
+ SclPoint bottom_right;
+ bottom_right.x = pos_x + width;
+ bottom_right.y = pos_y + height;
+
+ /* The inner width and height value should be bigger than 0 */
+ if (inner_width <= 0) inner_width = width;
+ if (inner_height <= 0) inner_height = height;
+
+ /* The inner width and height value should not exceed the actual width and height */
+ if (inner_width > width) inner_width = width;
+ if (inner_height > height) inner_height = height;
+
+ /* We need to make a inner rectangle if inner_width and inner_height are not 0 */
+ if (align == LABEL_ALIGN_CENTER_TOP ||
+ align == LABEL_ALIGN_CENTER_MIDDLE ||
+ align == LABEL_ALIGN_CENTER_BOTTOM) {
+ pos_x = pos_x + ((width - inner_width) / 2) + padding_x;
+ } else if (align == LABEL_ALIGN_RIGHT_TOP ||
+ align == LABEL_ALIGN_RIGHT_MIDDLE ||
+ align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos_x = pos_x + (width - inner_width) - padding_x;
+ } else {
+ pos_x += padding_x;
+ }
+ if (align == LABEL_ALIGN_LEFT_MIDDLE ||
+ align == LABEL_ALIGN_CENTER_MIDDLE ||
+ align == LABEL_ALIGN_RIGHT_MIDDLE) {
+ pos_y = pos_y + ((height - inner_height) / 2) + padding_y;
+ } else if (align == LABEL_ALIGN_LEFT_BOTTOM ||
+ align == LABEL_ALIGN_CENTER_BOTTOM ||
+ align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos_y = pos_y + (height - inner_height) - padding_y;
+ } else {
+ pos_y += padding_y;
+ }
+
+ /* Make sure the inner bounding box does not exceed the original bounding box */
+ if (pos_x + inner_width > bottom_right.x) {
+ width = bottom_right.x - pos_x;
+ } else {
+ width = inner_width;
+ }
+ if (pos_y + inner_height > bottom_right.y) {
+ height = bottom_right.y - pos_y;
+ } else {
+ height = inner_height;
+ }
+
+ align = LABEL_ALIGN_CENTER_MIDDLE;
+ padding_x = 0;
+ padding_y = 0;
+ }
+
+ sclchar strStyle[256];
+ snprintf(strStyle, 256,
+ "DEFAULT='font=%s font_size=%d align=%s color=#%02X%02X%02X%02X wrap=word left_margin=%d right_margin=%d'",
+ font_info.font_name, font_info.font_size,
+ (((int)align % 3) == 1) ? "center" : ((((int)align % 3) == 2) ? "right" : "left"),
+ color.r, color.g, color.b, color.a, padding_x, padding_x);
+
+ Evas_Textblock_Style *st;
+ st = evas_textblock_style_new();
+ evas_textblock_style_set(st, strStyle);
+ evas_object_textblock_style_set(text_object, st);
+ //evas_textblock_style_free(st);
+
+ //evas_object_textblock_clear(text_object);
+ char *markup = evas_textblock_text_utf8_to_markup(text_object, str);
+ if (markup) {
+ evas_object_textblock_text_markup_set(text_object, markup);
+ free(markup);
+ }
+ evas_object_resize(text_object, width, height);
+
+ object->extracted = FALSE;
+ object->type = EFLOBJECT_TEXTBLOCK;
+ object->object = text_object;
+ object->position.x = pos_x;
+ object->position.y = pos_y;
+ object->position.width = width;
+ object->position.height = height;
+ object->etc_info = str;
+ object->data = st;
+
+ sclint calwidth, calheight;
+ if (cachedinfo) {
+ calwidth = cachedinfo->actual_size.width;
+ calheight = cachedinfo->actual_size.height;
+ } else {
+ evas_object_textblock_size_native_get(text_object, &calwidth, &calheight);
+ }
+ // FIXME: float to int may loose precision
+ if (calwidth > 0) {
+ static float _SPACE_RATE = 0.1;
+ calwidth *= 1 + _SPACE_RATE;
+ }
+ if (calheight > 0) {
+ static float _SPACE_RATE = 0.1;
+ calheight *= 1 + _SPACE_RATE;
+ }
+
+ if (calwidth > width || calheight > height) {
+ sclfloat width_rate = (sclfloat)width / (sclfloat)calwidth;
+ sclfloat height_rate = (sclfloat)height / (sclfloat)calheight;
+ sclfloat resize_rate = height_rate;
+ if (width_rate < height_rate) {
+ resize_rate = width_rate;
+ }
+
+ snprintf(strStyle, 128,
+ "DEFAULT='font=%s font_size=%d align=%s color=#%02X%02X%02X%02X wrap=word left_margin=%d right_margin=%d'",
+ font_info.font_name,
+ (int)(SCL_LABEL_OVERLENGTH_TEXT_RESIZE_RATE * font_info.font_size * resize_rate),
+ (((int)align % 3) == 1) ? "center" : ((((int)align % 3) == 2) ? "right" : "left"),
+ color.r, color.g, color.b, color.a, padding_x, padding_x);
+ evas_textblock_style_set(st, strStyle);
+ evas_object_textblock_style_set(text_object, st);
+ markup = evas_textblock_text_utf8_to_markup(text_object, str);
+ if (markup) {
+ evas_object_textblock_text_markup_set(text_object, markup);
+ free(markup);
+ }
+ evas_object_resize(text_object, width, height);
+ LOGI("[1] text object w: %d, h : %d", width, height);
+ evas_object_textblock_size_native_get(text_object, &calwidth, &calheight);
+ }
+
+ /*if (align == LABEL_ALIGN_CENTER_TOP || align == LABEL_ALIGN_CENTER_MIDDLE || align == LABEL_ALIGN_CENTER_BOTTOM) {
+ pos_x = pos_x + ((width - calwidth) / 2) + padding_x;
+ } else if (align == LABEL_ALIGN_RIGHT_TOP || align == LABEL_ALIGN_RIGHT_MIDDLE || align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos_x = pos_x + (width - calwidth) - padding_x;
+ } else {
+ pos_x += padding_x;
+ }*/
+ if (align == LABEL_ALIGN_LEFT_MIDDLE ||
+ align == LABEL_ALIGN_CENTER_MIDDLE ||
+ align == LABEL_ALIGN_RIGHT_MIDDLE) {
+ pos_y = pos_y + ((height - calheight) / 2) + padding_y;
+ } else if (align == LABEL_ALIGN_LEFT_BOTTOM ||
+ align == LABEL_ALIGN_CENTER_BOTTOM ||
+ align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos_y = pos_y + (height - calheight) - padding_y;
+ } else {
+ pos_y += padding_y;
+ }
+
+ LOGI("[2] text object x: %d, y: %d, w: %d, h: %d", pos_x, pos_y, width, height);
+
+ evas_object_move(text_object, pos_x, pos_y);
+ evas_object_raise(text_object);
+ evas_object_show(text_object);
+
+ //evas_object_event_callback_add((Evas_Object*)text_object, EVAS_CALLBACK_MOUSE_DOWN, mouse_press, window);
+ /*evas_object_event_callback_add((Evas_Object*)text_object, EVAS_CALLBACK_MOUSE_UP, mouse_release, window);
+ evas_object_event_callback_add((Evas_Object*)text_object, EVAS_CALLBACK_MOUSE_MOVE, mouse_move, window);*/
+
+ target_window_context->etc_info =
+ eina_list_append((Eina_List*)(target_window_context->etc_info), object);
+
+ sclint window_layer = 29000;
+ if (!windows->is_base_window(reinterpret_cast<sclwindow>(draw_ctx))) {
+ window_layer = 29010;
+ }
+ evas_object_layer_set(text_object, window_layer + 1);
+ return text_object;
+ } else {
+ delete object;
+ object = NULL;
+ }
+ }
+#ifdef TEST_NEWBACKEND
+ TextCache cache;
+ cache.used = true;
+ cache.window = window;
+ cache.font_info = font_info;
+ cache.color = color;
+ strncpy(cache.font_info.font_name, font_info.font_name, MAX_FONT_NAME_LEN);
+ cache.font_info.font_size = font_info.font_size;
+ cache.font_info.is_bold = font_info.is_bold;
+ cache.font_info.is_italic = font_info.is_italic;
+ memcpy(&(cache.color), &(color), sizeof(SclColor));
+ strncpy(cache.str, str, sizeof(cache.str));
+ cache.strHash = hashval;
+ cache.pos_x = org_posx;
+ cache.pos_y = org_posy;
+ cache.width = width;
+ cache.height = height;
+ cache.align = align;
+ cache.padding_x = padding_x;
+ cache.padding_y = padding_y;
+ cache.inner_width = inner_width;
+ cache.inner_height = inner_height;
+
+ cache.text = object->object;
+
+ //g_TextCache.insert(g_TextCache.end(), cache);
+ sclboolean bInserted = FALSE;
+ for (sclint loop = 0;loop < (sclint)g_TextCache.size() && !bInserted;loop++) {
+ if (!g_TextCache[loop].used) {
+ g_TextCache[loop] = cache;
+ }
+ }
+ if (!bInserted) {
+ g_TextCache.push_back(cache);
+ }
+ }
+#endif /* TEST_NEWBACKEND */
+ }
+ }
+#endif /* 0 */
+
+ return NULL;
+}
+
+/**
+ * Draws a rectangle on cairo-surface
+ */
+scldrawing
+CSCLGraphicsImplNui::draw_rectangle(sclwindow window, const scldrawctx draw_ctx, scldouble pos_x, scldouble pos_y,
+ scldouble width, scldouble height, const scldouble line_width, const SclColor& line_color, sclboolean fill, const SclColor& fill_color, scldouble radius, sclfloat alpha)
+{
+ SCL_DEBUG();
+
+ LOGI("x(%f), y(%f), w(%f), h(%f)", pos_x, pos_y, width, height);
+ LOGI("fill(%d), r(%d), g(%d), b(%d), a(%d)", fill, fill_color.r, fill_color.g, fill_color.b, fill_color.a);
+
+ if (m_backend_callback) {
+ LOGI("call draw rectangle callback");
+ SCL_DEBUG_ELAPSED_TIME_START();
+ m_backend_callback->on_draw_rectangle(pos_x, pos_y, width, height, fill, fill_color.r, fill_color.g, fill_color.b, fill_color.a, m_backend_callback_data);
+ SCL_DEBUG_ELAPSED_TIME_END();
+ }
+ else {
+ LOGW("### No draw text callback ###");
+ }
+
+ return NULL;
+
+#if 0
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclWindowContext *window_context = NULL;
+ SclWindowContext *target_window_context = NULL;
+
+ if (windows && window) {
+ //window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ //target_window_context = windows->get_window_context(draw_ctx, FALSE);
+ target_window_context = windows->get_window_context(draw_ctx);
+ }
+
+ if (window_context && utils && cache && windows && target_window_context) {
+ EFLObject *object = new EFLObject;
+ if (object) {
+ Evas_Object *window_object = (Evas_Object*)window;
+ if (window_context->is_virtual) {
+ window_object = static_cast<Evas_Object*>(windows->get_base_window());
+ }
+
+ Evas *evas = evas_object_evas_get(window_object);
+ Evas_Object *rectobj = evas_object_rectangle_add(evas);
+
+ evas_object_color_set(rectobj, fill_color.r, fill_color.g, fill_color.b, fill_color.a);
+
+ evas_object_move(rectobj, pos_x, pos_y);
+ evas_object_resize(rectobj, width, height);
+ evas_object_show(rectobj);
+
+ object->extracted = FALSE;
+ object->object = rectobj;
+ object->type = EFLOBJECT_RECTANGLE;
+ object->position.x = pos_x;
+ object->position.y = pos_y;
+ object->position.width = width;
+ object->position.height = height;
+ object->etc_info = NULL;
+ object->data = NULL;
+
+ target_window_context->etc_info =
+ eina_list_append((Eina_List*)(target_window_context->etc_info), object);
+
+ /* FIXME : this is for placing the background image at the lowest depth */
+ sclint window_layer = 29000;
+ if (!windows->is_base_window(reinterpret_cast<sclwindow>(draw_ctx))) {
+ window_layer = 29010;
+ }
+ if (window_context->geometry.width == width &&
+ window_context->geometry.height == height) {
+ evas_object_layer_set(rectobj, window_layer + 0);
+ } else {
+ evas_object_layer_set(rectobj, window_layer + 1);
+ }
+ return rectobj;
+ }
+ }
+ return NULL;
+#endif
+}
+
+SclSize
+CSCLGraphicsImplNui::get_image_size(sclchar* image_path)
+{
+ SCL_DEBUG();
+ SclSize ret = { 0, 0 };
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return ret;
+
+ Evas_Object *window_object = (Evas_Object*)(windows->get_base_window());
+ Evas_Object *image_object = NULL;
+
+ if (window_object) {
+ Evas *evas = evas_object_evas_get(window_object);
+ image_object = evas_object_image_add(evas);
+ }
+
+ if (image_object) {
+ int w, h;
+ evas_object_image_file_set(image_object, image_path, NULL);
+ evas_object_image_size_get(image_object, &w, &h);
+ evas_object_del(image_object);
+ ret.width = w;
+ ret.height = h;
+ }
+
+ return ret;
+}
+
+SclSize
+CSCLGraphicsImplNui::get_text_size(const SclFontInfo &fontinfo, const sclchar *str)
+{
+ SCL_DEBUG();
+ SclSize ret = { 0, 0 };
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ Evas_Object *winobj = NULL;
+ Evas *evas = NULL;
+
+ if (windows) {
+ winobj = (Evas_Object*)(windows->get_base_window());
+ }
+ if (winobj) {
+ evas = evas_object_evas_get(winobj);
+ }
+
+ int w, h;
+
+ Evas_Textblock_Style *st;
+ st = evas_textblock_style_new();
+
+ Evas_Object *text_object = evas_object_textblock_add(evas);
+
+ if (text_object && st) {
+ const sclint STYLE_STR_LEN = 256;
+ sclchar strStyle[STYLE_STR_LEN] = {0};
+ snprintf(strStyle, STYLE_STR_LEN - 1, "DEFAULT='font=%s font_size=%d'",
+ fontinfo.font_name, fontinfo.font_size);
+
+ evas_textblock_style_set(st, strStyle);
+ evas_object_textblock_style_set(text_object, st);
+
+ evas_object_textblock_clear(text_object);
+ char *markup = evas_textblock_text_utf8_to_markup(text_object, str);
+ if (markup) {
+ evas_object_textblock_text_markup_set(text_object, markup);
+ free(markup);
+ }
+
+ evas_object_textblock_size_native_get(text_object, &w, &h);
+
+ ret.width = w;
+ ret.height = h;
+ }
+ if (text_object) {
+ evas_object_del(text_object);
+ }
+ if (st) {
+ evas_textblock_style_free(st);
+ }
+
+ return ret;
+}
+
+void CSCLGraphicsImplNui::set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data)
+{
+ m_backend_callback = callback;
+ m_backend_callback_data = data;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgraphics.h"
+
+#ifndef __SCL_GRAPHICS_NUI_H__
+#define __SCL_GRAPHICS_NUI_H__
+
+//#define DO_NOT_MOVE_MAGNIFIER_WINDOW
+//#define FULL_SCREEN_TEST
+
+#include <Evas.h>
+
+/* Still an experimental feature.. Will be refined after being stabilized */
+//#define TEST_NEWBACKEND
+#ifdef TEST_NEWBACKEND
+using namespace scl;
+
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+
+typedef struct {
+ sclboolean used;
+
+ Evas_Object *image;
+ Evas_Object *clipper;
+
+ sclwindow window;
+ sclchar image_path[_POSIX_PATH_MAX];
+ sclint imgPathHash;
+ sclint dest_x;
+ sclint dest_y;
+ sclint dest_width;
+ sclint dest_height;
+ sclint src_x;
+ sclint src_y;
+ sclint src_width;
+ sclint src_height;
+ sclboolean extrace_image;
+} ImageCache;
+
+typedef struct {
+ sclboolean used;
+
+ Evas_Object *text;
+
+ sclwindow window;
+ scl::SclFontInfo font_info;
+ SclColor color;
+ sclchar str[_POSIX_PATH_MAX];;
+ sclint strHash;
+ sclint pos_x;
+ sclint pos_y;
+ sclint width;
+ sclint height;
+ SCLLabelAlignment align;
+ sclint padding_x;
+ sclint padding_y;
+ sclint inner_width;
+ sclint inner_height;
+} TextCache;
+#else
+#endif
+
+namespace scl
+{
+class CSCLGraphicsImplNui : public CSCLGraphicsImpl
+{
+public :
+ CSCLGraphicsImplNui();
+ ~CSCLGraphicsImplNui();
+
+ void init();
+ void fini();
+
+ scldrawing draw_image(sclwindow window, const scldrawctx draw_ctx, sclchar* image_path, SclImageCachedInfo *cachedinfo,
+ sclint dest_x, sclint dest_y, sclint dest_width, sclint dest_height,
+ sclint src_x, sclint src_y, sclint src_width, sclint src_height, sclboolean extrace_image);
+ sclimage load_image(const sclchar* image_path);
+ void unload_image(sclimage image_data);
+
+ sclfont create_font(const SclFontInfo& info);
+ void destroy_font(sclfont font);
+ scldrawing draw_text(sclwindow window, const scldrawctx draw_ctx, const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y, sclint width, sclint height,
+ SCLLabelAlignment align, sclint padding_x, sclint padding_y, sclint inner_width, sclint inner_height);
+
+ scldrawing draw_rectangle(sclwindow window, const scldrawctx draw_ctx, scldouble pos_x, scldouble pos_y,
+ scldouble width, scldouble height, const scldouble line_width, const SclColor& line_color,
+ sclboolean fill, const SclColor& fill_color, scldouble radius, sclfloat alpha);
+ scldrawctx begin_paint(const sclwindow window, const sclboolean force_draw = FALSE);
+ void end_paint(const sclwindow window, scldrawctx draw_ctx);
+ SclSize get_image_size(sclchar* image_path);
+ SclSize get_text_size(const SclFontInfo &fontinfo, const sclchar *str);
+
+ void register_atspi_object(sclwindow window, scldrawing drawing, const sclchar* name);
+ //void set_draw_text_cb(scl_ui_draw_text_cb callback, void *data);
+ void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data);
+
+private:
+ Evas_Object *m_highlight_ui_object;
+ ISCLUIGraphicsBackendCallback* m_backend_callback;
+ void* m_backend_callback_data;
+};
+} /* End of scl namespace */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#define __GTK__ 1
+
+#include "sclgraphics.h"
+#ifdef __WIN32__
+#include "sclgraphics-win32.h"
+#elif defined(__EFL__)
+#include "sclgraphics-efl.h"
+#elif defined(__NUI__)
+#include "sclgraphics-nui.h"
+#elif __GTK__
+#include "sclgraphics-gtk.h"
+#else
+#include "sclgraphics-cairo.h"
+#endif
+#include "scldebug.h"
+
+using namespace scl;
+
+CSCLGraphics::CSCLGraphics()
+{
+ SCL_DEBUG();
+ m_impl = NULL;
+}
+
+CSCLGraphics::~CSCLGraphics()
+{
+ SCL_DEBUG();
+
+ if (m_impl) {
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+void CSCLGraphics::init()
+{
+ CSCLGraphicsImpl *impl = get_scl_graphics_impl();
+ if (impl) {
+ impl->init();
+ }
+}
+
+void CSCLGraphics::fini()
+{
+ CSCLGraphicsImpl *impl = get_scl_graphics_impl();
+ if (impl) {
+ impl->fini();
+ }
+}
+
+CSCLGraphicsImpl* CSCLGraphics::get_scl_graphics_impl()
+{
+ SCL_DEBUG();
+ if (m_impl == 0) {
+#ifdef __WIN32__
+ m_impl = new CSCLGraphicsImplWin32;
+#elif defined(__EFL__)
+ m_impl = new CSCLGraphicsImplEfl;
+#elif defined(__NUI__)
+ m_impl = new CSCLGraphicsImplNui;
+#elif __GTK__
+ m_impl = new CSCLGraphicsImplGtk;
+#else
+ m_impl = new CSCLGraphicsImplCairo;
+#endif
+ }
+ return m_impl;
+}
+
+CSCLGraphics* CSCLGraphics::get_instance()
+{
+ static CSCLGraphics instance;
+ return &instance;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "sclgraphicsbackendcallback.h"
+#include "sclgraphicsinfo.h"
+
+#ifndef __SCL_GRAPHICS_H__
+#define __SCL_GRAPHICS_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+typedef struct _SclImageCachedInfo {
+ sclint nine_patch_left;
+ sclint nine_patch_right;
+ sclint nine_patch_top;
+ sclint nine_patch_bottom;
+}SclImageCachedInfo;
+
+typedef struct _SclTextCachedInfo {
+ SclSize actual_size;
+}SclTextCachedInfo;
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLGraphicsImpl
+{
+public:
+ CSCLGraphicsImpl() {}
+ virtual ~CSCLGraphicsImpl() {}
+
+ virtual void init() = 0;
+ virtual void fini() = 0;
+
+ friend class CSCLGraphics;
+private:
+ virtual scldrawing draw_image(sclwindow window, const scldrawctx draw_ctx, sclchar* image_path,
+ SclImageCachedInfo *cachedinfo,
+ sclint dest_x, sclint dest_y, sclint dest_width, sclint dest_height,
+ sclint src_x, sclint src_y, sclint src_width, sclint src_height,
+ sclboolean extrace_image) = 0;
+ virtual scldrawing draw_text(sclwindow window, const scldrawctx draw_ctx, const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y,
+ sclint width, sclint height, SCLLabelAlignment align,
+ sclint padding_x, sclint padding_y, sclint inner_width, sclint inner_height) = 0;
+ virtual scldrawctx begin_paint(const sclwindow window, const sclboolean force_draw = FALSE) = 0;
+ virtual void end_paint(const sclwindow window, scldrawctx draw_ctx) = 0;
+ virtual sclimage load_image(const sclchar *image_path) = 0;
+ virtual void unload_image(sclimage image_data) = 0;
+ virtual sclfont create_font(const SclFontInfo& info) = 0;
+ virtual void destroy_font(sclfont font) = 0;
+ virtual scldrawing draw_rectangle(sclwindow window, const scldrawctx draw_ctx, scldouble pos_x, scldouble pos_y,
+ scldouble width, scldouble height, const scldouble line_width, const SclColor& line_color,
+ sclboolean fill, const SclColor& fill_color, scldouble radius, sclfloat alpha) = 0;
+ virtual SclSize get_image_size(sclchar* image_path) = 0;
+ virtual SclSize get_text_size(const SclFontInfo &fontinfo, const sclchar *str) = 0;
+ virtual void register_atspi_object(sclwindow window, scldrawing drawing, const sclchar* name) = 0;
+ virtual void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data) = 0;
+};
+
+class CSCLGraphics
+{
+ friend class CSCLImageProxy;
+ friend class CSCLFontProxy;
+
+private:
+ CSCLGraphics();
+public :
+ virtual ~CSCLGraphics();
+
+ static CSCLGraphics* get_instance();
+
+ void init();
+ void fini();
+
+ scldrawing draw_image(sclwindow window, const scldrawctx draw_ctx, sclchar* image_path, SclImageCachedInfo *cachedinfo, sclint dest_x, sclint dest_y,
+ sclint dest_width = -1, sclint dest_height = -1, sclint src_x = 0, sclint src_y = 0, sclint src_width = -1, sclint src_height = -1, sclboolean extrace_image = FALSE) {
+ return get_scl_graphics_impl()->draw_image(window, draw_ctx, image_path, cachedinfo, dest_x, dest_y, dest_width, dest_height, src_x, src_y, src_width, src_height, extrace_image);
+ }
+
+ scldrawing draw_text(sclwindow window, const scldrawctx draw_ctx, const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y, sclint width = 0, sclint height = 0,
+ SCLLabelAlignment align = LABEL_ALIGN_LEFT_TOP,
+ sclint padding_x = 0, sclint padding_y = 0, sclint inner_width = 0, sclint inner_height = 0) {
+ return get_scl_graphics_impl()->draw_text(window, draw_ctx, font_info, color, str, cachedinfo,
+ pos_x, pos_y, width, height, align, padding_x, padding_y, inner_width, inner_height);
+ }
+
+ scldrawctx begin_paint(const sclwindow window, const sclboolean force_draw = FALSE) {
+ return get_scl_graphics_impl()->begin_paint(window, force_draw);
+ }
+
+ void end_paint(const sclwindow window, scldrawctx draw_ctx) {
+ return get_scl_graphics_impl()->end_paint(window, draw_ctx);
+ }
+
+ scldrawing draw_rectangle(sclwindow window, const scldrawctx draw_ctx, scldouble pos_x, scldouble pos_y,
+ scldouble width, scldouble height, const scldouble line_width, const SclColor& line_color,
+ sclboolean fill, const SclColor& fill_color, scldouble radius = 0, sclfloat alpha = 1.0) {
+ return get_scl_graphics_impl()->draw_rectangle(window, draw_ctx, pos_x, pos_y, width, height, line_width, line_color, fill, fill_color, radius, alpha);
+ }
+
+ SclSize get_image_size(sclchar* image_path) {
+ return get_scl_graphics_impl()->get_image_size(image_path);
+ }
+
+ SclSize get_text_size(const SclFontInfo & fontinfo, const sclchar *str) {
+ return get_scl_graphics_impl()->get_text_size(fontinfo, str);
+ }
+
+ void register_atspi_object(sclwindow window, scldrawing drawing, const sclchar* name) {
+ return get_scl_graphics_impl()->register_atspi_object(window, drawing, name);
+ }
+
+ void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data) {
+ return get_scl_graphics_impl()->set_graphics_backend_callback(callback, data);
+ }
+
+private:
+ sclimage load_image(const sclchar *image_path) {
+ return get_scl_graphics_impl()->load_image(image_path);
+ }
+
+ void unload_image(sclimage image_data) {
+ return get_scl_graphics_impl()->unload_image(image_data);
+ }
+
+ sclfont create_font(const SclFontInfo& info) {
+ return get_scl_graphics_impl()->create_font(info);
+ }
+ void destroy_font(sclfont font) {
+ get_scl_graphics_impl()->destroy_font(font);
+ }
+
+protected :
+ CSCLGraphicsImpl* get_scl_graphics_impl();
+
+private :
+ CSCLGraphicsImpl* m_impl;
+};
+
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_GRAPHICS_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_GRAPHICS_BACKENDCALLBACK_H__
+#define __SCL_GRAPHICS_BACKENDCALLBACK_H__
+
+#include "sclgraphicsinfo.h"
+
+using namespace scl;
+
+//SCL_BEGIN_DECLS
+/* FIXME : Need to check the dependency cause by the next include statement */
+
+//typedef void (*scl_ui_draw_text_cb)(const char *str, int x, int y, int w, int h, int fontsize, void* user_data);
+
+struct ISCLUIGraphicsBackendCallback {
+ //virtual void on_draw_text(const char *str, int x, int y, int w, int h, int fontsize, void* user_data) { }
+ virtual void on_draw_text(const SclFontInfo& font_info, const SclColor& color, const char *str, int pos_x, int pos_y, int w, int h,
+ SCLLabelAlignment align, int padding_x, int padding_y, int inner_width, int inner_height, void* user_data) { }
+
+ /*
+ const SclFontInfo& font_info, const SclColor& color,
+ const sclchar *str, SclTextCachedInfo *cachedinfo, sclint pos_x, sclint pos_y, sclint width, sclint height,
+ SCLLabelAlignment align, sclint padding_x, sclint padding_y,
+ sclint inner_width, sclint inner_height)
+ */
+
+ virtual void on_draw_image(const char *image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, void* user_data) { }
+
+ virtual void on_draw_rectangle(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a, void* user_data) { }
+
+ //virtual void update_window(int x, int w, int width, int height, void* user_data) { }
+
+ //virtual void on_draw_image(const char *str, int x, int y, int w, int h, int fontsize, void* user_data) { }
+};
+
+#endif //__SCL_GRAPHICS_BACKENDCALLBACK_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+
+#ifndef __SCL_GRAPHICS_INFO_H__
+#define __SCL_GRAPHICS_INFO_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+#define MAX_FONT_NAME_LEN 32
+/**@brief font information structure */
+typedef struct _SclFontInfo {
+ sclchar font_name[MAX_FONT_NAME_LEN];
+ sclshort font_size;
+ sclboolean is_italic;
+ sclboolean is_bold;
+} SclFontInfo;
+
+typedef void * scldrawing;
+const SclColor SCLCOLOR_WHITE = {255, 255, 255, 255};
+const SclColor SCLCOLOR_GREY = {128, 128, 128, 255};
+const SclColor SCLCOLOR_BLACK = {0, 0, 0, 255};
+const SclColor SCLCOLOR_RED = {255, 0, 0, 255};
+const SclColor SCLCOLOR_BLUE = {0, 0, 255, 255};
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_GRAPHICS_INFO_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgwes.h"
+#include "scldebug.h"
+
+using namespace scl;
+
+CSCLGwes::CSCLGwes()
+{
+ SCL_DEBUG();
+
+ m_windows = NULL;
+ m_graphics = NULL;
+ m_events = NULL;
+}
+
+CSCLGwes::~CSCLGwes()
+{
+ SCL_DEBUG();
+}
+
+void CSCLGwes::init(sclwindow parent, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ if (m_windows == NULL) m_windows = CSCLWindows::get_instance();
+ if (m_graphics == NULL) m_graphics = CSCLGraphics::get_instance();
+ if (m_events == NULL) m_events = CSCLEvents::get_instance();
+
+ if (m_windows) {
+ m_windows->init();
+ }
+
+ if (m_graphics) {
+ m_graphics->init();
+ }
+
+ if (m_events) {
+ m_events->init();
+ }
+
+ if (m_windows) {
+ sclwindow wnd = m_windows->create_base_window(parent, width, height);
+ if (m_events) {
+ m_events->connect_window_events(wnd, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
+ }
+ }
+}
+
+void CSCLGwes::fini()
+{
+ SCL_DEBUG();
+
+ if (m_windows) {
+ m_windows->fini();
+ m_windows = NULL;
+ }
+ if (m_graphics) {
+ m_graphics->fini();
+ m_graphics = NULL;
+ }
+ if (m_events) {
+ m_events->fini();
+ m_events = NULL;
+ }
+}
+
+CSCLGwes* CSCLGwes::get_instance()
+{
+ static CSCLGwes instance;
+ return &instance;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclwindows.h"
+#include "sclgraphics.h"
+#include "sclevents.h"
+
+#ifndef __SCL_GWES_H__
+#define __SCL_GWES_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLGwes
+{
+private:
+ CSCLGwes();
+public :
+ virtual ~CSCLGwes();
+
+ static CSCLGwes* get_instance();
+
+private:
+public:
+ void init(sclwindow parent, scl16 width, scl16 height);
+ void fini();
+
+ CSCLGraphics *m_graphics;
+ CSCLWindows *m_windows;
+ CSCLEvents *m_events;
+};
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_GWES_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCLHEADERS_H__
+#define __SCLHEADERS_H__
+
+#include "sclversion.h"
+#include "scltypes.h"
+#include "sclkeydefines.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "scldebug.h"
+#include "scleffect.h"
+#include "sclerroradjustment.h"
+#include "sclfeedback.h"
+#include "sclgraphics.h"
+#include "sclutils.h"
+#include "sclcontext.h"
+#include "sclactionstate.h"
+#include "sclcore.h"
+#include "sclresource.h"
+#include "sclresourcecache.h"
+#include "scleventcallback.h"
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgraphics.h"
+#include "sclimageproxy.h"
+#include "scldebug.h"
+
+using namespace scl;
+
+/**
+* Constructor
+*/
+CSCLImageProxy::CSCLImageProxy()
+{
+ SCL_DEBUG();
+
+ for (int loop = 0;loop < IMAGE_PROXY_SIZE;loop++) {
+ m_image_cache_items[loop].image_data = NULL;
+ memset(m_image_cache_items[loop].image_path, 0x00, sizeof(m_image_cache_items[loop].image_path));
+ }
+}
+
+/**
+* De-constructor
+*/
+CSCLImageProxy::~CSCLImageProxy()
+{
+ SCL_DEBUG();
+ free_images();
+}
+
+CSCLImageProxy* CSCLImageProxy::get_instance()
+{
+ static CSCLImageProxy instance;
+ return &instance;
+}
+
+sclimage
+CSCLImageProxy::get_image(const sclchar* image_path)
+{
+ SCL_DEBUG();
+
+ sclimage ret = NULL;
+
+ /* FIXME : Better to use std::map for searching image cache item */
+ for (int loop = 0;loop < IMAGE_PROXY_SIZE && ret == NULL;loop++) {
+ if (strcmp(image_path, m_image_cache_items[loop].image_path) == 0) {
+ ret = m_image_cache_items[loop].image_data;
+ break;
+ }
+ }
+
+ if (ret == NULL) {
+ sclboolean isEmpty = FALSE;
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ ret = graphics->load_image(image_path);
+
+ if (ret) {
+ for (int loop = 0;loop < IMAGE_PROXY_SIZE && !isEmpty;loop++) {
+ if (m_image_cache_items[loop].image_data == NULL) {
+ isEmpty = TRUE;
+ strncpy(m_image_cache_items[loop].image_path, image_path, MAX_IMAGE_PATH_LEN);
+ m_image_cache_items[loop].image_path[MAX_IMAGE_PATH_LEN] = '\0';
+ m_image_cache_items[loop].image_data = ret;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+void
+CSCLImageProxy::free_images()
+{
+ SCL_DEBUG();
+
+ for (int loop = 0;loop < IMAGE_PROXY_SIZE;loop++) {
+ if (m_image_cache_items[loop].image_data) {
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ graphics->unload_image(m_image_cache_items[loop].image_data);
+ m_image_cache_items[loop].image_data = NULL;
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_IMAGE_PROXY_H__
+#define __SCL_IMAGE_PROXY_H__
+
+namespace scl
+{
+class CSCLImageProxy
+{
+private:
+ CSCLImageProxy();
+public :
+ virtual ~CSCLImageProxy();
+ static CSCLImageProxy* get_instance();
+
+ sclimage get_image(const sclchar* image_path);
+ void free_images();
+
+private:
+ static const sclint MAX_IMAGE_PATH_LEN = 255;
+ typedef struct _SclImageCacheItem {
+ sclchar image_path[MAX_IMAGE_PATH_LEN + 1];
+ sclimage image_data;
+ } SclImageCacheItem;
+
+ static const sclint IMAGE_PROXY_SIZE = 1;
+ SclImageCacheItem m_image_cache_items[IMAGE_PROXY_SIZE];
+};
+} /* End of scl namespace */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_KEY_DEFINES_H__
+#define __SCL_KEY_DEFINES_H__
+
+/* Virtual key definitions to use in SCL */
+
+#define MVK_VoidSymbol 0xffffff
+#define MVK_BackSpace 0xff08
+#define MVK_Tab 0xff09
+#define MVK_Linefeed 0xff0a
+#define MVK_Clear 0xff0b
+#define MVK_Return 0xff0d
+#define MVK_Pause 0xff13
+#define MVK_Scroll_Lock 0xff14
+#define MVK_Sys_Req 0xff15
+#define MVK_Escape 0xff1b
+#define MVK_Delete 0xffff
+#define MVK_Multi_key 0xff20
+#define MVK_Codeinput 0xff37
+#define MVK_SingleCandidate 0xff3c
+#define MVK_MultipleCandidate 0xff3d
+#define MVK_PreviousCandidate 0xff3e
+#define MVK_Kanji 0xff21
+#define MVK_Muhenkan 0xff22
+#define MVK_Henkan_Mode 0xff23
+#define MVK_Henkan 0xff23
+#define MVK_Romaji 0xff24
+#define MVK_Hiragana 0xff25
+#define MVK_Katakana 0xff26
+#define MVK_Hiragana_Katakana 0xff27
+#define MVK_Zenkaku 0xff28
+#define MVK_Hankaku 0xff29
+#define MVK_Zenkaku_Hankaku 0xff2a
+#define MVK_Touroku 0xff2b
+#define MVK_Massyo 0xff2c
+#define MVK_Kana_Lock 0xff2d
+#define MVK_Kana_Shift 0xff2e
+#define MVK_Eisu_Shift 0xff2f
+#define MVK_Eisu_toggle 0xff30
+#define MVK_Kanji_Bangou 0xff37
+#define MVK_Zen_Koho 0xff3d
+#define MVK_Mae_Koho 0xff3e
+#define MVK_Home 0xff50
+#define MVK_Left 0xff51
+#define MVK_Up 0xff52
+#define MVK_Right 0xff53
+#define MVK_Down 0xff54
+#define MVK_Prior 0xff55
+#define MVK_Page_Up 0xff55
+#define MVK_Next 0xff56
+#define MVK_Page_Down 0xff56
+#define MVK_End 0xff57
+#define MVK_Begin 0xff58
+#define MVK_Select 0xff60
+#define MVK_Print 0xff61
+#define MVK_Execute 0xff62
+#define MVK_Insert 0xff63
+#define MVK_Undo 0xff65
+#define MVK_Redo 0xff66
+#define MVK_Menu 0xff67
+#define MVK_Find 0xff68
+#define MVK_Cancel 0xff69
+#define MVK_Help 0xff6a
+#define MVK_Break 0xff6b
+#define MVK_Mode_switch 0xff7e
+#define MVK_script_switch 0xff7e
+#define MVK_Num_Lock 0xff7f
+#define MVK_KP_Space 0xff80
+#define MVK_KP_Tab 0xff89
+#define MVK_KP_Enter 0xff8d
+#define MVK_KP_F1 0xff91
+#define MVK_KP_F2 0xff92
+#define MVK_KP_F3 0xff93
+#define MVK_KP_F4 0xff94
+#define MVK_KP_Home 0xff95
+#define MVK_KP_Left 0xff96
+#define MVK_KP_Up 0xff97
+#define MVK_KP_Right 0xff98
+#define MVK_KP_Down 0xff99
+#define MVK_KP_Prior 0xff9a
+#define MVK_KP_Page_Up 0xff9a
+#define MVK_KP_Next 0xff9b
+#define MVK_KP_Page_Down 0xff9b
+#define MVK_KP_End 0xff9c
+#define MVK_KP_Begin 0xff9d
+#define MVK_KP_Insert 0xff9e
+#define MVK_KP_Delete 0xff9f
+#define MVK_KP_Equal 0xffbd
+#define MVK_KP_Multiply 0xffaa
+#define MVK_KP_Add 0xffab
+#define MVK_KP_Separator 0xffac
+#define MVK_KP_Subtract 0xffad
+#define MVK_KP_Decimal 0xffae
+#define MVK_KP_Divide 0xffaf
+#define MVK_KP_0 0xffb0
+#define MVK_KP_1 0xffb1
+#define MVK_KP_2 0xffb2
+#define MVK_KP_3 0xffb3
+#define MVK_KP_4 0xffb4
+#define MVK_KP_5 0xffb5
+#define MVK_KP_6 0xffb6
+#define MVK_KP_7 0xffb7
+#define MVK_KP_8 0xffb8
+#define MVK_KP_9 0xffb9
+#define MVK_F1 0xffbe
+#define MVK_F2 0xffbf
+#define MVK_F3 0xffc0
+#define MVK_F4 0xffc1
+#define MVK_F5 0xffc2
+#define MVK_F6 0xffc3
+#define MVK_F7 0xffc4
+#define MVK_F8 0xffc5
+#define MVK_F9 0xffc6
+#define MVK_F10 0xffc7
+#define MVK_F11 0xffc8
+#define MVK_L1 0xffc8
+#define MVK_F12 0xffc9
+#define MVK_L2 0xffc9
+#define MVK_F13 0xffca
+#define MVK_L3 0xffca
+#define MVK_F14 0xffcb
+#define MVK_L4 0xffcb
+#define MVK_F15 0xffcc
+#define MVK_L5 0xffcc
+#define MVK_F16 0xffcd
+#define MVK_L6 0xffcd
+#define MVK_F17 0xffce
+#define MVK_L7 0xffce
+#define MVK_F18 0xffcf
+#define MVK_L8 0xffcf
+#define MVK_F19 0xffd0
+#define MVK_L9 0xffd0
+#define MVK_F20 0xffd1
+#define MVK_L10 0xffd1
+#define MVK_F21 0xffd2
+#define MVK_R1 0xffd2
+#define MVK_F22 0xffd3
+#define MVK_R2 0xffd3
+#define MVK_F23 0xffd4
+#define MVK_R3 0xffd4
+#define MVK_F24 0xffd5
+#define MVK_R4 0xffd5
+#define MVK_F25 0xffd6
+#define MVK_R5 0xffd6
+#define MVK_F26 0xffd7
+#define MVK_R6 0xffd7
+#define MVK_F27 0xffd8
+#define MVK_R7 0xffd8
+#define MVK_F28 0xffd9
+#define MVK_R8 0xffd9
+#define MVK_F29 0xffda
+#define MVK_R9 0xffda
+#define MVK_F30 0xffdb
+#define MVK_R10 0xffdb
+#define MVK_F31 0xffdc
+#define MVK_R11 0xffdc
+#define MVK_F32 0xffdd
+#define MVK_R12 0xffdd
+#define MVK_F33 0xffde
+#define MVK_R13 0xffde
+#define MVK_F34 0xffdf
+#define MVK_R14 0xffdf
+#define MVK_F35 0xffe0
+#define MVK_R15 0xffe0
+#define MVK_Shift_L 0xffe1
+#define MVK_Shift_R 0xffe2
+#define MVK_Control_L 0xffe3
+#define MVK_Control_R 0xffe4
+#define MVK_Caps_Lock 0xffe5
+#define MVK_Shift_Lock 0xffe6
+#define MVK_Meta_L 0xffe7
+#define MVK_Meta_R 0xffe8
+#define MVK_Alt_L 0xffe9
+#define MVK_Alt_R 0xffea
+#define MVK_Super_L 0xffeb
+#define MVK_Super_R 0xffec
+#define MVK_Hyper_L 0xffed
+#define MVK_Hyper_R 0xffee
+#define MVK_ISO_Lock 0xfe01
+#define MVK_ISO_Level2_Latch 0xfe02
+#define MVK_ISO_Level3_Shift 0xfe03
+#define MVK_ISO_Level3_Latch 0xfe04
+#define MVK_ISO_Level3_Lock 0xfe05
+#define MVK_ISO_Level5_Shift 0xfe11
+#define MVK_ISO_Level5_Latch 0xfe12
+#define MVK_ISO_Level5_Lock 0xfe13
+#define MVK_ISO_Group_Shift 0xff7e
+#define MVK_ISO_Group_Latch 0xfe06
+#define MVK_ISO_Group_Lock 0xfe07
+#define MVK_ISO_Next_Group 0xfe08
+#define MVK_ISO_Next_Group_Lock 0xfe09
+#define MVK_ISO_Prev_Group 0xfe0a
+#define MVK_ISO_Prev_Group_Lock 0xfe0b
+#define MVK_ISO_First_Group 0xfe0c
+#define MVK_ISO_First_Group_Lock 0xfe0d
+#define MVK_ISO_Last_Group 0xfe0e
+#define MVK_ISO_Last_Group_Lock 0xfe0f
+#define MVK_ISO_Left_Tab 0xfe20
+#define MVK_ISO_Move_Line_Up 0xfe21
+#define MVK_ISO_Move_Line_Down 0xfe22
+#define MVK_ISO_Partial_Line_Up 0xfe23
+#define MVK_ISO_Partial_Line_Down 0xfe24
+#define MVK_ISO_Partial_Space_Left 0xfe25
+#define MVK_ISO_Partial_Space_Right 0xfe26
+#define MVK_ISO_Set_Margin_Left 0xfe27
+#define MVK_ISO_Set_Margin_Right 0xfe28
+#define MVK_ISO_Release_Margin_Left 0xfe29
+#define MVK_ISO_Release_Margin_Right 0xfe2a
+#define MVK_ISO_Release_Both_Margins 0xfe2b
+#define MVK_ISO_Fast_Cursor_Left 0xfe2c
+#define MVK_ISO_Fast_Cursor_Right 0xfe2d
+#define MVK_ISO_Fast_Cursor_Up 0xfe2e
+#define MVK_ISO_Fast_Cursor_Down 0xfe2f
+#define MVK_ISO_Continuous_Underline 0xfe30
+#define MVK_ISO_Discontinuous_Underline 0xfe31
+#define MVK_ISO_Emphasize 0xfe32
+#define MVK_ISO_Center_Object 0xfe33
+#define MVK_ISO_Enter 0xfe34
+#define MVK_dead_grave 0xfe50
+#define MVK_dead_acute 0xfe51
+#define MVK_dead_circumflex 0xfe52
+#define MVK_dead_tilde 0xfe53
+#define MVK_dead_perispomeni 0xfe53
+#define MVK_dead_macron 0xfe54
+#define MVK_dead_breve 0xfe55
+#define MVK_dead_abovedot 0xfe56
+#define MVK_dead_diaeresis 0xfe57
+#define MVK_dead_abovering 0xfe58
+#define MVK_dead_doubleacute 0xfe59
+#define MVK_dead_caron 0xfe5a
+#define MVK_dead_cedilla 0xfe5b
+#define MVK_dead_ogonek 0xfe5c
+#define MVK_dead_iota 0xfe5d
+#define MVK_dead_voiced_sound 0xfe5e
+#define MVK_dead_semivoiced_sound 0xfe5f
+#define MVK_dead_belowdot 0xfe60
+#define MVK_dead_hook 0xfe61
+#define MVK_dead_horn 0xfe62
+#define MVK_dead_stroke 0xfe63
+#define MVK_dead_abovecomma 0xfe64
+#define MVK_dead_psili 0xfe64
+#define MVK_dead_abovereversedcomma 0xfe65
+#define MVK_dead_dasia 0xfe65
+#define MVK_First_Virtual_Screen 0xfed0
+#define MVK_Prev_Virtual_Screen 0xfed1
+#define MVK_Next_Virtual_Screen 0xfed2
+#define MVK_Last_Virtual_Screen 0xfed4
+#define MVK_Terminate_Server 0xfed5
+#define MVK_AccessX_Enable 0xfe70
+#define MVK_AccessX_Feedback_Enable 0xfe71
+#define MVK_RepeatKeys_Enable 0xfe72
+#define MVK_SlowKeys_Enable 0xfe73
+#define MVK_BounceKeys_Enable 0xfe74
+#define MVK_StickyKeys_Enable 0xfe75
+#define MVK_MouseKeys_Enable 0xfe76
+#define MVK_MouseKeys_Accel_Enable 0xfe77
+#define MVK_Overlay1_Enable 0xfe78
+#define MVK_Overlay2_Enable 0xfe79
+#define MVK_AudibleBell_Enable 0xfe7a
+#define MVK_Pointer_Left 0xfee0
+#define MVK_Pointer_Right 0xfee1
+#define MVK_Pointer_Up 0xfee2
+#define MVK_Pointer_Down 0xfee3
+#define MVK_Pointer_UpLeft 0xfee4
+#define MVK_Pointer_UpRight 0xfee5
+#define MVK_Pointer_DownLeft 0xfee6
+#define MVK_Pointer_DownRight 0xfee7
+#define MVK_Pointer_Button_Dflt 0xfee8
+#define MVK_Pointer_Button1 0xfee9
+#define MVK_Pointer_Button2 0xfeea
+#define MVK_Pointer_Button3 0xfeeb
+#define MVK_Pointer_Button4 0xfeec
+#define MVK_Pointer_Button5 0xfeed
+#define MVK_Pointer_DblClick_Dflt 0xfeee
+#define MVK_Pointer_DblClick1 0xfeef
+#define MVK_Pointer_DblClick2 0xfef0
+#define MVK_Pointer_DblClick3 0xfef1
+#define MVK_Pointer_DblClick4 0xfef2
+#define MVK_Pointer_DblClick5 0xfef3
+#define MVK_Pointer_Drag_Dflt 0xfef4
+#define MVK_Pointer_Drag1 0xfef5
+#define MVK_Pointer_Drag2 0xfef6
+#define MVK_Pointer_Drag3 0xfef7
+#define MVK_Pointer_Drag4 0xfef8
+#define MVK_Pointer_Drag5 0xfefd
+#define MVK_Pointer_EnableKeys 0xfef9
+#define MVK_Pointer_Accelerate 0xfefa
+#define MVK_Pointer_DfltBtnNext 0xfefb
+#define MVK_Pointer_DfltBtnPrev 0xfefc
+#define MVK_3270_Duplicate 0xfd01
+#define MVK_3270_FieldMark 0xfd02
+#define MVK_3270_Right2 0xfd03
+#define MVK_3270_Left2 0xfd04
+#define MVK_3270_BackTab 0xfd05
+#define MVK_3270_EraseEOF 0xfd06
+#define MVK_3270_EraseInput 0xfd07
+#define MVK_3270_Reset 0xfd08
+#define MVK_3270_Quit 0xfd09
+#define MVK_3270_PA1 0xfd0a
+#define MVK_3270_PA2 0xfd0b
+#define MVK_3270_PA3 0xfd0c
+#define MVK_3270_Test 0xfd0d
+#define MVK_3270_Attn 0xfd0e
+#define MVK_3270_CursorBlink 0xfd0f
+#define MVK_3270_AltCursor 0xfd10
+#define MVK_3270_KeyClick 0xfd11
+#define MVK_3270_Jump 0xfd12
+#define MVK_3270_Ident 0xfd13
+#define MVK_3270_Rule 0xfd14
+#define MVK_3270_Copy 0xfd15
+#define MVK_3270_Play 0xfd16
+#define MVK_3270_Setup 0xfd17
+#define MVK_3270_Record 0xfd18
+#define MVK_3270_ChangeScreen 0xfd19
+#define MVK_3270_DeleteWord 0xfd1a
+#define MVK_3270_ExSelect 0xfd1b
+#define MVK_3270_CursorSelect 0xfd1c
+#define MVK_3270_PrintScreen 0xfd1d
+#define MVK_3270_Enter 0xfd1e
+#define MVK_space 0x020
+#define MVK_exclam 0x021
+#define MVK_quotedbl 0x022
+#define MVK_numbersign 0x023
+#define MVK_dollar 0x024
+#define MVK_percent 0x025
+#define MVK_ampersand 0x026
+#define MVK_apostrophe 0x027
+#define MVK_quoteright 0x027
+#define MVK_parenleft 0x028
+#define MVK_parenright 0x029
+#define MVK_asterisk 0x02a
+#define MVK_plus 0x02b
+#define MVK_comma 0x02c
+#define MVK_minus 0x02d
+#define MVK_period 0x02e
+#define MVK_slash 0x02f
+#define MVK_0 0x030
+#define MVK_1 0x031
+#define MVK_2 0x032
+#define MVK_3 0x033
+#define MVK_4 0x034
+#define MVK_5 0x035
+#define MVK_6 0x036
+#define MVK_7 0x037
+#define MVK_8 0x038
+#define MVK_9 0x039
+#define MVK_colon 0x03a
+#define MVK_semicolon 0x03b
+#define MVK_less 0x03c
+#define MVK_equal 0x03d
+#define MVK_greater 0x03e
+#define MVK_question 0x03f
+#define MVK_at 0x040
+#define MVK_A 0x041
+#define MVK_B 0x042
+#define MVK_C 0x043
+#define MVK_D 0x044
+#define MVK_E 0x045
+#define MVK_F 0x046
+#define MVK_G 0x047
+#define MVK_H 0x048
+#define MVK_I 0x049
+#define MVK_J 0x04a
+#define MVK_K 0x04b
+#define MVK_L 0x04c
+#define MVK_M 0x04d
+#define MVK_N 0x04e
+#define MVK_O 0x04f
+#define MVK_P 0x050
+#define MVK_Q 0x051
+#define MVK_R 0x052
+#define MVK_S 0x053
+#define MVK_T 0x054
+#define MVK_U 0x055
+#define MVK_V 0x056
+#define MVK_W 0x057
+#define MVK_X 0x058
+#define MVK_Y 0x059
+#define MVK_Z 0x05a
+#define MVK_bracketleft 0x05b
+#define MVK_backslash 0x05c
+#define MVK_bracketright 0x05d
+#define MVK_asciicircum 0x05e
+#define MVK_underscore 0x05f
+#define MVK_grave 0x060
+#define MVK_quoteleft 0x060
+#define MVK_a 0x061
+#define MVK_b 0x062
+#define MVK_c 0x063
+#define MVK_d 0x064
+#define MVK_e 0x065
+#define MVK_f 0x066
+#define MVK_g 0x067
+#define MVK_h 0x068
+#define MVK_i 0x069
+#define MVK_j 0x06a
+#define MVK_k 0x06b
+#define MVK_l 0x06c
+#define MVK_m 0x06d
+#define MVK_n 0x06e
+#define MVK_o 0x06f
+#define MVK_p 0x070
+#define MVK_q 0x071
+#define MVK_r 0x072
+#define MVK_s 0x073
+#define MVK_t 0x074
+#define MVK_u 0x075
+#define MVK_v 0x076
+#define MVK_w 0x077
+#define MVK_x 0x078
+#define MVK_y 0x079
+#define MVK_z 0x07a
+#define MVK_braceleft 0x07b
+#define MVK_bar 0x07c
+#define MVK_braceright 0x07d
+#define MVK_asciitilde 0x07e
+#define MVK_nobreakspace 0x0a0
+#define MVK_exclamdown 0x0a1
+#define MVK_cent 0x0a2
+#define MVK_sterling 0x0a3
+#define MVK_currency 0x0a4
+#define MVK_yen 0x0a5
+#define MVK_brokenbar 0x0a6
+#define MVK_section 0x0a7
+#define MVK_diaeresis 0x0a8
+#define MVK_copyright 0x0a9
+#define MVK_ordfeminine 0x0aa
+#define MVK_guillemotleft 0x0ab
+#define MVK_notsign 0x0ac
+#define MVK_hyphen 0x0ad
+#define MVK_registered 0x0ae
+#define MVK_macron 0x0af
+#define MVK_degree 0x0b0
+#define MVK_plusminus 0x0b1
+#define MVK_twosuperior 0x0b2
+#define MVK_threesuperior 0x0b3
+#define MVK_acute 0x0b4
+#define MVK_mu 0x0b5
+#define MVK_paragraph 0x0b6
+#define MVK_periodcentered 0x0b7
+#define MVK_cedilla 0x0b8
+#define MVK_onesuperior 0x0b9
+#define MVK_masculine 0x0ba
+#define MVK_guillemotright 0x0bb
+#define MVK_onequarter 0x0bc
+#define MVK_onehalf 0x0bd
+#define MVK_threequarters 0x0be
+#define MVK_questiondown 0x0bf
+#define MVK_Agrave 0x0c0
+#define MVK_Aacute 0x0c1
+#define MVK_Acircumflex 0x0c2
+#define MVK_Atilde 0x0c3
+#define MVK_Adiaeresis 0x0c4
+#define MVK_Aring 0x0c5
+#define MVK_AE 0x0c6
+#define MVK_Ccedilla 0x0c7
+#define MVK_Egrave 0x0c8
+#define MVK_Eacute 0x0c9
+#define MVK_Ecircumflex 0x0ca
+#define MVK_Ediaeresis 0x0cb
+#define MVK_Igrave 0x0cc
+#define MVK_Iacute 0x0cd
+#define MVK_Icircumflex 0x0ce
+#define MVK_Idiaeresis 0x0cf
+#define MVK_ETH 0x0d0
+#define MVK_Eth 0x0d0
+#define MVK_Ntilde 0x0d1
+#define MVK_Ograve 0x0d2
+#define MVK_Oacute 0x0d3
+#define MVK_Ocircumflex 0x0d4
+#define MVK_Otilde 0x0d5
+#define MVK_Odiaeresis 0x0d6
+#define MVK_multiply 0x0d7
+#define MVK_Oslash 0x0d8
+#define MVK_Ooblique 0x0d8
+#define MVK_Ugrave 0x0d9
+#define MVK_Uacute 0x0da
+#define MVK_Ucircumflex 0x0db
+#define MVK_Udiaeresis 0x0dc
+#define MVK_Yacute 0x0dd
+#define MVK_THORN 0x0de
+#define MVK_Thorn 0x0de
+#define MVK_ssharp 0x0df
+#define MVK_agrave 0x0e0
+#define MVK_aacute 0x0e1
+#define MVK_acircumflex 0x0e2
+#define MVK_atilde 0x0e3
+#define MVK_adiaeresis 0x0e4
+#define MVK_aring 0x0e5
+#define MVK_ae 0x0e6
+#define MVK_ccedilla 0x0e7
+#define MVK_egrave 0x0e8
+#define MVK_eacute 0x0e9
+#define MVK_ecircumflex 0x0ea
+#define MVK_ediaeresis 0x0eb
+#define MVK_igrave 0x0ec
+#define MVK_iacute 0x0ed
+#define MVK_icircumflex 0x0ee
+#define MVK_idiaeresis 0x0ef
+#define MVK_eth 0x0f0
+#define MVK_ntilde 0x0f1
+#define MVK_ograve 0x0f2
+#define MVK_oacute 0x0f3
+#define MVK_ocircumflex 0x0f4
+#define MVK_otilde 0x0f5
+#define MVK_odiaeresis 0x0f6
+#define MVK_division 0x0f7
+#define MVK_oslash 0x0f8
+#define MVK_ooblique 0x0f8
+#define MVK_ugrave 0x0f9
+#define MVK_uacute 0x0fa
+#define MVK_ucircumflex 0x0fb
+#define MVK_udiaeresis 0x0fc
+#define MVK_yacute 0x0fd
+#define MVK_thorn 0x0fe
+#define MVK_ydiaeresis 0x0ff
+#define MVK_Aogonek 0x1a1
+#define MVK_breve 0x1a2
+#define MVK_Lstroke 0x1a3
+#define MVK_Lcaron 0x1a5
+#define MVK_Sacute 0x1a6
+#define MVK_Scaron 0x1a9
+#define MVK_Scedilla 0x1aa
+#define MVK_Tcaron 0x1ab
+#define MVK_Zacute 0x1ac
+#define MVK_Zcaron 0x1ae
+#define MVK_Zabovedot 0x1af
+#define MVK_aogonek 0x1b1
+#define MVK_ogonek 0x1b2
+#define MVK_lstroke 0x1b3
+#define MVK_lcaron 0x1b5
+#define MVK_sacute 0x1b6
+#define MVK_caron 0x1b7
+#define MVK_scaron 0x1b9
+#define MVK_scedilla 0x1ba
+#define MVK_tcaron 0x1bb
+#define MVK_zacute 0x1bc
+#define MVK_doubleacute 0x1bd
+#define MVK_zcaron 0x1be
+#define MVK_zabovedot 0x1bf
+#define MVK_Racute 0x1c0
+#define MVK_Abreve 0x1c3
+#define MVK_Lacute 0x1c5
+#define MVK_Cacute 0x1c6
+#define MVK_Ccaron 0x1c8
+#define MVK_Eogonek 0x1ca
+#define MVK_Ecaron 0x1cc
+#define MVK_Dcaron 0x1cf
+#define MVK_Dstroke 0x1d0
+#define MVK_Nacute 0x1d1
+#define MVK_Ncaron 0x1d2
+#define MVK_Odoubleacute 0x1d5
+#define MVK_Rcaron 0x1d8
+#define MVK_Uring 0x1d9
+#define MVK_Udoubleacute 0x1db
+#define MVK_Tcedilla 0x1de
+#define MVK_racute 0x1e0
+#define MVK_abreve 0x1e3
+#define MVK_lacute 0x1e5
+#define MVK_cacute 0x1e6
+#define MVK_ccaron 0x1e8
+#define MVK_eogonek 0x1ea
+#define MVK_ecaron 0x1ec
+#define MVK_dcaron 0x1ef
+#define MVK_dstroke 0x1f0
+#define MVK_nacute 0x1f1
+#define MVK_ncaron 0x1f2
+#define MVK_odoubleacute 0x1f5
+#define MVK_udoubleacute 0x1fb
+#define MVK_rcaron 0x1f8
+#define MVK_uring 0x1f9
+#define MVK_tcedilla 0x1fe
+#define MVK_abovedot 0x1ff
+#define MVK_Hstroke 0x2a1
+#define MVK_Hcircumflex 0x2a6
+#define MVK_Iabovedot 0x2a9
+#define MVK_Gbreve 0x2ab
+#define MVK_Jcircumflex 0x2ac
+#define MVK_hstroke 0x2b1
+#define MVK_hcircumflex 0x2b6
+#define MVK_idotless 0x2b9
+#define MVK_gbreve 0x2bb
+#define MVK_jcircumflex 0x2bc
+#define MVK_Cabovedot 0x2c5
+#define MVK_Ccircumflex 0x2c6
+#define MVK_Gabovedot 0x2d5
+#define MVK_Gcircumflex 0x2d8
+#define MVK_Ubreve 0x2dd
+#define MVK_Scircumflex 0x2de
+#define MVK_cabovedot 0x2e5
+#define MVK_ccircumflex 0x2e6
+#define MVK_gabovedot 0x2f5
+#define MVK_gcircumflex 0x2f8
+#define MVK_ubreve 0x2fd
+#define MVK_scircumflex 0x2fe
+#define MVK_kra 0x3a2
+#define MVK_kappa 0x3a2
+#define MVK_Rcedilla 0x3a3
+#define MVK_Itilde 0x3a5
+#define MVK_Lcedilla 0x3a6
+#define MVK_Emacron 0x3aa
+#define MVK_Gcedilla 0x3ab
+#define MVK_Tslash 0x3ac
+#define MVK_rcedilla 0x3b3
+#define MVK_itilde 0x3b5
+#define MVK_lcedilla 0x3b6
+#define MVK_emacron 0x3ba
+#define MVK_gcedilla 0x3bb
+#define MVK_tslash 0x3bc
+#define MVK_ENG 0x3bd
+#define MVK_eng 0x3bf
+#define MVK_Amacron 0x3c0
+#define MVK_Iogonek 0x3c7
+#define MVK_Eabovedot 0x3cc
+#define MVK_Imacron 0x3cf
+#define MVK_Ncedilla 0x3d1
+#define MVK_Omacron 0x3d2
+#define MVK_Kcedilla 0x3d3
+#define MVK_Uogonek 0x3d9
+#define MVK_Utilde 0x3dd
+#define MVK_Umacron 0x3de
+#define MVK_amacron 0x3e0
+#define MVK_iogonek 0x3e7
+#define MVK_eabovedot 0x3ec
+#define MVK_imacron 0x3ef
+#define MVK_ncedilla 0x3f1
+#define MVK_omacron 0x3f2
+#define MVK_kcedilla 0x3f3
+#define MVK_uogonek 0x3f9
+#define MVK_utilde 0x3fd
+#define MVK_umacron 0x3fe
+#define MVK_Babovedot 0x1e02
+#define MVK_babovedot 0x1e03
+#define MVK_Dabovedot 0x1e0a
+#define MVK_Wgrave 0x1e80
+#define MVK_Wacute 0x1e82
+#define MVK_dabovedot 0x1e0b
+#define MVK_Ygrave 0x1ef2
+#define MVK_Fabovedot 0x1e1e
+#define MVK_fabovedot 0x1e1f
+#define MVK_Mabovedot 0x1e40
+#define MVK_mabovedot 0x1e41
+#define MVK_Pabovedot 0x1e56
+#define MVK_wgrave 0x1e81
+#define MVK_pabovedot 0x1e57
+#define MVK_wacute 0x1e83
+#define MVK_Sabovedot 0x1e60
+#define MVK_ygrave 0x1ef3
+#define MVK_Wdiaeresis 0x1e84
+#define MVK_wdiaeresis 0x1e85
+#define MVK_sabovedot 0x1e61
+#define MVK_Wcircumflex 0x174
+#define MVK_Tabovedot 0x1e6a
+#define MVK_Ycircumflex 0x176
+#define MVK_wcircumflex 0x175
+#define MVK_tabovedot 0x1e6b
+#define MVK_ycircumflex 0x177
+#define MVK_OE 0x13bc
+#define MVK_oe 0x13bd
+#define MVK_Ydiaeresis 0x13be
+#define MVK_overline 0x47e
+#define MVK_kana_fullstop 0x4a1
+#define MVK_kana_openingbracket 0x4a2
+#define MVK_kana_closingbracket 0x4a3
+#define MVK_kana_comma 0x4a4
+#define MVK_kana_conjunctive 0x4a5
+#define MVK_kana_middledot 0x4a5
+#define MVK_kana_WO 0x4a6
+#define MVK_kana_a 0x4a7
+#define MVK_kana_i 0x4a8
+#define MVK_kana_u 0x4a9
+#define MVK_kana_e 0x4aa
+#define MVK_kana_o 0x4ab
+#define MVK_kana_ya 0x4ac
+#define MVK_kana_yu 0x4ad
+#define MVK_kana_yo 0x4ae
+#define MVK_kana_tsu 0x4af
+#define MVK_kana_tu 0x4af
+#define MVK_prolongedsound 0x4b0
+#define MVK_kana_A 0x4b1
+#define MVK_kana_I 0x4b2
+#define MVK_kana_U 0x4b3
+#define MVK_kana_E 0x4b4
+#define MVK_kana_O 0x4b5
+#define MVK_kana_KA 0x4b6
+#define MVK_kana_KI 0x4b7
+#define MVK_kana_KU 0x4b8
+#define MVK_kana_KE 0x4b9
+#define MVK_kana_KO 0x4ba
+#define MVK_kana_SA 0x4bb
+#define MVK_kana_SHI 0x4bc
+#define MVK_kana_SU 0x4bd
+#define MVK_kana_SE 0x4be
+#define MVK_kana_SO 0x4bf
+#define MVK_kana_TA 0x4c0
+#define MVK_kana_CHI 0x4c1
+#define MVK_kana_TI 0x4c1
+#define MVK_kana_TSU 0x4c2
+#define MVK_kana_TU 0x4c2
+#define MVK_kana_TE 0x4c3
+#define MVK_kana_TO 0x4c4
+#define MVK_kana_NA 0x4c5
+#define MVK_kana_NI 0x4c6
+#define MVK_kana_NU 0x4c7
+#define MVK_kana_NE 0x4c8
+#define MVK_kana_NO 0x4c9
+#define MVK_kana_HA 0x4ca
+#define MVK_kana_HI 0x4cb
+#define MVK_kana_FU 0x4cc
+#define MVK_kana_HU 0x4cc
+#define MVK_kana_HE 0x4cd
+#define MVK_kana_HO 0x4ce
+#define MVK_kana_MA 0x4cf
+#define MVK_kana_MI 0x4d0
+#define MVK_kana_MU 0x4d1
+#define MVK_kana_ME 0x4d2
+#define MVK_kana_MO 0x4d3
+#define MVK_kana_YA 0x4d4
+#define MVK_kana_YU 0x4d5
+#define MVK_kana_YO 0x4d6
+#define MVK_kana_RA 0x4d7
+#define MVK_kana_RI 0x4d8
+#define MVK_kana_RU 0x4d9
+#define MVK_kana_RE 0x4da
+#define MVK_kana_RO 0x4db
+#define MVK_kana_WA 0x4dc
+#define MVK_kana_N 0x4dd
+#define MVK_voicedsound 0x4de
+#define MVK_semivoicedsound 0x4df
+#define MVK_kana_switch 0xff7e
+#define MVK_Farsi_0 0x6f0
+#define MVK_Farsi_1 0x6f1
+#define MVK_Farsi_2 0x6f2
+#define MVK_Farsi_3 0x6f3
+#define MVK_Farsi_4 0x6f4
+#define MVK_Farsi_5 0x6f5
+#define MVK_Farsi_6 0x6f6
+#define MVK_Farsi_7 0x6f7
+#define MVK_Farsi_8 0x6f8
+#define MVK_Farsi_9 0x6f9
+#define MVK_Arabic_percent 0x66a
+#define MVK_Arabic_superscript_alef 0x670
+#define MVK_Arabic_tteh 0x679
+#define MVK_Arabic_peh 0x67e
+#define MVK_Arabic_tcheh 0x686
+#define MVK_Arabic_ddal 0x688
+#define MVK_Arabic_rreh 0x691
+#define MVK_Arabic_comma 0x60C
+#define MVK_Arabic_fullstop 0x6d4
+#define MVK_Arabic_0 0x660
+#define MVK_Arabic_1 0x661
+#define MVK_Arabic_2 0x662
+#define MVK_Arabic_3 0x663
+#define MVK_Arabic_4 0x664
+#define MVK_Arabic_5 0x665
+#define MVK_Arabic_6 0x666
+#define MVK_Arabic_7 0x667
+#define MVK_Arabic_8 0x668
+#define MVK_Arabic_9 0x669
+#define MVK_Arabic_semicolon 0x61B
+#define MVK_Arabic_question_mark 0x61F
+#define MVK_Arabic_hamza 0x621
+#define MVK_Arabic_maddaonalef 0x622
+#define MVK_Arabic_hamzaonalef 0x623
+#define MVK_Arabic_hamzaonwaw 0x624
+#define MVK_Arabic_hamzaunderalef 0x625
+#define MVK_Arabic_hamzaonyeh 0x626
+#define MVK_Arabic_alef 0x627
+#define MVK_Arabic_beh 0x628
+#define MVK_Arabic_tehmarbuta 0x629
+#define MVK_Arabic_teh 0x62A
+#define MVK_Arabic_theh 0x62B
+#define MVK_Arabic_jeem 0x62C
+#define MVK_Arabic_hah 0x62D
+#define MVK_Arabic_khah 0x62E
+#define MVK_Arabic_dal 0x62F
+#define MVK_Arabic_thal 0x630
+#define MVK_Arabic_reh 0x631
+#define MVK_Arabic_zain 0x632
+#define MVK_Arabic_seen 0x633
+#define MVK_Arabic_sheen 0x634
+#define MVK_Arabic_sad 0x635
+#define MVK_Arabic_dad 0x636
+#define MVK_Arabic_tah 0x637
+#define MVK_Arabic_zah 0x638
+#define MVK_Arabic_ain 0x639
+#define MVK_Arabic_ghain 0x63A
+#define MVK_Arabic_tatweel 0x640
+#define MVK_Arabic_feh 0x641
+#define MVK_Arabic_qaf 0x642
+#define MVK_Arabic_kaf 0x643
+#define MVK_Arabic_lam 0x644
+#define MVK_Arabic_meem 0x645
+#define MVK_Arabic_noon 0x646
+#define MVK_Arabic_ha 0x647
+#define MVK_Arabic_heh 0x647
+#define MVK_Arabic_waw 0x648
+#define MVK_Arabic_alefmaksura 0x649
+#define MVK_Arabic_yeh 0x64A
+#define MVK_Arabic_fathatan 0x64B
+#define MVK_Arabic_dammatan 0x64C
+#define MVK_Arabic_kasratan 0x64D
+#define MVK_Arabic_fatha 0x64E
+#define MVK_Arabic_damma 0x64F
+#define MVK_Arabic_kasra 0x650
+#define MVK_Arabic_shadda 0x651
+#define MVK_Arabic_sukun 0x652
+#define MVK_Arabic_madda_above 0x653
+#define MVK_Arabic_hamza_above 0x654
+#define MVK_Arabic_hamza_below 0x655
+#define MVK_Arabic_jeh 0x698
+#define MVK_Arabic_veh 0x6a4
+#define MVK_Arabic_keheh 0x6a9
+#define MVK_Arabic_gaf 0x6af
+#define MVK_Arabic_noon_ghunna 0x6ba
+#define MVK_Arabic_heh_doachashmee 0x6be
+#define MVK_Farsi_yeh 0x6cc
+#define MVK_Arabic_farsi_yeh 0x6cc
+#define MVK_Arabic_yeh_barree 0x6d2
+#define MVK_Arabic_ae 0x6d5
+#define MVK_Arabic_heh_goal 0x6c1
+#define MVK_Arabic_ligature_lam_with_alef_with_hamza_below_isolated_form 0Xfef9
+#define MVK_Arabic_ligature_lam_with_alef_with_hamza_above_isolated_form 0Xfef7
+#define MVK_Arabic_ligature_lam_with_alef_isolated_form 0Xfefb
+#define MVK_Arabic_ligature_lam_with_alef_with_madda_above_isolated_form 0Xfef5
+#define MVK_Arabic_switch 0xff7e
+#define MVK_Cyrillic_GHE_bar 0x492
+#define MVK_Cyrillic_ghe_bar 0x493
+#define MVK_Cyrillic_ZHE_descender 0x496
+#define MVK_Cyrillic_zhe_descender 0x497
+#define MVK_Cyrillic_KA_descender 0x49a
+#define MVK_Cyrillic_ka_descender 0x49b
+#define MVK_Cyrillic_KA_vertstroke 0x49c
+#define MVK_Cyrillic_ka_vertstroke 0x49d
+#define MVK_Cyrillic_EN_descender 0x4a2
+#define MVK_Cyrillic_en_descender 0x4a3
+#define MVK_Cyrillic_U_straight 0x4ae
+#define MVK_Cyrillic_u_straight 0x4af
+#define MVK_Cyrillic_U_straight_bar 0x4b0
+#define MVK_Cyrillic_u_straight_bar 0x4b1
+#define MVK_Cyrillic_HA_descender 0x4b2
+#define MVK_Cyrillic_ha_descender 0x4b3
+#define MVK_Cyrillic_CHE_descender 0x4b6
+#define MVK_Cyrillic_che_descender 0x4b7
+#define MVK_Cyrillic_CHE_vertstroke 0x4b8
+#define MVK_Cyrillic_che_vertstroke 0x4b9
+#define MVK_Cyrillic_SHHA 0x4ba
+#define MVK_Cyrillic_shha 0x4bb
+#define MVK_Cyrillic_SCHWA 0x4d8
+#define MVK_Cyrillic_schwa 0x4d9
+#define MVK_Cyrillic_I_macron 0x4e2
+#define MVK_Cyrillic_i_macron 0x4e3
+#define MVK_Cyrillic_O_bar 0x4e8
+#define MVK_Cyrillic_o_bar 0x4e9
+#define MVK_Cyrillic_U_macron 0x4ee
+#define MVK_Cyrillic_u_macron 0x4ef
+#define MVK_Serbian_dje 0x6a1
+#define MVK_Macedonia_gje 0x6a2
+#define MVK_Cyrillic_io 0x6a3
+#define MVK_Ukrainian_ie 0x6a4
+#define MVK_Ukranian_je 0x6a4
+#define MVK_Macedonia_dse 0x6a5
+#define MVK_Ukrainian_i 0x6a6
+#define MVK_Ukranian_i 0x6a6
+#define MVK_Ukrainian_yi 0x6a7
+#define MVK_Ukranian_yi 0x6a7
+#define MVK_Cyrillic_je 0x6a8
+#define MVK_Serbian_je 0x6a8
+#define MVK_Cyrillic_lje 0x6a9
+#define MVK_Serbian_lje 0x6a9
+#define MVK_Cyrillic_nje 0x6aa
+#define MVK_Serbian_nje 0x6aa
+#define MVK_Serbian_tshe 0x6ab
+#define MVK_Macedonia_kje 0x6ac
+#define MVK_Ukrainian_ghe_with_upturn 0x6ad
+#define MVK_Byelorussian_shortu 0x6ae
+#define MVK_Cyrillic_dzhe 0x6af
+#define MVK_Serbian_dze 0x6af
+#define MVK_numerosign 0x6b0
+#define MVK_Serbian_DJE 0x6b1
+#define MVK_Macedonia_GJE 0x6b2
+#define MVK_Cyrillic_IO 0x6b3
+#define MVK_Ukrainian_IE 0x6b4
+#define MVK_Ukranian_JE 0x6b4
+#define MVK_Macedonia_DSE 0x6b5
+#define MVK_Ukrainian_I 0x6b6
+#define MVK_Ukranian_I 0x6b6
+#define MVK_Ukrainian_YI 0x6b7
+#define MVK_Ukranian_YI 0x6b7
+#define MVK_Cyrillic_JE 0x6b8
+#define MVK_Serbian_JE 0x6b8
+#define MVK_Cyrillic_LJE 0x6b9
+#define MVK_Serbian_LJE 0x6b9
+#define MVK_Cyrillic_NJE 0x6ba
+#define MVK_Serbian_NJE 0x6ba
+#define MVK_Serbian_TSHE 0x6bb
+#define MVK_Macedonia_KJE 0x6bc
+#define MVK_Ukrainian_GHE_WITH_UPTURN 0x6bd
+#define MVK_Byelorussian_SHORTU 0x6be
+#define MVK_Cyrillic_DZHE 0x6bf
+#define MVK_Serbian_DZE 0x6bf
+#define MVK_Cyrillic_yu 0x6c0
+#define MVK_Cyrillic_a 0x6c1
+#define MVK_Cyrillic_be 0x6c2
+#define MVK_Cyrillic_tse 0x6c3
+#define MVK_Cyrillic_de 0x6c4
+#define MVK_Cyrillic_ie 0x6c5
+#define MVK_Cyrillic_ef 0x6c6
+#define MVK_Cyrillic_ghe 0x6c7
+#define MVK_Cyrillic_ha 0x6c8
+#define MVK_Cyrillic_i 0x6c9
+#define MVK_Cyrillic_shorti 0x6ca
+#define MVK_Cyrillic_ka 0x6cb
+#define MVK_Cyrillic_el 0x6cc
+#define MVK_Cyrillic_em 0x6cd
+#define MVK_Cyrillic_en 0x6ce
+#define MVK_Cyrillic_o 0x6cf
+#define MVK_Cyrillic_pe 0x6d0
+#define MVK_Cyrillic_ya 0x6d1
+#define MVK_Cyrillic_er 0x6d2
+#define MVK_Cyrillic_es 0x6d3
+#define MVK_Cyrillic_te 0x6d4
+#define MVK_Cyrillic_u 0x6d5
+#define MVK_Cyrillic_zhe 0x6d6
+#define MVK_Cyrillic_ve 0x6d7
+#define MVK_Cyrillic_softsign 0x6d8
+#define MVK_Cyrillic_yeru 0x6d9
+#define MVK_Cyrillic_ze 0x6da
+#define MVK_Cyrillic_sha 0x6db
+#define MVK_Cyrillic_e 0x6dc
+#define MVK_Cyrillic_shcha 0x6dd
+#define MVK_Cyrillic_che 0x6de
+#define MVK_Cyrillic_hardsign 0x6df
+#define MVK_Cyrillic_YU 0x6e0
+#define MVK_Cyrillic_A 0x6e1
+#define MVK_Cyrillic_BE 0x6e2
+#define MVK_Cyrillic_TSE 0x6e3
+#define MVK_Cyrillic_DE 0x6e4
+#define MVK_Cyrillic_IE 0x6e5
+#define MVK_Cyrillic_EF 0x6e6
+#define MVK_Cyrillic_GHE 0x6e7
+#define MVK_Cyrillic_HA 0x6e8
+#define MVK_Cyrillic_I 0x6e9
+#define MVK_Cyrillic_SHORTI 0x6ea
+#define MVK_Cyrillic_KA 0x6eb
+#define MVK_Cyrillic_EL 0x6ec
+#define MVK_Cyrillic_EM 0x6ed
+#define MVK_Cyrillic_EN 0x6ee
+#define MVK_Cyrillic_O 0x6ef
+#define MVK_Cyrillic_PE 0x6f0
+#define MVK_Cyrillic_YA 0x6f1
+#define MVK_Cyrillic_ER 0x6f2
+#define MVK_Cyrillic_ES 0x6f3
+#define MVK_Cyrillic_TE 0x6f4
+#define MVK_Cyrillic_U 0x6f5
+#define MVK_Cyrillic_ZHE 0x6f6
+#define MVK_Cyrillic_VE 0x6f7
+#define MVK_Cyrillic_SOFTSIGN 0x6f8
+#define MVK_Cyrillic_YERU 0x6f9
+#define MVK_Cyrillic_ZE 0x6fa
+#define MVK_Cyrillic_SHA 0x6fb
+#define MVK_Cyrillic_E 0x6fc
+#define MVK_Cyrillic_SHCHA 0x6fd
+#define MVK_Cyrillic_CHE 0x6fe
+#define MVK_Cyrillic_HARDSIGN 0x6ff
+#define MVK_Greek_ALPHAaccent 0x7a1
+#define MVK_Greek_EPSILONaccent 0x7a2
+#define MVK_Greek_ETAaccent 0x7a3
+#define MVK_Greek_IOTAaccent 0x7a4
+#define MVK_Greek_IOTAdieresis 0x7a5
+#define MVK_Greek_IOTAdiaeresis 0x7a5
+#define MVK_Greek_OMICRONaccent 0x7a7
+#define MVK_Greek_UPSILONaccent 0x7a8
+#define MVK_Greek_UPSILONdieresis 0x7a9
+#define MVK_Greek_OMEGAaccent 0x7ab
+#define MVK_Greek_accentdieresis 0x7ae
+#define MVK_Greek_horizbar 0x7af
+#define MVK_Greek_alphaaccent 0x7b1
+#define MVK_Greek_epsilonaccent 0x7b2
+#define MVK_Greek_etaaccent 0x7b3
+#define MVK_Greek_iotaaccent 0x7b4
+#define MVK_Greek_iotadieresis 0x7b5
+#define MVK_Greek_iotaaccentdieresis 0x7b6
+#define MVK_Greek_omicronaccent 0x7b7
+#define MVK_Greek_upsilonaccent 0x7b8
+#define MVK_Greek_upsilondieresis 0x7b9
+#define MVK_Greek_upsilonaccentdieresis 0x7ba
+#define MVK_Greek_omegaaccent 0x7bb
+#define MVK_Greek_ALPHA 0x7c1
+#define MVK_Greek_BETA 0x7c2
+#define MVK_Greek_GAMMA 0x7c3
+#define MVK_Greek_DELTA 0x7c4
+#define MVK_Greek_EPSILON 0x7c5
+#define MVK_Greek_ZETA 0x7c6
+#define MVK_Greek_ETA 0x7c7
+#define MVK_Greek_THETA 0x7c8
+#define MVK_Greek_IOTA 0x7c9
+#define MVK_Greek_KAPPA 0x7ca
+#define MVK_Greek_LAMDA 0x7cb
+#define MVK_Greek_LAMBDA 0x7cb
+#define MVK_Greek_MU 0x7cc
+#define MVK_Greek_NU 0x7cd
+#define MVK_Greek_XI 0x7ce
+#define MVK_Greek_OMICRON 0x7cf
+#define MVK_Greek_PI 0x7d0
+#define MVK_Greek_RHO 0x7d1
+#define MVK_Greek_SIGMA 0x7d2
+#define MVK_Greek_TAU 0x7d4
+#define MVK_Greek_UPSILON 0x7d5
+#define MVK_Greek_PHI 0x7d6
+#define MVK_Greek_CHI 0x7d7
+#define MVK_Greek_PSI 0x7d8
+#define MVK_Greek_OMEGA 0x7d9
+#define MVK_Greek_alpha 0x7e1
+#define MVK_Greek_beta 0x7e2
+#define MVK_Greek_gamma 0x7e3
+#define MVK_Greek_delta 0x7e4
+#define MVK_Greek_epsilon 0x7e5
+#define MVK_Greek_zeta 0x7e6
+#define MVK_Greek_eta 0x7e7
+#define MVK_Greek_theta 0x7e8
+#define MVK_Greek_iota 0x7e9
+#define MVK_Greek_kappa 0x7ea
+#define MVK_Greek_lamda 0x7eb
+#define MVK_Greek_lambda 0x7eb
+#define MVK_Greek_mu 0x7ec
+#define MVK_Greek_nu 0x7ed
+#define MVK_Greek_xi 0x7ee
+#define MVK_Greek_omicron 0x7ef
+#define MVK_Greek_pi 0x7f0
+#define MVK_Greek_rho 0x7f1
+#define MVK_Greek_sigma 0x7f2
+#define MVK_Greek_finalsmallsigma 0x7f3
+#define MVK_Greek_tau 0x7f4
+#define MVK_Greek_upsilon 0x7f5
+#define MVK_Greek_phi 0x7f6
+#define MVK_Greek_chi 0x7f7
+#define MVK_Greek_psi 0x7f8
+#define MVK_Greek_omega 0x7f9
+#define MVK_Greek_switch 0xff7e
+#define MVK_leftradical 0x8a1
+#define MVK_topleftradical 0x8a2
+#define MVK_horizconnector 0x8a3
+#define MVK_topintegral 0x8a4
+#define MVK_botintegral 0x8a5
+#define MVK_vertconnector 0x8a6
+#define MVK_topleftsqbracket 0x8a7
+#define MVK_botleftsqbracket 0x8a8
+#define MVK_toprightsqbracket 0x8a9
+#define MVK_botrightsqbracket 0x8aa
+#define MVK_topleftparens 0x8ab
+#define MVK_botleftparens 0x8ac
+#define MVK_toprightparens 0x8ad
+#define MVK_botrightparens 0x8ae
+#define MVK_leftmiddlecurlybrace 0x8af
+#define MVK_rightmiddlecurlybrace 0x8b0
+#define MVK_topleftsummation 0x8b1
+#define MVK_botleftsummation 0x8b2
+#define MVK_topvertsummationconnector 0x8b3
+#define MVK_botvertsummationconnector 0x8b4
+#define MVK_toprightsummation 0x8b5
+#define MVK_botrightsummation 0x8b6
+#define MVK_rightmiddlesummation 0x8b7
+#define MVK_lessthanequal 0x8bc
+#define MVK_notequal 0x8bd
+#define MVK_greaterthanequal 0x8be
+#define MVK_integral 0x8bf
+#define MVK_therefore 0x8c0
+#define MVK_variation 0x8c1
+#define MVK_infinity 0x8c2
+#define MVK_nabla 0x8c5
+#define MVK_approximate 0x8c8
+#define MVK_similarequal 0x8c9
+#define MVK_ifonlyif 0x8cd
+#define MVK_implies 0x8ce
+#define MVK_identical 0x8cf
+#define MVK_radical 0x8d6
+#define MVK_includedin 0x8da
+#define MVK_includes 0x8db
+#define MVK_intersection 0x8dc
+#define MVK_union 0x8dd
+#define MVK_logicaland 0x8de
+#define MVK_logicalor 0x8df
+#define MVK_partialderivative 0x8ef
+#define MVK_function 0x8f6
+#define MVK_leftarrow 0x8fb
+#define MVK_uparrow 0x8fc
+#define MVK_rightarrow 0x8fd
+#define MVK_downarrow 0x8fe
+#define MVK_blank 0x9df
+#define MVK_soliddiamond 0x9e0
+#define MVK_checkerboard 0x9e1
+#define MVK_ht 0x9e2
+#define MVK_ff 0x9e3
+#define MVK_cr 0x9e4
+#define MVK_lf 0x9e5
+#define MVK_nl 0x9e8
+#define MVK_vt 0x9e9
+#define MVK_lowrightcorner 0x9ea
+#define MVK_uprightcorner 0x9eb
+#define MVK_upleftcorner 0x9ec
+#define MVK_lowleftcorner 0x9ed
+#define MVK_crossinglines 0x9ee
+#define MVK_horizlinescan1 0x9ef
+#define MVK_horizlinescan3 0x9f0
+#define MVK_horizlinescan5 0x9f1
+#define MVK_horizlinescan7 0x9f2
+#define MVK_horizlinescan9 0x9f3
+#define MVK_leftt 0x9f4
+#define MVK_rightt 0x9f5
+#define MVK_bott 0x9f6
+#define MVK_topt 0x9f7
+#define MVK_vertbar 0x9f8
+#define MVK_emspace 0xaa1
+#define MVK_enspace 0xaa2
+#define MVK_em3space 0xaa3
+#define MVK_em4space 0xaa4
+#define MVK_digitspace 0xaa5
+#define MVK_punctspace 0xaa6
+#define MVK_thinspace 0xaa7
+#define MVK_hairspace 0xaa8
+#define MVK_emdash 0xaa9
+#define MVK_endash 0xaaa
+#define MVK_signifblank 0xaac
+#define MVK_ellipsis 0xaae
+#define MVK_doubbaselinedot 0xaaf
+#define MVK_onethird 0xab0
+#define MVK_twothirds 0xab1
+#define MVK_onefifth 0xab2
+#define MVK_twofifths 0xab3
+#define MVK_threefifths 0xab4
+#define MVK_fourfifths 0xab5
+#define MVK_onesixth 0xab6
+#define MVK_fivesixths 0xab7
+#define MVK_careof 0xab8
+#define MVK_figdash 0xabb
+#define MVK_leftanglebracket 0xabc
+#define MVK_decimalpoint 0xabd
+#define MVK_rightanglebracket 0xabe
+#define MVK_marker 0xabf
+#define MVK_oneeighth 0xac3
+#define MVK_threeeighths 0xac4
+#define MVK_fiveeighths 0xac5
+#define MVK_seveneighths 0xac6
+#define MVK_trademark 0xac9
+#define MVK_signaturemark 0xaca
+#define MVK_trademarkincircle 0xacb
+#define MVK_leftopentriangle 0xacc
+#define MVK_rightopentriangle 0xacd
+#define MVK_emopencircle 0xace
+#define MVK_emopenrectangle 0xacf
+#define MVK_leftsinglequotemark 0xad0
+#define MVK_rightsinglequotemark 0xad1
+#define MVK_leftdoublequotemark 0xad2
+#define MVK_rightdoublequotemark 0xad3
+#define MVK_prescription 0xad4
+#define MVK_minutes 0xad6
+#define MVK_seconds 0xad7
+#define MVK_latincross 0xad9
+#define MVK_hexagram 0xada
+#define MVK_filledrectbullet 0xadb
+#define MVK_filledlefttribullet 0xadc
+#define MVK_filledrighttribullet 0xadd
+#define MVK_emfilledcircle 0xade
+#define MVK_emfilledrect 0xadf
+#define MVK_enopencircbullet 0xae0
+#define MVK_enopensquarebullet 0xae1
+#define MVK_openrectbullet 0xae2
+#define MVK_opentribulletup 0xae3
+#define MVK_opentribulletdown 0xae4
+#define MVK_openstar 0xae5
+#define MVK_enfilledcircbullet 0xae6
+#define MVK_enfilledsqbullet 0xae7
+#define MVK_filledtribulletup 0xae8
+#define MVK_filledtribulletdown 0xae9
+#define MVK_leftpointer 0xaea
+#define MVK_rightpointer 0xaeb
+#define MVK_club 0xaec
+#define MVK_diamond 0xaed
+#define MVK_heart 0xaee
+#define MVK_maltesecross 0xaf0
+#define MVK_dagger 0xaf1
+#define MVK_doubledagger 0xaf2
+#define MVK_checkmark 0xaf3
+#define MVK_ballotcross 0xaf4
+#define MVK_musicalsharp 0xaf5
+#define MVK_musicalflat 0xaf6
+#define MVK_malesymbol 0xaf7
+#define MVK_femalesymbol 0xaf8
+#define MVK_telephone 0xaf9
+#define MVK_telephonerecorder 0xafa
+#define MVK_phonographcopyright 0xafb
+#define MVK_caret 0xafc
+#define MVK_singlelowquotemark 0xafd
+#define MVK_doublelowquotemark 0xafe
+#define MVK_cursor 0xaff
+#define MVK_leftcaret 0xba3
+#define MVK_rightcaret 0xba6
+#define MVK_downcaret 0xba8
+#define MVK_upcaret 0xba9
+#define MVK_overbar 0xbc0
+#define MVK_downtack 0xbc2
+#define MVK_upshoe 0xbc3
+#define MVK_downstile 0xbc4
+#define MVK_underbar 0xbc6
+#define MVK_jot 0xbca
+#define MVK_quad 0xbcc
+#define MVK_uptack 0xbce
+#define MVK_circle 0xbcf
+#define MVK_upstile 0xbd3
+#define MVK_downshoe 0xbd6
+#define MVK_rightshoe 0xbd8
+#define MVK_leftshoe 0xbda
+#define MVK_lefttack 0xbdc
+#define MVK_righttack 0xbfc
+#define MVK_hebrew_doublelowline 0xcdf
+#define MVK_hebrew_aleph 0x5D0
+#define MVK_hebrew_bet 0x5D1
+#define MVK_hebrew_beth 0x5D1
+#define MVK_hebrew_gimel 0x5D2
+#define MVK_hebrew_gimmel 0x5D2
+#define MVK_hebrew_dalet 0x5D3
+#define MVK_hebrew_daleth 0x5D3
+#define MVK_hebrew_he 0x5D4
+#define MVK_hebrew_waw 0x5D5
+#define MVK_hebrew_zain 0x5D6
+#define MVK_hebrew_zayin 0x5D6
+#define MVK_hebrew_chet 0x5D7
+#define MVK_hebrew_het 0x5D7
+#define MVK_hebrew_tet 0x5D8
+#define MVK_hebrew_teth 0x5D8
+#define MVK_hebrew_yod 0x5D9
+#define MVK_hebrew_finalkaph 0x5DA
+#define MVK_hebrew_kaph 0x5DB
+#define MVK_hebrew_lamed 0x5DC
+#define MVK_hebrew_finalmem 0x5DD
+#define MVK_hebrew_mem 0x5DE
+#define MVK_hebrew_finalnun 0x5DF
+#define MVK_hebrew_nun 0x5E0
+#define MVK_hebrew_samech 0x5E1
+#define MVK_hebrew_samekh 0x5E1
+#define MVK_hebrew_ayin 0x5E2
+#define MVK_hebrew_finalpe 0x5E3
+#define MVK_hebrew_pe 0x5E4
+#define MVK_hebrew_finalzade 0x5E5
+#define MVK_hebrew_finalzadi 0x5E5
+#define MVK_hebrew_zade 0x5E6
+#define MVK_hebrew_zadi 0x5E6
+#define MVK_hebrew_qoph 0x5E7
+#define MVK_hebrew_kuf 0x5E7
+#define MVK_hebrew_resh 0x5E8
+#define MVK_hebrew_shin 0x5E9
+#define MVK_hebrew_taw 0x5EA
+#define MVK_hebrew_taf 0x5EA
+#define MVK_Hebrew_switch 0xff7e
+#define MVK_Thai_kokai 0xda1
+#define MVK_Thai_khokhai 0xda2
+#define MVK_Thai_khokhuat 0xda3
+#define MVK_Thai_khokhwai 0xda4
+#define MVK_Thai_khokhon 0xda5
+#define MVK_Thai_khorakhang 0xda6
+#define MVK_Thai_ngongu 0xda7
+#define MVK_Thai_chochan 0xda8
+#define MVK_Thai_choching 0xda9
+#define MVK_Thai_chochang 0xdaa
+#define MVK_Thai_soso 0xdab
+#define MVK_Thai_chochoe 0xdac
+#define MVK_Thai_yoying 0xdad
+#define MVK_Thai_dochada 0xdae
+#define MVK_Thai_topatak 0xdaf
+#define MVK_Thai_thothan 0xdb0
+#define MVK_Thai_thonangmontho 0xdb1
+#define MVK_Thai_thophuthao 0xdb2
+#define MVK_Thai_nonen 0xdb3
+#define MVK_Thai_dodek 0xdb4
+#define MVK_Thai_totao 0xdb5
+#define MVK_Thai_thothung 0xdb6
+#define MVK_Thai_thothahan 0xdb7
+#define MVK_Thai_thothong 0xdb8
+#define MVK_Thai_nonu 0xdb9
+#define MVK_Thai_bobaimai 0xdba
+#define MVK_Thai_popla 0xdbb
+#define MVK_Thai_phophung 0xdbc
+#define MVK_Thai_fofa 0xdbd
+#define MVK_Thai_phophan 0xdbe
+#define MVK_Thai_fofan 0xdbf
+#define MVK_Thai_phosamphao 0xdc0
+#define MVK_Thai_moma 0xdc1
+#define MVK_Thai_yoyak 0xdc2
+#define MVK_Thai_rorua 0xdc3
+#define MVK_Thai_ru 0xdc4
+#define MVK_Thai_loling 0xdc5
+#define MVK_Thai_lu 0xdc6
+#define MVK_Thai_wowaen 0xdc7
+#define MVK_Thai_sosala 0xdc8
+#define MVK_Thai_sorusi 0xdc9
+#define MVK_Thai_sosua 0xdca
+#define MVK_Thai_hohip 0xdcb
+#define MVK_Thai_lochula 0xdcc
+#define MVK_Thai_oang 0xdcd
+#define MVK_Thai_honokhuk 0xdce
+#define MVK_Thai_paiyannoi 0xdcf
+#define MVK_Thai_saraa 0xdd0
+#define MVK_Thai_maihanakat 0xdd1
+#define MVK_Thai_saraaa 0xdd2
+#define MVK_Thai_saraam 0xdd3
+#define MVK_Thai_sarai 0xdd4
+#define MVK_Thai_saraii 0xdd5
+#define MVK_Thai_saraue 0xdd6
+#define MVK_Thai_sarauee 0xdd7
+#define MVK_Thai_sarau 0xdd8
+#define MVK_Thai_sarauu 0xdd9
+#define MVK_Thai_phinthu 0xdda
+#define MVK_Thai_maihanakat_maitho 0xdde
+#define MVK_Thai_baht 0xddf
+#define MVK_Thai_sarae 0xde0
+#define MVK_Thai_saraae 0xde1
+#define MVK_Thai_sarao 0xde2
+#define MVK_Thai_saraaimaimuan 0xde3
+#define MVK_Thai_saraaimaimalai 0xde4
+#define MVK_Thai_lakkhangyao 0xde5
+#define MVK_Thai_maiyamok 0xde6
+#define MVK_Thai_maitaikhu 0xde7
+#define MVK_Thai_maiek 0xde8
+#define MVK_Thai_maitho 0xde9
+#define MVK_Thai_maitri 0xdea
+#define MVK_Thai_maichattawa 0xdeb
+#define MVK_Thai_thanthakhat 0xdec
+#define MVK_Thai_nikhahit 0xded
+#define MVK_Thai_leksun 0xdf0
+#define MVK_Thai_leknung 0xdf1
+#define MVK_Thai_leksong 0xdf2
+#define MVK_Thai_leksam 0xdf3
+#define MVK_Thai_leksi 0xdf4
+#define MVK_Thai_lekha 0xdf5
+#define MVK_Thai_lekhok 0xdf6
+#define MVK_Thai_lekchet 0xdf7
+#define MVK_Thai_lekpaet 0xdf8
+#define MVK_Thai_lekkao 0xdf9
+#define MVK_Hangul 0xff31
+#define MVK_Hangul_Start 0xff32
+#define MVK_Hangul_End 0xff33
+#define MVK_Hangul_Hanja 0xff34
+#define MVK_Hangul_Jamo 0xff35
+#define MVK_Hangul_Romaja 0xff36
+#define MVK_Hangul_Codeinput 0xff37
+#define MVK_Hangul_Jeonja 0xff38
+#define MVK_Hangul_Banja 0xff39
+#define MVK_Hangul_PreHanja 0xff3a
+#define MVK_Hangul_PostHanja 0xff3b
+#define MVK_Hangul_SingleCandidate 0xff3c
+#define MVK_Hangul_MultipleCandidate 0xff3d
+#define MVK_Hangul_PreviousCandidate 0xff3e
+#define MVK_Hangul_Special 0xff3f
+#define MVK_Hangul_switch 0xff7e
+#define MVK_Hangul_Kiyeog 0xea1
+#define MVK_Hangul_SsangKiyeog 0xea2
+#define MVK_Hangul_KiyeogSios 0xea3
+#define MVK_Hangul_Nieun 0xea4
+#define MVK_Hangul_NieunJieuj 0xea5
+#define MVK_Hangul_NieunHieuh 0xea6
+#define MVK_Hangul_Dikeud 0xea7
+#define MVK_Hangul_SsangDikeud 0xea8
+#define MVK_Hangul_Rieul 0xea9
+#define MVK_Hangul_RieulKiyeog 0xeaa
+#define MVK_Hangul_RieulMieum 0xeab
+#define MVK_Hangul_RieulPieub 0xeac
+#define MVK_Hangul_RieulSios 0xead
+#define MVK_Hangul_RieulTieut 0xeae
+#define MVK_Hangul_RieulPhieuf 0xeaf
+#define MVK_Hangul_RieulHieuh 0xeb0
+#define MVK_Hangul_Mieum 0xeb1
+#define MVK_Hangul_Pieub 0xeb2
+#define MVK_Hangul_SsangPieub 0xeb3
+#define MVK_Hangul_PieubSios 0xeb4
+#define MVK_Hangul_Sios 0xeb5
+#define MVK_Hangul_SsangSios 0xeb6
+#define MVK_Hangul_Ieung 0xeb7
+#define MVK_Hangul_Jieuj 0xeb8
+#define MVK_Hangul_SsangJieuj 0xeb9
+#define MVK_Hangul_Cieuc 0xeba
+#define MVK_Hangul_Khieuq 0xebb
+#define MVK_Hangul_Tieut 0xebc
+#define MVK_Hangul_Phieuf 0xebd
+#define MVK_Hangul_Hieuh 0xebe
+#define MVK_Hangul_A 0xebf
+#define MVK_Hangul_AE 0xec0
+#define MVK_Hangul_YA 0xec1
+#define MVK_Hangul_YAE 0xec2
+#define MVK_Hangul_EO 0xec3
+#define MVK_Hangul_E 0xec4
+#define MVK_Hangul_YEO 0xec5
+#define MVK_Hangul_YE 0xec6
+#define MVK_Hangul_O 0xec7
+#define MVK_Hangul_WA 0xec8
+#define MVK_Hangul_WAE 0xec9
+#define MVK_Hangul_OE 0xeca
+#define MVK_Hangul_YO 0xecb
+#define MVK_Hangul_U 0xecc
+#define MVK_Hangul_WEO 0xecd
+#define MVK_Hangul_WE 0xece
+#define MVK_Hangul_WI 0xecf
+#define MVK_Hangul_YU 0xed0
+#define MVK_Hangul_EU 0xed1
+#define MVK_Hangul_YI 0xed2
+#define MVK_Hangul_I 0xed3
+#define MVK_Hangul_J_Kiyeog 0xed4
+#define MVK_Hangul_J_SsangKiyeog 0xed5
+#define MVK_Hangul_J_KiyeogSios 0xed6
+#define MVK_Hangul_J_Nieun 0xed7
+#define MVK_Hangul_J_NieunJieuj 0xed8
+#define MVK_Hangul_J_NieunHieuh 0xed9
+#define MVK_Hangul_J_Dikeud 0xeda
+#define MVK_Hangul_J_Rieul 0xedb
+#define MVK_Hangul_J_RieulKiyeog 0xedc
+#define MVK_Hangul_J_RieulMieum 0xedd
+#define MVK_Hangul_J_RieulPieub 0xede
+#define MVK_Hangul_J_RieulSios 0xedf
+#define MVK_Hangul_J_RieulTieut 0xee0
+#define MVK_Hangul_J_RieulPhieuf 0xee1
+#define MVK_Hangul_J_RieulHieuh 0xee2
+#define MVK_Hangul_J_Mieum 0xee3
+#define MVK_Hangul_J_Pieub 0xee4
+#define MVK_Hangul_J_PieubSios 0xee5
+#define MVK_Hangul_J_Sios 0xee6
+#define MVK_Hangul_J_SsangSios 0xee7
+#define MVK_Hangul_J_Ieung 0xee8
+#define MVK_Hangul_J_Jieuj 0xee9
+#define MVK_Hangul_J_Cieuc 0xeea
+#define MVK_Hangul_J_Khieuq 0xeeb
+#define MVK_Hangul_J_Tieut 0xeec
+#define MVK_Hangul_J_Phieuf 0xeed
+#define MVK_Hangul_J_Hieuh 0xeee
+#define MVK_Hangul_RieulYeorinHieuh 0xeef
+#define MVK_Hangul_SunkyeongeumMieum 0xef0
+#define MVK_Hangul_SunkyeongeumPieub 0xef1
+#define MVK_Hangul_PanSios 0xef2
+#define MVK_Hangul_KkogjiDalrinIeung 0xef3
+#define MVK_Hangul_SunkyeongeumPhieuf 0xef4
+#define MVK_Hangul_YeorinHieuh 0xef5
+#define MVK_Hangul_AraeA 0xef6
+#define MVK_Hangul_AraeAE 0xef7
+#define MVK_Hangul_J_PanSios 0xef8
+#define MVK_Hangul_J_KkogjiDalrinIeung 0xef9
+#define MVK_Hangul_J_YeorinHieuh 0xefa
+#define MVK_Korean_Won 0xeff
+#define MVK_Armenian_ligature_ew 0x587
+#define MVK_Armenian_full_stop 0x589
+#define MVK_Armenian_verjaket 0x589
+#define MVK_Armenian_separation_mark 0x55d
+#define MVK_Armenian_but 0x55d
+#define MVK_Armenian_hyphen 0x58a
+#define MVK_Armenian_yentamna 0x58a
+#define MVK_Armenian_exclam 0x55c
+#define MVK_Armenian_amanak 0x55c
+#define MVK_Armenian_accent 0x55b
+#define MVK_Armenian_shesht 0x55b
+#define MVK_Armenian_question 0x55e
+#define MVK_Armenian_paruyk 0x55e
+#define MVK_Armenian_AYB 0x531
+#define MVK_Armenian_ayb 0x561
+#define MVK_Armenian_BEN 0x532
+#define MVK_Armenian_ben 0x562
+#define MVK_Armenian_GIM 0x533
+#define MVK_Armenian_gim 0x563
+#define MVK_Armenian_DA 0x534
+#define MVK_Armenian_da 0x564
+#define MVK_Armenian_YECH 0x535
+#define MVK_Armenian_yech 0x565
+#define MVK_Armenian_ZA 0x536
+#define MVK_Armenian_za 0x566
+#define MVK_Armenian_E 0x537
+#define MVK_Armenian_e 0x567
+#define MVK_Armenian_AT 0x538
+#define MVK_Armenian_at 0x568
+#define MVK_Armenian_TO 0x539
+#define MVK_Armenian_to 0x569
+#define MVK_Armenian_ZHE 0x53a
+#define MVK_Armenian_zhe 0x56a
+#define MVK_Armenian_INI 0x53b
+#define MVK_Armenian_ini 0x56b
+#define MVK_Armenian_LYUN 0x53c
+#define MVK_Armenian_lyun 0x56c
+#define MVK_Armenian_KHE 0x53d
+#define MVK_Armenian_khe 0x56d
+#define MVK_Armenian_TSA 0x53e
+#define MVK_Armenian_tsa 0x56e
+#define MVK_Armenian_KEN 0x53f
+#define MVK_Armenian_ken 0x56f
+#define MVK_Armenian_HO 0x540
+#define MVK_Armenian_ho 0x570
+#define MVK_Armenian_DZA 0x541
+#define MVK_Armenian_dza 0x571
+#define MVK_Armenian_GHAT 0x542
+#define MVK_Armenian_ghat 0x572
+#define MVK_Armenian_TCHE 0x543
+#define MVK_Armenian_tche 0x573
+#define MVK_Armenian_MEN 0x544
+#define MVK_Armenian_men 0x574
+#define MVK_Armenian_HI 0x545
+#define MVK_Armenian_hi 0x575
+#define MVK_Armenian_NU 0x546
+#define MVK_Armenian_nu 0x576
+#define MVK_Armenian_SHA 0x547
+#define MVK_Armenian_sha 0x577
+#define MVK_Armenian_VO 0x548
+#define MVK_Armenian_vo 0x578
+#define MVK_Armenian_CHA 0x549
+#define MVK_Armenian_cha 0x579
+#define MVK_Armenian_PE 0x54a
+#define MVK_Armenian_pe 0x57a
+#define MVK_Armenian_JE 0x54b
+#define MVK_Armenian_je 0x57b
+#define MVK_Armenian_RA 0x54c
+#define MVK_Armenian_ra 0x57c
+#define MVK_Armenian_SE 0x54d
+#define MVK_Armenian_se 0x57d
+#define MVK_Armenian_VEV 0x54e
+#define MVK_Armenian_vev 0x57e
+#define MVK_Armenian_TYUN 0x54f
+#define MVK_Armenian_tyun 0x57f
+#define MVK_Armenian_RE 0x550
+#define MVK_Armenian_re 0x580
+#define MVK_Armenian_TSO 0x551
+#define MVK_Armenian_tso 0x581
+#define MVK_Armenian_VYUN 0x552
+#define MVK_Armenian_vyun 0x582
+#define MVK_Armenian_PYUR 0x553
+#define MVK_Armenian_pyur 0x583
+#define MVK_Armenian_KE 0x554
+#define MVK_Armenian_ke 0x584
+#define MVK_Armenian_O 0x555
+#define MVK_Armenian_o 0x585
+#define MVK_Armenian_FE 0x556
+#define MVK_Armenian_fe 0x586
+#define MVK_Armenian_apostrophe 0x55a
+#define MVK_Georgian_an 0x10d0
+#define MVK_Georgian_ban 0x10d1
+#define MVK_Georgian_gan 0x10d2
+#define MVK_Georgian_don 0x10d3
+#define MVK_Georgian_en 0x10d4
+#define MVK_Georgian_vin 0x10d5
+#define MVK_Georgian_zen 0x10d6
+#define MVK_Georgian_tan 0x10d7
+#define MVK_Georgian_in 0x10d8
+#define MVK_Georgian_kan 0x10d9
+#define MVK_Georgian_las 0x10da
+#define MVK_Georgian_man 0x10db
+#define MVK_Georgian_nar 0x10dc
+#define MVK_Georgian_on 0x10dd
+#define MVK_Georgian_par 0x10de
+#define MVK_Georgian_zhar 0x10df
+#define MVK_Georgian_rae 0x10e0
+#define MVK_Georgian_san 0x10e1
+#define MVK_Georgian_tar 0x10e2
+#define MVK_Georgian_un 0x10e3
+#define MVK_Georgian_phar 0x10e4
+#define MVK_Georgian_khar 0x10e5
+#define MVK_Georgian_ghan 0x10e6
+#define MVK_Georgian_qar 0x10e7
+#define MVK_Georgian_shin 0x10e8
+#define MVK_Georgian_chin 0x10e9
+#define MVK_Georgian_can 0x10ea
+#define MVK_Georgian_jil 0x10eb
+#define MVK_Georgian_cil 0x10ec
+#define MVK_Georgian_char 0x10ed
+#define MVK_Georgian_xan 0x10ee
+#define MVK_Georgian_jhan 0x10ef
+#define MVK_Georgian_hae 0x10f0
+#define MVK_Georgian_he 0x10f1
+#define MVK_Georgian_hie 0x10f2
+#define MVK_Georgian_we 0x10f3
+#define MVK_Georgian_har 0x10f4
+#define MVK_Georgian_hoe 0x10f5
+#define MVK_Georgian_fi 0x10f6
+#define MVK_Xabovedot 0x1e8a
+#define MVK_Ibreve 0x12c
+#define MVK_Zstroke 0x1b5
+#define MVK_Gcaron 0x1e6
+#define MVK_Ocaron 0x1d1
+#define MVK_Obarred 0x19f
+#define MVK_xabovedot 0x1e8b
+#define MVK_ibreve 0x12d
+#define MVK_zstroke 0x1b6
+#define MVK_gcaron 0x1e7
+#define MVK_ocaron 0x1d2
+#define MVK_obarred 0x275
+#define MVK_SCHWA 0x18f
+#define MVK_schwa 0x259
+#define MVK_Lbelowdot 0x1e36
+#define MVK_lbelowdot 0x1e37
+#define MVK_Abelowdot 0x1ea0
+#define MVK_abelowdot 0x1ea1
+#define MVK_Ahook 0x1ea2
+#define MVK_ahook 0x1ea3
+#define MVK_Acircumflexacute 0x1ea4
+#define MVK_acircumflexacute 0x1ea5
+#define MVK_Acircumflexgrave 0x1ea6
+#define MVK_acircumflexgrave 0x1ea7
+#define MVK_Acircumflexhook 0x1ea8
+#define MVK_acircumflexhook 0x1ea9
+#define MVK_Acircumflextilde 0x1eaa
+#define MVK_acircumflextilde 0x1eab
+#define MVK_Acircumflexbelowdot 0x1eac
+#define MVK_acircumflexbelowdot 0x1ead
+#define MVK_Abreveacute 0x1eae
+#define MVK_abreveacute 0x1eaf
+#define MVK_Abrevegrave 0x1eb0
+#define MVK_abrevegrave 0x1eb1
+#define MVK_Abrevehook 0x1eb2
+#define MVK_abrevehook 0x1eb3
+#define MVK_Abrevetilde 0x1eb4
+#define MVK_abrevetilde 0x1eb5
+#define MVK_Abrevebelowdot 0x1eb6
+#define MVK_abrevebelowdot 0x1eb7
+#define MVK_Ebelowdot 0x1eb8
+#define MVK_ebelowdot 0x1eb9
+#define MVK_Ehook 0x1eba
+#define MVK_ehook 0x1ebb
+#define MVK_Etilde 0x1ebc
+#define MVK_etilde 0x1ebd
+#define MVK_Ecircumflexacute 0x1ebe
+#define MVK_ecircumflexacute 0x1ebf
+#define MVK_Ecircumflexgrave 0x1ec0
+#define MVK_ecircumflexgrave 0x1ec1
+#define MVK_Ecircumflexhook 0x1ec2
+#define MVK_ecircumflexhook 0x1ec3
+#define MVK_Ecircumflextilde 0x1ec4
+#define MVK_ecircumflextilde 0x1ec5
+#define MVK_Ecircumflexbelowdot 0x1ec6
+#define MVK_ecircumflexbelowdot 0x1ec7
+#define MVK_Ihook 0x1ec8
+#define MVK_ihook 0x1ec9
+#define MVK_Ibelowdot 0x1eca
+#define MVK_ibelowdot 0x1ecb
+#define MVK_Obelowdot 0x1ecc
+#define MVK_obelowdot 0x1ecd
+#define MVK_Ohook 0x1ece
+#define MVK_ohook 0x1ecf
+#define MVK_Ocircumflexacute 0x1ed0
+#define MVK_ocircumflexacute 0x1ed1
+#define MVK_Ocircumflexgrave 0x1ed2
+#define MVK_ocircumflexgrave 0x1ed3
+#define MVK_Ocircumflexhook 0x1ed4
+#define MVK_ocircumflexhook 0x1ed5
+#define MVK_Ocircumflextilde 0x1ed6
+#define MVK_ocircumflextilde 0x1ed7
+#define MVK_Ocircumflexbelowdot 0x1ed8
+#define MVK_ocircumflexbelowdot 0x1ed9
+#define MVK_Ohornacute 0x1eda
+#define MVK_ohornacute 0x1edb
+#define MVK_Ohorngrave 0x1edc
+#define MVK_ohorngrave 0x1edd
+#define MVK_Ohornhook 0x1ede
+#define MVK_ohornhook 0x1edf
+#define MVK_Ohorntilde 0x1ee0
+#define MVK_ohorntilde 0x1ee1
+#define MVK_Ohornbelowdot 0x1ee2
+#define MVK_ohornbelowdot 0x1ee3
+#define MVK_Ubelowdot 0x1ee4
+#define MVK_ubelowdot 0x1ee5
+#define MVK_Uhook 0x1ee6
+#define MVK_uhook 0x1ee7
+#define MVK_Uhornacute 0x1ee8
+#define MVK_uhornacute 0x1ee9
+#define MVK_Uhorngrave 0x1eea
+#define MVK_uhorngrave 0x1eeb
+#define MVK_Uhornhook 0x1eec
+#define MVK_uhornhook 0x1eed
+#define MVK_Uhorntilde 0x1eee
+#define MVK_uhorntilde 0x1eef
+#define MVK_Uhornbelowdot 0x1ef0
+#define MVK_uhornbelowdot 0x1ef1
+#define MVK_Ybelowdot 0x1ef4
+#define MVK_ybelowdot 0x1ef5
+#define MVK_Yhook 0x1ef6
+#define MVK_yhook 0x1ef7
+#define MVK_Ytilde 0x1ef8
+#define MVK_ytilde 0x1ef9
+#define MVK_Ohorn 0x1a0
+#define MVK_ohorn 0x1a1
+#define MVK_Uhorn 0x1af
+#define MVK_uhorn 0x1b0
+#define MVK_EcuSign 0x20a0
+#define MVK_ColonSign 0x20a1
+#define MVK_CruzeiroSign 0x20a2
+#define MVK_FFrancSign 0x20a3
+#define MVK_LiraSign 0x20a4
+#define MVK_MillSign 0x20a5
+#define MVK_NairaSign 0x20a6
+#define MVK_PesetaSign 0x20a7
+#define MVK_RupeeSign 0x20a8
+#define MVK_WonSign 0x20a9
+#define MVK_NewSheqelSign 0x20aa
+#define MVK_DongSign 0x20ab
+#define MVK_EuroSign 0x20ac
+#define MVK_zerosuperior 0x2070
+#define MVK_foursuperior 0x2074
+#define MVK_fivesuperior 0x2075
+#define MVK_sixsuperior 0x2076
+#define MVK_sevensuperior 0x2077
+#define MVK_eightsuperior 0x2078
+#define MVK_ninesuperior 0x2079
+#define MVK_zerosubscript 0x2080
+#define MVK_onesubscript 0x2081
+#define MVK_twosubscript 0x2082
+#define MVK_threesubscript 0x2083
+#define MVK_foursubscript 0x2084
+#define MVK_fivesubscript 0x2085
+#define MVK_sixsubscript 0x2086
+#define MVK_sevensubscript 0x2087
+#define MVK_eightsubscript 0x2088
+#define MVK_ninesubscript 0x2089
+#define MVK_partdifferential 0x2202
+#define MVK_emptyset 0x2205
+#define MVK_elementof 0x2208
+#define MVK_notelementof 0x2209
+#define MVK_containsas 0x220b
+#define MVK_squareroot 0x221a
+#define MVK_cuberoot 0x221b
+#define MVK_fourthroot 0x221c
+#define MVK_dintegral 0x222c
+#define MVK_tintegral 0x222d
+#define MVK_because 0x2235
+#define MVK_approxeq 0x2248
+#define MVK_notapproxeq 0x2247
+#define MVK_notidentical 0x2262
+#define MVK_stricteq 0x2263
+#define MVK_braille_dot_1 0xfff1
+#define MVK_braille_dot_2 0xfff2
+#define MVK_braille_dot_3 0xfff3
+#define MVK_braille_dot_4 0xfff4
+#define MVK_braille_dot_5 0xfff5
+#define MVK_braille_dot_6 0xfff6
+#define MVK_braille_dot_7 0xfff7
+#define MVK_braille_dot_8 0xfff8
+#define MVK_braille_dot_9 0xfff9
+#define MVK_braille_dot_10 0xfffa
+#define MVK_braille_blank 0x2800
+#define MVK_braille_dots_1 0x2801
+#define MVK_braille_dots_2 0x2802
+#define MVK_braille_dots_12 0x2803
+#define MVK_braille_dots_3 0x2804
+#define MVK_braille_dots_13 0x2805
+#define MVK_braille_dots_23 0x2806
+#define MVK_braille_dots_123 0x2807
+#define MVK_braille_dots_4 0x2808
+#define MVK_braille_dots_14 0x2809
+#define MVK_braille_dots_24 0x280a
+#define MVK_braille_dots_124 0x280b
+#define MVK_braille_dots_34 0x280c
+#define MVK_braille_dots_134 0x280d
+#define MVK_braille_dots_234 0x280e
+#define MVK_braille_dots_1234 0x280f
+#define MVK_braille_dots_5 0x2810
+#define MVK_braille_dots_15 0x2811
+#define MVK_braille_dots_25 0x2812
+#define MVK_braille_dots_125 0x2813
+#define MVK_braille_dots_35 0x2814
+#define MVK_braille_dots_135 0x2815
+#define MVK_braille_dots_235 0x2816
+#define MVK_braille_dots_1235 0x2817
+#define MVK_braille_dots_45 0x2818
+#define MVK_braille_dots_145 0x2819
+#define MVK_braille_dots_245 0x281a
+#define MVK_braille_dots_1245 0x281b
+#define MVK_braille_dots_345 0x281c
+#define MVK_braille_dots_1345 0x281d
+#define MVK_braille_dots_2345 0x281e
+#define MVK_braille_dots_12345 0x281f
+#define MVK_braille_dots_6 0x2820
+#define MVK_braille_dots_16 0x2821
+#define MVK_braille_dots_26 0x2822
+#define MVK_braille_dots_126 0x2823
+#define MVK_braille_dots_36 0x2824
+#define MVK_braille_dots_136 0x2825
+#define MVK_braille_dots_236 0x2826
+#define MVK_braille_dots_1236 0x2827
+#define MVK_braille_dots_46 0x2828
+#define MVK_braille_dots_146 0x2829
+#define MVK_braille_dots_246 0x282a
+#define MVK_braille_dots_1246 0x282b
+#define MVK_braille_dots_346 0x282c
+#define MVK_braille_dots_1346 0x282d
+#define MVK_braille_dots_2346 0x282e
+#define MVK_braille_dots_12346 0x282f
+#define MVK_braille_dots_56 0x2830
+#define MVK_braille_dots_156 0x2831
+#define MVK_braille_dots_256 0x2832
+#define MVK_braille_dots_1256 0x2833
+#define MVK_braille_dots_356 0x2834
+#define MVK_braille_dots_1356 0x2835
+#define MVK_braille_dots_2356 0x2836
+#define MVK_braille_dots_12356 0x2837
+#define MVK_braille_dots_456 0x2838
+#define MVK_braille_dots_1456 0x2839
+#define MVK_braille_dots_2456 0x283a
+#define MVK_braille_dots_12456 0x283b
+#define MVK_braille_dots_3456 0x283c
+#define MVK_braille_dots_13456 0x283d
+#define MVK_braille_dots_23456 0x283e
+#define MVK_braille_dots_123456 0x283f
+#define MVK_braille_dots_7 0x2840
+#define MVK_braille_dots_17 0x2841
+#define MVK_braille_dots_27 0x2842
+#define MVK_braille_dots_127 0x2843
+#define MVK_braille_dots_37 0x2844
+#define MVK_braille_dots_137 0x2845
+#define MVK_braille_dots_237 0x2846
+#define MVK_braille_dots_1237 0x2847
+#define MVK_braille_dots_47 0x2848
+#define MVK_braille_dots_147 0x2849
+#define MVK_braille_dots_247 0x284a
+#define MVK_braille_dots_1247 0x284b
+#define MVK_braille_dots_347 0x284c
+#define MVK_braille_dots_1347 0x284d
+#define MVK_braille_dots_2347 0x284e
+#define MVK_braille_dots_12347 0x284f
+#define MVK_braille_dots_57 0x2850
+#define MVK_braille_dots_157 0x2851
+#define MVK_braille_dots_257 0x2852
+#define MVK_braille_dots_1257 0x2853
+#define MVK_braille_dots_357 0x2854
+#define MVK_braille_dots_1357 0x2855
+#define MVK_braille_dots_2357 0x2856
+#define MVK_braille_dots_12357 0x2857
+#define MVK_braille_dots_457 0x2858
+#define MVK_braille_dots_1457 0x2859
+#define MVK_braille_dots_2457 0x285a
+#define MVK_braille_dots_12457 0x285b
+#define MVK_braille_dots_3457 0x285c
+#define MVK_braille_dots_13457 0x285d
+#define MVK_braille_dots_23457 0x285e
+#define MVK_braille_dots_123457 0x285f
+#define MVK_braille_dots_67 0x2860
+#define MVK_braille_dots_167 0x2861
+#define MVK_braille_dots_267 0x2862
+#define MVK_braille_dots_1267 0x2863
+#define MVK_braille_dots_367 0x2864
+#define MVK_braille_dots_1367 0x2865
+#define MVK_braille_dots_2367 0x2866
+#define MVK_braille_dots_12367 0x2867
+#define MVK_braille_dots_467 0x2868
+#define MVK_braille_dots_1467 0x2869
+#define MVK_braille_dots_2467 0x286a
+#define MVK_braille_dots_12467 0x286b
+#define MVK_braille_dots_3467 0x286c
+#define MVK_braille_dots_13467 0x286d
+#define MVK_braille_dots_23467 0x286e
+#define MVK_braille_dots_123467 0x286f
+#define MVK_braille_dots_567 0x2870
+#define MVK_braille_dots_1567 0x2871
+#define MVK_braille_dots_2567 0x2872
+#define MVK_braille_dots_12567 0x2873
+#define MVK_braille_dots_3567 0x2874
+#define MVK_braille_dots_13567 0x2875
+#define MVK_braille_dots_23567 0x2876
+#define MVK_braille_dots_123567 0x2877
+#define MVK_braille_dots_4567 0x2878
+#define MVK_braille_dots_14567 0x2879
+#define MVK_braille_dots_24567 0x287a
+#define MVK_braille_dots_124567 0x287b
+#define MVK_braille_dots_34567 0x287c
+#define MVK_braille_dots_134567 0x287d
+#define MVK_braille_dots_234567 0x287e
+#define MVK_braille_dots_1234567 0x287f
+#define MVK_braille_dots_8 0x2880
+#define MVK_braille_dots_18 0x2881
+#define MVK_braille_dots_28 0x2882
+#define MVK_braille_dots_128 0x2883
+#define MVK_braille_dots_38 0x2884
+#define MVK_braille_dots_138 0x2885
+#define MVK_braille_dots_238 0x2886
+#define MVK_braille_dots_1238 0x2887
+#define MVK_braille_dots_48 0x2888
+#define MVK_braille_dots_148 0x2889
+#define MVK_braille_dots_248 0x288a
+#define MVK_braille_dots_1248 0x288b
+#define MVK_braille_dots_348 0x288c
+#define MVK_braille_dots_1348 0x288d
+#define MVK_braille_dots_2348 0x288e
+#define MVK_braille_dots_12348 0x288f
+#define MVK_braille_dots_58 0x2890
+#define MVK_braille_dots_158 0x2891
+#define MVK_braille_dots_258 0x2892
+#define MVK_braille_dots_1258 0x2893
+#define MVK_braille_dots_358 0x2894
+#define MVK_braille_dots_1358 0x2895
+#define MVK_braille_dots_2358 0x2896
+#define MVK_braille_dots_12358 0x2897
+#define MVK_braille_dots_458 0x2898
+#define MVK_braille_dots_1458 0x2899
+#define MVK_braille_dots_2458 0x289a
+#define MVK_braille_dots_12458 0x289b
+#define MVK_braille_dots_3458 0x289c
+#define MVK_braille_dots_13458 0x289d
+#define MVK_braille_dots_23458 0x289e
+#define MVK_braille_dots_123458 0x289f
+#define MVK_braille_dots_68 0x28a0
+#define MVK_braille_dots_168 0x28a1
+#define MVK_braille_dots_268 0x28a2
+#define MVK_braille_dots_1268 0x28a3
+#define MVK_braille_dots_368 0x28a4
+#define MVK_braille_dots_1368 0x28a5
+#define MVK_braille_dots_2368 0x28a6
+#define MVK_braille_dots_12368 0x28a7
+#define MVK_braille_dots_468 0x28a8
+#define MVK_braille_dots_1468 0x28a9
+#define MVK_braille_dots_2468 0x28aa
+#define MVK_braille_dots_12468 0x28ab
+#define MVK_braille_dots_3468 0x28ac
+#define MVK_braille_dots_13468 0x28ad
+#define MVK_braille_dots_23468 0x28ae
+#define MVK_braille_dots_123468 0x28af
+#define MVK_braille_dots_568 0x28b0
+#define MVK_braille_dots_1568 0x28b1
+#define MVK_braille_dots_2568 0x28b2
+#define MVK_braille_dots_12568 0x28b3
+#define MVK_braille_dots_3568 0x28b4
+#define MVK_braille_dots_13568 0x28b5
+#define MVK_braille_dots_23568 0x28b6
+#define MVK_braille_dots_123568 0x28b7
+#define MVK_braille_dots_4568 0x28b8
+#define MVK_braille_dots_14568 0x28b9
+#define MVK_braille_dots_24568 0x28ba
+#define MVK_braille_dots_124568 0x28bb
+#define MVK_braille_dots_34568 0x28bc
+#define MVK_braille_dots_134568 0x28bd
+#define MVK_braille_dots_234568 0x28be
+#define MVK_braille_dots_1234568 0x28bf
+#define MVK_braille_dots_78 0x28c0
+#define MVK_braille_dots_178 0x28c1
+#define MVK_braille_dots_278 0x28c2
+#define MVK_braille_dots_1278 0x28c3
+#define MVK_braille_dots_378 0x28c4
+#define MVK_braille_dots_1378 0x28c5
+#define MVK_braille_dots_2378 0x28c6
+#define MVK_braille_dots_12378 0x28c7
+#define MVK_braille_dots_478 0x28c8
+#define MVK_braille_dots_1478 0x28c9
+#define MVK_braille_dots_2478 0x28ca
+#define MVK_braille_dots_12478 0x28cb
+#define MVK_braille_dots_3478 0x28cc
+#define MVK_braille_dots_13478 0x28cd
+#define MVK_braille_dots_23478 0x28ce
+#define MVK_braille_dots_123478 0x28cf
+#define MVK_braille_dots_578 0x28d0
+#define MVK_braille_dots_1578 0x28d1
+#define MVK_braille_dots_2578 0x28d2
+#define MVK_braille_dots_12578 0x28d3
+#define MVK_braille_dots_3578 0x28d4
+#define MVK_braille_dots_13578 0x28d5
+#define MVK_braille_dots_23578 0x28d6
+#define MVK_braille_dots_123578 0x28d7
+#define MVK_braille_dots_4578 0x28d8
+#define MVK_braille_dots_14578 0x28d9
+#define MVK_braille_dots_24578 0x28da
+#define MVK_braille_dots_124578 0x28db
+#define MVK_braille_dots_34578 0x28dc
+#define MVK_braille_dots_134578 0x28dd
+#define MVK_braille_dots_234578 0x28de
+#define MVK_braille_dots_1234578 0x28df
+#define MVK_braille_dots_678 0x28e0
+#define MVK_braille_dots_1678 0x28e1
+#define MVK_braille_dots_2678 0x28e2
+#define MVK_braille_dots_12678 0x28e3
+#define MVK_braille_dots_3678 0x28e4
+#define MVK_braille_dots_13678 0x28e5
+#define MVK_braille_dots_23678 0x28e6
+#define MVK_braille_dots_123678 0x28e7
+#define MVK_braille_dots_4678 0x28e8
+#define MVK_braille_dots_14678 0x28e9
+#define MVK_braille_dots_24678 0x28ea
+#define MVK_braille_dots_124678 0x28eb
+#define MVK_braille_dots_34678 0x28ec
+#define MVK_braille_dots_134678 0x28ed
+#define MVK_braille_dots_234678 0x28ee
+#define MVK_braille_dots_1234678 0x28ef
+#define MVK_braille_dots_5678 0x28f0
+#define MVK_braille_dots_15678 0x28f1
+#define MVK_braille_dots_25678 0x28f2
+#define MVK_braille_dots_125678 0x28f3
+#define MVK_braille_dots_35678 0x28f4
+#define MVK_braille_dots_135678 0x28f5
+#define MVK_braille_dots_235678 0x28f6
+#define MVK_braille_dots_1235678 0x28f7
+#define MVK_braille_dots_45678 0x28f8
+#define MVK_braille_dots_145678 0x28f9
+#define MVK_braille_dots_245678 0x28fa
+#define MVK_braille_dots_1245678 0x28fb
+#define MVK_braille_dots_345678 0x28fc
+#define MVK_braille_dots_1345678 0x28fd
+#define MVK_braille_dots_2345678 0x28fe
+#define MVK_braille_dots_12345678 0x28ff
+
+/*-----------------RUSSIAN KEY PAD QWERTY STYLE-------------------------------*/
+/*---first row contains 12 keys---(all russian keys)---*/
+#define MVK_RUSSIAN_SMALL_YA 0x44F
+#define MVK_RUSSIAN_CAPITAL_YA 0x42F
+#define MVK_RUSSIAN_SMALL_ZHE 0x436
+#define MVK_RUSSIAN_CAPITAL_ZHE 0x416
+#define MVK_RUSSIAN_SMALL_IE 0x435
+#define MVK_RUSSIAN_CAPITAL_IE 0x415
+#define MVK_RUSSIAN_SMALL_ER 0x440
+#define MVK_RUSSIAN_CAPITAL_ER 0x420
+#define MVK_RUSSIAN_SMALL_TE 0x442
+#define MVK_RUSSIAN_CAPITAL_TE 0x422
+#define MVK_RUSSIAN_SMALL_YERU 0x44B
+#define MVK_RUSSIAN_CAPITAL_YERU 0x42B
+#define MVK_RUSSIAN_SMALL_U 0x443
+#define MVK_RUSSIAN_CAPITAL_U 0x423
+#define MVK_RUSSIAN_SMALL_I 0x438
+#define MVK_RUSSIAN_CAPITAL_I 0x418
+#define MVK_RUSSIAN_SMALL_O 0x43E
+#define MVK_RUSSIAN_CAPITAL_O 0x41E
+#define MVK_RUSSIAN_SMALL_PE 0x43F
+#define MVK_RUSSIAN_CAPITAL_PE 0x41F
+#define MVK_RUSSIAN_SMALL_SHA 0x448
+#define MVK_RUSSIAN_CAPITAL_SHA 0x428
+#define MVK_RUSSIAN_SMALL_SHCA 0x449
+#define MVK_RUSSIAN_CAPITAL_SHCA 0x429
+/*-----second row contains 11 keys----(all russian keys)-----------*/
+#define MVK_RUSSIAN_SMALL_A 0x430
+#define MVK_RUSSIAN_CAPITAL_A 0x410
+#define MVK_RUSSIAN_SMALL_ES 0x441
+#define MVK_RUSSIAN_CAPITAL_ES 0x421
+#define MVK_RUSSIAN_SMALL_DE 0x434
+#define MVK_RUSSIAN_CAPITAL_DE 0x414
+#define MVK_RUSSIAN_SMALL_EF 0x444
+#define MVK_RUSSIAN_CAPITAL_EF 0x424
+#define MVK_RUSSIAN_SMALL_GHE 0x433
+#define MVK_RUSSIAN_CAPITAL_GHE 0x413
+#define MVK_RUSSIAN_SMALL_HA 0x445
+#define MVK_RUSSIAN_CAPITAL_HA 0x425
+#define MVK_RUSSIAN_SMALL_SHRTI 0x439
+#define MVK_RUSSIAN_CAPITAL_SHRTI 0x419
+#define MVK_RUSSIAN_SMALL_KA 0x43A
+#define MVK_RUSSIAN_CAPITAL_KA 0x41A
+#define MVK_RUSSIAN_SMALL_EL 0x43B
+#define MVK_RUSSIAN_CAPITAL_EL 0x41B
+#define MVK_RUSSIAN_SMALL_CHE 0x447
+#define MVK_RUSSIAN_CAPITAL_CHE 0x427
+#define MVK_RUSSIAN_SMALL_E 0x44D
+#define MVK_RUSSIAN_CAPITAL_E 0x42D
+/*----third row contains 12 keys----(shift key + 10 russian keys + enter key)-----*/
+#define MVK_RUSSIAN_SMALL_ZE 0x437
+#define MVK_RUSSIAN_CAPITAL_ZE 0x417
+#define MVK_RUSSIAN_SMALL_SOFT 0x44C
+#define MVK_RUSSIAN_CAPITAL_SOFT 0x42C
+#define MVK_RUSSIAN_SMALL_TSE 0x446
+#define MVK_RUSSIAN_CAPITAL_TSE 0x426
+#define MVK_RUSSIAN_SMALL_VE 0x432
+#define MVK_RUSSIAN_CAPITAL_VE 0x412
+#define MVK_RUSSIAN_SMALL_BE 0x431
+#define MVK_RUSSIAN_CAPITAL_BE 0x411
+#define MVK_RUSSIAN_SMALL_EN 0x43D
+#define MVK_RUSSIAN_CAPITAL_EN 0x41D
+#define MVK_RUSSIAN_SMALL_EM 0x43C
+#define MVK_RUSSIAN_CAPITAL_EM 0x41C
+#define MVK_RUSSIAN_SMALL_HARD 0x44A
+#define MVK_RUSSIAN_CAPITAL_HARD 0x42A
+#define MVK_RUSSIAN_SMALL_YU 0x44E
+#define MVK_RUSSIAN_CAPITAL_YU 0x42E
+#define MVK_RUSSIAN_SMALL_IO 0x451
+#define MVK_RUSSIAN_CAPITAL_IO 0x401
+/*----forth row is same as normal english qwerty keypad ---------------*/
+
+
+#define MVK_NATIVE 0x30a1
+
+#define MVK_RESERVED_KEY 0x9000 /* limit about reserved key*/
+
+
+#endif //__SCL_KEY_DEFINES_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include "sclkeyfocushandler.h"
+#include <Elementary.h>
+#include <Evas.h>
+#include <dlog.h>
+#ifndef WAYLAND
+#include <Ecore_X.h>
+#endif
+#include "sclres_type.h"
+#include "scldebug.h"
+#include "sclcontext.h"
+#include "sclresourcecache.h"
+#include "sclwindows.h"
+#include "scleventhandler.h"
+#include "sclres_manager.h"
+#include "sclanimator.h"
+
+using namespace scl;
+
+/**
+ * Constructor
+ */
+CSCLKeyFocusHandler::CSCLKeyFocusHandler()
+{
+ SCL_DEBUG();
+#ifdef USING_KEY_GRAB
+ m_keyboard_grabbed = FALSE;
+#endif
+ m_focus_key = NOT_USED;
+ m_focus_window = SCLWINDOW_INVALID;
+
+#ifdef TARGET_EMULATOR
+ create_sniffer_window();
+#endif
+}
+
+/**
+ * Destructor
+ */
+CSCLKeyFocusHandler::~CSCLKeyFocusHandler()
+{
+ SCL_DEBUG();
+}
+
+CSCLKeyFocusHandler*
+CSCLKeyFocusHandler::get_instance()
+{
+ static CSCLKeyFocusHandler instance;
+ return &instance;
+}
+
+#ifdef USING_KEY_GRAB
+/**
+ * Grabs the navigation and Return keys
+ */
+bool
+CSCLKeyFocusHandler::grab_keyboard(const sclwindow parent)
+{
+#ifndef WAYLAND
+ Evas_Object *window = (Evas_Object *)parent;
+ Ecore_X_Window x_window = elm_win_xwindow_get(window);
+
+ Display *x_display = (Display *)ecore_x_display_get();
+ int grab_result;
+
+ grab_result = utilx_grab_key(x_display, x_window, "Return", EXCLUSIVE_GRAB);
+ if (0 == grab_result) {
+ LOGD("Return Key Grabbed successfully\n");
+ } else if (EXCLUSIVE_GRABBED_ALREADY == grab_result) {
+ LOGD("Return Key already grabbed in Exclusiv mode\n");
+ } else {
+ LOGD("Failed to Grab Return key\n");
+ }
+#endif
+ m_keyboard_grabbed = TRUE;
+ return TRUE;
+}
+
+/**
+ * UnGrabs the navigation and Return keys
+ */
+void
+CSCLKeyFocusHandler::ungrab_keyboard(const sclwindow parent)
+{
+#ifndef WAYLAND
+ Evas_Object *window = (Evas_Object *)parent;
+ Ecore_X_Window x_window = elm_win_xwindow_get(window);
+ Display *x_display = (Display *)ecore_x_display_get();
+ int grab_result;
+ grab_result = utilx_ungrab_key(x_display, x_window, "Return");
+ if (0 == grab_result) {
+ LOGD("Return Key UnGrabbed successfully\n");
+ } else {
+ LOGD("Failed to UnGrab Return key\n");
+ }
+#endif
+ m_keyboard_grabbed = FALSE;
+}
+
+#endif /*USING_KEY_GRAB*/
+
+
+void
+CSCLKeyFocusHandler::popup_opened(sclwindow window)
+{
+}
+
+void
+CSCLKeyFocusHandler::popup_closed(sclwindow window)
+{
+ sclshort layout = NOT_USED;
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame = NULL;
+
+ if (context && windows && sclres_manager) {
+ sclres_layout_key_coordinate_pointer_frame = sclres_manager->get_key_coordinate_pointer_frame();
+ layout = context->get_popup_layout(m_focus_window);
+ }
+ if (windows && sclres_layout_key_coordinate_pointer_frame &&
+ scl_check_arrindex(layout, MAX_SCL_LAYOUT) && scl_check_arrindex(m_focus_key, MAX_KEY)) {
+ SclLayoutKeyCoordinatePointer cur = sclres_layout_key_coordinate_pointer_frame[layout][m_focus_key];
+ SclWindowContext *window_context = windows->get_window_context(m_focus_window);
+ SclRectangle cur_key_coordinate = {0, 0, 0, 0};
+ if (window_context) {
+ cur_key_coordinate.x = cur->x + window_context->geometry.x;
+ cur_key_coordinate.y = cur->y + window_context->geometry.y;
+ cur_key_coordinate.width = cur->width;
+ cur_key_coordinate.height = cur->height;
+ }
+
+ m_focus_window = windows->get_base_window();
+ m_focus_key = get_next_candidate_key(HIGHLIGHT_NAVIGATE_NONE, cur_key_coordinate, windows->get_base_window()).candidate;
+ }
+}
+
+/**
+ * Resets the navigation info
+ */
+void
+CSCLKeyFocusHandler::reset_key_navigation_info(sclwindow window)
+{
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ if (windows->is_base_window(window)) {
+ m_focus_window = window;
+ m_focus_key = 0;
+ }
+ }
+}
+
+/**
+ * Compares the sub-layout values
+ */
+inline bool
+CSCLKeyFocusHandler::sub_layout_match(sclchar *layout1, sclchar *layout2)
+{
+ if (layout1) {
+ if (layout2) {
+ if (strcmp(layout1, layout2) == 0) {
+ return TRUE;
+ }
+ }
+ } else if (layout2) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * Builds the key navigation info
+ */
+void
+CSCLKeyFocusHandler::update_key_navigation_info(sclwindow window, scl8 index, SclLayoutKeyCoordinatePointer p_next_key)
+{
+}
+
+/**
+ * Finalize the navigation info
+ */
+void
+CSCLKeyFocusHandler::finalize_key_navigation_info(sclwindow window)
+{
+}
+
+/**
+ * Initializes the key index to first key of first row
+ */
+void
+CSCLKeyFocusHandler::init_key_index()
+{
+}
+
+/**
+ * Returns the currently focused key index
+ */
+scl8
+CSCLKeyFocusHandler::get_current_focus_key(void)
+{
+ return m_focus_key;
+}
+
+/**
+ * Returns the currently focused window
+ */
+sclwindow
+CSCLKeyFocusHandler::get_current_focus_window(void)
+{
+ return m_focus_window;
+}
+
+#ifndef min
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+#ifndef max
+#define max(a, b) (((a) > (b)) ? (a) : (b))
+#endif
+/* If 2 lines overlap, this will return minus value of overlapping length,
+ and return positive distance value otherwise */
+int calculate_distance(int start_1, int end_1, int start_2, int end_2)
+{
+ return -1 * (min(end_1, end_2) - max(start_1, start_2));
+}
+
+/**
+ * Computes and Returns the key index for next focussed key depending upon the navigation direction
+ */
+NEXT_CANDIDATE_INFO
+CSCLKeyFocusHandler::get_next_candidate_key(SCLHighlightNavigationDirection direction, SclRectangle cur, sclwindow window)
+{
+ NEXT_CANDIDATE_INFO ret;
+ ret.candidate = NOT_USED;
+ ret.candidate_otherside = NOT_USED;
+
+ int candidate = NOT_USED;
+ int candidate_distance_x = INT_MAX;
+ int candidate_distance_y = INT_MAX;
+ int startpos_identical = FALSE;
+
+ int otherside_candidate = NOT_USED;
+
+ sclshort layout = NOT_USED;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame = NULL;
+
+ if (context && windows && sclres_manager) {
+ sclres_layout_key_coordinate_pointer_frame = sclres_manager->get_key_coordinate_pointer_frame();
+
+ if (windows->is_base_window(window)) {
+ layout = context->get_base_layout();
+ } else {
+ layout = context->get_popup_layout(window);
+ }
+ }
+
+ if (windows && cache && context &&
+ sclres_layout_key_coordinate_pointer_frame && scl_check_arrindex(layout, MAX_SCL_LAYOUT)) {
+ for (sclint loop = 0;loop < MAX_KEY; loop++) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout][loop];
+ if (p && (loop != m_focus_key || window != m_focus_window)) {
+ if (p->sub_layout && context->get_cur_sublayout()) {
+ if (!sub_layout_match(p->sub_layout, context->get_cur_sublayout())) {
+ continue;
+ }
+ }
+ SclWindowContext *window_context = windows->get_window_context(window);
+ SclRectangle btn = {0, 0, 0, 0};
+ if (window_context) {
+ btn.x = p->x + window_context->geometry.x;
+ btn.y = p->y + window_context->geometry.y;
+ btn.width = p->width;
+ btn.height = p->height;
+ }
+ if (windows->is_base_window(window)) {
+ btn.x += cache->get_custom_starting_coordinates().x;
+ btn.y += cache->get_custom_starting_coordinates().y;
+ }
+
+ int temp_distance_x;
+ int temp_distance_y;
+
+ switch (direction) {
+ case HIGHLIGHT_NAVIGATE_LEFT:
+ temp_distance_y = calculate_distance(btn.y, btn.y + btn.height, cur.y, cur.y + cur.height);
+ //if (temp_distance_y <= candidate_distance_y) {
+ if (temp_distance_y <= candidate_distance_y && temp_distance_y < 0) {
+ /* If the button is closer in Y axis, consider this to be the closer regardless of X */
+ if (temp_distance_y < candidate_distance_y) {
+ /* Only if the ypos were not the same */
+ if (!startpos_identical) {
+ candidate_distance_x = INT_MAX;
+ }
+ }
+ /* Save for otherside */
+ otherside_candidate = loop;
+ temp_distance_x = calculate_distance(btn.x, btn.x + btn.width, cur.x, cur.x + cur.width);
+ if (temp_distance_x < candidate_distance_x) {
+ if (btn.x < cur.x) {
+ candidate = loop;
+ candidate_distance_x = temp_distance_x;
+ candidate_distance_y = temp_distance_y;
+ startpos_identical = (btn.y == cur.y);
+ }
+ }
+ }
+ break;
+ case HIGHLIGHT_NAVIGATE_RIGHT:
+ temp_distance_y = calculate_distance(btn.y, btn.y + btn.height, cur.y, cur.y + cur.height);
+ //if (temp_distance_y <= candidate_distance_y) {
+ if (temp_distance_y <= candidate_distance_y && temp_distance_y < 0) {
+ /* If the button is closer in Y axis, consider this to be the closer regardless of X */
+ if (temp_distance_y < candidate_distance_y) {
+ /* Only if the ypos were not the same */
+ if (!startpos_identical) {
+ candidate_distance_x = INT_MAX;
+ }
+ }
+ /* Save for otherside */
+ if (otherside_candidate == NOT_USED) {
+ otherside_candidate = loop;
+ }
+ temp_distance_x = calculate_distance(btn.x, btn.x + btn.width, cur.x, cur.x + cur.width);
+ if (temp_distance_x < candidate_distance_x) {
+ if (btn.x > cur.x) {
+ candidate = loop;
+ candidate_distance_x = temp_distance_x;
+ candidate_distance_y = temp_distance_y;
+ startpos_identical = (btn.y == cur.y);
+ }
+ }
+ }
+ break;
+ case HIGHLIGHT_NAVIGATE_UP:
+ temp_distance_x = calculate_distance(btn.x, btn.x + btn.width, cur.x, cur.x + cur.width);
+ if (temp_distance_x <= candidate_distance_x) {
+ /* If the button is closer in X axis, consider this to be the closer regardless of Y */
+ if (temp_distance_x < candidate_distance_x) {
+ /* Only if the xpos were not the same */
+ if (!startpos_identical) {
+ candidate_distance_y = INT_MAX;
+ }
+ }
+ temp_distance_y = calculate_distance(btn.y, btn.y + btn.height, cur.y, cur.y + cur.height);
+ if (temp_distance_y < candidate_distance_y) {
+ if (btn.y < cur.y) {
+ candidate = loop;
+ candidate_distance_x = temp_distance_x;
+ candidate_distance_y = temp_distance_y;
+ startpos_identical = (btn.x == cur.x);
+ }
+ }
+ }
+ break;
+ case HIGHLIGHT_NAVIGATE_DOWN:
+ temp_distance_x = calculate_distance(btn.x, btn.x + btn.width, cur.x, cur.x + cur.width);
+ if (temp_distance_x <= candidate_distance_x) {
+ /* If the button is closer in X axis, consider this to be the closer regardless of Y */
+ if (temp_distance_x < candidate_distance_x) {
+ /* Only if the xpos were not the same */
+ if (!startpos_identical) {
+ candidate_distance_y = INT_MAX;
+ }
+ }
+ temp_distance_y = calculate_distance(btn.y, btn.y + btn.height, cur.y, cur.y + cur.height);
+ if (temp_distance_y < candidate_distance_y) {
+ if (btn.y > cur.y) {
+ candidate = loop;
+ candidate_distance_x = temp_distance_x;
+ candidate_distance_y = temp_distance_y;
+ startpos_identical = (btn.x == cur.x);
+ }
+ }
+ }
+ break;
+ default:
+ temp_distance_y = calculate_distance(btn.y, btn.y + btn.height, cur.y, cur.y + cur.height);
+ if (temp_distance_y <= candidate_distance_y) {
+ temp_distance_x = calculate_distance(btn.x, btn.x + btn.width, cur.x, cur.x + cur.width);
+ if (temp_distance_x <= candidate_distance_x) {
+ candidate = loop;
+ candidate_distance_x = temp_distance_x;
+ candidate_distance_y = temp_distance_y;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ ret.candidate = candidate;
+ ret.candidate_otherside = otherside_candidate;
+ }
+
+ return ret;
+}
+
+static void copy_rectangle(SclLayoutKeyCoordinatePointer src, SclRectangle *dest)
+{
+ if (src && dest) {
+ (dest)->x = (src)->x;
+ (dest)->y = (src)->y;
+ (dest)->width = (src)->width;
+ (dest)->height = (src)->height;
+ }
+}
+
+void
+CSCLKeyFocusHandler::process_navigation(SCLHighlightNavigationDirection direction)
+{
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!context || !windows || !handler || !cache || !sclres_manager) return;
+
+ sclshort layout = NOT_USED;
+
+ sclwindow prev_window = m_focus_window;
+ scl8 prev_key = m_focus_key;
+ sclwindow next_window = m_focus_window;
+ scl8 next_key = m_focus_key;
+
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame = NULL;
+
+ if (context && windows && handler && sclres_manager) {
+ sclres_layout_key_coordinate_pointer_frame = sclres_manager->get_key_coordinate_pointer_frame();
+
+ if (windows->is_base_window(m_focus_window)) {
+ layout = context->get_base_layout();
+ } else {
+ layout = context->get_popup_layout(m_focus_window);
+ }
+ }
+
+ if (sclres_layout_key_coordinate_pointer_frame && context->get_highlight_ui_enabled() &&
+ scl_check_arrindex(layout, MAX_SCL_LAYOUT) && scl_check_arrindex(m_focus_key, MAX_KEY)) {
+ SclLayoutKeyCoordinatePointer cur = sclres_layout_key_coordinate_pointer_frame[layout][m_focus_key];
+
+ /* To compare with buttons in popup window, let's convert to global coordinates */
+ SclWindowContext *window_context = windows->get_window_context(m_focus_window);
+ SclRectangle cur_key_coordinate = {0, 0, 0, 0};
+ if (window_context && cur && cache) {
+ cur_key_coordinate.x = cur->x + window_context->geometry.x;
+ cur_key_coordinate.y = cur->y + window_context->geometry.y;
+ cur_key_coordinate.width = cur->width;
+ cur_key_coordinate.height = cur->height;
+
+ if (windows->is_base_window(m_focus_window)) {
+ cur_key_coordinate.x += cache->get_custom_starting_coordinates().x;
+ cur_key_coordinate.y += cache->get_custom_starting_coordinates().y;
+ }
+ }
+
+ NEXT_CANDIDATE_INFO base_candidate;
+ base_candidate.candidate = base_candidate.candidate_otherside = NOT_USED;
+ NEXT_CANDIDATE_INFO popup_candidate;
+ popup_candidate.candidate = popup_candidate.candidate_otherside = NOT_USED;
+ sclboolean search_in_base_window = TRUE;
+ sclboolean exclude_popup_covered_area = FALSE;
+
+ if (windows && !windows->is_base_window(windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP))) {
+ if (cache && window_context && scl_check_arrindex(window_context->inputmode, MAX_SCL_INPUT_MODE)) {
+ const SclLayout *cur_layout =
+ cache->get_cur_layout(windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP));
+ if (cur_layout) {
+ if (!(cur_layout->use_sw_background) || cur_layout->bg_color.a != 0) {
+ const PSclInputModeConfigure sclres_input_mode_configure =
+ sclres_manager->get_input_mode_configure_table();
+ if (sclres_input_mode_configure && sclres_input_mode_configure[window_context->inputmode].use_dim_window) {
+ search_in_base_window = FALSE;
+ } else {
+ exclude_popup_covered_area = TRUE;
+ }
+ }
+ }
+ }
+ popup_candidate = get_next_candidate_key(direction, cur_key_coordinate,
+ windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP));
+ }
+ /* Now search buttons in base window */
+ if (search_in_base_window && windows) {
+ base_candidate = get_next_candidate_key(direction, cur_key_coordinate, windows->get_base_window());
+ }
+
+ if (popup_candidate.candidate == NOT_USED && base_candidate.candidate != NOT_USED) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate;
+ } else if (popup_candidate.candidate != NOT_USED && base_candidate.candidate == NOT_USED) {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate;
+ } else if (popup_candidate.candidate == NOT_USED && base_candidate.candidate == NOT_USED) {
+ if (base_candidate.candidate_otherside != NOT_USED) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate_otherside;
+ } else if (popup_candidate.candidate_otherside != NOT_USED) {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate_otherside;
+ }
+ } else {
+ /* Compare those 2 candidates */
+ sclwindow popup_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ sclshort base_layout = context->get_base_layout();
+ sclshort popup_layout = context->get_popup_layout(popup_window);
+
+ SclLayoutKeyCoordinatePointer base_key = NULL;
+ SclLayoutKeyCoordinatePointer popup_key = NULL;
+ SclWindowContext *base_window_context = NULL;
+ SclWindowContext *popup_window_context = NULL;
+
+ if (scl_check_arrindex(base_layout, MAX_SCL_LAYOUT) && scl_check_arrindex(popup_layout, MAX_SCL_LAYOUT)) {
+ base_key = sclres_layout_key_coordinate_pointer_frame[base_layout][base_candidate.candidate];
+ popup_key = sclres_layout_key_coordinate_pointer_frame[popup_layout][popup_candidate.candidate];
+ base_window_context = windows->get_window_context(windows->get_base_window());
+ popup_window_context = windows->get_window_context(popup_window);
+ }
+
+ SclRectangle base_key_coordinate = {0, 0, 0, 0};
+ if (base_window_context) {
+ base_key_coordinate.x = base_key->x + base_window_context->geometry.x;
+ base_key_coordinate.y = base_key->y + base_window_context->geometry.y;
+ base_key_coordinate.width = base_key->width;
+ base_key_coordinate.height = base_key->height;
+
+ base_key_coordinate.x += cache->get_custom_starting_coordinates().x;
+ base_key_coordinate.y += cache->get_custom_starting_coordinates().y;
+ }
+
+ SclRectangle popup_key_coordinate = {0, 0, 0, 0};
+ if (popup_window_context) {
+ popup_key_coordinate.x = popup_key->x + popup_window_context->geometry.x;
+ popup_key_coordinate.y = popup_key->y + popup_window_context->geometry.y;
+ popup_key_coordinate.width = popup_key->width;
+ popup_key_coordinate.height = popup_key->height;
+ }
+
+ if (exclude_popup_covered_area) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils && popup_window_context) {
+ /* If the base candidate key is covered by popup window, do not choose it */
+ if (utils->is_rect_overlap(base_key_coordinate, popup_window_context->geometry)) {
+ base_candidate.candidate = NOT_USED;
+ }
+ }
+ }
+ /* If the base candidate key wasn't excluded */
+ if (base_candidate.candidate != NOT_USED) {
+ int base_distance_x = INT_MAX;
+ int base_distance_y = INT_MAX;
+ int popup_distance_x = INT_MAX;
+ int popup_distance_y = INT_MAX;
+
+ base_distance_x = calculate_distance(
+ cur_key_coordinate.x, cur_key_coordinate.x + cur_key_coordinate.width,
+ base_key_coordinate.x, base_key_coordinate.x + base_key_coordinate.width);
+ base_distance_y = calculate_distance(
+ cur_key_coordinate.y, cur_key_coordinate.y + cur_key_coordinate.height,
+ base_key_coordinate.y, base_key_coordinate.y + base_key_coordinate.height);
+
+ popup_distance_x = calculate_distance(
+ cur_key_coordinate.x, cur_key_coordinate.x + cur_key_coordinate.width,
+ popup_key_coordinate.x, popup_key_coordinate.x + popup_key_coordinate.width);
+ popup_distance_y = calculate_distance(
+ cur_key_coordinate.y, cur_key_coordinate.y + cur_key_coordinate.height,
+ popup_key_coordinate.y, popup_key_coordinate.y + popup_key_coordinate.height);
+
+ if (direction == HIGHLIGHT_NAVIGATE_LEFT || direction == HIGHLIGHT_NAVIGATE_RIGHT) {
+ int minimum_distance = -1 * (cur_key_coordinate.height / 3);
+ if (base_distance_y > minimum_distance && popup_distance_y > minimum_distance) {
+ minimum_distance = 0;
+ }
+ if (base_distance_y < minimum_distance && popup_distance_y < minimum_distance) {
+ if (base_distance_x < popup_distance_x) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate;
+ } else {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate;
+ }
+ } else if (base_distance_y < minimum_distance) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate;
+ } else {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate;
+ }
+ } else if (direction == HIGHLIGHT_NAVIGATE_UP || direction == HIGHLIGHT_NAVIGATE_DOWN) {
+ int minimum_distance = -1 * (cur_key_coordinate.width / 3);
+ if (base_distance_x > minimum_distance && popup_distance_x > minimum_distance) {
+ minimum_distance = 0;
+ }
+ if (base_distance_x < minimum_distance && popup_distance_x < minimum_distance) {
+ if (base_distance_y < popup_distance_y) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate;
+ } else {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate;
+ }
+ } else if (base_distance_x < minimum_distance) {
+ next_window = windows->get_base_window();
+ next_key = base_candidate.candidate;
+ } else {
+ next_window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ next_key = popup_candidate.candidate;
+ }
+ }
+ }
+ }
+
+ SclNotiHighlightNavigateDesc desc;
+ desc.direction = direction;
+ desc.window_from = prev_window;
+ desc.key_from = prev_key;
+ desc.window_to = next_window;
+ desc.key_to = next_key;
+ if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_HIGHLIGHT_NAVIGATE, &desc)) {
+ CSCLAnimator *animator = CSCLAnimator::get_instance();
+ if (animator) {
+ sclboolean start_animation = FALSE;
+ if (windows->is_base_window(desc.window_to) && windows->is_base_window(desc.window_from)) {
+ if (desc.key_to != desc.key_from) {
+ start_animation = TRUE;
+ }
+ } else {
+ SclWindowContext *window_context_from = windows->get_window_context(desc.window_from);
+ SclWindowContext *window_context_to = windows->get_window_context(desc.window_to);
+ if (window_context_from && window_context_to) {
+ if ((windows->is_base_window(desc.window_from) || window_context_from->is_virtual) &&
+ (windows->is_base_window(desc.window_to) || window_context_to->is_virtual)) {
+ start_animation = TRUE;
+ }
+ }
+ }
+ sclshort layout_from = NOT_USED;
+ sclshort layout_to = NOT_USED;
+ if (windows->is_base_window(desc.window_from)) {
+ layout_from = context->get_base_layout();
+ } else {
+ layout_from = context->get_popup_layout(desc.window_from);
+ }
+ if (windows->is_base_window(desc.window_to)) {
+ layout_to = context->get_base_layout();
+ } else {
+ layout_to = context->get_popup_layout(desc.window_to);
+ }
+ if (!scl_check_arrindex(desc.key_from, MAX_KEY) || !scl_check_arrindex(desc.key_to, MAX_KEY) ||
+ !scl_check_arrindex(layout_from, MAX_SCL_LAYOUT) || !scl_check_arrindex(layout_to, MAX_SCL_LAYOUT)) {
+ start_animation = FALSE;
+ }
+ if (start_animation &&
+ context->get_highlight_ui_enabled() &&
+ context->get_highlight_ui_animation_enabled() &&
+ animator->check_animation_supported()) {
+ SclLayoutKeyCoordinatePointer prev_coordinate =
+ sclres_layout_key_coordinate_pointer_frame[layout_from][desc.key_from];
+ SclLayoutKeyCoordinatePointer next_coordinate =
+ sclres_layout_key_coordinate_pointer_frame[layout_to][desc.key_to];
+
+ SclRectangle prev_rect;
+ SclRectangle next_rect;
+ copy_rectangle(prev_coordinate, &(prev_rect));
+ copy_rectangle(next_coordinate, &(next_rect));
+
+ if (windows->is_base_window(desc.window_from)) {
+ prev_rect.x += cache->get_custom_starting_coordinates().x;
+ prev_rect.y += cache->get_custom_starting_coordinates().y;
+ } else {
+ /* Convert popup window coordinates relative to base window */
+ SclWindowContext *base_window_context =
+ windows->get_window_context(windows->get_base_window());
+ SclWindowContext *prev_window_context =
+ windows->get_window_context(desc.window_from);
+ if (base_window_context && prev_window_context) {
+ prev_rect.x += (prev_window_context->geometry.x - base_window_context->geometry.x);
+ prev_rect.y += (prev_window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+ if (windows->is_base_window(desc.window_to)) {
+ next_rect.x += cache->get_custom_starting_coordinates().x;
+ next_rect.y += cache->get_custom_starting_coordinates().y;
+ } else {
+ /* Convert popup window coordinates relative to base window */
+ SclWindowContext *base_window_context =
+ windows->get_window_context(windows->get_base_window());
+ SclWindowContext *next_window_context =
+ windows->get_window_context(desc.window_to);
+ if (base_window_context && next_window_context) {
+ next_rect.x += (next_window_context->geometry.x - base_window_context->geometry.x);
+ next_rect.y += (next_window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+ /* Let's check if the navigation animation should be in circular movement */
+ sclboolean circular = FALSE;
+ /* If our 2 buttons overlap in Y axis */
+ if (calculate_distance(
+ prev_rect.y, prev_rect.y + prev_rect.height,
+ next_rect.y, next_rect.y + next_rect.height) < 0) {
+ /* And if those 2 buttons are side buttons, let's run the animation in circular mode */
+ if (prev_coordinate->is_side_button && next_coordinate->is_side_button) {
+ circular = TRUE;
+ }
+ }
+
+ sclint id = animator->find_animator_by_type(ANIMATION_TYPE_HIGHLIGHT_UI);
+ if (id == NOT_USED) {
+ SclAnimationDesc animdesc;
+ animdesc.type = ANIMATION_TYPE_HIGHLIGHT_UI;
+ animdesc.length = SCL_ANIMATION_TIME;
+
+ animdesc.rect_from = prev_rect;
+ animdesc.rect_to = next_rect;
+
+ animdesc.window_from = desc.window_from;
+ animdesc.window_to = desc.window_to;
+ animdesc.circular = circular;
+
+ id = animator->create_animator(&animdesc);
+ animator->start_animator(id);
+ } else {
+ SclAnimationState *state = animator->get_animation_state(id);
+ if (state) {
+ if (state->active) {
+ /* FIXME : When we have time later,
+ let's use the currect rect so that the animation starts from the current position,
+ considering the circular movement case */
+ //state->desc.rect_from = state->rect_cur;
+ state->desc.rect_from = prev_rect;
+ } else {
+ state->active = TRUE;
+ state->desc.rect_from = prev_rect;
+ }
+ state->step = 0;
+ state->desc.circular = circular;
+
+ state->desc.rect_to = next_rect;
+
+ state->desc.window_from = desc.window_from;
+ state->desc.window_to = desc.window_to;
+ }
+ animator->start_animator(id);
+ }
+ }
+ }
+ m_focus_window = desc.window_to;
+ m_focus_key = desc.key_to;
+ }
+ }
+}
+
+void
+CSCLKeyFocusHandler::set_current_focus(sclwindow window, scl8 index)
+{
+ m_focus_window = window;
+ m_focus_key = index;
+}
+
+#ifdef TARGET_EMULATOR
+
+/**
+ * callback for window show event (sniffer window)
+ */
+static void sniffer_window_show_cb(void *data, Evas *e, Evas_Object *obj, void *event)
+{
+ LOGD("INSIDE =-=-=-=- x_event_sniffer_window_show_cb, Trying to Grab Key Board : \n");
+#ifndef WAYLAND
+ Eina_Bool ret = ecore_x_keyboard_grab(x_window);
+
+ if (EINA_TRUE == ret) {
+ LOGD("Keyboard Grabbed successfully by sniffer\n");
+ } else {
+ LOGD("Failed to Grab keyboard by sniffer\n");
+ }
+#endif
+}
+
+/**
+ * sniffer window creation function, the keyboard would be grabbed by this window in case of Tizen Emulator
+ */
+void
+CSCLKeyFocusHandler::create_sniffer_window(void)
+{
+ LOGD("CSCLKeyFocusHandler : INSIDE =-=-=-=- create_sniffer_window : \n");
+ Evas_Object *win = NULL;
+
+ win = elm_win_add(NULL, "KEY_SNIFFER", ELM_WIN_UTILITY);
+
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_FALSE);
+ elm_win_title_set(win, "KEY_SNIFFER");
+ elm_win_fullscreen_set(win, EINA_FALSE);
+ set_window_accepts_focus(win, FALSE);
+ evas_object_show(win);
+ evas_object_resize(win, 100, 100);
+ m_sniffer = win;
+
+ evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, sniffer_window_show_cb, NULL);
+}
+
+void
+CSCLKeyFocusHandler::set_window_accepts_focus(const sclwindow window, sclboolean acceptable)
+{
+ elm_win_prop_focus_skip_set(static_cast<Evas_Object*>(window), !acceptable);
+}
+
+
+#endif
+
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include "scltypes.h"
+#include "sclres_type.h"
+#ifndef __SCL_KEY_FOCUS_HANDLER_H__
+#define __SCL_KEY_FOCUS_HANDLER_H__
+
+//#define TARGET_EMULATOR
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+#define NAVI_INFO_MAX_ROWS 20
+#define NAVI_INFO_MAX_COLS 20
+
+typedef struct {
+ scl8 candidate;
+ scl8 candidate_otherside;
+} NEXT_CANDIDATE_INFO;
+
+/*
+typedef struct _SclKeyboardRowInfo {
+ sclbyte start_index;
+ sclbyte size;
+ sclchar *sub_layout;
+ sclshort col_coord[NAVI_INFO_MAX_COLS];
+}SclKeyboardRowInfo;
+
+typedef struct _SclKeyFocusNavigationInfo {
+ sclbyte total_rows;
+ sclshort row_coord;
+ SclKeyboardRowInfo* rows[NAVI_INFO_MAX_ROWS];
+}SclKeyFocusNavigationInfo;
+
+typedef struct _SclPopupRelativeKeyInfo {
+ sclbyte index;
+ sclwindow window;
+}SclPopupRelativeKeyInfo;
+
+typedef struct _SclPopupRowInfo {
+ sclbyte start_index;
+ sclbyte size;
+ sclshort col_coord[NAVI_INFO_MAX_COLS];
+ SclPopupRelativeKeyInfo nexts[NAVI_INFO_MAX_COLS][NAVIGATE_MAX];
+}SclPopupRowInfo;
+
+typedef struct _SclPopupNavigationInfo {
+ sclbyte total_rows;
+ sclshort row_coord;
+ SclPopupRowInfo* rows[NAVI_INFO_MAX_ROWS];
+}SclPopupNavigationInfo;
+*/
+
+/**
+* @brief The class to store key focus navigation information
+*
+* This class implements functions to support key focus navigation on the software keyboard
+* using remote controller input. It generates navigation information for the currently loaded
+* keyboard layout and provides the index of next key depending upon the navigation direction.
+* The key information can be retrieved from the array of key coordinates from Resource Cache.
+*
+* Apart from key navigation information, this class also provides functions to grab and ungrab
+* the remote controller keys.
+*
+* The public interface can be divided in three categories :
+* 1. Focus grab/ungrab API : Invoked while showing and hiding the software keyboard
+* - Client class: CSCLWindowsImplEfl
+* 2. Focus navigation info building API : Invoked while computing layout of the current keyboard
+* - Client class/function: CSCLResourceCache::recompute_layout
+* 3. Focus navigation API: Invoked while handling remote controller key press events
+* - Client class: CSCLEventsImplEfl
+*/
+class CSCLKeyFocusHandler
+{
+public:
+ virtual ~CSCLKeyFocusHandler();
+
+ static CSCLKeyFocusHandler* get_instance();
+
+#ifdef USING_KEY_GRAB
+ /*Focus grab/ungrab API*/
+ bool grab_keyboard(const sclwindow parent);
+ void ungrab_keyboard(const sclwindow parent);
+#endif
+
+ /*Focus navigation info building API*/
+ void reset_key_navigation_info(sclwindow window);
+ void update_key_navigation_info(sclwindow window, scl8 index, SclLayoutKeyCoordinatePointer p_next_key);
+ void finalize_key_navigation_info(sclwindow window);
+
+ void popup_opened(sclwindow window);
+ void popup_closed(sclwindow window);
+
+ /*Focus navigation API*/
+ void init_key_index();
+ scl8 get_current_focus_key(void);
+ sclwindow get_current_focus_window(void);
+ void process_navigation(SCLHighlightNavigationDirection direction);
+
+ void set_current_focus(sclwindow window, scl8 index);
+
+private:
+ NEXT_CANDIDATE_INFO get_next_candidate_key(SCLHighlightNavigationDirection direction, SclRectangle cur, sclwindow window);
+
+ sclwindow m_focus_window;
+ scl8 m_focus_key;
+
+#ifdef USING_KEY_GRAB
+ bool m_keyboard_grabbed;
+#endif
+ bool sub_layout_match(sclchar *layout1, sclchar *layout2);
+
+ CSCLKeyFocusHandler();
+#ifdef TARGET_EMULATOR
+ sclwindow m_sniffer;
+ void create_sniffer_window(void);
+ void set_window_accepts_focus(const sclwindow window, sclboolean acceptable);
+#endif
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclres.h"
+
+using namespace sclres;
+
+SclRes::SclRes()
+{
+ m_resource_directory.clear();
+}
+
+SclRes::~SclRes()
+{
+}
+
+void
+SclRes::set_resource_directory(const char *directory)
+{
+ m_resource_directory = directory;
+}
+
+const char*
+SclRes::get_resource_directory()
+{
+ return m_resource_directory.c_str();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCLRES__
+#define __SCLRES__
+#include "sclres_type.h"
+#include <string>
+
+namespace sclres {
+class SclRes{
+public:
+ SclRes();
+ virtual ~SclRes();
+
+ /* Inform the SclRes where the resource files are */
+ virtual void set_resource_directory(const char *directory);
+ /* Returns the current filepath where the resource files are */
+ virtual const char* get_resource_directory();
+
+public: /* These are the functions need to be implemented by the descendants of SclRes */
+ /* Initialize SclRes, with the given entry file that exists under the resource directory */
+ virtual void init(const char *entry_filename) = 0;
+ virtual void reload() = 0;
+
+ /* These functions are for dynamic (lazy) loading layouts */
+ virtual void load(int layout_id) = 0;
+ virtual void unload() = 0;
+ virtual bool loaded(int layout_id) = 0;
+
+ /* Functions returning the SCL structure containing the information described in resource files */
+ virtual PSclInputModeConfigure get_input_mode_configure_table() = 0;
+ virtual PSclLayout get_layout_table() = 0;
+ virtual PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame() = 0;
+ virtual PSclModifierDecoration get_modifier_decoration_table() = 0;
+ virtual PSclLabelPropertiesTable get_label_properties_frame() = 0;
+ virtual PSclDefaultConfigure get_default_configure() = 0;
+ virtual PSclAutoPopupConfigure get_autopopup_configure() = 0;
+ virtual PSclMagnifierWndConfigure get_magnifier_configure() = 0;
+
+ /* Functions returning specific data described in resource files */
+ virtual int get_inputmode_id(const char* name) = 0;
+ virtual const char* get_inputmode_name(int id) = 0;
+ virtual int get_inputmode_size() = 0;
+ virtual int get_layout_id(const char* name) = 0;
+ virtual int get_layout_size() = 0;
+ virtual int get_labelproperty_size() = 0;
+ virtual int get_modifier_decoration_id(const char *name) = 0;
+ virtual bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info) = 0;
+
+ /* Function returning the name of current SclRes instance */
+ virtual const char* get_name() = 0;
+
+private:
+ std::string m_resource_directory;
+};
+}
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclres_manager.h"
+#include "xmlresource.h"
+#include "binary_xmlresource.h"
+#include <assert.h>
+#include "simple_debug.h"
+using namespace xmlresource;
+using namespace binary_xmlresource;
+using namespace sclres;
+#include "put_record.h"
+
+static sclres::SclRes *_current_parser = NULL;
+
+SclResParserManager::~SclResParserManager() {
+ _current_parser = NULL;
+ m_initialized = false;
+}
+
+SclResParserManager*
+SclResParserManager::get_instance() {
+ static SclResParserManager instance;
+ return &instance;
+}
+
+SclResParserManager::SclResParserManager() {
+ _current_parser = NULL;
+ m_initialized = false;
+}
+
+void
+SclResParserManager::init(const SCLParserType parser_type, const char *entry_filepath) {
+ if (!m_initialized) {
+ if (parser_type == SCL_PARSER_TYPE_XML) {
+ SCLLOG(SclLog::MESSAGE, "Use text xml\n");
+ _current_parser = XMLResource::get_instance();
+ } else if (parser_type == SCL_PARSER_TYPE_BINARY_XML) {
+ SCLLOG(SclLog::MESSAGE, "Use binary xml\n");
+ _current_parser = BinResource::get_instance();
+ }
+
+ /* Let's acquire the directory information from filepath */
+ std::string str = entry_filepath;
+ size_t found;
+ found = str.find_last_of("/\\");
+
+ std::string filepath = str.substr(0, found);
+ std::string filename = str.substr(found + 1);
+
+ //assert(_current_parser != NULL);
+ if (_current_parser != NULL) {
+ /* Assume the directory where the main entry file exists, is the default resource directory */
+ _current_parser->set_resource_directory(filepath.c_str());
+ _current_parser->init(filename.c_str());
+#ifdef __SCL_TXT_DEBUG
+ put_autopopup_configure(PARSER, *(_current_parser->get_autopopup_configure()));
+ put_default_configure(PARSER, *(_current_parser->get_default_configure()));
+ put_input_mode_configure_table(PARSER, _current_parser->get_input_mode_configure_table());
+ put_key_coordinate_frame(PARSER, _current_parser->get_key_coordinate_pointer_frame());
+ put_label_properties_frame(PARSER, _current_parser->get_label_properties_frame());
+ put_layout_table(PARSER, _current_parser->get_layout_table());
+ put_magnifier_wnd_configure(PARSER, *(_current_parser->get_magnifier_configure()));
+ put_modifier_decoration(PARSER, _current_parser->get_modifier_decoration_table());
+ //put_nine_patch_info(PARSER, _current_parser->get_nine_patch_file_list());
+#endif
+ }
+ m_initialized = true;
+ }
+}
+
+void
+SclResParserManager::load(int layout_id) {
+ if (_current_parser) {
+ _current_parser->load(layout_id);
+ }
+}
+
+void
+SclResParserManager::unload() {
+ if (_current_parser) {
+ _current_parser->unload();
+ }
+}
+
+bool
+SclResParserManager::loaded(int layout_id) {
+ if (_current_parser == NULL) return false;
+
+ return _current_parser->loaded(layout_id);
+}
+
+void
+SclResParserManager::reload() {
+ if (_current_parser) {
+ _current_parser->reload();
+ }
+}
+
+PSclInputModeConfigure
+SclResParserManager::get_input_mode_configure_table() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_input_mode_configure_table();
+}
+
+PSclLayout
+SclResParserManager::get_layout_table() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_layout_table();
+}
+
+PSclLayoutKeyCoordinatePointerTable
+SclResParserManager::get_key_coordinate_pointer_frame() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_key_coordinate_pointer_frame();
+}
+
+PSclModifierDecoration
+SclResParserManager::get_modifier_decoration_table() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_modifier_decoration_table();
+}
+
+PSclLabelPropertiesTable
+SclResParserManager::get_label_properties_frame() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_label_properties_frame();
+}
+
+PSclDefaultConfigure
+SclResParserManager::get_default_configure() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_default_configure();
+}
+
+PSclAutoPopupConfigure
+SclResParserManager::get_autopopup_configure() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_autopopup_configure();
+}
+
+PSclMagnifierWndConfigure
+SclResParserManager::get_magnifier_configure() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_magnifier_configure();
+}
+
+const char*
+SclResParserManager::get_resource_directory() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_resource_directory();
+}
+
+int
+SclResParserManager::get_inputmode_id(const char *name) {
+ if (_current_parser == NULL) return -1;
+
+ return _current_parser->get_inputmode_id(name);
+}
+
+const char*
+SclResParserManager::get_inputmode_name(int id) {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_inputmode_name(id);
+}
+
+int
+SclResParserManager::get_inputmode_size() {
+ if (_current_parser == NULL) return 0;
+
+ return _current_parser->get_inputmode_size();
+}
+
+int
+SclResParserManager::get_layout_size() {
+ if (_current_parser == NULL) return 0;
+
+ return _current_parser->get_layout_size();
+}
+
+int
+SclResParserManager::get_layout_id(const char *name) {
+ if (_current_parser == NULL) return -1;
+
+ return _current_parser->get_layout_id(name);
+}
+
+int
+SclResParserManager::get_labelproperty_size() {
+ if (_current_parser == NULL) return 0;
+
+ return _current_parser->get_labelproperty_size();
+}
+
+int
+SclResParserManager::get_modifier_decoration_id(const char *name) {
+ if (_current_parser == NULL) return -1;
+
+ return _current_parser->get_modifier_decoration_id(name);
+}
+
+bool
+SclResParserManager::get_nine_patch_info(const char *filename, SclNinePatchInfo *info) {
+ if (_current_parser == NULL) return false;
+
+ return _current_parser->get_nine_patch_info(filename, info);
+}
+
+const char*
+SclResParserManager::get_name() {
+ if (_current_parser == NULL) return NULL;
+
+ return _current_parser->get_name();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCLRES_MANAGER__
+#define __SCLRES_MANAGER__
+#include "sclres_type.h"
+
+class SclResParserManager{
+ public:
+ ~SclResParserManager();
+ static SclResParserManager* get_instance();
+
+ public:
+ void init(const SCLParserType parser_type, const char *entry_filepath);
+
+ /* These functions are for dynamic (lazy) loading layouts */
+ void load(int layout_id);
+ void unload();
+ bool loaded(int layout_id);
+
+ void reload();
+
+ PSclInputModeConfigure get_input_mode_configure_table();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+ PSclModifierDecoration get_modifier_decoration_table();
+ PSclLabelPropertiesTable get_label_properties_frame();
+ PSclDefaultConfigure get_default_configure();
+ PSclAutoPopupConfigure get_autopopup_configure();
+ PSclMagnifierWndConfigure get_magnifier_configure();
+
+ const char* get_resource_directory();
+ int get_inputmode_id(const char* name);
+ const char* get_inputmode_name(int id);
+ int get_inputmode_size();
+ int get_layout_size();
+ int get_layout_id(const char *name);
+ int get_labelproperty_size();
+ int get_modifier_decoration_id(const char *name);
+ bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info);
+
+ const char* get_name();
+ void destroy();
+
+ private:
+ SclResParserManager();
+ bool m_initialized;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCLRES_TYPE_H__
+#define __SCLRES_TYPE_H__
+
+#include "sclstructs.h"
+#include "sclresource.h"
+
+#define MAX_SCL_INPUT_MODE 128
+#define MAX_SCL_LAYOUT 128
+#define MAX_SCL_LABEL_PROPERTIES 128
+#define MAX_SCL_MODIFIER_DECORATION_NUM 64
+
+using namespace scl;
+
+typedef SclInputModeConfigure (*PSclInputModeConfigure);
+typedef SclLayout (*PSclLayout);
+
+typedef SclLayoutKeyCoordinate (*PSclLayoutKeyCoordinate);
+typedef SclLayoutKeyCoordinate (*PSclLayoutKeyCoordinateTable)[MAX_KEY];
+
+typedef SclLayoutKeyCoordinate (*SclLayoutKeyCoordinatePointer);
+typedef SclLayoutKeyCoordinatePointer (*PSclLayoutKeyCoordinatePointerTable)[MAX_KEY];
+
+typedef SclModifierDecoration (*PSclModifierDecoration);
+
+typedef SclLabelProperties (*PSclLabelProperties);
+typedef SclLabelProperties (*PSclLabelPropertiesTable)[MAX_SIZE_OF_LABEL_FOR_ONE];
+
+typedef SclDefaultConfigure (*PSclDefaultConfigure);
+typedef SclAutoPopupConfigure (*PSclAutoPopupConfigure);
+typedef SclMagnifierWndConfigure (*PSclMagnifierWndConfigure);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "sclresourcekeys.h"
+#include "sclresourcecache.h"
+#include "scldebug.h"
+#include "sclcontext.h"
+
+//#include "sclresource.h"
+#include "scluibuilder.h"
+#include "sclres_manager.h"
+#include <assert.h>
+#include <dlog.h>
+
+//Includes for CSCLKeyFocusHandler
+#include "sclkeyfocushandler.h"
+using namespace scl;
+
+CSCLResourceCache::CSCLResourceCache()
+{
+ SCL_DEBUG();
+
+ memset(mCurThemename, 0x00, sizeof(mCurThemename));
+
+ memset(&mCurBaseLayout, 0x00, sizeof(mCurBaseLayout));
+ memset(mCurPopupLayout, 0x00, sizeof(mCurPopupLayout));
+
+ memset(mCurBaseLayoutKeyCoordinates, 0x00, sizeof(mCurBaseLayoutKeyCoordinates));
+ memset(mCurPopupLayoutKeyCoordinates, 0x00, sizeof(mCurPopupLayoutKeyCoordinates));
+
+ memset(mCurBaseButtonContext, 0x00, sizeof(mCurBaseButtonContext));
+ memset(mCurPopupButtonContext, 0x00, sizeof(mCurPopupButtonContext));
+
+ mCurStartingCoordinates.x = 0;
+ mCurStartingCoordinates.y = 0;
+ mCurStartingCoordinatesOption = SCL_STARTING_COORDINATES_OPTION_ALL;
+}
+
+CSCLResourceCache::~CSCLResourceCache()
+{
+ SCL_DEBUG();
+}
+
+CSCLResourceCache*
+CSCLResourceCache::get_instance()
+{
+ static CSCLResourceCache instance;
+ return &instance;
+}
+
+
+sclboolean
+CSCLResourceCache::init()
+{
+ clear_private_keys();
+
+ resize_resource_elements_by_resolution();
+
+ mCurStartingCoordinates.x = 0;
+ mCurStartingCoordinates.y = 0;
+ mCurStartingCoordinatesOption = SCL_STARTING_COORDINATES_OPTION_ALL;
+
+ return TRUE;
+}
+
+/**
+ * Returns the current layout data
+ */
+const SclLayout*
+CSCLResourceCache::get_cur_layout(sclwindow window) const
+{
+ SCL_DEBUG();
+
+ const SclLayout *ret = NULL;
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (windows) {
+ if (windows->get_base_window() == window) {
+ ret = &mCurBaseLayout;
+ } else {
+ sclbyte popupindex = windows->find_popup_window_index(window);
+ scl_assert_return_false(popupindex < MAX_POPUP_WINDOW);
+ if (popupindex < MAX_POPUP_WINDOW) {
+ ret = &mCurPopupLayout[popupindex];
+ }
+ }
+ }
+ return ret;
+}
+
+/**
+ * Translates each key's x,y,width,height by the current screen resolution
+ * This func should be called when the class init / or after lazy loading
+ */
+sclboolean
+CSCLResourceCache::resize_layout_by_resolution(sclbyte layout_index, sclboolean resize_key_only)
+{
+ sclint innerLoop;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (utils && sclres_manager && context) {
+ const PSclDefaultConfigure sclres_default_configure = sclres_manager->get_default_configure();
+ const PSclLayout sclres_layout = sclres_manager->get_layout_table();
+ const PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame =
+ sclres_manager->get_key_coordinate_pointer_frame();
+
+ assert(sclres_default_configure != NULL);
+ assert(sclres_layout != NULL);
+ assert(sclres_layout_key_coordinate_pointer_frame != NULL);
+
+ sclboolean invert_display = FALSE;
+
+ if (sclres_default_configure->auto_detect_landscape) {
+ sclint width, height;
+ utils->get_screen_resolution(&width, &height);
+ /* If the width of screen is bigger than the height, switch portrait mode and landscape mode */
+ if (width > height && context->get_display_mode() == DISPLAYMODE_PORTRAIT) {
+ invert_display = TRUE;
+ }
+ }
+
+ sclfloat scale_value_x, scale_value_y;
+ if (invert_display) {
+ if (sclres_layout[layout_index].display_mode == DISPLAYMODE_PORTRAIT) {
+ scale_value_x = utils->get_scale_rate_y();
+ scale_value_y = utils->get_scale_rate_x();
+ } else {
+ scale_value_x = utils->get_scale_rate_x();
+ scale_value_y = utils->get_scale_rate_y();
+ }
+ } else {
+ if (sclres_layout[layout_index].display_mode == DISPLAYMODE_PORTRAIT) {
+ scale_value_x = utils->get_scale_rate_x();
+ scale_value_y = utils->get_scale_rate_y();
+ } else {
+ scale_value_x = utils->get_scale_rate_y();
+ scale_value_y = utils->get_scale_rate_x();
+ }
+ }
+
+ ///* FIXME : We should apply this constraint to other scaling routines also! */
+ ///* If the current screen resolution Y is bigger than our target height */
+ //if (scale_value_y > 1.0f) {
+ // /* And if we have to scale Y-axis more than the X-axis, limit the scale value to X-axis rate */
+ // if (scale_value_y > scale_value_x) {
+ // scale_value_y = scale_value_x;
+ // }
+ //} else if (scale_value_y < 1.0f) { /* Or current screen is smaller than our target resolution */
+ // /* And if we have to scale Y-axis more than the X-axis, limit the scale value to X-axis rate */
+ // if (scale_value_y < scale_value_x) {
+ // scale_value_y = scale_value_x;
+ // }
+ //}
+
+ if (!resize_key_only) {
+ sclres_layout[layout_index].width *= scale_value_x;
+ sclres_layout[layout_index].height *= scale_value_y;
+ }
+
+ for (innerLoop = 0;innerLoop < MAX_KEY;innerLoop++) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout_index][innerLoop];
+ if (p && p->valid) {
+ p->x *= scale_value_x;
+ p->y *= scale_value_y;
+ p->width *= scale_value_x;
+ p->height *= scale_value_y;
+ p->add_hit_left *= scale_value_x;
+ p->add_hit_right *= scale_value_x;
+ p->add_hit_top *= scale_value_y;
+ p->add_hit_bottom *= scale_value_y;
+ p->popup_relative_x *= scale_value_x;
+ p->popup_relative_y *= scale_value_y;
+ p->extract_offset_x *= scale_value_x;
+ p->extract_offset_y *= scale_value_y;
+ p->magnifier_offset_x *= scale_value_x;
+ p->magnifier_offset_y *= scale_value_y;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Translates the current x,y,width,height by the current screen resolution
+ * This func should be called when the class init
+ */
+sclboolean
+CSCLResourceCache::resize_resource_elements_by_resolution()
+{
+ sclint loop, innerLoop;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (utils && sclres_manager) {
+ const PSclDefaultConfigure sclres_default_configure = sclres_manager->get_default_configure();
+ const PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ const PSclModifierDecoration sclres_modifier_decoration = sclres_manager->get_modifier_decoration_table();
+ const PSclLabelPropertiesTable sclres_label_properties = sclres_manager->get_label_properties_frame();
+ const PSclAutoPopupConfigure sclres_autopopup_configure = sclres_manager->get_autopopup_configure();
+ const PSclMagnifierWndConfigure sclres_magnifier_configure = sclres_manager->get_magnifier_configure();
+
+ assert(sclres_default_configure != NULL);
+ assert(sclres_input_mode_configure != NULL);
+ assert(sclres_modifier_decoration != NULL);
+ assert(sclres_label_properties != NULL);
+ assert(sclres_autopopup_configure != NULL);
+ assert(sclres_magnifier_configure != NULL);
+
+ sclboolean invert_display = FALSE;
+
+ if (sclres_default_configure->auto_detect_landscape) {
+ sclint width, height;
+ utils->get_screen_resolution(&width, &height);
+ /* If the width of screen is bigger than the height, switch portrait mode and landscape mode */
+ if (width > height) {
+ invert_display = TRUE;
+ }
+ }
+
+ /* First we recalculate all the coordinates of each keys and sizes of layouts structure */
+ /* FIXME */
+ //for (loop = 0;loop < MAX_LAYOUT;loop++) {
+ for (loop = 0;loop < MAX_SCL_LAYOUT;loop++) {
+ resize_layout_by_resolution(loop);
+ }
+
+ /* And resize the font labels, adjusting the size of padding also */
+ /* FIXME */
+ //for (loop = 0;loop < MAX_LABEL_PROPERTIES;loop++) {
+ for (loop = 0;loop < MAX_SCL_LABEL_PROPERTIES;loop++) {
+ for (innerLoop = 0;innerLoop < MAX_SIZE_OF_LABEL_FOR_ONE;innerLoop++) {
+ if (sclres_label_properties[loop][innerLoop].valid)
+ sclres_label_properties[loop][innerLoop].font_size *= utils->get_smallest_scale_rate();
+ sclres_label_properties[loop][innerLoop].padding_x *= utils->get_smallest_scale_rate();
+ sclres_label_properties[loop][innerLoop].padding_y *= utils->get_smallest_scale_rate();
+ sclres_label_properties[loop][innerLoop].inner_width *= utils->get_smallest_scale_rate();
+ sclres_label_properties[loop][innerLoop].inner_height *= utils->get_smallest_scale_rate();
+ sclres_label_properties[loop][innerLoop].shadow_distance *= utils->get_smallest_scale_rate();
+ }
+ }
+
+ /* FIXME - Let's check if these variables also need to be calculated by AutoLandscapeDection */
+ sclres_autopopup_configure->decoration_size *= utils->get_smallest_scale_rate();
+ sclres_autopopup_configure->bg_padding *= utils->get_smallest_scale_rate();
+ sclres_autopopup_configure->button_spacing *= utils->get_smallest_scale_rate();
+ sclres_autopopup_configure->button_width *= utils->get_scale_rate_x();
+ sclres_autopopup_configure->button_height *= utils->get_scale_rate_y();
+
+ sclres_magnifier_configure->width *= utils->get_scale_rate_x();
+ sclres_magnifier_configure->height *= utils->get_scale_rate_y();
+ sclres_magnifier_configure->label_area_rect.left *= utils->get_scale_rate_x();
+ sclres_magnifier_configure->label_area_rect.right *= utils->get_scale_rate_x();
+ sclres_magnifier_configure->label_area_rect.top *= utils->get_scale_rate_y();
+ sclres_magnifier_configure->label_area_rect.bottom *= utils->get_scale_rate_y();
+ sclres_magnifier_configure->padding_x *= utils->get_scale_rate_x();
+ sclres_magnifier_configure->padding_y *= utils->get_scale_rate_y();
+
+ /* The size of magnifier window is fixed at initialization stage, so we need to change it
+ if the screen resolution has been changed. */
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ windows->resize_window(windows->get_magnifier_window(),
+ sclres_magnifier_configure->width, sclres_magnifier_configure->height);
+ }
+
+ if (invert_display) {
+ /* FIXME */
+ //for (loop = 0;loop < MAX_INPUT_MODE;loop++) {
+ for (loop = 0;loop < MAX_SCL_INPUT_MODE;loop++) {
+ sclchar *temp = sclres_input_mode_configure[loop].layouts[0];
+ sclres_input_mode_configure[loop].layouts[0] = sclres_input_mode_configure[loop].layouts[1];
+ sclres_input_mode_configure[loop].layouts[1] = temp;
+ }
+ /* FIXME */
+ //for (loop = 0;loop < MODIFIER_DECORATION_NUM;loop++) {
+ for (loop = 0;loop < MAX_SCL_MODIFIER_DECORATION_NUM;loop++) {
+ for (innerLoop = 0;innerLoop < KEY_MODIFIER_MAX;innerLoop++) {
+ sclchar *temp;
+ temp = sclres_modifier_decoration[loop].bg_image_path[0][innerLoop];
+ sclres_modifier_decoration[loop].bg_image_path[0][innerLoop] = sclres_modifier_decoration[loop].bg_image_path[1][innerLoop];
+ sclres_modifier_decoration[loop].bg_image_path[1][innerLoop] = temp;
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Changes the current key properties by the current screen resolution
+ * This func should be called when the class init
+ */
+sclboolean
+CSCLResourceCache::change_by_privatekey(const sclbyte input_mode_index, const sclbyte layout_index, const sclbyte key_index, SclLayoutKeyCoordinate* coordinate)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(coordinate);
+
+ if (coordinate) {
+ for (int loop = 0;loop < MAX_PRIVATE_KEY; loop++) {
+ if (mPrivateKeyProperties[loop].valid &&
+ !(mPrivateKeyProperties[loop].custom_id.empty()) && coordinate->custom_id) {
+ if (mPrivateKeyProperties[loop].custom_id.compare(coordinate->custom_id) == 0) {
+ /* sets the current properties to private key properties */
+ copy_from_privatekeyproperties(&mPrivateKeyProperties[loop], coordinate);
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Copys the given private properties data to the given key properties
+ */
+sclboolean
+CSCLResourceCache::copy_from_privatekeyproperties(const SclPrivateKeyProperties* privProperties, SclLayoutKeyCoordinate* coordinate)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(privProperties);
+ scl_assert_return_false(coordinate);
+
+ sclint loop;
+ sclint inner_loop;
+ if (privProperties && coordinate) {
+ /* Copy customizing-allowed properties only if those properties are valid */
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_LABEL_FOR_ONE;inner_loop++) {
+ if (!(privProperties->label[loop][inner_loop].empty())) {
+ if (coordinate->label_count < inner_loop + 1) {
+ coordinate->label_count = inner_loop + 1;
+ }
+ coordinate->label[loop][inner_loop] =
+ const_cast<sclchar*>(privProperties->label[loop][inner_loop].c_str());
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ if (!(privProperties->image_label_path[loop][inner_loop].empty())) {
+ coordinate->image_label_path[loop][inner_loop] =
+ const_cast<sclchar*>(privProperties->image_label_path[loop][inner_loop].c_str());
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ if (!(privProperties->bg_image_path[loop][inner_loop].empty())) {
+ coordinate->bg_image_path[loop][inner_loop] =
+ const_cast<sclchar*>(privProperties->bg_image_path[loop][inner_loop].c_str());
+ }
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (!(privProperties->key_value[loop][inner_loop].empty())) {
+ coordinate->key_value[loop][inner_loop] =
+ const_cast<sclchar*>(privProperties->key_value[loop][inner_loop].c_str());
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (privProperties->key_event[loop][inner_loop] != 0) {
+ coordinate->key_event[loop][inner_loop] =
+ privProperties->key_event[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (!(privProperties->hint_string[loop][inner_loop].empty())) {
+ coordinate->hint_string[loop][inner_loop] =
+ const_cast<sclchar*>(privProperties->hint_string[loop][inner_loop].c_str());
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Copys the given properties data to the given private key properties
+ */
+sclboolean
+CSCLResourceCache::copy_to_privatekeyproperties(const SclLayoutKeyCoordinate *coordinate, SclPrivateKeyProperties* privProperties)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(privProperties);
+ scl_assert_return_false(coordinate);
+
+ /* sets the current key Properties to private key privProperties */
+
+ sclint loop;
+ sclint inner_loop;
+ if (privProperties && coordinate) {
+ /* Configure */
+ if (coordinate->custom_id) {
+ privProperties->custom_id = coordinate->custom_id;
+ }
+ privProperties->button_type = coordinate->button_type;
+ privProperties->key_type = coordinate->key_type;
+ privProperties->popup_type = coordinate->popup_type;
+ privProperties->use_magnifier = coordinate->use_magnifier;
+ privProperties->use_long_key_magnifier = coordinate->use_long_key_magnifier;
+ if (coordinate->sound_style) {
+ privProperties->sound_style = coordinate->sound_style;
+ }
+ if (coordinate->vibe_style) {
+ privProperties->vibe_style = coordinate->vibe_style;
+ }
+
+ for (loop = 0;loop < SCL_DRAG_STATE_MAX;loop++) {
+ if (coordinate->popup_input_mode[loop]) {
+ privProperties->popup_input_mode[loop] = coordinate->popup_input_mode[loop];
+ }
+ }
+
+ /* Properties */
+ privProperties->label_count = coordinate->label_count;
+ privProperties->key_value_count = coordinate->key_value_count;
+ privProperties->long_key_type = coordinate->long_key_type;
+ if (coordinate->long_key_value) {
+ privProperties->long_key_value = coordinate->long_key_value;
+ }
+ privProperties->long_key_event = coordinate->long_key_event;
+ privProperties->use_repeat_key = coordinate->use_repeat_key;
+ privProperties->dont_close_popup = coordinate->dont_close_popup;
+ privProperties->extra_option = coordinate->extra_option;
+ if (coordinate->label_type) {
+ privProperties->label_type = coordinate->label_type;
+ }
+ if (coordinate->image_label_type) {
+ privProperties->image_label_type = coordinate->image_label_type;
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_LABEL_FOR_ONE;inner_loop++) {
+ if (coordinate->label[loop][inner_loop]) {
+ privProperties->label[loop][inner_loop] =
+ coordinate->label[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ if (coordinate->image_label_path[loop][inner_loop]) {
+ privProperties->image_label_path[loop][inner_loop] =
+ coordinate->image_label_path[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ if (coordinate->bg_image_path[loop][inner_loop]) {
+ privProperties->bg_image_path[loop][inner_loop] =
+ coordinate->bg_image_path[loop][inner_loop];
+ }
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (coordinate->key_value[loop][inner_loop]) {
+ privProperties->key_value[loop][inner_loop] =
+ coordinate->key_value[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (coordinate->key_event[loop][inner_loop]) {
+ privProperties->key_event[loop][inner_loop] =
+ coordinate->key_event[loop][inner_loop];
+ }
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ if (coordinate->autopopup_key_labels[loop][inner_loop]) {
+ privProperties->autopopup_key_labels[loop][inner_loop] =
+ coordinate->autopopup_key_labels[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ if (coordinate->autopopup_key_events[loop][inner_loop]) {
+ privProperties->autopopup_key_events[loop][inner_loop] =
+ coordinate->autopopup_key_events[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ if (coordinate->autopopup_key_values[loop][inner_loop]) {
+ privProperties->autopopup_key_values[loop][inner_loop] =
+ coordinate->autopopup_key_values[loop][inner_loop];
+ }
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ if (coordinate->hint_string[loop][inner_loop]) {
+ privProperties->hint_string[loop][inner_loop] =
+ coordinate->hint_string[loop][inner_loop];
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Copys the given private properties data to the other private properties
+ */
+sclboolean
+CSCLResourceCache::copy_privatekeyproperties(const SclPrivateKeyProperties* source, SclPrivateKeyProperties* target)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(source);
+ scl_assert_return_false(target);
+
+ sclint loop;
+ sclint inner_loop;
+ if (source && target) {
+ target->input_mode_index = source->input_mode_index;
+ target->layout_index = source->layout_index;
+ target->key_index = source->key_index;
+
+ /* Configure */
+ target->custom_id = source->custom_id;
+ target->button_type = source->button_type;
+ target->key_type = source->key_type;
+ target->popup_type = source->popup_type;
+ target->use_magnifier = source->use_magnifier;
+ target->use_long_key_magnifier = source->use_long_key_magnifier;
+ target->sound_style = source->sound_style;
+ target->vibe_style = source->vibe_style;
+
+ for (loop = 0;loop < SCL_DRAG_STATE_MAX;loop++) {
+ target->popup_input_mode[loop] = source->popup_input_mode[loop];
+ }
+
+ /* Properties */
+ target->label_count = source->label_count;
+ target->key_value_count = source->key_value_count;
+ target->long_key_type = source->long_key_type;
+ target->long_key_value = source->long_key_value;
+ target->long_key_event = source->long_key_event;
+ target->use_repeat_key = source->use_repeat_key;
+ target->dont_close_popup = source->dont_close_popup;
+ target->extra_option = source->extra_option;
+ target->label_type = source->label_type;
+ target->image_label_type = source->image_label_type;
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_LABEL_FOR_ONE;inner_loop++) {
+ target->label[loop][inner_loop] =
+ source->label[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ target->image_label_path[loop][inner_loop] =
+ source->image_label_path[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ target->bg_image_path[loop][inner_loop] =
+ source->bg_image_path[loop][inner_loop];
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ target->key_value[loop][inner_loop] =
+ source->key_value[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ target->key_event[loop][inner_loop] =
+ source->key_event[loop][inner_loop];
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ target->autopopup_key_labels[loop][inner_loop] =
+ source->autopopup_key_labels[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ target->autopopup_key_events[loop][inner_loop] =
+ source->autopopup_key_events[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ target->autopopup_key_values[loop][inner_loop] =
+ source->autopopup_key_values[loop][inner_loop];
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ target->hint_string[loop][inner_loop] =
+ source->hint_string[loop][inner_loop];
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Clears the given private properties data
+ */
+sclboolean
+CSCLResourceCache::clear_privatekeyproperties(SclPrivateKeyProperties* privProperties)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(privProperties);
+
+ /* sets the current key Properties to private key privProperties */
+
+ sclint loop;
+ sclint inner_loop;
+ if (privProperties) {
+ /* Configure */
+ privProperties->valid = FALSE;
+ privProperties->input_mode_index = NOT_USED;
+ privProperties->layout_index = NOT_USED;
+ privProperties->key_index = NOT_USED;
+
+ privProperties->custom_id.clear();
+ privProperties->button_type = BUTTON_TYPE_NORMAL;
+ privProperties->key_type = KEY_TYPE_NONE;
+ privProperties->popup_type = POPUP_TYPE_NONE;
+ privProperties->use_magnifier = FALSE;
+ privProperties->use_long_key_magnifier = FALSE;
+ privProperties->sound_style.clear();
+ privProperties->vibe_style.clear();
+
+ for (loop = 0;loop < SCL_DRAG_STATE_MAX;loop++) {
+ privProperties->popup_input_mode[loop].clear();
+ }
+
+ /* Properties */
+ privProperties->label_count = 0;
+ privProperties->key_value_count = 0;
+ privProperties->long_key_type = KEY_TYPE_NONE;
+ privProperties->long_key_value.clear();
+ privProperties->long_key_event = 0;
+ privProperties->use_repeat_key = FALSE;
+ privProperties->dont_close_popup = FALSE;
+ privProperties->extra_option = 0;
+ privProperties->label_type.clear();
+ privProperties->image_label_type.clear();
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_LABEL_FOR_ONE;inner_loop++) {
+ privProperties->label[loop][inner_loop].clear();
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ privProperties->image_label_path[loop][inner_loop].clear();
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < SCL_BUTTON_STATE_MAX;inner_loop++) {
+ privProperties->bg_image_path[loop][inner_loop].clear();
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ privProperties->key_value[loop][inner_loop].clear();
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ privProperties->key_event[loop][inner_loop] = 0;
+ }
+ }
+
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ privProperties->autopopup_key_labels[loop][inner_loop].clear();
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ privProperties->autopopup_key_events[loop][inner_loop] = 0;
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_AUTOPOPUP_STRING;inner_loop++) {
+ privProperties->autopopup_key_values[loop][inner_loop].clear();
+ }
+ }
+ for (loop = 0;loop < SCL_SHIFT_STATE_MAX;loop++) {
+ for (inner_loop = 0;inner_loop < MAX_SIZE_OF_MULTITAP_CHAR;inner_loop++) {
+ privProperties->hint_string[loop][inner_loop].clear();
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Adds a new private key
+ * It will update it to the current cache properties context because the application can call it anytime
+ * For adapting it in realtime, you should explicitly call the draw_button function.
+ *
+ * @param[out] fNeedInvalid It will return true if the current private can be adapt into the current display.
+ * @return id an array index of the private key
+ */
+sclint
+CSCLResourceCache::add_private_key(SclPrivateKeyProperties* privProperties, sclboolean *fNeedInvalid)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(privProperties);
+ sclint ret = NOT_USED;
+ *fNeedInvalid = FALSE; /* don't need to update now */
+
+ if (privProperties->custom_id.empty())
+ return ret;
+
+ /* Finds an index to be set */
+ sclint loop = 0;
+ for (loop = 0;loop < MAX_PRIVATE_KEY; loop++) {
+ if (mPrivateKeyProperties[loop].custom_id.compare(privProperties->custom_id) == 0) {
+ break;
+ }
+ }
+
+ if (loop == MAX_PRIVATE_KEY) {
+ for (loop = 0;loop < MAX_PRIVATE_KEY; loop++) {
+ if (mPrivateKeyProperties[loop].valid == FALSE) break;
+ }
+ if (loop == MAX_PRIVATE_KEY) {
+ LOGW("Out of buffer!! could not insert new private data into buffer");
+ return ret;
+ }
+ }
+
+ copy_privatekeyproperties(privProperties, &mPrivateKeyProperties[loop]);
+ mPrivateKeyProperties[loop].valid = TRUE;
+ ret = loop;
+
+ SclPrivateKeyProperties* newPrivProperties = &mPrivateKeyProperties[loop];
+
+ sclboolean found = FALSE;
+ for (loop = 0;loop < MAX_KEY; loop++) {
+ if ((!(newPrivProperties->custom_id.empty())) && mCurBaseLayoutKeyCoordinates[loop].custom_id) {
+ if (newPrivProperties->custom_id.compare(mCurBaseLayoutKeyCoordinates[loop].custom_id) == 0) {
+ /* sets the current properties to private key properties */
+ copy_from_privatekeyproperties(newPrivProperties, &mCurBaseLayoutKeyCoordinates[loop]);
+ found = TRUE;
+ }
+ }
+ }
+ if (found) {
+ *fNeedInvalid = TRUE;
+ return ret;
+ }
+
+#if 0
+ /* For popup layout */
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ for (int ploop = 0; ploop < MAX_POPUP_WINDOW; ploop++) {
+ layout = context->get_popup_layout(windows->get_nth_popup_window(ploop));
+ if (privProperties->input_mode_index == inputmode && privProperties->layout_index == layout) {
+ /* sets the current properties to private key properties */
+ copy_privatekeyproperties_to_keyproperties(privProperties, &mCurPopupLayoutKeyProperties[ploop][privProperties->key_index]);
+ return ret;
+ *fNeedInvalid = TRUE;
+ }
+ }
+#endif
+
+ return ret;
+}
+
+/**
+ * Removes the private data of the given id from SclPrivateKeyProperties buffer
+ */
+sclboolean
+CSCLResourceCache::remove_private_key(sclint id)
+{
+ SCL_DEBUG();
+ sclint loop;
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (!context || !utils) return FALSE;
+
+ /* resets the current properties to predefined properties */
+ sclshort layout = context->get_base_layout();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return FALSE;
+
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame =
+ sclres_manager->get_key_coordinate_pointer_frame();
+
+ if (sclres_layout_key_coordinate_pointer_frame == NULL) {
+ return FALSE;
+ }
+ if (scl_check_arrindex(layout, MAX_SCL_LAYOUT)) {
+ for (loop = 0;loop < MAX_KEY; loop++) {
+ if ((!(mPrivateKeyProperties[id].custom_id.empty())) && mCurBaseLayoutKeyCoordinates[loop].custom_id) {
+ if (mPrivateKeyProperties[id].custom_id.compare(mCurBaseLayoutKeyCoordinates[loop].custom_id) == 0) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout][loop];
+ if (p == NULL) {
+ continue;
+ }
+ SclLayoutKeyCoordinatePointer the_key = mCurBaseLayoutKeyCoordinates + loop;
+ if (the_key) {
+ memcpy(the_key, p, sizeof(SclLayoutKeyCoordinate));
+
+ /* Apply the custom scale rate value */
+ the_key->x *= utils->get_custom_scale_rate_x();
+ the_key->y *= utils->get_custom_scale_rate_y();
+ the_key->width *= utils->get_custom_scale_rate_x();
+ the_key->height *= utils->get_custom_scale_rate_y();
+ the_key->add_hit_left *= utils->get_custom_scale_rate_x();
+ the_key->add_hit_right *= utils->get_custom_scale_rate_x();
+ the_key->add_hit_top *= utils->get_custom_scale_rate_y();
+ the_key->add_hit_bottom *= utils->get_custom_scale_rate_y();
+ the_key->popup_relative_x *= utils->get_custom_scale_rate_x();
+ the_key->popup_relative_y *= utils->get_custom_scale_rate_y();
+ the_key->extract_offset_x *= utils->get_custom_scale_rate_x();
+ the_key->extract_offset_y *= utils->get_custom_scale_rate_y();
+ the_key->magnifier_offset_x *= utils->get_custom_scale_rate_x();
+ the_key->magnifier_offset_y *= utils->get_custom_scale_rate_y();
+
+ /* Apply the custom starting coordinates */
+ the_key->x += mCurStartingCoordinates.x;
+ the_key->y += mCurStartingCoordinates.y;
+ }
+ }
+ }
+ }
+ }
+
+ /* Shift all the privatekey properties to the left by 1, starting from the item next to the id th element */
+ for (loop = id;loop < MAX_PRIVATE_KEY - 1; loop++) {
+ copy_privatekeyproperties(&mPrivateKeyProperties[loop + 1], &mPrivateKeyProperties[loop]);
+ }
+ /* Clear the last element */
+ clear_privatekeyproperties(&mPrivateKeyProperties[MAX_PRIVATE_KEY - 1]);
+ return TRUE;
+}
+
+/**
+ * Clears all private keys
+ */
+sclboolean
+CSCLResourceCache::clear_private_keys()
+{
+ SCL_DEBUG();
+ for (sclint loop = 0; loop < MAX_PRIVATE_KEY;loop++) {
+ clear_privatekeyproperties(&mPrivateKeyProperties[loop]);
+ }
+ return TRUE;
+}
+
+/**
+ * Re-computes the cache data of the given window. The cache data has been including the current key properties, button context, layout etc,,
+ * Another role of this func is to adjust the current coordinate according to the current resolution.
+ * This func will be called when a newly window is created
+ */
+sclboolean
+CSCLResourceCache::recompute_layout(sclwindow window)
+{
+ SCL_DEBUG();
+
+ sclint loop;
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!windows || !context || !utils || !sclres_manager) return FALSE;
+
+ const PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ const PSclLayout sclres_layout = sclres_manager->get_layout_table();
+ const PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame =
+ sclres_manager->get_key_coordinate_pointer_frame();
+ const PSclModifierDecoration sclres_modifier_decoration = sclres_manager->get_modifier_decoration_table();
+ const PSclLabelPropertiesTable sclres_label_properties = sclres_manager->get_label_properties_frame();
+
+ if (!sclres_input_mode_configure || !sclres_layout || !sclres_layout_key_coordinate_pointer_frame ||
+ !sclres_modifier_decoration || !sclres_label_properties)
+ return FALSE;
+
+ /* FIXME */
+ scl8 popupindex = NOT_USED;
+
+ SclLayout *pCurLayout = NULL;
+ SclLayoutKeyCoordinate (*pCurLayoutKeyCoordinate)[MAX_KEY] = NULL;
+ SclButtonContext (*pCurButtonContext)[MAX_KEY] = NULL;
+
+ sclshort layout = NOT_USED;
+ if (windows && context && utils) {
+ sclbyte inputmode = context->get_input_mode();
+
+ if (windows->is_base_window(window)) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ layout = sclres_manager->get_layout_id(
+ sclres_input_mode_configure[inputmode].layouts[display_mode]);
+ if (layout != context->get_base_layout()) {
+ sclres_manager->unload();
+ }
+ if (!(sclres_manager->loaded(layout))) {
+ sclres_manager->load(layout);
+ resize_layout_by_resolution(layout);
+ }
+ SCLDisplayMode pair_mode = ((display_mode == DISPLAYMODE_PORTRAIT) ? DISPLAYMODE_LANDSCAPE : DISPLAYMODE_PORTRAIT);
+ sclshort pair_layout = sclres_manager->get_layout_id(
+ sclres_input_mode_configure[inputmode].layouts[pair_mode]);
+ if (!(sclres_manager->loaded(pair_layout))) {
+ sclres_manager->load(pair_layout);
+ resize_layout_by_resolution(pair_layout);
+ }
+ context->set_base_layout(layout);
+
+ pCurLayout = &mCurBaseLayout;
+ pCurLayoutKeyCoordinate = &mCurBaseLayoutKeyCoordinates;
+ pCurButtonContext = &mCurBaseButtonContext;
+ } else {
+ popupindex = windows->find_popup_window_index(window);
+ /* Check if the popup index is in valid range */
+ scl_assert_return_false(popupindex >= 0 && popupindex < MAX_POPUP_WINDOW);
+
+ layout = context->get_popup_layout(window);
+
+ if (!(sclres_manager->loaded(layout))) {
+ sclres_manager->load(layout);
+ resize_layout_by_resolution(layout);
+ }
+ context->set_popup_layout(window, layout);
+
+ if (popupindex >= 0 && popupindex < MAX_POPUP_WINDOW) {
+ if (!(windows->is_base_window(window))) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->inputmode != NOT_USED) {
+ inputmode = window_context->inputmode;
+ }
+ if (window_context->layout != NOT_USED) {
+ layout = window_context->layout;
+ }
+ }
+ }
+
+ pCurLayout = &mCurPopupLayout[popupindex];
+ pCurLayoutKeyCoordinate = &mCurPopupLayoutKeyCoordinates[popupindex];
+
+ pCurButtonContext = &mCurPopupButtonContext[popupindex];
+ }
+ }
+
+ if (pCurLayout && pCurLayoutKeyCoordinate && pCurButtonContext) {
+ memset(pCurButtonContext, 0x00, sizeof(SclButtonContext) * MAX_KEY);
+ /* If the layout index represents system-defined autopopup, generate layout and key properties data */
+ if (layout == SCL_LAYOUT_AUTOPOPUP) {
+ const SclLayoutKeyCoordinate *coordinate =
+ get_cur_layout_key_coordinate(context->get_cur_pressed_window(context->get_last_touch_device_id()),
+ context->get_cur_pressed_key(context->get_last_touch_device_id()));
+
+ generate_autopopup_layout(coordinate, pCurLayout, pCurLayoutKeyCoordinate, pCurButtonContext);
+ } else {
+ if (scl_check_arrindex(layout, MAX_SCL_LAYOUT)) {
+ memcpy(pCurLayout, &sclres_layout[layout], sizeof(SclLayout));
+
+ memset(pCurLayoutKeyCoordinate, 0x00, sizeof(SclLayoutKeyCoordinate) * (MAX_KEY));
+ for (int i = 0; i < MAX_KEY; ++i) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout][i];
+ if (!p) break;
+ memcpy((SclLayoutKeyCoordinatePointer)pCurLayoutKeyCoordinate + i, p, sizeof(SclLayoutKeyCoordinate));
+ }
+
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+ if (focus_handler) {
+ //reset navigation info
+ focus_handler->reset_key_navigation_info(window);
+ }
+ for (loop = 0;loop < MAX_KEY;loop++) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout][loop];
+ if (p && p->valid) {
+ if (focus_handler) {
+ //BUILDING KEY NAVIGATION INFO
+ focus_handler->update_key_navigation_info(window, loop, p);
+ }
+ //BUILDING KEY NAVIGATION INFO COMPLETED
+ (*pCurButtonContext)[loop].used = TRUE;
+ if (popupindex != NOT_USED) {
+ change_by_privatekey(inputmode, layout, loop, &(mCurPopupLayoutKeyCoordinates[popupindex][loop]));
+ } else {
+ change_by_privatekey(inputmode, layout, loop, &(mCurBaseLayoutKeyCoordinates[loop]));
+ }
+ /* if this button is UIITEM type, set the state of this button disabled */
+ if ((*pCurLayoutKeyCoordinate)[loop].button_type == BUTTON_TYPE_UIITEM) {
+ (*pCurButtonContext)[loop].state = BUTTON_STATE_DISABLED;
+ }
+
+ /* If this button's custom id is in the disabled key list, make it disabled */
+ sclboolean found = false;
+ if ((*pCurLayoutKeyCoordinate)[loop].custom_id) {
+ for (sclint inner_loop = 0;inner_loop < MAX_DISABLED_KEY;inner_loop++) {
+ if (!(mDisabledKeyList[inner_loop].empty())) {
+ if (mDisabledKeyList[inner_loop].compare(
+ (*pCurLayoutKeyCoordinate)[loop].custom_id) == 0) {
+ (*pCurButtonContext)[loop].state = BUTTON_STATE_DISABLED;
+ found = true;
+ }
+ }
+ }
+ }
+ if (!found) {
+ (*pCurButtonContext)[loop].state = BUTTON_STATE_NORMAL;
+ }
+ (*pCurButtonContext)[loop].toggled = FALSE;
+
+ /* Apply the custom scale rate value */
+ (*pCurLayoutKeyCoordinate)[loop].x *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].y *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].width *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].height *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].add_hit_left *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].add_hit_right *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].add_hit_top *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].add_hit_bottom *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].popup_relative_x *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].popup_relative_y *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].extract_offset_x *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].extract_offset_y *= utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinate)[loop].magnifier_offset_x *= utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinate)[loop].magnifier_offset_y *= utils->get_custom_scale_rate_y();
+
+ if (windows->is_base_window(window)) {
+ /* Apply the custom starting coordinates */
+ (*pCurLayoutKeyCoordinate)[loop].x += mCurStartingCoordinates.x;
+ (*pCurLayoutKeyCoordinate)[loop].y += mCurStartingCoordinates.y;
+ }
+ }
+ }
+
+ if (focus_handler) {
+ //finalize navigation info
+ focus_handler->finalize_key_navigation_info(window);
+ }
+ }
+
+ /* Apply the custom scale rate value */
+ (*pCurLayout).width *= utils->get_custom_scale_rate_x();
+ (*pCurLayout).height *= utils->get_custom_scale_rate_y();
+
+ (*pCurLayout).add_grab_left *= utils->get_custom_scale_rate_x();
+ (*pCurLayout).add_grab_right *= utils->get_custom_scale_rate_x();
+ (*pCurLayout).add_grab_top *= utils->get_custom_scale_rate_y();
+ (*pCurLayout).add_grab_bottom *= utils->get_custom_scale_rate_y();
+
+ (*pCurLayout).mouse_manipulate_x *= utils->get_custom_scale_rate_x();
+ (*pCurLayout).mouse_manipulate_y *= utils->get_custom_scale_rate_y();
+ }
+
+ /* Resize window */
+ if (windows->is_base_window(window)) {
+ windows->resize_window(window, mCurBaseLayout.width, mCurBaseLayout.height);
+ windows->resize_window(windows->get_dim_window(), mCurBaseLayout.width, mCurBaseLayout.height);
+ }
+
+ /* EFL testing */
+ if (window) {
+ windows->update_window(window);
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Returns the current key_coordinate data
+ */
+SclLayoutKeyCoordinate*
+CSCLResourceCache::get_cur_layout_key_coordinate(sclwindow window, sclbyte key_index)
+{
+ SCL_DEBUG();
+ scl_assert_return_null(key_index < MAX_KEY);
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return NULL;
+
+ if (windows->get_base_window() == window) {
+ if (key_index < MAX_KEY) {
+ return &mCurBaseLayoutKeyCoordinates[key_index];
+ }
+ } else {
+ sclbyte popupindex = windows->find_popup_window_index(window);
+ scl_assert_return_false(popupindex < MAX_POPUP_WINDOW);
+ if (key_index < MAX_KEY && popupindex < MAX_POPUP_WINDOW) {
+ return &mCurPopupLayoutKeyCoordinates[popupindex][key_index];
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * FIXME : This must be very SLOW - let's refine this function ASAP
+ * Returns the current label_properties data
+ */
+const SclLabelProperties*
+CSCLResourceCache::get_label_properties(sclchar *label_type, sclbyte index) const
+{
+ SCL_DEBUG();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return NULL;
+
+ PSclLabelPropertiesTable sclres_label_properties = sclres_manager->get_label_properties_frame();
+ assert(sclres_label_properties != NULL);
+ if (sclres_label_properties && label_type) {
+ /* FIXME */
+ //if (scl_check_arrindex(labeltype, MAX_LABEL_PROPERTIES) && scl_check_arrindex(index, MAX_SIZE_OF_LABEL_FOR_ONE)) {
+ for (sclshort labeltype = 0;
+ labeltype < MAX_SCL_LABEL_PROPERTIES && labeltype < sclres_manager->get_labelproperty_size();
+ labeltype++) {
+ if (sclres_label_properties[labeltype][0].label_type) {
+ if (strcmp(sclres_label_properties[labeltype][0].label_type, label_type) == 0) {
+ if (scl_check_arrindex_unsigned(index, MAX_SIZE_OF_LABEL_FOR_ONE)) {
+ return &sclres_label_properties[labeltype][index];
+ }
+ }
+ }
+ }
+ }
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils && label_type) {
+ utils->log("WARNING!!!!!!!!!!!!!!!!!! LABEL NAME %s COULD NOT BE FOUND!!!!!\n", label_type);
+ }
+
+ return NULL;
+}
+
+/**
+ * Returns the current button_context data
+ */
+SclButtonContext*
+CSCLResourceCache::get_cur_button_context(sclwindow window, sclbyte key_index)
+{
+ SCL_DEBUG();
+ scl_assert_return_null(key_index < MAX_KEY);
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (!windows) return NULL;
+
+ if (windows->get_base_window() == window) {
+ if (key_index < MAX_KEY) {
+ return &mCurBaseButtonContext[key_index];
+ }
+ } else {
+ sclbyte popupindex = windows->find_popup_window_index(window);
+ scl_assert_return_null(popupindex < MAX_POPUP_WINDOW);
+ if (key_index < MAX_KEY && popupindex < MAX_POPUP_WINDOW) {
+ return &mCurPopupButtonContext[popupindex][key_index];
+ }
+ }
+
+ return NULL;
+}
+
+/* Generate and fill autopopup layout data */
+void CSCLResourceCache::generate_autopopup_layout(const SclLayoutKeyCoordinate *coordinate,
+ SclLayout *pCurLayout, SclLayoutKeyCoordinate (*pCurLayoutKeyCoordinates)[MAX_KEY],
+ SclButtonContext (*pCurButtonContext)[MAX_KEY] )
+{
+ SCL_DEBUG();
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclAutoPopupConfigure autopopup_configure = NULL;
+ if (sclres_manager) {
+ autopopup_configure = sclres_manager->get_autopopup_configure();
+ }
+
+ int loop;
+ if (utils && context && coordinate && autopopup_configure) {
+ sclbyte num_keys, num_columns, num_rows;
+ sclint x, y, width, height;
+ SCLShiftState shift_index = context->get_shift_state();
+ if (shift_index >= SCL_SHIFT_STATE_MAX) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+ if (utils->get_autopopup_window_variables(coordinate->autopopup_key_labels[shift_index], &num_keys, &num_columns, &num_rows, &width, &height)) {
+ int row = 0, column = 0;
+
+ pCurLayout->use_magnifier_window = FALSE;
+ pCurLayout->valid = TRUE;
+ pCurLayout->style = LAYOUT_STYLE_POPUP_GRAB;
+ pCurLayout->name = NULL;
+ pCurLayout->width = width;
+ pCurLayout->height = height;
+ memset(pCurLayout->image_path, 0x00, sizeof(pCurLayout->image_path));
+ pCurLayout->use_sw_background = TRUE;
+ if (autopopup_configure->bg_image_path != NULL) {
+ pCurLayout->image_path[0] = autopopup_configure->bg_image_path;
+ pCurLayout->use_sw_background = FALSE;
+ }
+ pCurLayout->use_sw_button = TRUE;
+ /* If button image path is set, use images instead of SW buttons */
+ if (autopopup_configure->button_image_path[0] != NULL) {
+ pCurLayout->use_sw_button = FALSE;
+ }
+ pCurLayout->use_magnifier_window = FALSE;
+ pCurLayout->extract_background = FALSE;
+ pCurLayout->bg_color = autopopup_configure->bg_color;
+ pCurLayout->bg_line_width = autopopup_configure->bg_line_width * utils->get_smallest_custom_scale_rate();
+ pCurLayout->bg_line_color = autopopup_configure->bg_line_color;
+ pCurLayout->add_grab_left = autopopup_configure->add_grab_left * utils->get_custom_scale_rate_x();
+ pCurLayout->add_grab_right = autopopup_configure->add_grab_right * utils->get_custom_scale_rate_x();
+ pCurLayout->add_grab_top = autopopup_configure->add_grab_top * utils->get_custom_scale_rate_y();
+ pCurLayout->add_grab_bottom = autopopup_configure->add_grab_bottom * utils->get_custom_scale_rate_y();
+ pCurLayout->mouse_manipulate_x = 0;
+ pCurLayout->mouse_manipulate_y = (autopopup_configure->button_height * utils->get_custom_scale_rate_y() * -1);
+
+ memset((*pCurLayoutKeyCoordinates), 0x00, sizeof(SclLayoutKeyCoordinate) * MAX_KEY);
+
+ memset((*pCurButtonContext), 0x00, sizeof(SclButtonContext) * MAX_KEY);
+
+ int button_index = 0;
+
+ if (autopopup_configure->line_image_path &&
+ strlen(autopopup_configure->line_image_path) > 0) {
+ for (loop = 0;loop < num_columns - 1;loop++) {
+ if (button_index < MAX_KEY) {
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+
+ (*pCurLayoutKeyCoordinates)[button_index].x =
+ autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate() +
+ (autopopup_configure->button_width * utils->get_custom_scale_rate_x() * (loop + 1)) +
+ (autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate() * loop);
+ (*pCurLayoutKeyCoordinates)[button_index].y = pCurLayout->bg_line_width;
+ (*pCurLayoutKeyCoordinates)[button_index].width =
+ autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate();
+ (*pCurLayoutKeyCoordinates)[button_index].height = height - (pCurLayout->bg_line_width * 2);
+
+ (*pCurButtonContext)[button_index].used = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].button_type = BUTTON_TYPE_UIITEM;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][1] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][1] =
+ autopopup_configure->line_image_path;
+ button_index++;
+ }
+ }
+
+ for (loop = 0;loop < num_rows - 1;loop++) {
+ if (button_index < MAX_KEY) {
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+
+ (*pCurLayoutKeyCoordinates)[button_index].x = pCurLayout->bg_line_width;
+ (*pCurLayoutKeyCoordinates)[button_index].y =
+ autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate() +
+ (autopopup_configure->button_height * utils->get_custom_scale_rate_y() * (loop + 1)) +
+ (autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate() * loop);
+ (*pCurLayoutKeyCoordinates)[button_index].width = width - (pCurLayout->bg_line_width * 2);
+ (*pCurLayoutKeyCoordinates)[button_index].height =
+ autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate();
+
+ (*pCurButtonContext)[button_index].used = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].button_type = BUTTON_TYPE_UIITEM;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][1] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][1] =
+ autopopup_configure->line_image_path;
+ button_index++;
+ }
+ }
+ }
+
+ for (loop = 0;loop < (num_columns * num_rows) && button_index < MAX_KEY && loop < MAX_SIZE_OF_AUTOPOPUP_STRING;loop++) {
+ column = (loop % num_columns);
+ row = loop / num_columns;
+ x = autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate() +
+ (autopopup_configure->button_width * utils->get_custom_scale_rate_x() * column) +
+ (autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate() * column);
+ y = autopopup_configure->bg_padding * utils->get_smallest_custom_scale_rate() +
+ (autopopup_configure->button_height * utils->get_custom_scale_rate_y() * (num_rows - row - 1)) +
+ (autopopup_configure->button_spacing * utils->get_smallest_custom_scale_rate() * row);
+
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].x = x +
+ autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ (*pCurLayoutKeyCoordinates)[button_index].y = y +
+ autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ (*pCurLayoutKeyCoordinates)[button_index].width =
+ autopopup_configure->button_width * utils->get_custom_scale_rate_x();
+ (*pCurLayoutKeyCoordinates)[button_index].height =
+ autopopup_configure->button_height * utils->get_custom_scale_rate_y();
+ (*pCurLayoutKeyCoordinates)[button_index].popup_relative_x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].popup_relative_y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].extract_offset_x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].extract_offset_y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].sub_layout = NULL;
+
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ if (loop < num_keys) {
+ (*pCurLayoutKeyCoordinates)[button_index].button_type = BUTTON_TYPE_NORMAL;
+ } else {
+ (*pCurLayoutKeyCoordinates)[button_index].button_type = BUTTON_TYPE_UIITEM;
+ }
+ (*pCurLayoutKeyCoordinates)[button_index].key_type = KEY_TYPE_STRING;
+ (*pCurLayoutKeyCoordinates)[button_index].popup_type = POPUP_TYPE_NONE;
+ (*pCurLayoutKeyCoordinates)[button_index].use_magnifier = FALSE;
+ (*pCurLayoutKeyCoordinates)[button_index].use_long_key_magnifier = TRUE;
+ memset((*pCurLayoutKeyCoordinates)[button_index].popup_input_mode, NOT_USED, sizeof((*pCurLayoutKeyCoordinates)[loop].popup_input_mode));
+
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].label_count = 1;
+ if (context->get_caps_lock_mode()) {
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_OFF][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_ON][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_ON][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_OFF][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_LOCK][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_OFF][loop];
+ } else {
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_OFF][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_OFF][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_ON][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_ON][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].label[SCL_SHIFT_STATE_LOCK][0] =
+ coordinate->autopopup_key_labels[SCL_SHIFT_STATE_LOCK][loop];
+ }
+ //(*pCurLayoutKeyProperties)[loop].labelPropId = SCL_LABEL_PROPERTY_AUTOPOPUP;
+ (*pCurLayoutKeyCoordinates)[button_index].label_type = autopopup_configure->label_type;
+ memset((*pCurLayoutKeyCoordinates)[button_index].image_label_path, 0x00, sizeof((*pCurLayoutKeyCoordinates)[loop].image_label_path));
+ memset((*pCurLayoutKeyCoordinates)[button_index].bg_image_path, 0x00, sizeof((*pCurLayoutKeyCoordinates)[loop].bg_image_path));
+ for (int innerLoop = 0;innerLoop < SCL_BUTTON_STATE_MAX;innerLoop++) {
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[SCL_SHIFT_STATE_OFF][innerLoop] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[SCL_SHIFT_STATE_ON][innerLoop] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[SCL_SHIFT_STATE_LOCK][innerLoop] =
+ autopopup_configure->button_image_path[innerLoop];
+ }
+
+ (*pCurLayoutKeyCoordinates)[button_index].key_value_count = 1;
+
+ if (coordinate->autopopup_key_values[0][loop] == NULL) {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[0][0] = coordinate->autopopup_key_labels[0][loop];
+ } else {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[0][0] = coordinate->autopopup_key_values[0][loop];
+ }
+ if (coordinate->autopopup_key_values[1][loop] == NULL) {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[1][0] = coordinate->autopopup_key_labels[1][loop];
+ } else {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[1][0] = coordinate->autopopup_key_values[1][loop];
+ }
+ if (coordinate->autopopup_key_values[2][loop] == NULL) {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[2][0] = coordinate->autopopup_key_labels[2][loop];
+ } else {
+ (*pCurLayoutKeyCoordinates)[button_index].key_value[2][0] = coordinate->autopopup_key_values[2][loop];
+ }
+ (*pCurLayoutKeyCoordinates)[button_index].key_event[0][0] = coordinate->autopopup_key_events[0][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].key_event[1][0] = coordinate->autopopup_key_events[1][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].key_event[2][0] = coordinate->autopopup_key_events[2][loop];
+ (*pCurLayoutKeyCoordinates)[button_index].long_key_type = KEY_TYPE_NONE;
+ (*pCurLayoutKeyCoordinates)[button_index].long_key_value = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].long_key_event = 0;
+
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_labels[0][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_labels[1][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_labels[2][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_events[0][0] = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_events[1][0] = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_events[2][0] = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_values[0][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_values[1][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].autopopup_key_values[2][0] = NULL;
+ (*pCurLayoutKeyCoordinates)[button_index].extra_option = 0;
+
+ (*pCurButtonContext)[button_index].used = TRUE;
+ button_index++;
+ }
+
+ for (loop = 0;loop < MAX_WND_DECORATOR;loop++) {
+ if (button_index < MAX_KEY &&
+ autopopup_configure->decoration_image_path[loop] &&
+ strlen(autopopup_configure->decoration_image_path[loop]) > 0) {
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ int decoration_size = autopopup_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ switch (loop) {
+ case WND_DECORATOR_TOP_LEFT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ case WND_DECORATOR_TOP_CENTER:
+ (*pCurLayoutKeyCoordinates)[button_index].x = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].width = width - (2 * decoration_size);
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ case WND_DECORATOR_TOP_RIGHT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = width - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ case WND_DECORATOR_MIDDLE_LEFT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].y = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = height - (2 * decoration_size);
+ break;
+ case WND_DECORATOR_MIDDLE_CENTER:
+ (*pCurLayoutKeyCoordinates)[button_index].x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].y = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].width = width;
+ (*pCurLayoutKeyCoordinates)[button_index].height = height;
+ break;
+ case WND_DECORATOR_MIDDLE_RIGHT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = width - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].y = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = height - (2 * decoration_size);
+ break;
+ case WND_DECORATOR_BOTTOM_LEFT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = 0;
+ (*pCurLayoutKeyCoordinates)[button_index].y = height - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ case WND_DECORATOR_BOTTOM_CENTER:
+ (*pCurLayoutKeyCoordinates)[button_index].x = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].y = height - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].width = width - (2 * decoration_size);
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ case WND_DECORATOR_BOTTOM_RIGHT:
+ (*pCurLayoutKeyCoordinates)[button_index].x = width - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].y = height - decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].width = decoration_size;
+ (*pCurLayoutKeyCoordinates)[button_index].height = decoration_size;
+ break;
+ }
+
+ (*pCurButtonContext)[button_index].used = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].button_type = BUTTON_TYPE_UIITEM;
+ (*pCurLayoutKeyCoordinates)[button_index].valid = TRUE;
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[0][1] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][0] =
+ (*pCurLayoutKeyCoordinates)[button_index].bg_image_path[1][1] =
+ autopopup_configure->decoration_image_path[loop];
+ }
+ button_index++;
+ }
+ }
+ }
+}
+
+/**
+* Sets the current theme name
+*/
+sclboolean
+CSCLResourceCache::set_cur_themename(const sclchar *themename)
+{
+ if (themename) {
+ strncpy(mCurThemename, themename, _POSIX_PATH_MAX - 1);
+ mCurThemename[_POSIX_PATH_MAX - 1] = '\0';
+ }
+
+ return TRUE;
+}
+
+const sclchar*
+CSCLResourceCache::get_cur_themename()
+{
+ return mCurThemename;
+}
+
+/**
+ * Returns a template private key properties using key properties of the given context
+ */
+void
+CSCLResourceCache::clone_keyproperties(SclPrivateKeyProperties* priv, sclbyte input_mode_index, sclbyte layout_index, sclbyte key_index)
+{
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return;
+
+ const PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame = sclres_manager->get_key_coordinate_pointer_frame();
+
+ SCL_DEBUG();
+ if (priv && sclres_layout_key_coordinate_pointer_frame) {
+ clear_privatekeyproperties(priv);
+
+ /* gets the value of the previous key properties */
+ SclLayoutKeyCoordinate keyCoordinate;
+ memset(&keyCoordinate, 0x00, sizeof(keyCoordinate));
+ if (scl_check_arrindex_unsigned(layout_index, MAX_SCL_LAYOUT) &&
+ scl_check_arrindex_unsigned(key_index, MAX_KEY)) {
+ SclLayoutKeyCoordinatePointer p = sclres_layout_key_coordinate_pointer_frame[layout_index][key_index];
+ if (p) {
+ memcpy(&keyCoordinate, p, sizeof(SclLayoutKeyCoordinate));
+ }
+ }
+
+ scl_assert_return(keyCoordinate.valid == TRUE);
+
+ /* Sets the default properties base on the properties values of the given context */
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ cache->copy_to_privatekeyproperties(&keyCoordinate, priv);
+ }
+ }
+}
+
+/**
+ * Sets a private key to the current context
+ *
+ * @Usage
+ * SclPrivateKeyProperties privProperties;
+ * gCore->clone_keyproperties(&privProperties, INPUT_MODE_NUMBER, LYT_PORTRAIT_NOW_3x4, 0);
+ * // change
+ * gCore->set_private_key(&privProperties, TRUE);
+ */
+sclint
+CSCLResourceCache::set_private_key(SclPrivateKeyProperties* properties, sclboolean fRedraw, sclboolean fPendingUpdate)
+{
+ SCL_DEBUG();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ sclint privateId = NOT_USED;
+ sclboolean isNeedUpdate = FALSE;
+ if (cache && context && properties) {
+ privateId = cache->add_private_key(properties, &isNeedUpdate);
+ if (fRedraw && isNeedUpdate && !fPendingUpdate && privateId != NOT_USED) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ /* Fix me (we should consider popupwindow later)*/
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+ return privateId;
+}
+
+/**
+ * Sets a private key to the current context
+ * The other properties except given parameters will keep to the original value.
+ * @Usage
+ * gCore->set_private_key(INPUT_MODE_NUMBER, LYT_PORTRAIT_NOW_3x4, 0, "private", 999, TRUE);
+ *
+ * @param fRedraw If true, it will redraw the current key
+ */
+sclint
+CSCLResourceCache::set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean fRedraw, sclboolean fPendingUpdate)
+{
+ SCL_DEBUG();
+
+ SclPrivateKeyProperties privProperties;
+ clear_privatekeyproperties(&privProperties);
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (!sclres_manager) return NOT_USED;
+
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame = sclres_manager->get_key_coordinate_pointer_frame();
+ assert(sclres_layout_key_coordinate_pointer_frame != NULL);
+
+ sclint loop;
+
+ privProperties.valid = TRUE;
+ privProperties.custom_id = custom_id;
+
+ privProperties.key_event[SCL_SHIFT_STATE_LOCK][0] = privProperties.key_event[SCL_SHIFT_STATE_ON][0] =
+ privProperties.key_event[SCL_SHIFT_STATE_OFF][0] = key_event;
+ if (label) {
+ privProperties.label[SCL_SHIFT_STATE_LOCK][0] = label;
+ privProperties.label[SCL_SHIFT_STATE_ON][0] = label;
+ privProperties.label[SCL_SHIFT_STATE_OFF][0] = label;
+ }
+ if (key_value) {
+ privProperties.key_value[SCL_SHIFT_STATE_LOCK][0] = privProperties.key_value[SCL_SHIFT_STATE_ON][0] =
+ privProperties.key_value[SCL_SHIFT_STATE_OFF][0] = key_value;
+ }
+ if (imagelabel) {
+ for (loop =0;loop < SCL_BUTTON_STATE_MAX;loop++) {
+ if (imagelabel[loop])
+ privProperties.image_label_path[SCL_SHIFT_STATE_LOCK][loop] =
+ privProperties.image_label_path[SCL_SHIFT_STATE_ON][loop] =
+ privProperties.image_label_path[SCL_SHIFT_STATE_OFF][loop] = imagelabel[loop];
+ }
+ }
+ if (imagebg) {
+ for (loop =0;loop < SCL_BUTTON_STATE_MAX;loop++) {
+ if (imagebg[loop]) {
+ privProperties.bg_image_path[SCL_SHIFT_STATE_LOCK][loop] =
+ privProperties.bg_image_path[SCL_SHIFT_STATE_ON][loop] =
+ privProperties.bg_image_path[SCL_SHIFT_STATE_OFF][loop] = imagebg[loop];
+ }
+ }
+ }
+ return set_private_key(&privProperties, fRedraw, fPendingUpdate);
+}
+
+/**
+* Unset private key for specific key
+* @Usage
+* gCore->unset_private_key(INPUT_MODE_NUMBER, LYT_PORTRAIT_NOW_3x4, 0);
+*/
+void
+CSCLResourceCache::unset_private_key(sclshort input_mode_index, sclbyte layout_index, sclbyte key_index)
+{
+ sclint loop = 0;
+ for (loop = 0;loop < MAX_PRIVATE_KEY; loop++) {
+ if ((mPrivateKeyProperties[loop].input_mode_index == input_mode_index) &&
+ mPrivateKeyProperties[loop].layout_index == layout_index &&
+ mPrivateKeyProperties[loop].key_index == key_index) {
+ remove_private_key(loop);
+ }
+ }
+}
+
+/**
+* Unset private by custom_id, effective when removing all private keys with same custom_id
+* @Usage
+* gCore->unset_private_key(3);
+*/
+void
+CSCLResourceCache::unset_private_key(const sclchar* custom_id)
+{
+ int loop;
+ if (custom_id) {
+ for (loop = 0;loop < MAX_PRIVATE_KEY;loop++) {
+ if (mPrivateKeyProperties[loop].valid &&
+ mPrivateKeyProperties[loop].custom_id.compare(custom_id) == 0) {
+ remove_private_key(loop);
+ }
+ }
+ }
+}
+
+/**
+* Enable/disable button for handling mouse events
+*/
+void CSCLResourceCache::enable_button(const sclchar *custom_id, sclboolean enabled)
+{
+ SCL_DEBUG();
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!windows || !context || !sclres_manager) return;
+
+ sclint loop;
+ if (custom_id) {
+ sclbyte layout_index = NOT_USED;
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame =
+ sclres_manager->get_key_coordinate_pointer_frame();
+ if (!sclres_layout_key_coordinate_pointer_frame) return;
+
+ if (context) {
+ layout_index = context->get_base_layout();
+ }
+ if (scl_check_arrindex_unsigned(layout_index, MAX_SCL_LAYOUT)) {
+ for (loop = 0;loop < MAX_KEY;loop++) {
+ SclLayoutKeyCoordinatePointer p =
+ sclres_layout_key_coordinate_pointer_frame[layout_index][loop];
+ if (!p || !(p->valid)) break;
+ if (p->custom_id) {
+ if (strcmp(p->custom_id, custom_id) == 0) {
+ if (enabled) {
+ mCurBaseButtonContext[loop].state = BUTTON_STATE_NORMAL;
+ } else {
+ mCurBaseButtonContext[loop].state = BUTTON_STATE_DISABLED;
+ }
+ }
+ }
+ }
+ }
+
+ /* Fix me (we should decide by which way we would redraw the button's region - direct or indirect?)*/
+ if (windows) {
+ windows->update_window(windows->get_base_window());
+ }
+
+ sclboolean found = FALSE;
+ sclint empty_index = -1;
+
+ for (loop = 0;loop < MAX_DISABLED_KEY;loop++) {
+ if (!(mDisabledKeyList[loop].empty())) {
+ if (mDisabledKeyList[loop].compare(custom_id) == 0) {
+ if (enabled) {
+ /* Erase this item from the disabled key list */
+ mDisabledKeyList[loop].clear();
+ }
+ found = TRUE;
+ }
+ } else {
+ empty_index = loop;
+ }
+ }
+
+ if (!found) {
+ if (!enabled) {
+ if (scl_check_arrindex(empty_index, MAX_DISABLED_KEY)) {
+ /* Add to the disabled key */
+ mDisabledKeyList[empty_index] = custom_id;
+ }
+ }
+ }
+ }
+}
+
+/**
+* Get geometry information of a button with given custom_id
+*/
+sclboolean CSCLResourceCache::get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle)
+{
+ SCL_DEBUG();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!context || !sclres_manager) return FALSE;
+
+ sclint loop;
+ if (custom_id && rectangle) {
+ sclbyte layout_index = NOT_USED;
+ PSclLayoutKeyCoordinatePointerTable sclres_layout_key_coordinate_pointer_frame =
+ sclres_manager->get_key_coordinate_pointer_frame();
+ if (!sclres_layout_key_coordinate_pointer_frame) return FALSE;
+
+ if (context) {
+ layout_index = context->get_base_layout();
+ }
+ if (scl_check_arrindex_unsigned(layout_index, MAX_SCL_LAYOUT)) {
+ for (loop = 0;loop < MAX_KEY;loop++) {
+ SclLayoutKeyCoordinatePointer p = &mCurBaseLayoutKeyCoordinates[loop];
+ if (!p || !(p->valid)) break;
+ if (p->custom_id) {
+ if (strcmp(p->custom_id, custom_id) == 0) {
+ rectangle->x = p->x;
+ rectangle->y = p->y;
+ rectangle->width = p->width;
+ rectangle->height = p->height;
+
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+sclboolean
+CSCLResourceCache::set_string_substitution(const sclchar *original, const sclchar *substitute)
+{
+ if (original && substitute) {
+ if (mStringSubstitutor[std::string(original)].compare(substitute) == 0) {
+ return false;
+ }
+ mStringSubstitutor[std::string(original)] = std::string(substitute);
+ }
+ return true;
+}
+
+void
+CSCLResourceCache::unset_string_substitution(const sclchar *original)
+{
+ if (original) {
+ mStringSubstitutor.erase(std::string(original));
+ }
+}
+
+const sclchar*
+CSCLResourceCache::find_substituted_string(const sclchar *original)
+{
+ const sclchar* ret = original;
+
+ if (original) {
+ std::map<std::string, std::string>::iterator iter = mStringSubstitutor.find(std::string(original));
+ if (iter != mStringSubstitutor.end()) {
+ ret = iter->second.c_str();
+ }
+ }
+
+ return ret;
+}
+
+void
+CSCLResourceCache::set_custom_starting_coordinates(sclint x, sclint y)
+{
+ mCurStartingCoordinates.x = x;
+ mCurStartingCoordinates.y = y;
+}
+
+SclPoint
+CSCLResourceCache::get_custom_starting_coordinates()
+{
+ return mCurStartingCoordinates;
+}
+
+void
+CSCLResourceCache::set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option)
+{
+ mCurStartingCoordinatesOption = option;
+}
+
+SCLStartingCoordinatesOption
+CSCLResourceCache::get_custom_starting_coordinates_option()
+{
+ return mCurStartingCoordinatesOption;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclgwes.h"
+#include "sclutils.h"
+#include "sclresource.h"
+
+#ifndef __SCL_RESOURCE_CACHE_H__
+#define __SCL_RESOURCE_CACHE_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+typedef struct _SclButtonContext {
+ sclboolean used;
+ sclbyte multitap_index;
+ sclboolean toggled;
+ SCLButtonState state;
+} SclButtonContext;
+/**
+* @brief The class to store current state of key layout
+*
+* This class implements all functions for working as a soft-based keyboard
+* In side of ISE developer, they can modify it by their requirements.
+*/
+class CSCLResourceCache
+{
+private:
+ CSCLResourceCache();
+
+public:
+ virtual ~CSCLResourceCache();
+
+ static CSCLResourceCache* get_instance();
+
+ sclboolean init();
+ sclboolean recompute_layout(sclwindow window);
+
+ const SclLayout* get_cur_layout(sclwindow window) const;
+ SclLayoutKeyCoordinate* get_cur_layout_key_coordinate(sclwindow window, sclbyte key_index);
+
+ const SclLabelProperties* get_label_properties(sclchar *label_type, sclbyte index) const;
+
+ SclButtonContext* get_cur_button_context(sclwindow window, sclbyte key_index);
+
+ sclboolean clear_private_keys();
+ sclint add_private_key(SclPrivateKeyProperties* properties, sclboolean *fNeedInvalid);
+ sclboolean remove_private_key(sclint id);
+
+ sclboolean copy_from_privatekeyproperties(const SclPrivateKeyProperties* privProperties, SclLayoutKeyCoordinate* coordinate);
+ sclboolean copy_to_privatekeyproperties(const SclLayoutKeyCoordinate *coordinate, SclPrivateKeyProperties* privProperties);
+ sclboolean copy_privatekeyproperties(const SclPrivateKeyProperties* source, SclPrivateKeyProperties* target);
+ sclboolean clear_privatekeyproperties(SclPrivateKeyProperties* privProperties);
+
+ sclboolean set_cur_themename(const sclchar *themename);
+ const sclchar* get_cur_themename();
+
+ sclint set_private_key(SclPrivateKeyProperties* properties, sclboolean fRedraw, sclboolean fPendingUpdate);
+ sclint set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean fRedraw, sclboolean fPendingUpdate);
+ void unset_private_key(sclshort input_mode_index, sclbyte layout_index, sclbyte key_index);
+ void unset_private_key(const sclchar* custom_id);
+
+ void clone_keyproperties(SclPrivateKeyProperties* priv, sclbyte input_mode_index, sclbyte layout_index, sclbyte key_index);
+
+ void enable_button(const sclchar* custom_id, sclboolean enabled);
+ sclboolean get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle);
+
+ sclboolean set_string_substitution(const sclchar *original, const sclchar *substitute);
+ void unset_string_substitution(const sclchar *original);
+ const sclchar* find_substituted_string(const sclchar *original);
+
+ void set_custom_starting_coordinates(sclint x, sclint y);
+ SclPoint get_custom_starting_coordinates();
+
+ void set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option);
+ SCLStartingCoordinatesOption get_custom_starting_coordinates_option();
+
+ sclboolean resize_resource_elements_by_resolution();
+private:
+ sclboolean resize_layout_by_resolution(sclbyte layout_index, sclboolean resize_key_only = FALSE);
+ sclboolean change_by_privatekey(const sclbyte input_mode_index, const sclbyte layout_index, const sclbyte key_index, SclLayoutKeyCoordinate* coordinate);
+
+ void generate_autopopup_layout(const SclLayoutKeyCoordinate *coordinate,
+ SclLayout *pCurLayout,
+ SclLayoutKeyCoordinate (*pCurLayoutKeyCoordinates)[MAX_KEY],
+ SclButtonContext (*pCurButtonContext)[MAX_KEY]);
+
+protected:
+ SclLayout mCurBaseLayout;
+ SclLayoutKeyCoordinate mCurBaseLayoutKeyCoordinates[MAX_KEY];
+
+ SclButtonContext mCurBaseButtonContext[MAX_KEY];
+
+ SclLayout mCurPopupLayout[MAX_POPUP_WINDOW];
+ SclLayoutKeyCoordinate mCurPopupLayoutKeyCoordinates[MAX_POPUP_WINDOW][MAX_KEY];
+
+ SclButtonContext mCurPopupButtonContext[MAX_POPUP_WINDOW][MAX_KEY];
+
+ SclPrivateKeyProperties mPrivateKeyProperties[MAX_PRIVATE_KEY];
+ std::string mDisabledKeyList[MAX_DISABLED_KEY];
+ std::map<std::string, std::string> mStringSubstitutor;
+
+ sclchar mCurThemename[_POSIX_PATH_MAX];
+
+ SclPoint mCurStartingCoordinates;
+ SCLStartingCoordinatesOption mCurStartingCoordinatesOption;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <string>
+#include "scltypes.h"
+#include "sclconfig.h"
+
+#ifndef __SCL_STRUCTS_H__
+#define __SCL_STRUCTS_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+/**
+ *@brief SCL input mode configuration structure, which indicates a type of SW keyboard
+ */
+typedef struct _SclInputModeConfigure {
+ sclchar* name; /* Name of this inputmode */
+ sclchar* layouts[DISPLAYMODE_MAX]; /* This contains the filename of each layouts */
+ sclboolean use_virtual_window; /* Whether to use a new window or make a popup window as a layer of existing base window */
+ sclboolean use_dim_window; /* Whether to use a dim window */
+ sclint timeout; /* fTimeout seconds of idle state will close this popup window. Set 0 to disable */
+}SclInputModeConfigure;
+
+/**
+ *@brief SCL Layout structure, which is a physical keyboard representation defined by a group of SclLayoutKeyCoordinates
+ */
+typedef struct _SclLayout {
+ sclboolean valid; /* Indicates whether this information is in use or not */
+
+ sclchar* name; /* Name of this layout */
+ SCLDisplayMode display_mode; /* Indicates whether this layout is for portrait mode or landscape display */
+ SCLLayoutStyle style; /* Desribes the style of this layout */
+
+ sclshort width; /* Width of this layout */
+ sclshort height; /* Height of this layout*/
+
+ sclboolean use_sw_button; /* Whether to draw buttons by SW or not */
+ sclboolean use_magnifier_window; /* Whether to use magnifier window or not */
+ sclboolean extract_background; /* Whether to display only some part of background image */
+
+ sclshort key_width; /* Default width of key */
+ sclshort key_height; /* Default height of keys */
+ sclshort key_spacing; /* Default spacing amount between keys */
+ sclshort row_spacing; /* Default spacing amount between rows */
+
+ sclshort add_hit_left; /* Left value for expanded hit area */
+ sclshort add_hit_right; /* Right value for expanded hit area */
+ sclshort add_hit_top; /* Left value for expanded hit area */
+ sclshort add_hit_bottom; /* Left value for expanded hit area */
+
+ sclboolean use_sw_background; /* Whether to draw background by SW or not */
+ SclColor bg_color; /* If drawn by SW, describes the background color */
+ scldouble bg_line_width; /* If drawn by SW, describes the background border width */
+ SclColor bg_line_color; /* If drawn by SW, describes the background border color */
+
+ sclshort add_grab_left; /* If this layout's style is POPUP_GRAB, desribes the left pixel for grab area */
+ sclshort add_grab_right; /* If this layout's style is POPUP_GRAB, desribes the right pixel for grab area */
+ sclshort add_grab_top; /* If this layout's style is POPUP_GRAB, desribes the top pixel for grab area */
+ sclshort add_grab_bottom; /* If this layout's style is POPUP_GRAB, desribes the bottom pixel for grab area */
+
+ sclshort mouse_manipulate_x; /* The X-point that this layout needs to manipulate the position of mouse event */
+ sclshort mouse_manipulate_y; /* The Y-point that this layout needs to manipulate the position of mouse event */
+
+ /* Background image of each button state */
+ sclchar* image_path[SCL_BUTTON_STATE_MAX];
+
+ /* Default background images for keys */
+ sclchar* key_background_image[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+
+ sclchar* sound_style; /* A default sound feedback style when buttons are clicked */
+ sclchar* vibe_style; /* A default vibration feedback style when this buttons are clicked */
+ sclchar* label_type; /* Default label property type for specifying the appearance of label strings */
+
+ /* If the button should be displayed differently depending on the modifier, describe a decorator and provide its ID here */
+ sclchar* modifier_decorator;
+}SclLayout;
+
+/**
+ *@brief SCL Layout key coordinate structure, which represents a key's position-related information
+ */
+typedef struct _SclLayoutKeyCoordinate {
+ sclboolean valid; /* Indicates whether this information is in use or not */
+ sclshort x; /* X coordinate of this button */
+ sclshort y; /* Y coordinate of this button */
+ sclshort width; /* Width of this button */
+ sclshort height; /* Height of this button */
+ sclshort add_hit_left; /* Left value for expanded hit area */
+ sclshort add_hit_right; /* Right value for expanded hit area */
+ sclshort add_hit_top; /* Left value for expanded hit area */
+ sclshort add_hit_bottom; /* Left value for expanded hit area */
+ sclshort popup_relative_x; /* Relative X offset for popup window */
+ sclshort popup_relative_y; /* Relative Y offset for popup window */
+ sclshort extract_offset_x; /* If the popup layout has ExtractBG, this value provides the X offset inside the BG image */
+ sclshort extract_offset_y; /* If the popup layout has ExtractBG, this value provides the Y offset inside the BG image */
+ sclchar* sub_layout; /* Indicates which sublayout this button belongs to */
+ sclshort magnifier_offset_x; /* Relative X offset for magnifier window */
+ sclshort magnifier_offset_y; /* Relative Y offset for magnifier window */
+
+ sclchar* custom_id; /* A value for indentifying a button when handling private keys or disable key. */
+ SCLButtonType button_type; /* Indicates the behavioral type of this button */
+ SCLKeyType key_type; /* Delivered key type when the button event is emitted */
+ SCLPopupType popup_type; /* Popup type when this button is activated */
+ sclboolean use_magnifier; /* Indicates whether this button needs to display magnifier window when clicked */
+ sclboolean use_long_key_magnifier; /* Indicates whether this button needs to display magnifier window when long-pressed */
+ /* Popup inputmode IDs depending on the direction of the drag action */
+ sclchar* popup_input_mode[SCL_DRAG_STATE_MAX];
+ sclchar* sound_style; /* A sound feedback style when this button is clicked */
+ sclchar* vibe_style; /* A vibration feedback style when this button is clicked */
+ sclboolean is_side_button; /* Indicates whether this button is located on the very left or right of the layout */
+
+ sclbyte label_count; /* Number of labels for this button (Max value :MAX_SIZE_OF_LABEL_FOR_ONE )*/
+ /* Label strings depending on the shift state */
+ sclchar* label[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_LABEL_FOR_ONE];
+ sclchar* label_type; /* Label propery name for specifying the appearance of label strings */
+ /* image_path for the case of image label */
+ sclchar* image_label_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ sclchar* image_label_type; /* Label propery name for specifying the appearance of image labels */
+ /* If bg_image_path is NULL, background will not be drawn. If "", layout image will be used instead */
+ /* image_path for the button's background */
+ sclchar* bg_image_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ sclbyte key_value_count; /* Number of key events in case of multitap or rotation button */
+ /* A string value delivered to ISE when clicked */
+ sclchar* key_value[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+ /* A long int value delivered to ISE when clicked */
+ sclulong key_event[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+ SCLKeyType long_key_type; /* A key type delivered to ISE when long key clicked */
+ sclchar* long_key_value; /* A string value delivered to ISE when long key clicked */
+ sclulong long_key_event; /* A long int value delivered to ISE when long key clicked */
+ sclboolean use_repeat_key; /* Indicates whether this button allows repeated key events when pressed for a long time */
+ /* optional */
+ /* A string of candidate characters that will be shown in an autopopup window */
+ sclchar* autopopup_key_labels[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ sclulong autopopup_key_events[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ sclchar* autopopup_key_values[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ /* When set, any events raised from this button will not close opened popup window */
+ sclboolean dont_close_popup;
+ /* Extra options for each types of buttons :
+ BUTTON_TYPE_ROTATION - Set to 1 if the button should return to initial state when other key is pressed
+ BUTTON_TYPE_DIRECTION -
+ use definitions below, that are declared in sclconfig.h file
+
+ #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS 0
+ #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS 1
+ #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_LONG 2
+ #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG 3
+ #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN 4
+ #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN 5
+ #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE 6
+ */
+ sclbyte extra_option;
+ sclbyte multitouch_type; /* Indicates what kind of multitouch type this button supports */
+ /* If the button should be displayed differently depending on the modifier, describe a decorator and provide its ID here */
+ sclchar* modifier_decorator;
+ /* For the case if this button needs to display multiple labels or different string from the label string */
+ sclchar* magnifier_label[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_LABEL_FOR_ONE];
+
+ sclchar* hint_string[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+}SclLayoutKeyCoordinate;
+
+///**
+//*@brief SCL Layout keyset structure, indicates which keyset should be used for specific inputmode and layout combination
+//*/
+//typedef struct _SclLayoutKeyset {
+// sclint inputmodeID; /* Target inputmode ID */
+// sclint layoutID; /* Target layout ID */
+// sclint keysetID; /* Keyset ID that should be selected when the above inputmodeID and layoutID are given */
+// sclboolean popupEntry; /* Whether this entry is for popup layout */
+//} SclLayoutKeyset;
+
+///**
+// *@brief SCL Layout key configure structure
+// */
+//typedef struct _SclLayoutKeyConfigure {
+// sclboolean valid; /* Indicates whether this information is in use or not */
+// sclchar* custom_id; /* A value for indentifying a button when handling private keys or disable key. */
+// SCLButtonType button_type; /* Indicates the behavioral type of this button */
+// SCLKeyType key_type; /* Delivered key type when the button event is emitted */
+// SCLPopupType popup_type; /* Popup type when this button is activated */
+// sclboolean use_magnifier; /* Indicates whether this button needs to display magnifier window when clicked */
+// sclboolean use_long_key_magnifier; /* Indicates whether this button needs to display magnifier window when long-pressed */
+// sclboolean enabled; /* Indicates whether this button needs to be automatically enabled */ /* SEEMS TO BE NEEDLESS */
+// sclbyte popup_input_mode[SCL_DRAG_STATE_MAX]; /* Popup inputmode IDs depending on the direction of the drag action */
+// sclchar* sound_style; /* A sound feedback style when this button is clicked */
+// sclchar* vibe_style; /* A vibration feedback style when this button is clicked */
+// sclboolean is_side_button; /* Indicates whether this button is located on the very left or right of the layout */
+//}SclLayoutKeyConfigure;
+
+/**
+ *@brief SCL Label properties structure
+ */
+typedef struct _SclLabelProperties {
+ sclboolean valid; /* Indicates whether this information is in use or not */
+ sclchar* label_type; /* Identifies the current label property */
+ sclchar* font_name; /* Font name of this label property */
+ sclbyte font_size; /* Font size of this label property */
+ /* Font color depending on the button and shift state */
+ SclColor font_color[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ SCLLabelAlignment alignment; /* Alignment option for this label property */
+ sclshort padding_x; /* X padding value for alignment option above */
+ sclshort padding_y; /* Y padding value for alignment option above */
+ sclbyte inner_width; /* Inner width value for making a inner rect padded in above values */
+ sclbyte inner_height; /* Inner height value for making a inner rect padded in above values */
+ sclbyte shadow_distance; /* A distance value for drawing shadow */
+ SCLShadowDirection shadow_direction; /* A direction option for drawing shadown */
+ /* Shadow color depeding on the button and shift state */
+ SclColor shadow_color[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+}SclLabelProperties;
+
+/**
+ *@brief SCL Layout key properties structure
+ */
+/* SCL Supports drawing button's background using SclLayout's image_path - use below macro to bg_image_path for this feature */
+#define SCL_BACKGROUND_IMAGE_STRING "BACKGROUND_IMAGE"
+#define _Label_
+#define _LabelImg_
+#define _BGImg_
+#define _KeyVal_
+#define _KeyEvt_
+//typedef struct _SclLayoutKeyProperties {
+// sclboolean valid; /* Indicates whether this information is in use or not */
+// sclbyte label_count; /* Number of labels for this button (Max value :MAX_SIZE_OF_LABEL_FOR_ONE )*/
+// sclchar* label[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_LABEL_FOR_ONE]; /* Label strings depending on the shift state */
+// sclchar* label_name; /* Label propery name for specifying the appearance of label strings */
+// sclchar* label_image_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX]; /* image_path for the case of image label */
+// /** If bg_image_path is NULL, background will not be drawn. If "", layout image will be used instead */
+// sclchar* bg_image_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX]; /* image_path for the button's background */
+// sclbyte key_value_count; /* Number of key events in case of multitap or rotation button */
+// sclchar* key_value[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR]; /* A string value delivered to ISE when clicked */
+// sclulong key_event[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR]; /* A long int value delivered to ISE when clicked */
+// sclchar* long_key_value; /* A string value delivered to ISE when long key clicked */
+// sclulong long_key_event; /* A long int value delivered to ISE when long key clicked */
+// sclboolean use_repeat_key; /* Indicates whether this button allows repeated key events when pressed for a long time */
+// /* optional */
+// /* A string of candidate characters that will be shown in an autopopup window */
+// sclchar* autopopup_keys[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+// /* When set, any events raised from this button will not close opened popup window */
+// sclboolean dont_close_popup;
+// /* Extra options for each types of buttons :
+// BUTTON_TYPE_ROTATION - Set to 1 if the button should return to initial state when other key is pressed
+// BUTTON_TYPE_DIRECTION -
+// use definitions below, that are declared in sclconfig.h file
+//
+// #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS 0
+// #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS 1
+// #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_LONG 2
+// #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_LONG 3
+// #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN 4
+// #define DIRECTION_EXTRA_OPTION_8_DIRECTIONS_WITH_RETURN 5
+// #define DIRECTION_EXTRA_OPTION_4_DIRECTIONS_WITH_RETURN_AND_CURVE 6
+// */
+// sclbyte extra_option;
+// sclbyte multitouch_type; /* Indicates what kind of multitouch type this button supports */
+// /* If the button should be displayed differently depending on the modifier, describe a decorator and provide its ID here */
+// sclbyte modifier_decorator;
+// /* For the case if this button needs to display multiple labels or different string from the label string */
+// sclchar* magnifier_label[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_LABEL_FOR_ONE];
+//}SclLayoutKeyProperties;
+
+/**
+ *@brief SCL private key structure for application, to change the configuration and property of a specific key
+ */
+typedef struct _SclPrivateKeyProperties {
+ sclboolean valid; /* Indicates whether this information is in use or not */
+ sclshort input_mode_index; /* Target inputmode index that this private key wants to affect */
+ sclshort layout_index; /* Target layout index that this private key wants to affect */
+ sclbyte key_index; /* Target key index that this private key wants to affect */
+
+ /* Configurations */ /* Has same purpose with the SclLayoutKeyConfiguration's member variable */
+ std::string custom_id;
+ SCLButtonType button_type;
+ SCLKeyType key_type;
+ SCLPopupType popup_type;
+ sclboolean use_magnifier;
+ sclboolean use_long_key_magnifier;
+ sclboolean enabled;
+ std::string popup_input_mode[SCL_DRAG_STATE_MAX];
+ std::string sound_style;
+ std::string vibe_style;
+
+ /* Properties */ /* Has same purpose with the SclLayoutKeyProperties' member variable */
+ sclbyte label_count;
+ std::string label[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_LABEL_FOR_ONE];
+ std::string label_type;
+ std::string image_label_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ std::string image_label_type;
+ std::string bg_image_path[SCL_SHIFT_STATE_MAX][SCL_BUTTON_STATE_MAX];
+ sclbyte key_value_count;
+ std::string key_value[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+ sclulong key_event[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+ SCLKeyType long_key_type;
+ std::string long_key_value;
+ sclulong long_key_event;
+ sclboolean use_repeat_key;
+ std::string autopopup_key_labels[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ sclulong autopopup_key_events[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ std::string autopopup_key_values[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_AUTOPOPUP_STRING];
+ sclboolean dont_close_popup;
+ sclbyte extra_option;
+ sclbyte multitouch_type;
+ sclbyte modifier_decorator;
+
+ std::string hint_string[SCL_SHIFT_STATE_MAX][MAX_SIZE_OF_MULTITAP_CHAR];
+}SclPrivateKeyProperties;
+
+/**
+ *@brief SCL S/W button style structure
+ */
+typedef struct _SclSWButtonStyle {
+ scldouble line_width[SCL_BUTTON_STATE_MAX]; /* A border line width when drawing a SW button */
+ SclColor line_color[SCL_BUTTON_STATE_MAX]; /* A border line color when drawing a SW buttton */
+ SclColor bg_color[SCL_BUTTON_STATE_MAX]; /* A background color when drawing a SW button */
+ scldouble line_curve; /* A line curve value for drawing round rectangle. This can be ignored in some platforms */
+ sclfloat bg_alpha; /* A alpha value used when painting background. This can be ignored in some platforms */
+}SclSWButtonStyle;
+
+/**
+ *@brief SCL input mode configuration structure
+ */
+typedef struct _SclDefaultConfigure {
+ SCLDisplayMode display_mode; /* Initial display mode */
+ sclchar *input_mode; /* Initial input mode */
+ sclchar *image_file_base_path; /* Default image files directory */
+ sclint target_screen_width; /* Targeting screen width */
+ sclint target_screen_height; /* Targeting screen height */
+ sclboolean auto_detect_landscape; /* A flag for switching portrait-landscape if screen width is bigger than height */
+ sclboolean use_magnifier_window; /* A flag for enabling magnifer window */
+ sclboolean use_auto_popup; /* A flag for enabling autopopup window */
+ sclboolean use_zoom_window; /* A flag for enabling zoom window */
+ sclboolean on_error_noti_send; /* A flag for playing error sound */
+ sclboolean use_word_deletion; /* A flag for using word deletion mode when repeating delete key */
+ sclbyte sw_button_style; /* Describes which SW button style should be used */
+ /* Touch offset adjustment level description */
+ SCLTouchOffsetLevel touch_offset_level[DISPLAYMODE_MAX];
+ SclPoint touch_offset[DISPLAYMODE_MAX]; /* Touch offset adjustment value description */
+ sclchar *default_sub_layout; /* Initial sub_layout_name */
+ sclboolean use_actual_dim_window; /* Whether to use a new window or make a dim window as a layer of existing base window */
+ SclColor dim_color; /* Color setting for dim window */
+}SclDefaultConfigure;
+
+/**
+ *@brief SCL magnifier(preview) window configuration structure. It will show the selected key label on the magnifier window
+ */
+typedef struct _SclMagnifierWndConfigure {
+ SCLMagnifierStyle style; /* Magnifier style description */
+ sclshort width; /* Width of magnifier window */
+ sclshort height; /* Height of magnifier window */
+ SclRect label_area_rect; /* Area description for displaying label string */
+ sclchar* bg_image_path; /* File path for background image */
+ sclchar* bg_shift_image_path; /* File path for background image in shift key state */
+ sclchar* bg_shift_lock_image_path; /* File path for background image in shift lock key state */
+ sclchar* bg_long_key_image_path; /* File path for background image in longkey state */
+ sclboolean use_actual_window; /* Whether to use a new window or make a popup window as a layer of existing base window */
+ sclchar* label_type; /* Label property name for each strings */
+ sclshort padding_x; /* Padding value X for displaying label string */
+ sclshort padding_y; /* Padding value Y for displaying label string */
+ sclboolean show_shift_label; /* Whether a shift label or a default label string should be displayed in shift mode */
+ /* A 8-way decotation images for magnifier window */
+ sclchar* decoration_image_path[MAX_WND_DECORATOR];
+ sclbyte decoration_size; /* Size of window decoration images */
+}SclMagnifierWndConfigure;
+
+/**
+*@brief SCL auto-generated popup configuration structure. Mostly used for umlaut alternate characters in european languages
+*/
+typedef struct _SclAutoPopupConfigure {
+ sclchar* bg_image_path; /* File path for background image */
+ SclColor bg_color; /* Background color for SW background */
+ scldouble bg_line_width; /* Background SW border width */
+ SclColor bg_line_color; /* Background SW border color */
+ sclbyte bg_padding; /* Padding amount between the bg border and buttons */
+ /* A filepath for each button's background image */
+ sclchar* button_image_path[SCL_BUTTON_STATE_MAX];
+ sclbyte sw_button_style; /* Describes which SW button style should be used */
+ sclshort button_width; /* Each button's width */
+ sclshort button_height; /* Each button's height */
+ sclbyte button_spacing; /* Spacing amount between buttons */
+ sclchar* line_image_path; /* Line image between buttons */
+ sclchar* label_type; /* Label property name for each strings */
+ /* A 8-way decotation images for autopopup window */
+ sclchar* decoration_image_path[MAX_WND_DECORATOR];
+ sclbyte decoration_size; /* Size of window decoration images */
+ sclbyte max_column; /* Maximum number of items in a row */
+
+ sclshort add_grab_left; /* If this layout's style is POPUP_GRAB, desribes the left pixel for grab area */
+ sclshort add_grab_right; /* If this layout's style is POPUP_GRAB, desribes the right pixel for grab area */
+ sclshort add_grab_top; /* If this layout's style is POPUP_GRAB, desribes the top pixel for grab area */
+ sclshort add_grab_bottom; /* If this layout's style is POPUP_GRAB, desribes the bottom pixel for grab area */
+}SclAutoPopupConfigure;
+
+/**
+*@brief 9 patch image information struct - image files registered here would be displayed in 9 patch style
+*/
+typedef struct _SclNinePatchInfo {
+ sclchar *image_path; /* File path for identifying nine patch image file */
+ sclshort left; /* Amount of left pixels for describing area that should not be scaled */
+ sclshort right; /* Amount of right pixels for describing area that should not be scaled */
+ sclshort top; /* Amount of top pixels for describing area that should not be scaled */
+ sclshort bottom; /* Amount of bottom pixels for describing area that should not be scaled */
+}SclNinePatchInfo;
+
+/**
+*@brief A struct for decorating a button depending on the current modifier state
+*/
+typedef struct _SclModifierDecoration {
+ sclboolean valid; /* Indicates whether this information is in use or not */
+ sclboolean extract_background; /* Whether to display only some part of background image */
+ sclchar *name;
+ /* Background image file for decoration */
+ sclchar *bg_image_path[DISPLAYMODE_MAX][KEY_MODIFIER_MAX];
+}SclModifierDecoration;
+
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_STRUCTS_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclui.h"
+#include "scluiimpl.h"
+
+using namespace scl;
+
+CSCLUI::CSCLUI()
+{
+ m_impl = CSCLUIImpl::get_instance();
+}
+
+CSCLUI::~CSCLUI()
+{
+ m_impl = NULL;
+}
+
+sclboolean CSCLUI::init(sclwindow parent, const SCLParserType parser_type, const char *entry_filepath)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->init(parent, parser_type, entry_filepath);
+ }
+ return ret;
+}
+
+void
+CSCLUI::fini()
+{
+ if (m_impl) {
+ m_impl->fini();
+ }
+}
+
+/**
+ * Shows the SCL main window
+ * For displaying the SCL UI, you should explicitly call this function after CSCLUI class is created
+ */
+void
+//CSCLUI::show(sclboolean auto_relocate /* = TRUE */ )
+CSCLUI::show()
+{
+ if (m_impl) {
+ m_impl->show();
+ }
+}
+
+/**
+ * Hides the SCL main window
+ * The real hide action does not work about base window because that is child of the active window
+ */
+void
+CSCLUI::hide()
+{
+ if (m_impl) {
+ m_impl->hide();
+ }
+}
+
+
+/**
+ * Registers an event callback function
+ * so that the user which uses SCL can recevies all events occuring in running
+ */
+void
+CSCLUI::set_ui_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode)
+{
+ if (m_impl) {
+ m_impl->set_ui_event_callback(callback, input_mode);
+ }
+}
+
+void
+CSCLUI::set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data)
+{
+ if (m_impl) {
+ m_impl->set_graphics_backend_callback(callback, data);
+ }
+}
+
+void
+CSCLUI::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
+{
+ if (m_impl) {
+ m_impl->set_window_backend_callback(callback, data);
+ }
+}
+
+/**
+ * Sets the current input mode to the given mode
+ * @Usage
+ * gCore->set_input_mode("INPUT_MODE_SYMBOL");
+ */
+sclboolean
+CSCLUI::set_input_mode(const sclchar *input_mode)
+{
+ sclboolean ret = FALSE;
+
+ if (m_impl) {
+ ret = m_impl->set_input_mode(input_mode);
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the current input mode
+ */
+const sclchar*
+CSCLUI::get_input_mode()
+{
+ const sclchar *ret = NULL;
+
+ if (m_impl) {
+ ret = m_impl->get_input_mode();
+ }
+
+ return ret;
+}
+
+/**
+ * Sets the given popup window's input mode to the given mode
+ * @Usage
+ * gCore->set_input_mode("INPUT_MODE_SYMBOL");
+ */
+sclboolean
+CSCLUI::set_popup_input_mode(sclwindow window, const sclchar *input_mode)
+{
+ sclboolean ret = FALSE;
+
+ if (m_impl) {
+ ret = m_impl->set_popup_input_mode(window, input_mode);
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the given popup window's input mode
+ */
+const sclchar*
+CSCLUI::get_popup_input_mode(sclwindow window)
+{
+ const sclchar *ret = NULL;
+
+ if (m_impl) {
+ ret = m_impl->get_popup_input_mode(window);
+ }
+
+ return ret;
+}
+
+
+/**
+ * Sets the current rotation
+ */
+sclboolean
+CSCLUI::set_rotation(SCLRotation rotation)
+{
+ sclboolean ret = FALSE;
+
+ if (m_impl) {
+ ret = m_impl->set_rotation(rotation);
+ }
+
+ return ret;
+}
+
+/**
+ * Gets the current rotation
+ */
+SCLRotation
+CSCLUI::get_rotation()
+{
+ SCLRotation ret = ROTATION_0;
+
+ if (m_impl) {
+ ret = m_impl->get_rotation();
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the current display mode
+ */
+SCLDisplayMode
+CSCLUI::get_display_mode()
+{
+ SCLDisplayMode ret = DISPLAYMODE_PORTRAIT;
+
+ if (m_impl) {
+ ret = m_impl->get_display_mode();
+ }
+
+ return ret;
+}
+
+/**
+ * Sets a private key to the current context
+ * The other properties except given parameters will keep to the orginal value.
+ * @Usage
+ * gCore->set_private_key(INPUT_MODE_NUMBER, LYT_PORTRAIT_NOW_3x4, 0, "private", 999, TRUE);
+ *
+ * @param fRedraw If true, it will redraw the current key
+ */
+sclint
+CSCLUI::set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean redraw)
+{
+ sclint ret = NOT_USED;
+
+ if (m_impl) {
+ ret = m_impl->set_private_key(custom_id, label, imagelabel, imagebg, key_event, key_value, redraw);
+ }
+
+ return ret;
+}
+
+
+/**
+* Unsets a private key to the current context
+*/
+void
+CSCLUI::unset_private_key(const sclchar* custom_id)
+{
+ if (m_impl) {
+ m_impl->unset_private_key(custom_id);
+ }
+}
+
+/**
+* Sets the current theme
+*/
+/* FIXME : If setting themename is not allowed before initializing,
+ the default theme has to be loaded regardless of current theme name
+ and the appropriate current theme has to be loaded afterwards, which is very inefficient */
+sclboolean
+CSCLUI::set_cur_themename(const sclchar *themename)
+{
+ sclboolean ret = FALSE;
+
+ if (m_impl) {
+ ret = m_impl->set_cur_themename(themename);
+ }
+
+ return ret;
+}
+
+SCLShiftState
+CSCLUI::get_shift_state()
+{
+ SCLShiftState ret = SCL_SHIFT_STATE_OFF;
+ if (m_impl) {
+ ret = m_impl->get_shift_state();
+ }
+ return ret;
+}
+
+void
+CSCLUI::set_shift_state(SCLShiftState state)
+{
+ if (m_impl) {
+ m_impl->set_shift_state(state);
+ }
+}
+
+sclboolean
+CSCLUI::get_caps_lock_mode()
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->get_caps_lock_mode();
+ }
+ return ret;
+}
+
+void
+CSCLUI::set_caps_lock_mode(sclboolean state)
+{
+ if (m_impl) {
+ m_impl->set_caps_lock_mode(state);
+ }
+}
+
+
+/**
+ * This function will be called by the user which uses SCL when the context of the focus application is changed
+ * ISE user should explicitly call this function when the context of application is changed.
+ * For instance, focus-changed, application-changed,, and so on.
+ * This function will call CSCLController to init the related variables.
+ */
+void
+CSCLUI::notify_app_focus_changed()
+{
+ if (m_impl) {
+ m_impl->notify_app_focus_changed();
+ }
+}
+
+void
+CSCLUI::reset_popup_timeout()
+{
+ if (m_impl) {
+ m_impl->notify_app_focus_changed();
+ }
+}
+
+void
+CSCLUI::close_all_popups()
+{
+ if (m_impl) {
+ m_impl->close_all_popups();
+ }
+}
+
+/**
+ * Returns a scale rate (see default screen resolution in sclconfig.h file)
+ */
+sclfloat
+CSCLUI::get_scale_rate()
+{
+ sclfloat ret = 0.0f;
+ if (m_impl) {
+ ret = m_impl->get_scale_rate();
+ }
+ return ret;
+}
+
+/**
+ * Returns a calculated x value according to the current screen resolution
+ */
+scl16
+CSCLUI::get_scaled_x(scl16 x)
+{
+ scl16 ret = 0;
+ if (m_impl) {
+ ret = m_impl->get_scaled_x(x);
+ }
+ return ret;
+}
+
+/**
+ * Returns a calculated y value according to the current screen resolution
+ */
+scl16
+CSCLUI::get_scaled_y(scl16 y)
+{
+ scl16 ret = 0;
+ if (m_impl) {
+ ret = m_impl->get_scaled_y(y);
+ }
+ return ret;
+}
+
+/**
+ * Returns the current rate x value for resizing the keyboard's content
+ */
+sclfloat
+CSCLUI::get_custom_scale_rate_x()
+{
+ sclfloat ret = 1.0f;
+ if (m_impl) {
+ ret = m_impl->get_custom_scale_rate_x();
+ }
+ return ret;
+}
+
+/**
+ * Returns the current rate y value for resizing the keyboard's content
+ */
+sclfloat
+CSCLUI::get_custom_scale_rate_y()
+{
+ sclfloat ret = 1.0f;
+ if (m_impl) {
+ ret = m_impl->get_custom_scale_rate_y();
+ }
+ return ret;
+}
+
+/**
+ * Sets the custom rate value for resizing the keyboard's content
+ */
+void
+CSCLUI::set_custom_scale_rate(sclfloat x, sclfloat y)
+{
+ if (m_impl) {
+ m_impl->set_custom_scale_rate(x, y);
+ }
+}
+
+/**
+ * Sets the custom starting coordinates for drawing the keyboard's content
+ */
+void
+CSCLUI::set_custom_starting_coordinates(sclint x, sclint y)
+{
+ if (m_impl) {
+ m_impl->set_custom_starting_coordinates(x, y);
+ }
+}
+
+/**
+ * Sets the custom starting coordinates option for drawing the keyboard's content
+ */
+void
+CSCLUI::set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option)
+{
+ if (m_impl) {
+ m_impl->set_custom_starting_coordinates_option(option);
+ }
+}
+
+/**
+ * Returns the scl main window size
+ */
+SclRectangle
+CSCLUI::get_main_window_rect()
+{
+ SclRectangle ret = {0, 0, 0, 0};
+
+ if (m_impl) {
+ ret = m_impl->get_main_window_rect();
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the size of given input mode
+ */
+SclSize
+CSCLUI::get_input_mode_size(const sclchar *input_mode, SCLDisplayMode display_mode)
+{
+ SclSize ret = {0, 0};
+
+ if (m_impl) {
+ ret = m_impl->get_input_mode_size(input_mode, display_mode);
+ }
+
+ return ret;
+}
+
+/**
+* Returns the screen resolution
+*/
+void
+CSCLUI::get_screen_resolution(sclint *width, sclint *height)
+{
+ if (m_impl) {
+ m_impl->get_screen_resolution(width, height);
+ }
+}
+
+
+
+void
+CSCLUI::set_debug_mode(SCLDebugMode mode)
+{
+ if (m_impl) {
+ m_impl->set_debug_mode(mode);
+ }
+}
+
+SCLDebugMode
+CSCLUI::get_debug_mode()
+{
+ SCLDebugMode ret = DEBUGMODE_DISABLED;
+ if (m_impl) {
+ ret = m_impl->get_debug_mode();
+ }
+ return ret;
+}
+
+void
+CSCLUI::set_update_pending(sclboolean pend)
+{
+ if (m_impl) {
+ m_impl->set_update_pending(pend);
+ }
+}
+
+void
+CSCLUI::enable_button(const sclchar* custom_id, sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_button(custom_id, enabled);
+ }
+}
+
+sclint
+CSCLUI::get_multi_touch_context_num()
+{
+ sclint ret = 0;
+ if (m_impl) {
+ ret = m_impl->get_multi_touch_context_num();
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::get_multi_touch_event(sclint seqorder, SclUIEventDesc *desc)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->get_multi_touch_event(seqorder, desc);
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::set_longkey_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_longkey_duration(msc);
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::set_longkey_cancel_dist(sclshort dist)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_longkey_cancel_dist(dist);
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::set_repeatkey_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_repeatkey_duration(msc);
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::set_autopopup_key_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_autopopup_key_duration(msc);
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUI::set_button_delay_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_button_delay_duration(msc);
+ }
+ return ret;
+}
+
+void
+CSCLUI::enable_magnifier(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_magnifier(enabled);
+ }
+}
+
+void
+CSCLUI::enable_sound(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_sound(enabled);
+ }
+}
+
+void
+CSCLUI::enable_vibration(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_vibration(enabled);
+ }
+}
+
+void
+CSCLUI::enable_tts(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_tts(enabled);
+ }
+}
+
+void
+CSCLUI::enable_shift_multi_touch(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_shift_multi_touch(enabled);
+ }
+}
+
+void
+CSCLUI::enable_highlight_ui(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_highlight_ui(enabled);
+ }
+}
+
+void
+CSCLUI::enable_highlight_ui_animation(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_highlight_ui_animation(enabled);
+ }
+}
+
+void
+CSCLUI::enable_touch_offset(sclboolean enabled)
+{
+ if (m_impl) {
+ m_impl->enable_touch_offset(enabled);
+ }
+}
+
+void
+CSCLUI::disable_input_events(sclboolean disabled)
+{
+ if (m_impl) {
+ m_impl->disable_input_events(disabled);
+ }
+}
+
+sclboolean
+CSCLUI::set_cur_sublayout(const sclchar *sub_layout_name)
+{
+ sclboolean ret = FALSE;
+ if (m_impl) {
+ ret = m_impl->set_cur_sublayout(sub_layout_name);
+ }
+ return ret;
+}
+
+const sclchar*
+CSCLUI::get_cur_sublayout()
+{
+ const sclchar* ret = NULL;
+ if (m_impl) {
+ ret = m_impl->get_cur_sublayout();
+ }
+ return ret;
+}
+
+void
+CSCLUI::set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label)
+{
+ if (m_impl) {
+ m_impl->set_custom_magnifier_label(touch_id, index, label);
+ }
+}
+
+void
+CSCLUI::set_string_substitution(const sclchar *original, const sclchar *substitute)
+{
+ if (m_impl) {
+ m_impl->set_string_substitution(original, substitute);
+ }
+}
+
+void
+CSCLUI::unset_string_substitution(const sclchar *original)
+{
+ if (m_impl) {
+ m_impl->unset_string_substitution(original);
+ }
+}
+
+void
+CSCLUI::set_autocapital_shift_state(sclboolean flag) {
+ if (m_impl) {
+ m_impl->set_autocapital_shift_state(flag);
+ }
+}
+
+sclint
+CSCLUI::get_autocapital_shift_state() {
+ sclint flag = 0;
+
+ if (m_impl) {
+ flag = m_impl->get_autocapital_shift_state();
+ }
+
+ return flag;
+}
+
+sclboolean
+CSCLUI::process_key_event(const char *key)
+{
+ if (m_impl) {
+ return m_impl->process_key_event(key);
+ }
+ return FALSE;
+}
+
+sclboolean
+CSCLUI::get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle)
+{
+ if (m_impl) {
+ return m_impl->get_button_geometry(custom_id, rectangle);
+ }
+ return FALSE;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_UI_H__
+#define __SCL_UI_H__
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+#include "scleventcallback.h"
+#include "sclgraphicsbackendcallback.h"
+#include "sclwindowbackendcallback.h"
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+/* To use pimpl idiom */
+class CSCLUIImpl;
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class EXAPI CSCLUI
+{
+public:
+ CSCLUI();
+ virtual ~CSCLUI();
+
+ /*
+ * @brief This API initializes SCL library
+ * @param[in] main_window a pointer to main window object
+ * @param[in] parser_type decides which parser should be selected for parsing SCL UI resource file
+ * @param[in] entry_filepath a file path to SCL's UI resource entry file
+ * @return non-zero value is returned when successful
+ */
+ sclboolean init(sclwindow main_window, SCLParserType parser_type, const sclchar *entry_filepath);
+
+ /*
+ * @brief This API deinitializes SCL library
+ */
+ void fini();
+
+ /**
+ * @brief This API requests SCL library to show the S/W keyboard on the screen
+ * @param[in] auto_relocate Indicates whether the SCL library should relocate the keyboard window automatically
+ * When set to FALSE, the developer should move the window to its expected position.
+ */
+ //void show(sclboolean auto_relocate = TRUE);
+ void show();
+
+ /**
+ * @brief This API requests SCL library to hide the S/W keyboard from the screen
+ */
+ void hide();
+
+
+ /**
+ * @brief This API registers a callback interface, to handle the events generated by SCL library
+ * @param[in] callback a pointer to ISCLEventCallback interface implementation class
+ * @param[in] input_mode when given not NULL, this callback processes event on that input_mode only.
+ */
+ void set_ui_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode = NULL);
+
+ /**
+ * @brief This API requests SCL library to rotate the window to given degree
+ * @param[in] degree an SCLRotation value for rotating the keyboard
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_rotation(SCLRotation degree);
+
+ /**
+ * @brief This API returns the current rotation degree
+ * @return current rotation value
+ */
+ SCLRotation get_rotation();
+
+ /**
+ * @brief This API checks if the current display mode is portrait or landscape
+ * @return current display mode
+ */
+ SCLDisplayMode get_display_mode();
+
+ /**
+ * @brief This API request SCL library to change to given input mode
+ * @param[in] input_mode the name of the desired input mode
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_input_mode(const sclchar *input_mode);
+
+ /**
+ * @brief This API retrieves the current input mode
+ * @return a string pointer that indicates the name of current input mode
+ */
+ const sclchar* get_input_mode();
+
+ /**
+ * @brief This API request SCL library to change the given popup window's input mode
+ * @param[in] window the handle for the popup window that we want to change the input mode
+ * @param[in] input_mode the name of the desired input mode
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_popup_input_mode(sclwindow window, const sclchar *input_mode);
+
+ /**
+ * @brief This API retrieves the current input mode
+ * @param[in] window the handle for the popup window that we want to retrieve the input mode
+ * @return a string pointer that indicates the name of current input mode
+ */
+ const sclchar* get_popup_input_mode(sclwindow window);
+
+ /**
+ * @brief This API request SCL library to suspend screen updates
+ * @param[in] pend whether to suspend screen updates
+ */
+ void set_update_pending(sclboolean pend);
+
+ /**
+ * @brief This API request SCL library to change a specific key with user customized values, with different parameters
+ * @param[in] custom_id the name of the key to be reset
+ * @param[in] label the string to be displayed on the button
+ * @param[in] label the file path to button's label image
+ * @param[in] imagebg the file path to button's background image
+ * @param[in] key_event a numeric value to be emitted when this button is clicked
+ * @param[in] key_value a string value to be emitted when this button is clicked
+ * @param[in] redraw whether to redraw the key right after updating detailed information
+ * @return internal private key index
+ */
+ sclint set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean redraw);
+
+ /**
+ * @brief This API request SCL library to reset a key to its original configuration
+ * @param[in] custom_id the name of the key to be reset
+ */
+ void unset_private_key(const sclchar* custom_id);
+
+ /**
+ * @brief This API request SCL library to enable a button with given ID
+ * @param[in] custom_id the name of the key to be enabled
+ * @param[in] enabled whether this button should be enabled or not
+ */
+ void enable_button(const sclchar* custom_id, sclboolean enabled);
+
+ /**
+ * @brief This API sets the name of the current theme to change the look and feel of S/W keyboard
+ * @param[in] themename the name of the theme to be applied
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_cur_themename(const sclchar *themename);
+
+ /**
+ * @brief This API sets the name of the desired predefined sub-layout, which changes only some part of current layout
+ * @param[in] themename the name of the theme to be applied
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_cur_sublayout(const sclchar *sub_layout_name);
+
+ /**
+ * @brief This API retrieves the name of current selected sub-layout
+ * @return the string pointer that indicates the name of current sub-layout
+ */
+ const sclchar* get_cur_sublayout();
+
+ /**
+ * @brief This API sets the current shift state
+ * @param[in] state the SCLShiftState value for desired shift state
+ */
+ void set_shift_state(SCLShiftState state);
+
+ /**
+ * @brief This API retrieves the current shift state
+ * @return current shift state
+ */
+ SCLShiftState get_shift_state();
+
+ /**
+ * @brief This API sets the current caps lock mode, which reverses the effect of shift mode
+ * @param[in] mode whether the cap lock mode is enabled or not
+ */
+ void set_caps_lock_mode(sclboolean mode);
+
+ /**
+ * @brief This API retrieves the current caps lock mode
+ * @return current caps lock mode
+ */
+ sclboolean get_caps_lock_mode();
+
+ /**
+ * @brief This API notifies the SCL library that the application's focus was moved to another input context
+ */
+ void notify_app_focus_changed();
+
+ /**
+ * @brief This API request SCL library to reset the timer, which closes all popup windows when expired
+ */
+ void reset_popup_timeout();
+
+ /**
+ * @brief This API request SCL library to close all opened popup windows
+ */
+ void close_all_popups();
+
+ /*
+ * @brief This API acquires the size of main window
+ * @param[out] rect the geometry information of main window
+ */
+ SclRectangle get_main_window_rect();
+
+ /**
+ * @brief This API retrieves the current input mode
+ * @param[in] input_mode the name of the desired input mode
+ * @param[in] display_mode desired display mode value
+ * @return a size struct contains the input_mode's size in given display_mode
+ */
+ SclSize get_input_mode_size(const sclchar *input_mode, SCLDisplayMode display_mode);
+
+ /**
+ * @brief This API acquires the screen size of current device
+ * @param[out] width the x-axis size of screen
+ * @param[out] height the y-axis size of screen
+ */
+ void get_screen_resolution(sclint *width, sclint *height);
+
+ /**
+ * @brief This API request SCL library to scale the input value,
+ by calculating the rate of target screen size and current screen size
+ * @param[in] x the value that needs to be scaled
+ * @return scaled value
+ */
+ scl16 get_scaled_x(scl16 x);
+
+ /**
+ * @brief This API request SCL library to scale the input value,
+ by calculating the rate of target screen size and current screen size
+ * @param[in] y the value that needs to be scaled
+ * @return scaled value
+ */
+ scl16 get_scaled_y(scl16 y);
+
+ /**
+ * @brief This API returns the smaller scale rate, between x and y
+ * @return scale rate
+ */
+ sclfloat get_scale_rate();
+
+ /**
+ * @brief This API retrieves the current custom scale rate x, for resizing the keyboard's content
+ * @return current custom x scale value
+ */
+ sclfloat get_custom_scale_rate_x();
+
+ /**
+ * @brief This API retrieves the current custom scale rate y, for resizing the keyboard's content
+ * @return current custom y scale value
+ */
+ sclfloat get_custom_scale_rate_y();
+
+ /**
+ * @brief This API sets the current custom scale rate values, for resizing the keyboard's content
+ * @param[in] x the scale rate value
+ */
+ void set_custom_scale_rate(sclfloat x, sclfloat y);
+
+ /**
+ * @brief This API sets the starting coordinates for drawing keyboard's contents
+ * @param[in] x the starting coordinate x
+ * @param[in] y the starting coordinate y
+ */
+ void set_custom_starting_coordinates(sclint x, sclint y);
+
+ /**
+ * @brief This API sets the option for the starting coordinates feature
+ * @param[in] option the starting coordinate option
+ */
+ void set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option);
+
+ /**
+ * @brief This API returns the number of current multi touch contexts,
+ * which means how many fingers are currently pressing the touch device
+ * @return number of touch contexts
+ */
+ sclint get_multi_touch_context_num();
+
+ /**
+ * @brief This API retrieves the descriptor for the nth multi touch context, for processing multi touch events
+ * @param[in] seqorder the sequence order of currently requesting multi touch context
+ * @param[out] desc a pointer to SclKeyEventDesc struct, to be filled with given multi touch context's detailed information
+ * @return non-zero value is returned when successful
+ */
+ sclboolean get_multi_touch_event(sclint seqorder, SclUIEventDesc *desc);
+
+ /**
+ * @brief This API requests SCL library to start working in debug mode
+ */
+ void set_debug_mode(SCLDebugMode mode);
+
+ /**
+ * @brief This API retrieves the current debug mode of SCL library
+ */
+ SCLDebugMode get_debug_mode();
+
+ /**
+ * @brief This API sets the timeout value for recognizing long press event
+ * @param[in] msc the time before the system waits until it determines the press event is long press event
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_longkey_duration(scllong msc);
+
+ /**
+ * @brief This API sets the threshold value for recognizing long press event
+ * @param[in] dist maximum distance, in pixels.
+ the move event should not go beyond this distance from its initial pressed point
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_longkey_cancel_dist(sclshort dist);
+
+ /**
+ * @brief This API sets the timeout value for emitting repeat key event
+ * @param[in] msc the time that SCL library has to wait before emitting next repeat key even
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_repeatkey_duration(scllong msc);
+
+ /**
+ * @brief This API sets the timeout value for recognizing long press event, if current button supports hidden text popup
+ * @param[in] msc the time before the system waits until it determines the press event is long press event
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_autopopup_key_duration(scllong msc);
+
+ /**
+ * @brief This API sets the timeout value before it reverts the ui feedback of button press event
+ * @param[in] msc the time before the system waits until it resets the pressed key to its normal state
+ * @return non-zero value is returned when successful
+ */
+ sclboolean set_button_delay_duration(scllong msc);
+
+ /**
+ * @brief This API requests SCL library to enable/disable magnifier window
+ * @param[in] enabled indicates whether mangifier window should be displayed or not
+ */
+ void enable_magnifier(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable sound feedback
+ * @param[in] enabled indicates whether sound feedback should be played or not, when a key is pressed
+ */
+ void enable_sound(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable vibration feedback
+ * @param[in] enabled indicates whether vibration feedback should be played or not, when a key is pressed
+ */
+ void enable_vibration(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable tts feedback
+ * @param[in] enabled indicates whether tts feedback should be played or not, when a key is pressed
+ */
+ void enable_tts(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable shift multi touch action
+ * @param[in] enabled indicates whether shift button should provide multi touch action
+ */
+ void enable_shift_multi_touch(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable highlight ui
+ * @param[in] enabled indicates whether to show highlight ui
+ */
+ void enable_highlight_ui(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to enable/disable animation effect for highlight ui
+ * @param[in] enabled indicates whether to display animation effect when moving highlight ui
+ */
+ void enable_highlight_ui_animation(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to apply the touch offset adjustment
+ * @param[in] enabled indicates whether the touch offset adjustment should applied or not
+ */
+ void enable_touch_offset(sclboolean enabled);
+
+ /**
+ * @brief This API requests SCL library to ignore any events raised from the keyboard window
+ * @param[in] enabled indicates whether the keyboard window should ignore any touch events it receives
+ */
+ void disable_input_events(sclboolean disabled);
+
+ /**
+ * @brief This API requests SCL library to change the content of magnifier window that will be displayed
+ * @param[in] touch_id indicates which multi touch context this customization should be applied to
+ * @param[in] index indicates the index of magnifier window's label
+ * @param[in] label the string to be displayed on the magnifier window
+ */
+ void set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label);
+
+ /**
+ * @brief This API requests SCL library to substitute a string with given one when displaying it
+ * @param[in] original indicates the string that should be substituted from
+ * @param[in] substitute indicates the string that should be substituted to
+ */
+ void set_string_substitution(const sclchar *original, const sclchar *substitute);
+
+ /**
+ * @brief This API requests SCL library to reset substitution for the given string
+ * @param[in] original indicates the string that was registered to be substituted from
+ */
+ void unset_string_substitution(const sclchar *original);
+
+ /**
+ * @brief This API sets the autocapital shift state flag
+ * @param[in] flag: TRUE indicates the libscl-ui will auto handle the shift state
+ * FALSE not, then the users will handle this outside the libscl-ui
+ * default is TRUE
+ */
+ void set_autocapital_shift_state(sclboolean flag);
+
+ /**
+ * @brief This API gets the autocapital shift state flag
+ */
+ sclint get_autocapital_shift_state();
+
+ /**
+ * @brief This API process the key event received from ISF
+ */
+ sclboolean process_key_event(const char *key);
+
+ /**
+ * @brief This API request SCL library to return the geometry information of a button with given ID
+ * @param[in] custom_id the name of the key to be queried
+ * @return non-zero value is returned when successful
+ */
+ sclboolean get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle);
+
+ void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data);
+
+ void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data);
+private:
+ CSCLUIImpl *m_impl;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_UI_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scluibuilder.h"
+#include "scldebug.h"
+#include "sclresourcecache.h"
+#include "sclcontext.h"
+#include "sclimageproxy.h"
+#include "sclactionstate.h"
+#include "sclkeyfocushandler.h"
+#include "sclanimator.h"
+
+//#include "sclresource.h"
+#include <assert.h>
+#include "sclres_manager.h"
+
+using namespace scl;
+
+//extern sclboolean g_key_spacing_off;
+
+CSCLUIBuilder::CSCLUIBuilder()
+{
+ SCL_DEBUG();
+
+ m_gwes = NULL;
+ m_utils = NULL;
+}
+
+CSCLUIBuilder::~CSCLUIBuilder()
+{
+ SCL_DEBUG();
+ m_gwes = NULL;
+ m_utils = NULL;
+}
+
+CSCLUIBuilder*
+CSCLUIBuilder::get_instance()
+{
+ static CSCLUIBuilder instance;
+ return &instance;
+}
+
+void
+CSCLUIBuilder::init(sclwindow parent)
+{
+ SCL_DEBUG();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ m_gwes = CSCLGwes::get_instance();
+ m_utils = CSCLUtils::get_instance();
+ /* It will create the base window */
+
+ scl8 mode = NOT_USED;
+ sclint layout = NOT_USED;
+ SCLDisplayMode display_mode = DISPLAYMODE_PORTRAIT;
+
+ PSclDefaultConfigure default_configure = NULL;
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (m_gwes && m_utils && sclres_manager) {
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ PSclLayout sclres_layout = sclres_manager->get_layout_table();
+
+ assert(sclres_input_mode_configure != NULL);
+ assert(sclres_layout != NULL);
+
+ default_configure = sclres_manager->get_default_configure();
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ if (default_configure) {
+ display_mode = default_configure->display_mode;
+ mode = sclres_manager->get_inputmode_id(default_configure->input_mode);
+ }
+ /* Make sure these variables does not exceed the size of our array */
+ if (!scl_check_arrindex(mode, MAX_SCL_INPUT_MODE) ||
+ !scl_check_arrindex(mode, sclres_manager->get_inputmode_size())) {
+ mode = 0;
+ }
+ if (!scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ display_mode = DISPLAYMODE_PORTRAIT;
+ }
+
+ layout = sclres_manager->get_layout_id(sclres_input_mode_configure[mode].layouts[display_mode]);
+ if (layout < 0 || !scl_check_arrindex_unsigned(layout, MAX_SCL_LAYOUT) ||
+ !scl_check_arrindex_unsigned(layout, sclres_manager->get_layout_size())) {
+ layout = 0;
+ }
+
+ if (m_utils) {
+ m_gwes->init(parent,
+ m_utils->get_scaled_x(sclres_layout[layout].width),
+ m_utils->get_scaled_y(sclres_layout[layout].height));
+ }
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_display_mode(display_mode);
+ context->set_input_mode(mode);
+ context->set_base_layout(sclres_manager->get_layout_id(sclres_input_mode_configure[mode].layouts[display_mode]));
+ }
+
+ sclwindow window = SCLWINDOW_INVALID;
+ if (m_gwes->m_windows)
+ window = m_gwes->m_windows->get_base_window();
+
+ /* Creates the magnifier window */
+ if (default_configure && magnifier_configure) {
+ if (default_configure->use_magnifier_window) {
+ if (m_gwes->m_windows && m_gwes->m_events) {
+ sclwindow magnifier_window = m_gwes->m_windows->create_magnifier_window(parent, 0, 0,
+ magnifier_configure->width, magnifier_configure->height);
+ m_gwes->m_events->connect_window_events(magnifier_window, SCL_EVENT_EXPOSE | SCL_EVENT_MOUSE);
+ }
+ }
+ }
+
+ /* Creates the dim window */
+ /* FIXME */
+ //if (scl_check_arrindex(defaultLayoutIdx, MAX_LAYOUT)) {
+ if (m_gwes->m_windows)
+ m_gwes->m_windows->create_dim_window(window, NULL, sclres_layout[layout].width, sclres_layout[layout].height);
+
+ /* m_gwes->m_events->set_touch_event_offset(scl_default_configure.touch_offset);*/
+ /*Moved to Show Layout*/
+
+ /* For testing pre-image load */
+ /*CSCLImageProxy *proxy = CSCLImageProxy::get_instance();
+ sclchar composed_path[_POSIX_PATH_MAX] = {0,};
+ for (sclint loop = 0; loop < MAX_PRELOAD_IMG_CNT; loop++) {
+ memset(composed_path, 0x00, sizeof(sclchar)*_POSIX_PATH_MAX);
+ m_utils->get_composed_path(composed_path, scl_preload_image[loop]);
+ proxy->get_image(composed_path);
+ }*/
+ }
+}
+
+/**
+ * Shows the current layout and contexts
+ * This function will be called by expose event and invalidate rect
+ */
+sclboolean
+CSCLUIBuilder::show_layout(const sclwindow window, const scl16 x, const scl16 y, const scl16 width, const scl16 height)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+ if (events && windows && graphics && cache && context && focus_handler && default_configure) {
+ /* FIXME : The draw_ctx should be acquired from the base window also, if the target window is virtual
+ However, for ease of development, leave the drawctx to be acquired from the target window for now
+ Should modify the EFLObject list management routine after fixing the issue described above
+ */
+ scldrawctx draw_ctx = graphics->begin_paint(window);
+ SCLDisplayMode display_mode = context->get_display_mode();
+ events->set_touch_event_offset(default_configure->touch_offset[display_mode]);
+
+ if (window == windows->get_magnifier_window()) {
+ /* For the magnifier window */
+ ret = show_magnifier(window, draw_ctx);
+ } else if (window == windows->get_dim_window()) {
+ SclWindowContext *dim_window_context = windows->get_window_context(window);
+ if (dim_window_context) {
+ SclSize size;
+ SclColor color;
+ size.width = dim_window_context->geometry.width;
+ size.height = dim_window_context->geometry.height;
+ color = default_configure->dim_color;
+ draw_window_bg_by_sw(window, draw_ctx, size, 0.0, color, color);
+ /*sclchar composed_path[_POSIX_PATH_MAX] = {0,};
+ const SclLayout* layout = cache->get_cur_layout(windows->get_base_window());
+ m_utils->get_composed_path(composed_path, layout->image_path[BUTTON_STATE_NORMAL]);
+ graphics->draw_image(window, draw_ctx, composed_path, 0, 0, layout->width, layout->height);*/
+ }
+ } else {
+ /* For the base and popup window */
+ const SclLayout* layout = cache->get_cur_layout(window);
+ // FIXME implement later
+ // SclLayoutInfoCache *info_cache = cache->get_cur_layout_info_cache(window);
+ if (layout) {
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ scl_assert_return_false(layout);
+
+ if (layout->use_sw_background) {
+ if (window_context) {
+ SclSize size;
+ size.width = window_context->geometry.width;
+ size.height = window_context->geometry.height;
+ draw_window_bg_by_sw(window, draw_ctx, size, layout->bg_line_width, layout->bg_line_color, layout->bg_color);
+ }
+ } else if (layout->image_path[BUTTON_STATE_NORMAL]) {
+ sclint targetx = 0;
+ sclint targety = 0;
+ /* If the target window is virtual window, let's draw it on the base window */
+ sclwindow targetwin = window;
+ if (window_context) {
+ if (window_context->is_virtual) {
+ /*SclWindowContext *base_window_context =
+ windows->get_window_context(windows->get_base_window(), FALSE);*/
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ targetwin = windows->get_base_window();
+ targetx = window_context->geometry.x - base_window_context->geometry.x;
+ targety = window_context->geometry.y - base_window_context->geometry.y;
+ }
+ }
+ /* Apply custom starting coordinates only to the base window, and if the option is ALL */
+ if (windows->is_base_window(window) &&
+ cache->get_custom_starting_coordinates_option() == SCL_STARTING_COORDINATES_OPTION_ALL) {
+ targetx += cache->get_custom_starting_coordinates().x;
+ targety += cache->get_custom_starting_coordinates().y;
+ }
+ if (strlen(layout->image_path[BUTTON_STATE_NORMAL]) > 0) {
+ /*SclImageCachedInfo cached_info = {0, };
+ cached_info.nine_patch_left = info_cache->bg_image_path[BUTTON_STATE_NORMAL].left;
+ cached_info.nine_patch_right = info_cache->bg_image_path[BUTTON_STATE_NORMAL].right;
+ cached_info.nine_patch_top = info_cache->bg_image_path[BUTTON_STATE_NORMAL].top;
+ cached_info.nine_patch_bottom = info_cache->bg_image_path[BUTTON_STATE_NORMAL].bottom;*/
+
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, layout->image_path[BUTTON_STATE_NORMAL]);
+ // Temporary testing for EFL backend.. Otherwise the background image covers other buttons
+ if (window_context && (x + y + width + height == 0)) {
+ //graphics->draw_image(targetwin, draw_ctx, composed_path, &cached_info, targetx, targety, layout->width, layout->height, window_context->layout_image_offset.x, winctx->layout_image_offset.y, -1, -1, layout->extract_background);
+ graphics->draw_image(targetwin, draw_ctx, composed_path, NULL,
+ targetx, targety, layout->width, layout->height,
+ window_context->layout_image_offset.x, window_context->layout_image_offset.y,
+ -1, -1, layout->extract_background);
+ }
+ }
+ }
+ }
+ draw_button_all(window, draw_ctx, x, y, width, height);
+
+ //if (highlight_ui_enabled)
+ if (focus_handler->get_current_focus_window() == window) {
+ sclint startx = 0;
+ sclint starty = 0;
+
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context && base_window_context) {
+ if (window_context->is_virtual) {
+ startx += (window_context->geometry.x - base_window_context->geometry.x);
+ starty += (window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+
+ sclboolean draw_highlight_ui = TRUE;
+ SclAnimationState *state = NULL;
+ CSCLAnimator *animator = CSCLAnimator::get_instance();
+ if (animator) {
+ sclint id = animator->find_animator_by_type(ANIMATION_TYPE_HIGHLIGHT_UI);
+ state = animator->get_animation_state(id);
+ }
+ if (state) {
+ // If currently the highlight UI is being animated, don't draw it here
+ if (state->active) {
+ draw_highlight_ui = FALSE;
+ }
+ }
+
+ if (draw_highlight_ui && context->get_highlight_ui_enabled()) {
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+ scl8 current_key_index = focus_handler->get_current_focus_key();
+ coordinate = cache->get_cur_layout_key_coordinate(window, current_key_index);
+ /* FIXME : Need to use highlight image */
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, SCL_HIGHLIGHT_UI_IMAGE);
+ if (coordinate) {
+ // Draw highlight
+ graphics->draw_image(window, draw_ctx, composed_path, NULL,
+ startx + coordinate->x, starty + coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+ }
+ }
+ graphics->end_paint(window, draw_ctx);
+ }
+
+ return ret;
+}
+
+/**
+ * Draws all of buttons
+ */
+sclboolean
+CSCLUIBuilder::draw_button_all(const sclwindow window, const scldrawctx draw_ctx, const scl16 x /* = 0 */, const scl16 y /* = 0 */, const scl16 width /* = 0 */, const scl16 height /* = 0 */)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+
+ sclboolean drawall = FALSE;
+ SclRectangle updatearea = {x, y, width, height};
+ if (x + y + width + height == 0) {
+ drawall = TRUE;
+ }
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclLayoutKeyCoordinate* coordinate = NULL;
+ SclButtonContext* button_context = NULL;
+
+ if (context && cache && utils) {
+ for (sclint idx = 0; idx < MAX_KEY; idx++) {
+ coordinate = cache->get_cur_layout_key_coordinate(window, idx);
+ button_context = cache->get_cur_button_context(window, idx);
+ if (coordinate && button_context) {
+ /* First check if this button is enabled in current active sublayout */
+ sclboolean subLayoutMatch = TRUE;
+ if (coordinate->sub_layout && context->get_cur_sublayout()) {
+ if (strncmp(coordinate->sub_layout, context->get_cur_sublayout(), MAX_SIZE_OF_SUBLAYOUT_STRING) != 0) {
+ subLayoutMatch = FALSE;
+ }
+ }
+ if (coordinate->valid && subLayoutMatch) {
+ SclRectangle itemrect = {coordinate->x, coordinate->y, coordinate->width, coordinate->height};
+ if (drawall || utils->is_rect_overlap(itemrect, updatearea)) {
+ SCLButtonState state = button_context->state;
+ if (button_context->toggled) {
+ state = BUTTON_STATE_TOGGLED;
+ }
+ if (!draw_button(window, draw_ctx, idx, state)) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * Returns text that should be read if accessibility support is enabled
+ */
+const sclchar*
+CSCLUIBuilder::get_button_text_to_read(const sclwindow window, const scl16 key_index, SCLShiftState shift_index)
+{
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ if (!cache)
+ return NULL;
+
+ const SclLayoutKeyCoordinate *coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ SclButtonContext * button_context = cache->get_cur_button_context(window, key_index);
+
+ if (coordinate && button_context && coordinate->key_type != KEY_TYPE_NONE) {
+ const sclchar *targetstr = coordinate->hint_string[shift_index][button_context->multitap_index];
+ if (targetstr == NULL) {
+ targetstr = coordinate->label[shift_index][0];
+ }
+ if (targetstr == NULL) {
+ targetstr = coordinate->key_value[shift_index][button_context->multitap_index];
+ }
+
+ return cache->find_substituted_string(targetstr);
+ }
+ return NULL;
+}
+
+
+/**
+ * Draws the button of the given key index by type of the button
+ * @remark draw_button_all
+ */
+sclboolean
+CSCLUIBuilder::draw_button(const sclwindow window, scldrawctx draw_ctx, const scl16 key_index, const SCLButtonState state, const sclboolean force_draw_bg /* = FALSE */)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+ scl_assert_return_false(key_index > NOT_USED && key_index < MAX_KEY);
+ scl_assert_return_false(state >= BUTTON_STATE_NORMAL && state < SCL_BUTTON_STATE_MAX);
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+
+ if (cache && context && graphics) {
+ SclButtonContext* button_context = cache->get_cur_button_context(window, key_index);
+
+ if (button_context) {
+ if (!button_context->used) {
+ return FALSE;
+ }
+
+ /* creates a cairo surface if the value of the given draw_ctx is NULL */
+ sclboolean need_endpaint = FALSE;
+ if (draw_ctx == NULL) {
+ draw_ctx = graphics->begin_paint(window);
+ need_endpaint = TRUE;
+ }
+
+ /* FIXME : There is a case that begin_pain fails. Inspection on the root cause is needed */
+ if (draw_ctx) {
+ SCLShiftState shift_index = context->get_shift_state();
+ if (shift_index >= SCL_SHIFT_STATE_MAX) shift_index = SCL_SHIFT_STATE_OFF;
+
+ const SclLayout* layout = cache->get_cur_layout(window);
+ const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ /* 1. drawing the background of the button */
+ /* check it according to the following check-list */
+ /* check it whether uses SW style button */
+ if (layout && coordinate) {
+ scldrawing background = NULL;
+ if (layout->use_sw_button) {
+ /* case 1 (uses Software button) */
+ background = draw_button_bg_by_sw(window, draw_ctx, key_index, state);
+ } else {
+ /* check it whether uses an individual images */
+ if (coordinate->bg_image_path[shift_index][state]) {
+ if (strcmp(coordinate->bg_image_path[shift_index][state], SCL_BACKGROUND_IMAGE_STRING) != 0) {
+ /* case 2 (uses an individual image) */
+ background = draw_button_bg_by_img(window, draw_ctx, key_index, state, shift_index);
+ } else {
+ /* case 3 (uses the layout background image) */
+ background = draw_button_bg_by_layoutimg(window, draw_ctx, key_index, state, shift_index);
+ }
+ } else if (force_draw_bg) {
+ background = draw_button_bg_by_layoutimg(window, draw_ctx, key_index, state, shift_index);
+ }
+ /* case 4 (don't draw anything for button's background if image_path is NULL) */
+ }
+
+ /* 2. displaying the label of the button */
+ draw_button_label(window, draw_ctx, key_index, state, shift_index);
+ /* 3. register button as atspi object */
+ const sclchar * text = get_button_text_to_read(window, key_index, shift_index);
+ graphics->register_atspi_object(window, background, text);
+ }
+ }
+
+ /* destroys the cairo surface if the value of the given(parameter) draw_ctx is NULL */
+ if (need_endpaint) {
+ graphics->end_paint(window, draw_ctx);
+ }
+ } else {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * Draws labels for the target button
+ * @remark draw_button
+ */
+sclboolean
+CSCLUIBuilder::draw_button_label(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index, SCLButtonState state, SCLShiftState shift)
+{
+ SCL_DEBUG();
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ const SclLayoutKeyCoordinate* coordinate = NULL;
+
+ if (!utils || !windows || !graphics || !cache) return FALSE;
+
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ if (coordinate) {
+ scl_assert_return_false(window);
+ scl_assert_return_false(draw_ctx);
+ scl_assert_return_false(coordinate);
+
+ /* If the target window is virtual window, let's draw it on the base window */
+ sclint targetaddx = 0;
+ sclint targetaddy = 0;
+ sclwindow targetwin = window;
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->is_virtual) {
+ //SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ targetwin = windows->get_base_window();
+ targetaddx = window_context->geometry.x - base_window_context->geometry.x;
+ targetaddy = window_context->geometry.y - base_window_context->geometry.y;
+ }
+ }
+ }
+
+ /* for image label */
+ if (coordinate->image_label_path[shift][state]) {
+ if (strlen(coordinate->image_label_path[shift][state]) > 0) {
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, coordinate->image_label_path[shift][state]);
+
+ SclSize imgSize = m_gwes->m_graphics->get_image_size(composed_path);
+ if (imgSize.width == 0 && imgSize.height == 0) {
+ imgSize.width = coordinate->width;
+ imgSize.height = coordinate->height;
+ }
+ imgSize.width *= m_utils->get_smallest_scale_rate() * m_utils->get_smallest_custom_scale_rate();
+ imgSize.height *= m_utils->get_smallest_scale_rate() * m_utils->get_smallest_custom_scale_rate();
+
+ /* Make sure the image label is not bigger than the given coordinate */
+ if (imgSize.width > coordinate->width) {
+ imgSize.width = coordinate->width;
+ }
+ if (imgSize.height > coordinate->height) {
+ imgSize.height = coordinate->height;
+ }
+
+ SclPoint pos = {0, 0};
+ const SclLabelProperties *labelproperties = cache->get_label_properties(coordinate->image_label_type, 0);
+ if (labelproperties) {
+ SCLLabelAlignment align = labelproperties->alignment;
+ sclshort padding_x = labelproperties->padding_x * utils->get_custom_scale_rate_x();
+ sclshort padding_y = labelproperties->padding_y * utils->get_custom_scale_rate_y();
+ if (align == LABEL_ALIGN_LEFT_MIDDLE ||
+ align == LABEL_ALIGN_CENTER_MIDDLE ||
+ align == LABEL_ALIGN_RIGHT_MIDDLE) {
+ pos.y = coordinate->y + ((coordinate->height - imgSize.height) / 2) + padding_y;
+ } else if (align == LABEL_ALIGN_LEFT_BOTTOM ||
+ align == LABEL_ALIGN_CENTER_BOTTOM ||
+ align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos.y = coordinate->y + (coordinate->height - imgSize.height) - padding_y;
+ } else {
+ pos.y = coordinate->y + padding_y;
+ }
+ if (align == LABEL_ALIGN_CENTER_TOP ||
+ align == LABEL_ALIGN_CENTER_MIDDLE ||
+ align == LABEL_ALIGN_CENTER_BOTTOM) {
+ pos.x = coordinate->x + ((coordinate->width - imgSize.width) / 2) + padding_x;
+ } else if (align == LABEL_ALIGN_RIGHT_TOP ||
+ align == LABEL_ALIGN_RIGHT_MIDDLE ||
+ align == LABEL_ALIGN_RIGHT_BOTTOM) {
+ pos.x = coordinate->x + (coordinate->width - imgSize.width) - padding_x;
+ } else {
+ pos.x = coordinate->x + padding_x;
+ }
+ } else {
+ pos.x = coordinate->x + ((coordinate->width - imgSize.width) / 2);
+ pos.y = coordinate->y + ((coordinate->height - imgSize.height) / 2);
+ }
+
+ /*
+ graphics->draw_image(
+ targetwin,
+ draw_ctx,
+ composed_path,
+ pos.x + targetaddx,
+ pos.y + targetaddy,
+ imgSize.width,
+ imgSize.height
+ );*/
+ graphics->draw_image(
+ targetwin,
+ draw_ctx,
+ composed_path,
+ NULL,
+ pos.x + targetaddx,
+ pos.y + targetaddy,
+ imgSize.width,
+ imgSize.height);
+ }
+ }
+
+ /* for text */
+ for (int idx = 0; idx < coordinate->label_count; idx++) {
+ SclFontInfo info;
+ const SclLabelProperties *labelproperties = cache->get_label_properties(coordinate->label_type, idx);
+ if (labelproperties) {
+ const sclchar *label = coordinate->label[shift][idx];
+ label = cache->find_substituted_string(label);
+
+ /* If the button type is BUTTON_TYPE_ROTATION, display current keyvalue */
+ if (idx == 0) {
+ if (coordinate->button_type == BUTTON_TYPE_ROTATION) {
+ SclButtonContext* button_context = cache->get_cur_button_context(window, key_index);
+ if (button_context) {
+ if (button_context->multitap_index < MAX_SIZE_OF_MULTITAP_CHAR) {
+ label = coordinate->key_value[shift][button_context->multitap_index];
+ }
+ }
+ }
+ }
+ if (labelproperties->font_name) {
+ strncpy(info.font_name, labelproperties->font_name, MAX_FONT_NAME_LEN - 1);
+ info.font_name[MAX_FONT_NAME_LEN - 1] = '\0';
+ info.font_size = labelproperties->font_size * utils->get_smallest_custom_scale_rate();
+ info.is_bold = info.is_italic = true;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ SCLShiftState shiftstate = SCL_SHIFT_STATE_OFF;
+ if (context)
+ shiftstate = context->get_shift_state();
+ if (labelproperties->shadow_distance > 0 && labelproperties->shadow_color[shiftstate][state].a != 0) {
+ sclint deltax = 0;
+ sclint deltay = 0;
+
+ if (labelproperties->shadow_direction == SHADOW_DIRECTION_LEFT_TOP ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_LEFT_MIDDLE ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_LEFT_BOTTOM) {
+ deltax -= labelproperties->shadow_distance * utils->get_smallest_custom_scale_rate();
+ } else if (labelproperties->shadow_direction == SHADOW_DIRECTION_RIGHT_TOP ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_RIGHT_MIDDLE ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_RIGHT_BOTTOM) {
+ deltax += labelproperties->shadow_distance * utils->get_smallest_custom_scale_rate();
+ }
+
+ if (labelproperties->shadow_direction == SHADOW_DIRECTION_LEFT_TOP ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_CENTER_TOP ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_RIGHT_TOP) {
+ deltay -= labelproperties->shadow_distance * utils->get_smallest_custom_scale_rate();
+ } else if (labelproperties->shadow_direction == SHADOW_DIRECTION_LEFT_BOTTOM ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_CENTER_BOTTOM ||
+ labelproperties->shadow_direction == SHADOW_DIRECTION_RIGHT_BOTTOM) {
+ deltay += labelproperties->shadow_distance * utils->get_smallest_custom_scale_rate();
+ }
+
+ graphics->draw_text(
+ targetwin,
+ draw_ctx,
+ info,
+ labelproperties->shadow_color[shiftstate][state],
+ label,
+ NULL,
+ (sclint)coordinate->x + deltax + targetaddx,
+ (sclint)coordinate->y + deltax + targetaddy,
+ (sclint)coordinate->width,
+ (sclint)coordinate->height,
+ labelproperties->alignment,
+ labelproperties->padding_x * utils->get_custom_scale_rate_x(),
+ labelproperties->padding_y * utils->get_custom_scale_rate_y(),
+ labelproperties->inner_width * utils->get_custom_scale_rate_x(),
+ labelproperties->inner_height * utils->get_custom_scale_rate_y());
+ }
+ graphics->draw_text(
+ targetwin,
+ draw_ctx,
+ info,
+ labelproperties->font_color[shiftstate][state],
+ label,
+ NULL,
+ (sclint)coordinate->x + targetaddx,
+ (sclint)coordinate->y + targetaddy,
+ (sclint)coordinate->width,
+ (sclint)coordinate->height,
+ labelproperties->alignment,
+ labelproperties->padding_x * utils->get_custom_scale_rate_x(),
+ labelproperties->padding_y * utils->get_custom_scale_rate_y(),
+ labelproperties->inner_width * utils->get_custom_scale_rate_x(),
+ labelproperties->inner_height * utils->get_custom_scale_rate_y());
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+* Draws window's background using software
+* @remark
+*/
+sclboolean
+CSCLUIBuilder::draw_window_bg_by_sw(const sclwindow window, const scldrawctx draw_ctx, const SclSize size,
+ const scldouble line_width, const SclColor line_color, const SclColor fill_color)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+ scl_assert_return_false(draw_ctx);
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+
+ if (graphics && windows && cache) {
+ /* If the target window is virtual window, let's draw it on the base window */
+ sclwindow targetwin = window;
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->is_virtual) {
+ targetwin = windows->get_base_window();
+ }
+ }
+
+ graphics->draw_rectangle(targetwin, draw_ctx,
+ cache->get_custom_starting_coordinates().x, cache->get_custom_starting_coordinates().y,
+ size.width, size.height, line_width, line_color, TRUE, fill_color);
+ }
+
+ return TRUE;
+}
+
+/**
+ * Draws a button using software
+ * @remark draw_button
+ */
+scldrawing
+CSCLUIBuilder::draw_button_bg_by_sw(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index, const SCLButtonState state)
+{
+ //SCL_DEBUG();
+
+ //CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ //const SclLayoutKeyCoordinate* coords = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ //scl_assert_return_false(window);
+ //scl_assert_return_false(draw_ctx);
+ //scl_assert_return_false(coords);
+
+ //scl_assert_return_false(state >= BUTTON_STATE_NORMAL && state < SCL_BUTTON_STATE_MAX);
+
+ //scldouble line_width = scl_swbutton_style[scl_default_configure.sw_button_style].line_width[state];
+ //SclColor &line_color = scl_swbutton_style[scl_default_configure.sw_button_style].line_color[state];
+ //SclColor &bg_color = scl_swbutton_style[scl_default_configure.sw_button_style].bg_color[state];
+ //scldouble line_curve = scl_swbutton_style[scl_default_configure.sw_button_style].line_curve;
+ //sclfloat bg_alpha = scl_swbutton_style[scl_default_configure.sw_button_style].bg_alpha;
+
+ ///*if (g_key_spacing_off) {
+ // m_gwes->m_graphics->draw_rectangle(window,
+ // draw_ctx,
+ // (sclint)coords->x - (sclint)coords->add_hit_left,
+ // (sclint)coords->y - (sclint)coords->add_hit_top,
+ // (sclint)coords->width + (sclint)coords->add_hit_left + (sclint)coords->add_hit_right,
+ // (sclint)coords->height + (sclint)coords->add_hit_top + (sclint)coords->add_hit_bottom,
+ // line_width,
+ // line_color,
+ // TRUE,
+ // bg_color,
+ // line_curve,
+ // bg_alpha);
+ //} else {*/
+ // m_gwes->m_graphics->draw_rectangle(window,
+ // draw_ctx,
+ // coords->x,
+ // coords->y,
+ // coords->width,
+ // coords->height,
+ // line_width,
+ // line_color,
+ // TRUE,
+ // bg_color,
+ // line_curve,
+ // bg_alpha);
+ ////}
+ return NULL;
+}
+
+/**
+ * Draws a button using the set image
+ * @remark draw_button
+ */
+scldrawing
+CSCLUIBuilder::draw_button_bg_by_img(const sclwindow window, const scldrawctx draw_ctx, scl16 key_index, SCLButtonState state, SCLShiftState shift)
+{
+ SCL_DEBUG();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ const SclLayoutKeyCoordinate* coordinate = NULL;
+
+ if (!context || !windows || !graphics || !cache || !sclres_manager) return NULL;
+
+ coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+
+ PSclModifierDecoration sclres_modifier_decoration = sclres_manager->get_modifier_decoration_table();
+ assert(sclres_modifier_decoration != NULL);
+ scl_assert_return_null(window);
+ scl_assert_return_null(draw_ctx);
+
+ scl_assert_return_null(state >= BUTTON_STATE_NORMAL && state < SCL_BUTTON_STATE_MAX);
+
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+
+ if (context && windows && graphics && cache && coordinate) {
+ sclboolean path_composed = FALSE;
+ /* Check if we need to decorate the button's drag state */
+ //if (context->get_cur_drag_state(context->get_last_touch_device_id()) != SCL_DRAG_STATE_NONE &&
+ if (context->get_cur_key_modifier(context->get_last_touch_device_id()) != KEY_MODIFIER_NONE &&
+ context->get_cur_pressed_window(context->get_last_touch_device_id()) == window &&
+ context->get_cur_pressed_key(context->get_last_touch_device_id()) == key_index &&
+ coordinate->modifier_decorator) {
+ sclchar *decoration_bg_img = NULL;
+ const SclModifierDecoration *decoration = NULL;
+ /* FIXME */
+ /*if (scl_check_arrindex(coordinate->modifier_decorator,
+ sizeof(sclres_modifier_decoration) / sizeof(SclModifierDecoration ))) {*/
+ scl8 decoration_id = sclres_manager->get_modifier_decoration_id(coordinate->modifier_decorator);
+ if (scl_check_arrindex(decoration_id, MAX_SCL_MODIFIER_DECORATION_NUM)) {
+ if (sclres_modifier_decoration[decoration_id].valid) {
+ decoration = &(sclres_modifier_decoration[decoration_id]);
+ }
+ }
+ if (decoration) {
+ sclshort display = context->get_display_mode();
+ if (!scl_check_arrindex(display, DISPLAYMODE_MAX)) display = 0;
+ SCLKeyModifier modifier = context->get_cur_key_modifier(context->get_last_touch_device_id());
+ if (!scl_check_arrindex(modifier, KEY_MODIFIER_MAX)) modifier = KEY_MODIFIER_NONE;
+ decoration_bg_img = decoration->bg_image_path[display][modifier];
+ /*sclshort dragstate = context->get_cur_drag_state(context->get_last_touch_device_id());
+ if (!scl_check_arrindex(dragstate, SCL_DRAG_STATE_MAX)) dragstate = 0;
+ decoration_bg_img = decoration->bg_image_path[display][dragstate];*/
+ }
+ if (decoration_bg_img) {
+ if (strlen(decoration_bg_img) > 0) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, decoration_bg_img);
+ path_composed = TRUE;
+ }
+ }
+ }
+ if (!path_composed) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, coordinate->bg_image_path[shift][state]);
+ }
+
+ /* If the target window is virtual window, let's draw it on the base window */
+ sclint targetx = coordinate->x;
+ sclint targety = coordinate->y;
+ sclwindow targetwin = window;
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->is_virtual) {
+ //SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ targetwin = windows->get_base_window();
+ targetx += window_context->geometry.x - base_window_context->geometry.x;
+ targety += window_context->geometry.y - base_window_context->geometry.y;
+ }
+ }
+ }
+
+ /*if (g_key_spacing_off) {
+ m_gwes->m_graphics->draw_image(
+ window,
+ draw_ctx,
+ composed_path,
+ (sclint)coordinate->x - (sclint)coordinate->add_hit_left,
+ (sclint)coordinate->y - (sclint)coordinate->add_hit_top,
+ (sclint)coordinate->width + (sclint)coordinate->add_hit_left + (sclint)coordinate->add_hit_right,
+ (sclint)coordinate->height + (sclint)coordinate->add_hit_top + (sclint)coordinate->add_hit_bottom
+ );
+ } else {*/
+ return graphics->draw_image(
+ targetwin,
+ draw_ctx,
+ composed_path,
+ NULL,
+ (sclint)targetx,
+ (sclint)targety,
+ (sclint)coordinate->width,
+ (sclint)coordinate->height);
+ //}
+ }
+
+ return NULL;
+}
+
+/**
+ * Draws a button using the set layout image
+ * @remark draw_button
+ */
+scldrawing
+CSCLUIBuilder::draw_button_bg_by_layoutimg(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index, const SCLButtonState state, const sclboolean shift)
+{
+ SCL_DEBUG();
+
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (!context || !windows || !cache || !sclres_manager) return NULL;
+
+ const SclLayout* layout = cache->get_cur_layout(window);
+ const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(window, key_index);
+ PSclModifierDecoration sclres_modifier_decoration = sclres_manager->get_modifier_decoration_table();
+ assert(sclres_modifier_decoration != NULL);
+
+ scl_assert_return_null(window);
+ scl_assert_return_null(draw_ctx);
+
+ scl_assert_return_null(state >= BUTTON_STATE_NORMAL && state < SCL_BUTTON_STATE_MAX);
+
+ //SclWindowContext *window_context = windows->get_window_context(window, FALSE);
+ SclWindowContext *window_context = windows->get_window_context(window);
+
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ if (context && cache && coordinate && window_context) {
+ sclboolean path_composed = FALSE;
+ /* Check if we need to decorate the button's drag state */
+ //if (context->get_cur_drag_state(context->get_last_touch_device_id()) != SCL_DRAG_STATE_NONE &&
+ if (context->get_cur_key_modifier(context->get_last_touch_device_id()) != KEY_MODIFIER_NONE &&
+ context->get_cur_pressed_window(context->get_last_touch_device_id()) == window &&
+ context->get_cur_pressed_key(context->get_last_touch_device_id()) == key_index &&
+ coordinate->modifier_decorator) {
+ sclchar *decoration_bg_img = NULL;
+ const SclModifierDecoration *decoration = NULL;
+ /* FIXME */
+ /*if (scl_check_arrindex(coordinate->modifier_decorator,
+ sizeof(sclres_modifier_decoration) / sizeof(SclModifierDecoration ))) {*/
+ scl8 decoration_id = sclres_manager->get_modifier_decoration_id(coordinate->modifier_decorator);
+ if (scl_check_arrindex(decoration_id, MAX_SCL_MODIFIER_DECORATION_NUM)) {
+ if (sclres_modifier_decoration[decoration_id].valid) {
+ decoration = &(sclres_modifier_decoration[decoration_id]);
+ }
+ }
+ if (decoration) {
+ sclshort display = context->get_display_mode();
+ if (!scl_check_arrindex(display, DISPLAYMODE_MAX)) display = 0;
+ SCLKeyModifier modifier = context->get_cur_key_modifier(context->get_last_touch_device_id());
+ if (!scl_check_arrindex(modifier, KEY_MODIFIER_MAX)) modifier = KEY_MODIFIER_NONE;
+ decoration_bg_img = decoration->bg_image_path[display][modifier];
+ /*sclshort dragstate = context->get_cur_drag_state(context->get_last_touch_device_id());
+ if (!scl_check_arrindex(dragstate, SCL_DRAG_STATE_MAX)) dragstate = 0;
+ decoration_bg_img = decoration->bg_image_path[display][dragstate];*/
+ }
+ if (decoration_bg_img) {
+ if (strlen(decoration_bg_img) > 0) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, decoration_bg_img);
+ path_composed = TRUE;
+ }
+ }
+ }
+ if (!path_composed && layout) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, layout->image_path[state]);
+ }
+ /*if (g_key_spacing_off) {
+ m_gwes->m_graphics->draw_image(
+ window,
+ draw_ctx,
+ composed_path,
+ (sclint)coordinate->x - (sclint)coordinate->add_hit_left,
+ (sclint)coordinate->y - (sclint)coordinate->add_hit_top,
+ (sclint)coordinate->width + (sclint)coordinate->add_hit_left + (sclint)coordinate->add_hit_right,
+ (sclint)coordinate->height + (sclint)coordinate->add_hit_top + (sclint)coordinate->add_hit_bottom,
+ window_context->imgOffsetx + (sclint)coordinate->x - (sclint)coordinate->add_hit_left,
+ window_context->imgOffsety + (sclint)coordinate->y - (sclint)coordinate->add_hit_top,
+ (sclint)coordinate->width + (sclint)coordinate->add_hit_left + (sclint)coordinate->add_hit_right,
+ (sclint)coordinate->height + (sclint)coordinate->add_hit_top + (sclint)coordinate->add_hit_bottom,
+ TRUE
+ );
+ } else {*/
+ sclint dest_x = coordinate->x;
+ sclint dest_y = coordinate->y;
+ if (window_context->is_virtual) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ dest_x += (window_context->geometry.x - base_window_context->geometry.x);
+ dest_y += (window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+
+ return m_gwes->m_graphics->draw_image(
+ window,
+ draw_ctx,
+ composed_path,
+ NULL,
+ dest_x,
+ dest_y,
+ (sclint)coordinate->width,
+ (sclint)coordinate->height,
+ window_context->layout_image_offset.x + (sclint)coordinate->x,
+ window_context->layout_image_offset.y + (sclint)coordinate->y,
+ (sclint)coordinate->width,
+ (sclint)coordinate->height,
+ TRUE);
+ //}
+ }
+ return NULL;
+}
+
+/**
+ * Shows the magnifier window
+ */
+sclboolean
+CSCLUIBuilder::show_magnifier(const sclwindow window, scldrawctx draw_ctx)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (!utils || !context || !cache || !state || !windows) return FALSE;
+
+ utils->log("show_magnifier");
+ sclwindow pressed_window = context->get_cur_pressed_window(context->get_last_touch_device_id());
+ scl8 pressed_key = context->get_cur_pressed_key(context->get_last_touch_device_id());
+
+ /* Due to the explicit delay on hiding magnifier window, there is a case pressed key has been already reset */
+ if (pressed_key == NOT_USED) {
+ pressed_window = context->get_prev_pressed_window(context->get_last_touch_device_id());
+ pressed_key = context->get_prev_pressed_key(context->get_last_touch_device_id());
+ }
+
+ if (pressed_key == NOT_USED || pressed_key >= MAX_KEY) {
+ //utils->log("show_magnifier pressed_key == NOT_USED || pressed_key >= MAX_KEY \n");
+ return TRUE;
+ }
+
+ const SclLayout *layout = cache->get_cur_layout(windows->get_base_window());
+ SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+ SclButtonContext* button_context = cache->get_cur_button_context(pressed_window, pressed_key);
+ SCLShiftState shift_index = context->get_shift_state();
+ if (shift_index >= SCL_SHIFT_STATE_MAX) shift_index = SCL_SHIFT_STATE_OFF;
+ if (context->get_caps_lock_mode()) {
+ shift_index = (shift_index == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+
+ /* Do not show if current layout does not allow magnifier */
+ if (layout) {
+ if (!(layout->use_magnifier_window)) {
+ if (utils) {
+ utils->log("!(layout->use_magnifier_window \n");
+ }
+ return FALSE;
+ }
+ }
+ if (coordinate) {
+ /* Some key types do not use the magnifier window */
+ if ((coordinate->key_type == KEY_TYPE_CONTROL &&
+ coordinate->key_event[0][0] != MVK_space &&
+ coordinate->key_event[0][0] != MVK_BackSpace) ||
+ (coordinate->key_type == KEY_TYPE_MODECHANGE ||
+ coordinate->key_type == KEY_TYPE_NONE ||
+ coordinate->button_type == BUTTON_TYPE_ROTATION)) {
+ return FALSE;
+ }
+ /* FIXME : workaround for not showing magnifier for recent symbols */
+ /* Do not show if there's nothing to show */
+ //const char *targetstr = coordinate->key_value[shift_index][button_context->multikeyIdx];
+ const char *targetstr = coordinate->label[shift_index][0];
+ if (state) {
+ if (state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY) {
+ targetstr = coordinate->long_key_value;
+ }
+ }
+ const sclchar* customstr = NULL;
+ for (sclint label_index = 0;label_index < MAX_SIZE_OF_LABEL_FOR_ONE && !customstr;label_index++) {
+ const sclchar *tempstr = context->get_custom_magnifier_label(context->get_last_touch_device_id(), label_index);
+ if (tempstr) {
+ customstr = tempstr;
+ }
+ }
+ if (customstr) {
+ targetstr = customstr;
+ }
+ if (targetstr == NULL) {
+ if (utils) {
+ utils->log("coordinate->key_value[shift][button_context->multikeyIdx] == NULL \n");
+ }
+ return FALSE;
+ } else if (strlen(targetstr) == 0) {
+ if (utils) {
+ utils->log("coordinate->key_value[shift][button_context->multikeyIdx]) == 0 \n");
+ }
+ return FALSE;
+ }
+ }
+
+#if 0
+ SclPoint pos = {0, 0};
+ /* calculates x position to be set */
+ pos.x = (coordinate->x + (coordinate->width / 2)) - (utils->get_scale_x(scl_magnifier_configure.width) / 2);
+
+ /* calculates y position to be set */
+ sclint scnWidth, scnHeight;
+ utils->get_screen_resolution(&scnWidth, &scnHeight);
+ pos.y = (scnHeight - layout->height) + coordinate->y - utils->get_scale_y(scl_magnifier_configure.height);
+ windows->move_window(windows->get_magnifier_window(), pos.x, pos.y);
+#endif
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+ if (coordinate && magnifier_configure && utils && state) {
+ sclchar composed_path[_POSIX_PATH_MAX] = {0, };
+ if (state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, magnifier_configure->bg_long_key_image_path);
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x(),
+ magnifier_configure->height * utils->get_custom_scale_rate_y());
+ } else {
+ if (shift_index == SCL_SHIFT_STATE_LOCK) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, magnifier_configure->bg_shift_lock_image_path);
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x(),
+ magnifier_configure->height * utils->get_custom_scale_rate_y());
+ } else if (shift_index == SCL_SHIFT_STATE_ON) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, magnifier_configure->bg_shift_image_path);
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x(),
+ magnifier_configure->height * utils->get_custom_scale_rate_y());
+ } else {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, magnifier_configure->bg_image_path);
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x(),
+ magnifier_configure->height * utils->get_custom_scale_rate_y());
+ }
+ }
+
+ for (int loop = 0;loop < MAX_WND_DECORATOR;loop++) {
+ if (magnifier_configure->decoration_image_path[loop] &&
+ strlen(magnifier_configure->decoration_image_path[loop]) > 0) {
+ m_utils->get_composed_path(composed_path, IMG_PATH_PREFIX, magnifier_configure->decoration_image_path[loop]);
+ int decoration_size = magnifier_configure->decoration_size * utils->get_smallest_custom_scale_rate();
+ switch (loop) {
+ case WND_DECORATOR_TOP_LEFT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL,
+ 0, 0, decoration_size, decoration_size);
+ break;
+ case WND_DECORATOR_TOP_CENTER:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, decoration_size, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x()- (2 * decoration_size), decoration_size);
+ break;
+ case WND_DECORATOR_TOP_RIGHT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL,
+ magnifier_configure->width * utils->get_custom_scale_rate_x() - decoration_size, 0, decoration_size, decoration_size);
+ break;
+ case WND_DECORATOR_MIDDLE_LEFT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0,
+ decoration_size, decoration_size, magnifier_configure->height * utils->get_custom_scale_rate_y() - (2 * decoration_size));
+ break;
+ case WND_DECORATOR_MIDDLE_CENTER:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0, 0,
+ magnifier_configure->width * utils->get_custom_scale_rate_x(), magnifier_configure->height * utils->get_custom_scale_rate_y());
+ break;
+ case WND_DECORATOR_MIDDLE_RIGHT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL,
+ magnifier_configure->width * utils->get_custom_scale_rate_x() - decoration_size, decoration_size,
+ decoration_size, magnifier_configure->height * utils->get_custom_scale_rate_y() - (2 * decoration_size));
+ break;
+ case WND_DECORATOR_BOTTOM_LEFT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, 0,
+ magnifier_configure->height * utils->get_custom_scale_rate_y() - decoration_size, decoration_size, decoration_size);
+ break;
+ case WND_DECORATOR_BOTTOM_CENTER:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL,
+ decoration_size, magnifier_configure->height * utils->get_custom_scale_rate_y() - decoration_size,
+ magnifier_configure->width * utils->get_custom_scale_rate_x() - (2 * decoration_size), decoration_size);
+ break;
+ case WND_DECORATOR_BOTTOM_RIGHT:
+ m_gwes->m_graphics->draw_image(window, draw_ctx, composed_path, NULL, magnifier_configure->width * utils->get_custom_scale_rate_x()
+ - decoration_size, magnifier_configure->height * utils->get_custom_scale_rate_y() - decoration_size, decoration_size, decoration_size);
+ break;
+ }
+ }
+ }
+
+ sclboolean ended = FALSE;
+ for (int loop = 0;loop < MAX_SIZE_OF_LABEL_FOR_ONE && !ended;loop++) {
+ const SclLabelProperties *labelproperties = cache->get_label_properties(magnifier_configure->label_type, loop);
+ if (labelproperties) {
+ if (labelproperties->valid) {
+ if (magnifier_configure->show_shift_label) {
+ shift_index = SCL_SHIFT_STATE_ON;
+ }
+ if ((coordinate->use_long_key_magnifier && state->get_cur_action_state() == ACTION_STATE_BASE_LONGKEY) ||
+ state->get_cur_action_state() == ACTION_STATE_POPUP_LONGKEY) {
+ const sclchar* targetstr = coordinate->long_key_value;
+ const sclchar* customstr = context->get_custom_magnifier_label(context->get_last_touch_device_id(), loop);
+ if (customstr) {
+ if (coordinate->long_key_value == NULL) {
+ targetstr = customstr;
+ } else if (strlen(coordinate->long_key_value) == 0) {
+ targetstr = customstr;
+ } else if (strcmp(coordinate->long_key_value, " ") == 0) {
+ targetstr = customstr;
+ }
+ draw_magnifier_label(window, draw_ctx, loop, targetstr);
+ } else if (loop == 0) {
+ targetstr = cache->find_substituted_string(targetstr);
+ draw_magnifier_label(window, draw_ctx, 0, targetstr);
+ }
+ } else {
+ const sclchar* targetstr = NULL;
+ const sclchar* customstr = context->get_custom_magnifier_label(context->get_last_touch_device_id(), loop);
+ if (customstr) {
+ targetstr = customstr;
+ } else if (coordinate->magnifier_label[shift_index][loop]) {
+ targetstr = coordinate->magnifier_label[shift_index][loop];
+ targetstr = cache->find_substituted_string(targetstr);
+ } else if (loop == 0) {
+ /* Don't display sublabels of each buttons in magnifier window - this policy can be changed, but for now */
+ if (button_context) {
+ targetstr = coordinate->label[shift_index][button_context->multitap_index];
+ targetstr = cache->find_substituted_string(targetstr);
+ }
+ }
+ if (targetstr) {
+ draw_magnifier_label(window, draw_ctx, loop, targetstr);
+ }
+ }
+ } else {
+ ended = TRUE;
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * Draws labels on the rectangle of the magnifier window
+ * @remark show_magnifier
+ */
+sclboolean
+CSCLUIBuilder::draw_magnifier_label(const sclwindow window, const scldrawctx draw_ctx, const scl16 label_index, const sclchar* label)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(window);
+ scl_assert_return_false(draw_ctx);
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+
+ if (utils && windows && cache && context && graphics && magnifier_configure) {
+ const SclLabelProperties *labelproperties = NULL;
+ if (scl_check_arrindex(label_index, MAX_SIZE_OF_LABEL_FOR_ONE)) {
+ labelproperties = cache->get_label_properties(magnifier_configure->label_type, label_index);
+ }
+ if (labelproperties) {
+ SclFontInfo info;
+ if (labelproperties->font_name) {
+ strncpy(info.font_name, labelproperties->font_name, MAX_FONT_NAME_LEN - 1);
+ }
+ info.font_name[MAX_FONT_NAME_LEN - 1] = '\0';
+ info.font_size = labelproperties->font_size * utils->get_smallest_custom_scale_rate();
+ info.is_bold = info.is_italic = true;
+
+ SCLShiftState shiftstate = context->get_shift_state();
+ if (scl_check_arrindex(shiftstate, SCL_SHIFT_STATE_MAX)) {
+ if (context->get_caps_lock_mode()) {
+ shiftstate = (shiftstate == SCL_SHIFT_STATE_OFF) ? SCL_SHIFT_STATE_ON : SCL_SHIFT_STATE_OFF;
+ }
+ graphics->draw_text(
+ window,
+ draw_ctx,
+ info,
+ labelproperties->font_color[shiftstate][BUTTON_STATE_NORMAL],
+ label,
+ NULL,
+ magnifier_configure->label_area_rect.left * utils->get_custom_scale_rate_x(),
+ magnifier_configure->label_area_rect.top * utils->get_custom_scale_rate_y(),
+ magnifier_configure->label_area_rect.right * utils->get_custom_scale_rate_x(),
+ magnifier_configure->label_area_rect.bottom * utils->get_custom_scale_rate_y(),
+ labelproperties->alignment,
+ labelproperties->padding_x * utils->get_custom_scale_rate_x(),
+ labelproperties->padding_y * utils->get_custom_scale_rate_y(),
+ labelproperties->inner_width * utils->get_custom_scale_rate_x(),
+ labelproperties->inner_height * utils->get_custom_scale_rate_y());
+ }
+ }
+ }
+ return TRUE;
+}
+
+void
+CSCLUIBuilder::set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data)
+{
+ CSCLGraphics *graphics = CSCLGraphics::get_instance();
+
+ if (graphics)
+ graphics->set_graphics_backend_callback(callback, data);
+}
+
+void
+CSCLUIBuilder::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
+{
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (m_gwes) {
+ if (m_gwes->m_windows)
+ m_gwes->m_windows->set_window_backend_callback(callback, data);
+ else {
+ if (utils)
+ utils->log("No window");
+ }
+ }
+ else {
+ if (utils)
+ utils->log("No GWES");
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <map>
+#include <string>
+#include "sclgwes.h"
+#include "sclutils.h"
+#include "sclgraphicsbackendcallback.h"
+#include "sclwindowbackendcallback.h"
+
+#ifndef __SCL_UIBUILDER_H__
+#define __SCL_UIBUILDER_H__
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLUIBuilder
+{
+ friend class CSCLFontProxy;
+
+private:
+ CSCLUIBuilder();
+public:
+ virtual ~CSCLUIBuilder();
+
+ static CSCLUIBuilder* get_instance();
+
+ void init(sclwindow parent);
+ sclboolean show_layout(const sclwindow window, const scl16 x = 0, const scl16 y = 0, const scl16 width = 0, const scl16 height = 0);
+ sclboolean draw_button(const sclwindow window, scldrawctx draw_ctx, const scl16 key_index, const SCLButtonState state, const sclboolean force_draw_bg = FALSE);
+ sclboolean show_magnifier(const sclwindow window, scldrawctx draw_ctx);
+ sclboolean show_autopopup(const sclwindow parent, scldrawctx draw_ctx, const scl16 key_index);
+
+ void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data);
+ void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data);
+
+private:
+ sclboolean draw_button_all(const sclwindow window, const scldrawctx draw_ctx, const scl16 x, const scl16 y, const scl16 width, const scl16 height);
+ scldrawing draw_button_bg_by_sw(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index, const SCLButtonState state);
+ sclboolean draw_window_bg_by_sw(const sclwindow window, const scldrawctx draw_ctx, const SclSize size,
+ const scldouble line_width, const SclColor line_color, const SclColor fill_color);
+ scldrawing draw_button_bg_by_img(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index,
+ SCLButtonState state, SCLShiftState shift);
+ scldrawing draw_button_bg_by_layoutimg(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index,
+ const SCLButtonState state, const sclboolean shift);
+ sclboolean draw_button_label(const sclwindow window, const scldrawctx draw_ctx, const scl16 key_index,
+ SCLButtonState state, SCLShiftState shift);
+
+ sclboolean draw_magnifier_label(const sclwindow window, const scldrawctx draw_ctx, const scl16 label_index, const sclchar* label);
+
+ const sclchar* get_button_text_to_read(const sclwindow window, const scl16 key_index, SCLShiftState shift_index);
+
+protected:
+ /* Backend Primitive */
+ CSCLGwes *m_gwes;
+ CSCLUtils *m_utils;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_UIBUILDER_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "scluiimpl.h"
+#include "scldebug.h"
+#include "scluibuilder.h"
+#include "sclcontroller.h"
+#include "sclresourcecache.h"
+#include "sclerroradjustment.h"
+#include "sclres_manager.h"
+#include "scleventhandler.h"
+#include "sclkeyfocushandler.h"
+#include "sclanimator.h"
+
+using namespace scl;
+
+CSCLUIImpl::CSCLUIImpl()
+{
+ SCL_DEBUG();
+
+ /*CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+ if (builder && controller) {
+ builder->init(SCLWINDOW_INVALID);
+ controller->init();
+ }*/
+ m_initialized = FALSE;
+ /* FIXME whether need the libscl-ui autocapital the shift state */
+ /* if set to FALSE, the libscl-ui will not auto handle the shift state */
+ /* the client will handle outside the libscl-ui, default is TRUE */
+ m_autocapital_shift_state = TRUE;
+}
+
+CSCLUIImpl::~CSCLUIImpl()
+{
+ SCL_DEBUG();
+}
+
+CSCLUIImpl*
+CSCLUIImpl::get_instance()
+{
+ static CSCLUIImpl instance;
+ return &instance;
+}
+
+sclboolean CSCLUIImpl::init(sclwindow parent, const SCLParserType parser_type, const char *entry_filepath)
+{
+ SCL_DEBUG();
+
+ SCL_DEBUG_ELAPSED_TIME_START();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (sclres_manager && builder && cache && utils) {
+ sclres_manager->init(parser_type, entry_filepath);
+
+ utils->init();
+ cache->init();
+ builder->init(parent);
+
+ m_initialized = TRUE;
+ }
+
+ SCL_DEBUG_ELAPSED_TIME_END();
+
+ return TRUE;
+}
+
+void
+CSCLUIImpl::fini()
+{
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->fini();
+ }
+
+ CSCLGwes *gwes = CSCLGwes::get_instance();
+ if (gwes) {
+ gwes->fini();
+ }
+}
+
+/**
+ * Shows the SCL main window
+ * For displaying the SCL UI, you should explicitly call this function after CSCLUIImpl class is created
+ */
+void
+//CSCLUIImpl::show(sclboolean auto_relocate /* = TRUE */ )
+CSCLUIImpl::show()
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (utils && windows && controller && context && sclres_manager) {
+ if (utils->update_screen_resolution()) {
+ utils->log("Screen resolution updated, now reloading resource files");
+ /* If the screen resolution has been changed, reload all the xml files and recompute layout */
+ sclres_manager->reload();
+
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ cache->resize_resource_elements_by_resolution();
+ cache->recompute_layout(windows->get_base_window());
+ }
+ } else {
+ utils->log("Screen resolution not changed, continuing");
+ }
+ //if (auto_relocate) {
+ if (TRUE) {
+ /* Let's relocate our base window - bottomed center aligned */
+ SclRectangle rect = get_main_window_rect();
+
+ sclint scrx, scry;
+ utils->get_screen_resolution(&scrx, &scry);
+
+ sclint pos_x = (scrx - rect.width) / 2;
+ sclint pos_y = (scry - rect.height);
+
+ windows->move_window(windows->get_base_window(), pos_x, pos_y);
+ }
+
+ sclwindow window = windows->get_base_window();
+ controller->handle_engine_signal(SCL_SIG_SHOW);
+ windows->show_window(window);
+ }
+ }
+}
+
+/**
+ * Hides the SCL main window
+ * The real hide action does not work about base window because that is child of the active window
+ */
+void
+CSCLUIImpl::hide()
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (controller && windows) {
+ controller->handle_engine_signal(SCL_SIG_HIDE);
+ windows->hide_window(windows->get_base_window());
+ }
+ }
+}
+
+
+/**
+ * Registers an event callback function
+ * so that the user which uses SCL can receives all events occuring in running
+ */
+void
+CSCLUIImpl::set_ui_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode)
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ if (handler) {
+ handler->set_event_callback(callback, input_mode);
+ }
+ }
+}
+
+void
+CSCLUIImpl::set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data)
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ if (builder) {
+ builder->set_graphics_backend_callback(callback, data);
+ }
+ }
+}
+
+void
+CSCLUIImpl::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ if (builder) {
+ builder->set_window_backend_callback(callback, data);
+ }
+ }
+}
+
+/**
+ * Sets the current input mode to the given mode
+ * @Usage
+ * gCore->set_input_mode("INPUT_MODE_SYMBOL");
+ */
+sclboolean
+CSCLUIImpl::set_input_mode(const sclchar *input_mode)
+{
+ SCL_DEBUG();
+ SCL_DEBUG_ELAPSED_TIME_START();
+
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ scl8 mode = NOT_USED;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (sclres_manager) {
+ mode = sclres_manager->get_inputmode_id(input_mode);
+ }
+
+ if (controller && windows && handler && focus_handler && mode != NOT_USED) {
+ if (handler->set_input_mode(input_mode)) {
+ ret = controller->process_input_mode_change(mode);
+ windows->update_window(windows->get_base_window());
+ focus_handler->init_key_index();
+ }
+ }
+ }
+
+ SCL_DEBUG_ELAPSED_TIME_END();
+ return ret;
+}
+
+/**
+ * Returns the current input mode
+ */
+const sclchar*
+CSCLUIImpl::get_input_mode()
+{
+ SCL_DEBUG();
+
+ const sclchar *ret = NULL;
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (context && sclres_manager) {
+ scl8 inputmode_id = context->get_input_mode();
+ ret = sclres_manager->get_inputmode_name(inputmode_id);
+ }
+ }
+ return ret;
+}
+
+
+/**
+ * Sets the given popup window's input mode to the given mode
+ * @Usage
+ * gCore->set_input_mode("INPUT_MODE_SYMBOL");
+ */
+sclboolean
+CSCLUIImpl::set_popup_input_mode(sclwindow window, const sclchar *input_mode)
+{
+ SCL_DEBUG();
+ SCL_DEBUG_ELAPSED_TIME_START();
+
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ scl8 mode = NOT_USED;
+ sclshort layout = NOT_USED;
+ SclWindowContext *window_context = NULL;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (sclres_manager && windows && context) {
+ SCLDisplayMode display_mode = context->get_display_mode();
+ PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ mode = sclres_manager->get_inputmode_id(input_mode);
+ window_context = windows->get_window_context(window);
+ if (sclres_input_mode_configure &&
+ scl_check_arrindex(mode, MAX_SCL_INPUT_MODE) &&
+ scl_check_arrindex(display_mode, DISPLAYMODE_MAX)) {
+ layout = sclres_manager->get_layout_id(sclres_input_mode_configure[mode].layouts[display_mode]);
+ }
+ }
+
+ if (cache && windows && window_context) {
+ if (mode != NOT_USED && mode != window_context->inputmode && layout != NOT_USED) {
+ window_context->inputmode = mode;
+ window_context->layout = layout;
+ cache->recompute_layout(window);
+ windows->update_window(window);
+ ret = TRUE;
+ }
+ }
+ }
+
+ SCL_DEBUG_ELAPSED_TIME_END();
+ return ret;
+}
+
+/**
+ * Returns the given window's input mode
+ */
+const sclchar*
+CSCLUIImpl::get_popup_input_mode(sclwindow window)
+{
+ SCL_DEBUG();
+
+ const sclchar *ret = NULL;
+
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (windows && sclres_manager) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (scl_check_arrindex(window_context->inputmode, MAX_SCL_INPUT_MODE)) {
+ ret = sclres_manager->get_inputmode_name(window_context->inputmode);
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * Sets the current rotation
+ */
+sclboolean
+CSCLUIImpl::set_rotation(SCLRotation rotation)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+
+ if (utils && windows && controller) {
+ ret = controller->process_rotation_change(rotation);
+
+ //if (auto_relocate) {
+ if (TRUE) {
+ /* Let's relocate our base window - bottomed center aligned */
+ SclRectangle rect = get_main_window_rect();
+
+ sclint scrx, scry;
+ utils->get_screen_resolution(&scrx, &scry);
+
+ sclint pos_x = (scrx - rect.width) / 2;
+ sclint pos_y = (scry - rect.height);
+
+ windows->move_window(windows->get_base_window(), pos_x, pos_y);
+ }
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the current rotation
+ */
+SCLRotation
+CSCLUIImpl::get_rotation()
+{
+ SCL_DEBUG();
+
+ SCLRotation ret = ROTATION_0;
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_rotation();
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the current display mode
+ */
+SCLDisplayMode
+CSCLUIImpl::get_display_mode()
+{
+ SCL_DEBUG();
+
+ SCLDisplayMode ret = DISPLAYMODE_MAX;
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_display_mode();
+ }
+ }
+ return ret;
+}
+
+/**
+ * Sets a private key to the current context
+ * The other properties except given parameters will keep to the original value.
+ * @Usage
+ * gCore->set_private_key(INPUT_MODE_NUMBER, LYT_PORTRAIT_NOW_3x4, 0, "private", 999, TRUE);
+ *
+ * @param fRedraw If true, it will redraw the current key
+ */
+sclint
+CSCLUIImpl::set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean fRedraw)
+{
+ SCL_DEBUG();
+ sclint ret = NOT_USED;
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (windows && cache) {
+ ret = cache->set_private_key(custom_id, label, imagelabel, imagebg,
+ key_event, key_value, fRedraw, windows->get_update_pending());
+ }
+ }
+ return ret;
+}
+
+
+/**
+* Unsets a private key to the current context
+*/
+void
+CSCLUIImpl::unset_private_key(const sclchar* custom_id)
+{
+ SCL_DEBUG();
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ cache->unset_private_key(custom_id);
+ }
+ }
+}
+
+/**
+* Sets the current theme
+*/
+/* FIXME : If setting themename is not allowed before initializing,
+ the default theme has to be loaded regardless of current theme name
+ and the appropriate current theme has to be loaded afterwards, which is very inefficient */
+sclboolean
+CSCLUIImpl::set_cur_themename(const sclchar *themename)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (cache && windows) {
+ cache->set_cur_themename(themename);
+ windows->update_window(windows->get_base_window());
+ int loop = 0;
+ sclwindow window;
+ do {
+ window = windows->get_nth_popup_window(loop);
+ if (window) {
+ windows->update_window(window);
+ }
+ loop++;
+ } while (window);
+ }
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+SCLShiftState
+CSCLUIImpl::get_shift_state()
+{
+ SCLShiftState ret = SCL_SHIFT_STATE_OFF;
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_shift_state();
+ }
+ }
+ return ret;
+}
+
+void
+CSCLUIImpl::set_shift_state(SCLShiftState state)
+{
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ /*inform the client that the shift state changed */
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+ if (handler) {
+ SclNotiShiftStateChangeDesc desc;
+ desc.ui_event_desc = NULL;
+ desc.shift_state = state;
+
+ SCLEventReturnType ret = handler->on_event_notification(SCL_UINOTITYPE_SHIFT_STATE_CHANGE, &desc);
+ if (ret == SCL_EVENT_DONE) {
+ return;
+ }
+ }
+
+ if (context && windows && utils) {
+ SCLShiftState current_state = context->get_shift_state();
+ context->set_shift_state(state);
+ if (state != current_state) {
+ windows->update_window(windows->get_base_window());
+ if (context->get_tts_enabled()) {
+ if (state == SCL_SHIFT_STATE_ON) {
+ utils->play_tts(SCL_SHIFT_STATE_ON_HINT_STRING);
+ } else if (state == SCL_SHIFT_STATE_LOCK) {
+ utils->play_tts(SCL_SHIFT_STATE_LOCK_HINT_STRING);
+ } else {
+ utils->play_tts(SCL_SHIFT_STATE_OFF_HINT_STRING);
+ }
+ }
+ }
+ }
+ }
+}
+
+sclboolean
+CSCLUIImpl::get_caps_lock_mode()
+{
+ sclboolean ret = FALSE;
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_caps_lock_mode();
+ }
+ }
+ return ret;
+}
+
+void
+CSCLUIImpl::set_caps_lock_mode(sclboolean mode)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (context && windows) {
+ sclboolean current_mode = context->get_caps_lock_mode();
+ if (mode != current_mode) {
+ context->set_caps_lock_mode(mode);
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+}
+
+/**
+ * This function will be called by the user which uses SCL when the context of the focus application is changed
+ * ISE user should explicitly call this function when the context of application is changed.
+ * For instance, focus-changed, application-changed,, and so on.
+ * This function will call CSCLController to init the related variables.
+ */
+void
+CSCLUIImpl::notify_app_focus_changed()
+{
+ SCL_DEBUG();
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ controller->handle_engine_signal(SCL_SIG_FOCUS_CHANGE);
+ }
+ }
+}
+
+void
+CSCLUIImpl::reset_popup_timeout()
+{
+ SCL_DEBUG();
+ if (m_initialized) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (events && windows) {
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+
+ sclbyte index = 0;
+ sclboolean timerset = FALSE;
+ sclwindow window = SCLWINDOW_INVALID;
+ SclWindowContext *window_context = NULL;
+ do {
+ window = windows->get_nth_window_in_Z_order_list(index);
+ //window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (window_context->timeout != 0) {
+ events->create_timer(SCL_TIMER_POPUP_TIMEOUT, window_context->timeout, 0, TRUE);
+ timerset = TRUE;
+ }
+ index++;
+ }
+ } while (index < MAX_ZORDER_NUM && window != SCLWINDOW_INVALID && !timerset);
+ }
+ }
+}
+
+void
+CSCLUIImpl::close_all_popups()
+{
+ SCL_DEBUG();
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ windows->close_all_popups();
+ }
+ }
+}
+
+/**
+ * Returns a scale rate (see default screen resolution in sclconfig.h file)
+ */
+sclfloat
+CSCLUIImpl::get_scale_rate()
+{
+ sclfloat ret = 0.0f;
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ ret = utils->get_smallest_scale_rate();
+ }
+ }
+ return ret;
+}
+
+/**
+ * Returns a calculated x value according to the current screen resolution
+ */
+scl16
+CSCLUIImpl::get_scaled_x(scl16 x)
+{
+ scl16 ret = 0;
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ ret = utils->get_scaled_x(x);
+ }
+ }
+ return ret;
+}
+
+/**
+ * Returns a calculated y value according to the current screen resolution
+ */
+scl16
+CSCLUIImpl::get_scaled_y(scl16 y)
+{
+ scl16 ret = 0;
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ ret = utils->get_scaled_y(y);
+ }
+ }
+ return ret;
+}
+
+/**
+ * Returns the current rate x value for resizing the keyboard's content
+ */
+sclfloat
+CSCLUIImpl::get_custom_scale_rate_x()
+{
+ sclfloat ret = 1.0f;
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ ret = utils->get_custom_scale_rate_x();
+ }
+ }
+ return ret;
+}
+
+/**
+ * Returns the current rate y value for resizing the keyboard's content
+ */
+sclfloat
+CSCLUIImpl::get_custom_scale_rate_y()
+{
+ sclfloat ret = 1.0f;
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ ret = utils->get_custom_scale_rate_y();
+ }
+ }
+ return ret;
+}
+
+/**
+ * Sets the custom rate value for resizing the keyboard's content
+ */
+void
+CSCLUIImpl::set_custom_scale_rate(sclfloat x, sclfloat y)
+{
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (utils && cache && windows) {
+ utils->set_custom_scale_rate_x(x);
+ utils->set_custom_scale_rate_y(y);
+
+ cache->recompute_layout(windows->get_base_window());
+ }
+ }
+}
+
+/**
+ * Sets the custom starting coordinates for drawing the keyboard's content
+ */
+void
+CSCLUIImpl::set_custom_starting_coordinates(sclint x, sclint y)
+{
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (cache) {
+ SclPoint coords = cache->get_custom_starting_coordinates();
+ /* Do not proceed if the new coordinates are same with the values that we currently have */
+ if (x != coords.x || y != coords.y) {
+ cache->set_custom_starting_coordinates(x, y);
+ if (windows) {
+ cache->recompute_layout(windows->get_base_window());
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Sets the custom starting coordinates option for drawing the keyboard's content
+ */
+void
+CSCLUIImpl::set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option)
+{
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ cache->set_custom_starting_coordinates_option(option);
+ }
+ }
+}
+
+/**
+ * Returns the scl base window size
+ */
+SclRectangle
+CSCLUIImpl::get_main_window_rect()
+{
+ SclRectangle ret = {0, 0, 0, 0};
+
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (cache && windows) {
+ //const SclLayout *layout = cache->get_cur_layout(windows->get_base_window());
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ ret.x = window_context->geometry.x;
+ ret.y = window_context->geometry.y;
+ ret.width = window_context->geometry.width;
+ ret.height = window_context->geometry.height;
+ }
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * Returns the scl base window size
+ */
+SclSize
+CSCLUIImpl::get_input_mode_size(const sclchar *input_mode, SCLDisplayMode display_mode)
+{
+ SclSize ret = {0, 0};
+
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (utils && sclres_manager) {
+ const PSclInputModeConfigure sclres_input_mode_configure = sclres_manager->get_input_mode_configure_table();
+ const PSclLayout sclres_layout = sclres_manager->get_layout_table();
+ sclint inputmode = sclres_manager->get_inputmode_id(input_mode);
+ if (sclres_input_mode_configure && sclres_layout) {
+ sclint layout = sclres_manager->get_layout_id(
+ sclres_input_mode_configure[inputmode].layouts[display_mode]);
+
+ if (layout >= 0) {
+ ret.width = sclres_layout[layout].width;
+ ret.height = sclres_layout[layout].height;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+/**
+* Returns the screen resolution
+*/
+void
+CSCLUIImpl::get_screen_resolution(sclint *width, sclint *height)
+{
+ if (m_initialized) {
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils && width && height) {
+ utils->get_screen_resolution(width, height);
+ }
+ }
+}
+
+void
+CSCLUIImpl::set_debug_mode(SCLDebugMode mode)
+{
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ controller->set_debug_mode(mode);
+ }
+ }
+}
+
+SCLDebugMode
+CSCLUIImpl::get_debug_mode()
+{
+ SCLDebugMode ret = DEBUGMODE_DISABLED;
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->get_debug_mode();
+ }
+ }
+ return ret;
+}
+
+void
+CSCLUIImpl::set_update_pending(sclboolean pend)
+{
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ windows->set_update_pending(pend);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_button(const sclchar* custom_id, sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache) {
+ cache->enable_button(custom_id, enabled);
+ }
+ }
+}
+
+sclint
+CSCLUIImpl::get_multi_touch_context_num()
+{
+ sclint ret = 0;
+
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_multi_touch_context_num();
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::get_multi_touch_event(sclint seqorder, SclUIEventDesc *desc)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_multi_touch_event(seqorder, desc);
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::set_longkey_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->set_longkey_duration(msc);
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::set_longkey_cancel_dist(sclshort dist)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->set_longkey_cancel_dist(dist);
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::set_repeatkey_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->set_repeatkey_duration(msc);
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::set_autopopup_key_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->set_autopopup_key_duration(msc);
+ }
+ }
+ return ret;
+}
+
+sclboolean
+CSCLUIImpl::set_button_delay_duration(scllong msc)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ ret = controller->set_button_delay_duration(msc);
+ }
+ }
+ return ret;
+}
+
+void
+CSCLUIImpl::enable_magnifier(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_magnifier_enabled(enabled);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_sound(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_sound_enabled(enabled);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_vibration(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_vibration_enabled(enabled);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_tts(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_tts_enabled(enabled);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_shift_multi_touch(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_shift_multi_touch_enabled(enabled);
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_highlight_ui(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (context && windows) {
+ context->set_highlight_ui_enabled(enabled);
+
+ sclwindow window = windows->get_nth_window_in_Z_order_list(SCL_WINDOW_Z_TOP);
+ windows->update_window(window);
+ if (!(windows->is_base_window(window))) {
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ if (enabled) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+ scl8 key_index;
+ sclwindow focus_window ;
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+ if (!windows || !focus_handler || !cache) return;
+
+ focus_window = focus_handler->get_current_focus_window();
+ key_index = focus_handler->get_current_focus_key();
+ if (cache) {
+ coordinate = cache->get_cur_layout_key_coordinate(focus_window, key_index);
+ }
+ if (coordinate) {
+ windows->update_window(focus_window,
+ coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_highlight_ui_animation(sclboolean enabled)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLAnimator *animator = CSCLAnimator::get_instance();
+ if (context && animator) {
+ context->set_highlight_ui_animation_enabled(enabled);
+
+ if (!enabled) {
+ sclint id = animator->find_animator_by_type(ANIMATION_TYPE_HIGHLIGHT_UI);
+ if (id != NOT_USED) {
+ animator->destroy_animator(id);
+ }
+ }
+ }
+ }
+}
+
+void
+CSCLUIImpl::enable_touch_offset(sclboolean enabled)
+{
+ CSCLErrorAdjustment *adjustment = CSCLErrorAdjustment::get_instance();
+ if (adjustment) {
+ adjustment->enable_touch_offset(enabled);
+ }
+}
+
+void
+CSCLUIImpl::disable_input_events(sclboolean disabled)
+{
+ if (m_initialized) {
+ CSCLController *controller = CSCLController::get_instance();
+ if (controller) {
+ controller->disable_input_events(disabled);
+ }
+ }
+}
+
+sclboolean
+CSCLUIImpl::set_cur_sublayout(const sclchar *sub_layout_name)
+{
+ sclboolean ret = FALSE;
+
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ if (context && windows) {
+ ret = context->set_cur_sublayout(sub_layout_name);
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ if (!(window_context->hidden)) {
+ /* Update main window only when it is in visible state */
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+const sclchar*
+CSCLUIImpl::get_cur_sublayout()
+{
+ sclchar* ret = NULL;
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ ret = context->get_cur_sublayout();
+ }
+ }
+ return ret;
+}
+
+void
+CSCLUIImpl::set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label)
+{
+ if (m_initialized) {
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ context->set_custom_magnifier_label(touch_id, index, label);
+ }
+ }
+}
+
+void
+CSCLUIImpl::set_string_substitution(const sclchar *original, const sclchar *substitute)
+{
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (!cache || !windows) return;
+
+ if (m_initialized) {
+ if (cache->set_string_substitution(original, substitute)) {
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ if (!(window_context->hidden)) {
+ /* Update main window only when it is in visible state */
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+ }
+}
+
+void
+CSCLUIImpl::unset_string_substitution(const sclchar *original)
+{
+ if (m_initialized) {
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache && windows) {
+ cache->unset_string_substitution(original);
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) {
+ if (!(window_context->hidden)) {
+ /* Update main window only when it is in visible state */
+ windows->update_window(windows->get_base_window());
+ }
+ }
+ }
+ }
+}
+
+void
+CSCLUIImpl::set_autocapital_shift_state(sclboolean flag) {
+ m_autocapital_shift_state = flag;
+}
+
+sclboolean
+CSCLUIImpl::get_autocapital_shift_state() {
+ return m_autocapital_shift_state;
+}
+
+sclboolean
+CSCLUIImpl::process_key_event(const char *key)
+{
+ if (m_initialized) {
+ CSCLEvents *events = CSCLEvents::get_instance();
+ return events->process_key_event(key);
+ }
+ return FALSE;
+}
+
+sclboolean
+CSCLUIImpl::get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle)
+{
+ if (m_initialized) {
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ if (cache)
+ return cache->get_button_geometry(custom_id, rectangle);
+ }
+ return FALSE;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_UIIMPL_H__
+#define __SCL_UIIMPL_H__
+
+#include "scltypes.h"
+#include "sclstructs.h"
+#include "scleventcallback.h"
+#include "sclgraphicsbackendcallback.h"
+#include "sclwindowbackendcallback.h"
+
+//SCL_BEGIN_DECLS
+
+namespace scl
+{
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLUIImpl
+{
+private:
+ CSCLUIImpl();
+
+public:
+ virtual ~CSCLUIImpl();
+ static CSCLUIImpl* get_instance();
+
+ sclboolean init(sclwindow parent, SCLParserType parser_type, const char *entry_filepath);
+ void fini();
+
+ void show();
+ void hide();
+
+ void set_ui_event_callback(ISCLUIEventCallback *callback, const sclchar *input_mode);
+ void set_graphics_backend_callback(ISCLUIGraphicsBackendCallback *callback, void *data);
+ void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data);
+
+ sclboolean set_rotation(SCLRotation degree);
+ SCLRotation get_rotation();
+
+ SCLDisplayMode get_display_mode();
+
+ sclboolean set_input_mode(const sclchar *input_mode);
+ const sclchar* get_input_mode();
+ sclboolean set_popup_input_mode(sclwindow window, const sclchar *input_mode);
+ const sclchar* get_popup_input_mode(sclwindow window);
+
+ void set_update_pending(sclboolean pend);
+
+ sclint set_private_key(const sclchar* custom_id, sclchar* label, sclchar* imagelabel[SCL_BUTTON_STATE_MAX], sclchar* imagebg[SCL_BUTTON_STATE_MAX], sclulong key_event, sclchar *key_value, sclboolean redraw);
+ void unset_private_key(const sclchar* custom_id);
+
+ void enable_button(const sclchar* custom_id, sclboolean enabled);
+
+ sclboolean set_cur_themename(const sclchar *themename);
+
+ sclboolean set_cur_sublayout(const sclchar *sub_layout_name);
+ const sclchar* get_cur_sublayout();
+
+ void set_shift_state(SCLShiftState state);
+ SCLShiftState get_shift_state();
+
+ void set_caps_lock_mode(sclboolean mode);
+ sclboolean get_caps_lock_mode();
+
+ void notify_app_focus_changed();
+ void reset_popup_timeout();
+ void close_all_popups();
+
+ SclRectangle get_main_window_rect();
+ SclSize get_input_mode_size(const sclchar *input_mode, SCLDisplayMode display_mode);
+ void get_screen_resolution(sclint *width, sclint *height);
+
+ scl16 get_scaled_x(scl16 x);
+ scl16 get_scaled_y(scl16 y);
+ sclfloat get_scale_rate();
+
+ sclfloat get_custom_scale_rate_x();
+ sclfloat get_custom_scale_rate_y();
+ void set_custom_scale_rate(sclfloat x, sclfloat y);
+
+ void set_custom_starting_coordinates(sclint x, sclint y);
+ void set_custom_starting_coordinates_option(SCLStartingCoordinatesOption option);
+
+ sclint get_multi_touch_context_num();
+ sclboolean get_multi_touch_event(sclint seqorder, SclUIEventDesc *desc);
+
+ void set_debug_mode(SCLDebugMode mode);
+ SCLDebugMode get_debug_mode();
+
+ sclboolean set_longkey_duration(scllong msc);
+ sclboolean set_longkey_cancel_dist(sclshort dist);
+ sclboolean set_repeatkey_duration(scllong msc);
+ sclboolean set_autopopup_key_duration(scllong msc);
+ sclboolean set_button_delay_duration(scllong msc);
+
+ void enable_magnifier(sclboolean enabled);
+ void enable_sound(sclboolean enabled);
+ void enable_vibration(sclboolean enabled);
+ void enable_tts(sclboolean enabled);
+ void enable_shift_multi_touch(sclboolean enabled);
+ void enable_highlight_ui(sclboolean enabled);
+ void enable_highlight_ui_animation(sclboolean enabled);
+
+ void enable_touch_offset(sclboolean enabled);
+ void disable_input_events(sclboolean disabled);
+
+ void set_custom_magnifier_label(scltouchdevice touch_id, sclint index, const sclchar* label);
+
+ void set_string_substitution(const sclchar *original, const sclchar *substitute);
+ void unset_string_substitution(const sclchar *original);
+ sclboolean get_autocapital_shift_state();
+ void set_autocapital_shift_state(sclboolean flag);
+
+ sclboolean process_key_event(const char *key);
+ sclboolean get_button_geometry(const sclchar* custom_id, SclRectangle *rectangle);
+
+private:
+ sclboolean m_initialized;
+ sclboolean m_autocapital_shift_state;
+};
+
+}
+
+//SCL_END_DECLS
+
+#endif //__SCL_UIIMPL_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclutils.h"
+#include "scldebug.h"
+#include "sclcontext.h"
+
+#include <stdarg.h>
+
+#include <Elementary.h>
+#ifdef WAYLAND
+#define EFL_BETA_API_SUPPORT
+#include <Ecore_Wl2.h>
+#else
+#include <Ecore_X.h>
+#endif
+#include <feedback.h>
+#include <tts.h>
+#include <vconf.h>
+
+#include <dlog.h>
+
+using namespace scl;
+
+static tts_h tts = NULL;
+#ifndef WAYLAND
+static Eina_Bool _get_default_zone_geometry_info(Ecore_X_Window root, scluint *x, scluint *y, scluint *w, scluint *h)
+{
+ Ecore_X_Atom zone_geometry_atom;
+ Ecore_X_Window* zone_lists;
+ sclint num_zone_lists;
+ sclint num_ret;
+ Eina_Bool ret;
+
+ zone_geometry_atom = ecore_x_atom_get("_E_ILLUME_ZONE_GEOMETRY");
+ if (!zone_geometry_atom) {
+ /* Error... */
+ return EINA_FALSE;
+ }
+
+ scluint geom[4];
+ num_zone_lists = ecore_x_window_prop_window_list_get(root, ECORE_X_ATOM_E_ILLUME_ZONE_LIST, &zone_lists);
+ if (num_zone_lists > 0) {
+ num_ret = ecore_x_window_prop_card32_get(zone_lists[0], zone_geometry_atom, geom, 4);
+ if (num_ret == 4) {
+ if (x) *x = geom[0];
+ if (y) *y = geom[1];
+ if (w) *w = geom[2];
+ if (h) *h = geom[3];
+ ret = EINA_TRUE;
+ } else {
+ ret = EINA_FALSE;
+ }
+ } else {
+ /* if there is no zone available */
+ ret = EINA_FALSE;
+ }
+
+ if (zone_lists) {
+ /* We must free zone_lists */
+ free(zone_lists);
+ }
+
+ return ret;
+}
+#endif
+static void accessibility_changed_cb(keynode_t *key, void* data)
+{
+ int r;
+ int enabled = 0;
+ if (vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &enabled) == 0) {
+ LOGD("VCONFKEY_SETAPPL_ACCESSIBILITY_TTS : %d, (%p)", enabled, tts);
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context)
+ context->set_tts_enabled(enabled);
+
+ if (enabled) {
+ if (tts == NULL) {
+ LOGD("Initializing TTS\n");
+
+ r = tts_create(&tts);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_create FAILED : result(%d)", r);
+ } else {
+ r = tts_set_mode(tts, TTS_MODE_SCREEN_READER);
+ }
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_set_mode FAILED : result(%d)", r);
+ }
+
+ tts_state_e current_state;
+ r = tts_get_state(tts, ¤t_state);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_get_state FAILED : result(%d)", r);
+ }
+
+ if (TTS_STATE_CREATED == current_state) {
+ r = tts_prepare(tts);
+ }
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_prepare FAILED : ret(%d)\n", r);
+ }
+ }
+ } else {
+ if (tts != NULL) {
+ LOGD("Deinitializing TTS\n");
+
+ r = tts_unprepare(tts);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_unprepare FAILED : result(%d)", r);
+ }
+
+ r = tts_destroy(tts);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("tts_destroy FAILED : result(%d)", r);
+ }
+
+ tts = NULL;
+ }
+ }
+ }
+}
+
+void
+CSCLUtilsImplLinux::init() {
+ SCL_DEBUG();
+ ecore_wl2_init();
+
+ open_devices();
+
+ vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, accessibility_changed_cb, NULL);
+ accessibility_changed_cb(NULL, NULL);
+}
+
+void
+CSCLUtilsImplLinux::fini() {
+ SCL_DEBUG();
+
+ vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, accessibility_changed_cb);
+
+ close_devices();
+
+ ecore_wl2_shutdown();
+}
+
+/* FIXME : Currently the screen resolution is locally cached, should be updated when it gets changed */
+sclboolean
+CSCLUtilsImplLinux::get_screen_resolution(sclint *x, sclint *y) {
+ SCL_DEBUG();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ sclint scr_w = m_scr_size.width;
+ sclint scr_h = m_scr_size.height;
+ if (m_scr_size.width == 0 || m_scr_size.height == 0) {
+#ifdef WAYLAND
+ ecore_wl2_sync();
+ Ecore_Wl2_Display *ewd;
+ if (!(ewd = ecore_wl2_connected_display_get(NULL)))
+ return FALSE;
+ ecore_wl2_display_screen_size_get(ewd, &scr_w, &scr_h);
+#else
+ scluint w, h;
+ w = h = 0;
+ if (_get_default_zone_geometry_info(ecore_x_window_root_first_get(), NULL, NULL, &w, &h)) {
+ scr_w = w;
+ scr_h = h;
+ } else {
+ ecore_x_window_size_get(ecore_x_window_root_first_get(), &scr_w, &scr_h);
+ }
+#endif
+ m_scr_size.width = scr_w;
+ m_scr_size.height = scr_h;
+ }
+ if (context && x && y) {
+ if (context->get_display_mode() == DISPLAYMODE_LANDSCAPE) {
+ *x = scr_h;
+ *y = scr_w;
+ } else {
+ *x = scr_w;
+ *y = scr_h;
+ }
+ }
+ return TRUE;
+}
+
+sclboolean
+CSCLUtilsImplLinux::update_screen_resolution() {
+ sclboolean ret = FALSE;
+ SclSize prev_size = m_scr_size;
+
+ /* Reset screen size cache value for acquiring new resolution */
+ m_scr_size.width = 0;
+ m_scr_size.height = 0;
+ get_screen_resolution(NULL, NULL);
+
+ LOGD("Previous resolution : %d %d, Current resolution : %d %d",
+ prev_size.width, prev_size.height, m_scr_size.width, m_scr_size.height);
+
+ /* Check if the screen size value has been changed */
+ if (m_scr_size.width != prev_size.width || m_scr_size.height != prev_size.height) {
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLUtilsImplLinux::play_tts(const sclchar* str) {
+ SCL_DEBUG();
+
+ if (str) {
+ int r;
+ int utt_id = 0;
+ tts_state_e current_state;
+
+ r = tts_get_state(tts, ¤t_state);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("Fail to get state from TTS : ret(%d)\n", r);
+ }
+
+ if (TTS_STATE_PLAYING == current_state) {
+ r = tts_stop(tts);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("Fail to stop TTS : ret(%d)\n", r);
+ }
+ }
+ r = tts_add_text(tts, str, NULL, TTS_VOICE_TYPE_AUTO, TTS_SPEED_AUTO, &utt_id);
+ if (TTS_ERROR_NONE == r) {
+ r = tts_play(tts);
+ if (TTS_ERROR_NONE != r) {
+ LOGD("Fail to play TTS : ret(%d)\n", r);
+ }
+ } else {
+ LOGD("Fail to add text : ret(%d)\n", r);
+ }
+ }
+
+ return TRUE;
+}
+
+sclboolean
+CSCLUtilsImplLinux::play_sound(const sclchar* snd_style) {
+ SCL_DEBUG();
+
+ typedef struct {
+ const char *name;
+ feedback_pattern_e type_value;
+ } SOUND_TYPES;
+
+ static const SOUND_TYPES internal_types[] = {
+ {"Backspace", FEEDBACK_PATTERN_SIP},
+ };
+ static const sclint SOUND_TYPES_NUM = (sizeof(internal_types) / sizeof(SOUND_TYPES));
+
+ sclboolean ret = FALSE;
+ int r = FEEDBACK_ERROR_NONE;
+
+ sclboolean found = FALSE;
+ sclint loop = 0;
+ for (loop = 0; loop < SOUND_TYPES_NUM;loop++) {
+ if (strncmp(snd_style, internal_types[loop].name, strlen(internal_types[loop].name)) == 0) {
+ found = TRUE;
+ r = feedback_play_type(FEEDBACK_TYPE_SOUND, internal_types[loop].type_value);
+ }
+ }
+ if (!found) {
+ r = feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_SIP);
+ }
+
+ if (r != FEEDBACK_ERROR_NONE) {
+ LOGD("Cannot play sound : %d\n", r);
+ } else {
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLUtilsImplLinux::play_vibration(const sclchar* vibe_style, const scllong duration) {
+ SCL_DEBUG();
+
+ typedef struct {
+ const char *name;
+ feedback_pattern_e type_value;
+ } VIBRATION_TYPES;
+
+ static const VIBRATION_TYPES internal_types[] = {
+ {"Backspace", FEEDBACK_PATTERN_SIP},
+ };
+ static const sclint VIBRATION_TYPES_NUM = (sizeof(internal_types) / sizeof(VIBRATION_TYPES));
+
+ sclboolean ret = FALSE;
+ int r = FEEDBACK_ERROR_NONE;
+
+ sclboolean found = FALSE;
+ sclint loop = 0;
+ for (loop = 0; loop < VIBRATION_TYPES_NUM;loop++) {
+ if (strncmp(vibe_style, internal_types[loop].name, strlen(internal_types[loop].name)) == 0) {
+ found = TRUE;
+ r = feedback_play_type(FEEDBACK_TYPE_VIBRATION, internal_types[loop].type_value);
+ }
+ }
+ if (!found) {
+ r = feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_SIP);
+ }
+
+ if (r != FEEDBACK_ERROR_NONE) {
+ LOGD("Cannot play vibration : %d\n", r);
+ } else {
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+sclboolean
+CSCLUtilsImplLinux::open_devices() {
+ SCL_DEBUG();
+
+ int r = feedback_initialize(); // Initialize feedback
+
+ if (r != FEEDBACK_ERROR_NONE) {
+ LOGD("FEEDBACK INITIALIZATION FAILED : %d\n", r);
+ } else {
+ LOGD("FEEDBACK INITIALIZATION SUCCESSFUL : %d\n", r);
+ }
+
+ return TRUE;
+}
+
+sclboolean
+CSCLUtilsImplLinux::close_devices() {
+ SCL_DEBUG();
+
+ int r = feedback_deinitialize(); // Deinitialize feedback
+
+ if (r != FEEDBACK_ERROR_NONE) {
+ LOGD("FEEDBACK DEINITIALIZATION FAILED : %d\n", r);
+ } else {
+ LOGD("FEEDBACK DEINITIALIZATION SUCCESSFUL : %d\n", r);
+ }
+
+ return TRUE;
+}
+
+sclint CSCLUtilsImplLinux::log(const sclchar *msg)
+{
+ SCL_DEBUG();
+ sclint ret = 0;
+
+ LOGD("%s", msg);
+
+ return ret;
+}
+
+/*
+sclboolean
+CSCLUtilsImplLinux::find_first_file(FILEFINDINFO &sFileFindInfo, const sclchar *szSuffix, const sclchar *szDirPath)
+{
+ sclboolean bSuccess = false;
+
+ sFileFindInfo.Uninitialize();
+
+ sFileFindInfo.pDirInfo = opendir(szDirPath);
+ if (sFileFindInfo.pDirInfo) {
+ sclboolean bEnd = false;
+ while (!bEnd) {
+ struct dirent *pDirEnt = readdir(sFileFindInfo.pDirInfo);
+ if (NULL == pDirEnt) {
+ bEnd = true;
+ } else {
+ if (szSuffix) {
+ if (strlen(szSuffix) <= strlen(pDirEnt->d_name)) {
+ if (strcmp(pDirEnt->d_name + strlen(pDirEnt->d_name) - strlen(szSuffix), szSuffix) == 0) {
+ bSuccess = true;
+ sFileFindInfo.pDirEnt = pDirEnt;
+ bEnd = true;
+ }
+ }
+ } else {
+ bSuccess = true;
+ sFileFindInfo.pDirEnt = pDirEnt;
+ bEnd = true;
+ }
+ }
+ }
+ }
+
+ return bSuccess;
+}
+
+sclboolean
+CSCLUtilsImplLinux::find_next_file(FILEFINDINFO &sFileFindInfo, const sclchar *szSuffix)
+{
+ sclboolean bSuccess = false;
+
+ if (sFileFindInfo.pDirInfo) {
+ sclboolean bEnd = false;
+ while (!bEnd) {
+ struct dirent *pDirEnt = readdir(sFileFindInfo.pDirInfo);
+ if (NULL == pDirEnt) {
+ bEnd = true;
+ } else {
+ if (szSuffix) {
+ if (strlen(szSuffix) <= strlen(pDirEnt->d_name)) {
+ if (strcmp(pDirEnt->d_name + strlen(pDirEnt->d_name) - strlen(szSuffix), szSuffix) == 0) {
+ bSuccess = true;
+ sFileFindInfo.pDirEnt = pDirEnt;
+ bEnd = true;
+ }
+ }
+ } else {
+ bSuccess = true;
+ sFileFindInfo.pDirEnt = pDirEnt;
+ bEnd = true;
+ }
+ }
+ }
+ }
+
+ return bSuccess;
+}
+*/
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <math.h>
+#include <stdarg.h>
+
+#include "sclutils.h"
+#include "sclconfig.h"
+#include "scldebug.h"
+#include "sclcontext.h"
+#include "sclresource.h"
+#include "sclresourcecache.h"
+#include "sclres_manager.h"
+
+using namespace scl;
+
+#define SCL_MAX_UNIQUE_ID 1000
+
+CSCLUtils::CSCLUtils()
+{
+ SCL_DEBUG();
+ m_scn_rate_x = 1.0f;
+ m_scn_rate_y = 1.0f;
+ m_custom_scale_rate_x = 1.0f;
+ m_custom_scale_rate_y = 1.0f;
+ m_scn_resolution_x = 0;
+ m_scn_resolution_y = 0;
+}
+
+CSCLUtils::~CSCLUtils()
+{
+ SCL_DEBUG();
+}
+
+CSCLUtils* CSCLUtils::get_instance()
+{
+ static CSCLUtils instance;
+ return &instance;
+}
+
+void
+CSCLUtils::init()
+{
+ SCL_DEBUG();
+
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ impl->init();
+ }
+
+ update_scale_rate_values();
+
+ m_nine_patch_info_map.clear();
+}
+
+void CSCLUtils::fini()
+{
+ SCL_DEBUG();
+
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ impl->fini();
+ }
+}
+
+/**
+ * Returns a scale rate (see default screen resolution in sclconfig.h file)
+ */
+sclfloat
+CSCLUtils::get_smallest_scale_rate()
+{
+ /* Try to return smaller scale rate, to avoid UI crash */
+ return (m_scn_rate_x < m_scn_rate_y ) ? m_scn_rate_x : m_scn_rate_y ;
+}
+
+/**
+* Returns a scale rate X (see default screen resolution in sclconfig.h file)
+*/
+sclfloat
+CSCLUtils::get_scale_rate_x()
+{
+ /* Try to return smaller scale rate, to avoid UI crash */
+ return m_scn_rate_x;
+}
+
+/**
+* Returns a scale rate Y (see default screen resolution in sclconfig.h file)
+*/
+sclfloat
+CSCLUtils::get_scale_rate_y()
+{
+ /* Try to return smaller scale rate, to avoid UI crash */
+ return m_scn_rate_y;
+}
+
+/**
+ * Recalculates x value according to the current screen resolution
+ */
+void
+CSCLUtils::scale_x(scl16 *x)
+{
+ if (x) (*x) *= m_scn_rate_x;
+}
+
+/**
+* Recalculates y value according to the current screen resolution
+ */
+void
+CSCLUtils::scale_y(scl16 *y)
+{
+ if (y) (*y) *= m_scn_rate_y;
+}
+
+/**
+ * Returns a calculated x value according to the current screen resolution
+ */
+scl16
+CSCLUtils::get_scaled_x(scl16 x)
+{
+ return static_cast<scl16>(x * m_scn_rate_x);
+}
+
+/**
+ * Returns a calculated y value according to the current screen resolution
+ */
+scl16
+CSCLUtils::get_scaled_y(scl16 y)
+{
+ return static_cast<scl16>(y * m_scn_rate_y);
+}
+
+/**
+ * Returns the smallest custom scale rate
+ */
+sclfloat
+CSCLUtils::get_smallest_custom_scale_rate()
+{
+ /* Try to return smaller scale rate, to avoid UI crash */
+ return (m_custom_scale_rate_x < m_custom_scale_rate_y) ? m_custom_scale_rate_x : m_custom_scale_rate_y;
+}
+
+/**
+* Returns the current custom scale rate X
+*/
+sclfloat
+CSCLUtils::get_custom_scale_rate_x()
+{
+ return m_custom_scale_rate_x;
+}
+
+/**
+* Returns the current custom scale rate Y
+*/
+sclfloat
+CSCLUtils::get_custom_scale_rate_y()
+{
+ return m_custom_scale_rate_y;
+}
+
+void
+CSCLUtils::set_custom_scale_rate_x(sclfloat x)
+{
+ if (x > 0.0f) {
+ m_custom_scale_rate_x = x;
+ }
+}
+
+void
+CSCLUtils::set_custom_scale_rate_y(sclfloat y)
+{
+ if (y > 0.0f) {
+ m_custom_scale_rate_y = y;
+ }
+}
+
+/**
+ * portable sleep function
+ */
+sclboolean
+CSCLUtils::sleep(sclulong msc)
+{
+ SCL_DEBUG();
+ fd_set dummy;
+ struct timeval interval;
+ FD_ZERO(&dummy);
+ interval.tv_sec = msc / 1000;
+ interval.tv_usec = (msc % 1000) * 1000;
+ select(0, &dummy, NULL, NULL, &interval);
+ return TRUE;
+}
+
+/* FIXME : let's just look for appropriate directory once and cache it
+ and one more thing, let's find a closest resolution when caching the appropriate directory
+*/
+/**
+ * returns the composed path
+ */
+sclchar*
+CSCLUtils::get_composed_path(sclchar* buf, const sclchar* prefix, const sclchar* path)
+{
+ SCL_DEBUG();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (buf && path && sclres_manager) {
+ const sclchar *base_path = "";
+ PSclDefaultConfigure default_configure = sclres_manager->get_default_configure();
+ if (default_configure) {
+ if (default_configure->image_file_base_path) {
+ base_path = default_configure->image_file_base_path;
+ }
+ }
+
+ if (path[0] == '/')
+ snprintf(buf, _POSIX_PATH_MAX, "%s", path);
+ else
+ snprintf(buf, _POSIX_PATH_MAX, "%s/%s/%s/%s",
+ sclres_manager->get_resource_directory(), base_path, IMG_PATH_PREFIX, path);
+ }
+
+ return buf;
+}
+
+/**
+ * returns the decomposed path
+ */
+sclchar*
+CSCLUtils::get_decomposed_path(sclchar* buf, const sclchar* prefix, const sclchar* path)
+{
+ SCL_DEBUG();
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+
+ if (buf && path && sclres_manager) {
+ sclchar comparand[_POSIX_PATH_MAX];
+
+ snprintf(comparand, _POSIX_PATH_MAX, "%s/%s/",
+ sclres_manager->get_resource_directory(), IMG_PATH_PREFIX);
+ if (strncmp(path, comparand, strlen(comparand)) == 0) {
+ snprintf(buf, _POSIX_PATH_MAX, "%s", path + strlen(comparand));
+ } else {
+ snprintf(buf, _POSIX_PATH_MAX, "%s", path);
+ }
+ }
+
+ return buf;
+}
+
+sclboolean
+CSCLUtils::get_autopopup_window_variables(sclchar * const autopopup_keys[MAX_SIZE_OF_AUTOPOPUP_STRING], sclbyte *num_keys, sclbyte *num_columns, sclbyte *num_rows, sclint *width, sclint *height)
+{
+ SCL_DEBUG();
+ scl_assert_return_false(autopopup_keys);
+ scl_assert_return_false(num_keys && num_columns && num_rows && width && height);
+
+ int loop;
+ sclboolean ret = FALSE;
+ sclint scrx, scry;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclAutoPopupConfigure autopopup_configure = NULL;
+ if (sclres_manager) {
+ autopopup_configure = sclres_manager->get_autopopup_configure();
+ }
+ if (autopopup_configure && autopopup_keys && num_keys && num_columns && num_rows && width && height) {
+ *num_keys = 0;
+ for (loop = 0;loop < MAX_SIZE_OF_AUTOPOPUP_STRING;loop++) {
+ if (autopopup_keys[loop]) {
+ if (strlen(autopopup_keys[loop]) > 0) {
+ (*num_keys)++;
+ }
+ }
+ }
+ if (*num_keys > 0) {
+ ret = TRUE;
+ }
+
+ this->get_screen_resolution(&scrx, &scry);
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context && context->get_display_mode() == DISPLAYMODE_LANDSCAPE) {
+ int swap = scrx;
+ scrx = scry;
+ scry = swap;
+ }
+
+ *num_columns = (scrx - (2 * autopopup_configure->bg_padding * get_smallest_custom_scale_rate())) /
+ (autopopup_configure->button_width * get_smallest_custom_scale_rate() +
+ autopopup_configure->button_spacing * get_smallest_custom_scale_rate());
+ if (*num_columns > autopopup_configure->max_column && autopopup_configure->max_column > 0)
+ *num_columns = autopopup_configure->max_column;
+ *num_rows = ((*num_keys - 1) / *num_columns) + 1;
+ if (*num_columns > *num_keys) *num_columns = *num_keys;
+
+ /* Try to spread evenly on each lines */
+ *num_columns = (*num_keys) / (*num_rows);
+ if ((*num_keys) % *num_rows != 0) (*num_columns)++;
+
+ *width =
+ (*num_columns * autopopup_configure->button_width * get_custom_scale_rate_x()) +
+ (2 * autopopup_configure->bg_padding * get_smallest_custom_scale_rate()) +
+ ((*num_columns - 1) * autopopup_configure->button_spacing * get_smallest_custom_scale_rate());
+ *height =
+ (*num_rows * autopopup_configure->button_height * get_custom_scale_rate_y()) +
+ (2 * autopopup_configure->bg_padding * get_smallest_custom_scale_rate()) +
+ ((*num_rows - 1) * autopopup_configure->button_spacing * get_smallest_custom_scale_rate());
+
+ *width += (2 * autopopup_configure->decoration_size * get_smallest_custom_scale_rate());
+ *height += (2 * autopopup_configure->decoration_size * get_smallest_custom_scale_rate());
+ }
+
+ return ret;
+}
+
+/**
+ * Returns a duplicated string pointer by given str
+ */
+sclchar*
+CSCLUtils::get_str_dup(const sclchar* str)
+{
+ SCL_DEBUG();
+ sclchar *new_str;
+ sclint length;
+
+ if (str) {
+ length = strlen(str) + 1;
+ new_str = (sclchar*)malloc(length);
+ if (new_str) {
+ memcpy(new_str, str, length);
+ new_str[length - 1] = '\0';
+ }
+ } else {
+ new_str = NULL;
+ }
+
+ return new_str;
+}
+
+/**
+ * Returns an unique ID
+ */
+scl16
+CSCLUtils::get_unique_id()
+{
+ SCL_DEBUG();
+ static scl16 uniId = 0;
+ if (uniId < SCL_MAX_UNIQUE_ID) {
+ uniId++;
+ } else {
+ uniId = 0;
+ }
+ return uniId;
+}
+
+sclboolean
+CSCLUtils::is_rect_overlap(SclRectangle rect1, SclRectangle rect2)
+{
+ if (rect1.x < rect2.x + rect2.width && rect1.x + rect1.width > rect2.x &&
+ rect1.y < rect2.y + rect2.height && rect1.y + rect1.height > rect2.y) {
+ /*if (rect1.x == rect2.x && rect1.width == rect2.width &&
+ rect1.y == rect2.y && rect1.height == rect2.height) {*/
+ return true;
+ }
+ return false;
+}
+
+sclfloat
+CSCLUtils::get_distance(sclint x1, sclint y1, sclint x2, sclint y2)
+{
+ sclint dx = x1 - x2;
+ sclint dy = y1 - y2;
+ return sqrt((dx * dx) + (dy * dy));
+}
+
+sclfloat
+CSCLUtils::get_distance(SclPoint pt1, SclPoint pt2)
+{
+ return get_distance(pt1.x, pt1.y, pt2.x, pt2.y);
+}
+
+sclfloat
+CSCLUtils::get_approximate_distance(sclint x1, sclint y1, sclint x2, sclint y2)
+{
+ sclint dx = abs(x1 - x2);
+ sclint dy = abs(y1 - y2);
+ return dx + dy;
+}
+
+sclfloat
+CSCLUtils::get_approximate_distance(SclPoint pt1, SclPoint pt2)
+{
+ return get_approximate_distance(pt1.x, pt1.y, pt2.x, pt2.y);
+}
+
+const SclNinePatchInfo*
+CSCLUtils::get_nine_patch_info(const sclchar *image_path)
+{
+ SCL_DEBUG();
+
+ /* FIXME - Let's fix this function not to use static */
+ static SclNinePatchInfo ret;
+ if (!image_path) return NULL;
+
+ sclchar buf[_POSIX_PATH_MAX] = {0};
+ sclboolean finished = FALSE;
+ //get_decomposed_path(buf, IMG_PATH_PREFIX, image_path);
+ for (sclint loop = strlen(image_path);!finished && loop > 0;loop--) {
+ if (image_path[loop] == '\\' || image_path[loop] == '/') {
+ strncpy(buf, image_path + loop + 1, _POSIX_PATH_MAX - 1);
+ finished = TRUE;
+ }
+ }
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (sclres_manager) {
+ if (sclres_manager->get_nine_patch_info(buf, &ret)) {
+ return &ret;
+ }
+ }
+
+ return NULL;
+}
+
+sclint CSCLUtils::log(const sclchar *fmt, ...)
+{
+ SCL_DEBUG();
+ va_list argptr;
+ sclint ret = 0;
+
+ va_start(argptr, fmt);
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ char buf[_POSIX_PATH_MAX] = {0};
+ vsnprintf(buf, _POSIX_PATH_MAX - 1, fmt, argptr);
+ ret = impl->log(buf);
+ }
+ va_end(argptr);
+
+ return ret;
+}
+
+void CSCLUtils::update_scale_rate_values()
+{
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+
+ if (default_configure) {
+ scl_assert(default_configure->target_screen_width);
+ scl_assert(default_configure->target_screen_height);
+ if (default_configure->target_screen_width != 0 && default_configure->target_screen_height != 0) {
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl)
+ impl->get_screen_resolution(&m_scn_resolution_x, &m_scn_resolution_y);
+
+ m_scn_rate_x = m_scn_resolution_x / (float)default_configure->target_screen_width;
+ m_scn_rate_y = m_scn_resolution_y / (float)default_configure->target_screen_height;
+
+ if (default_configure->auto_detect_landscape) {
+ /* If the width of screen is bigger than the height, switch portrait mode and landscape mode */
+ if (m_scn_resolution_x > m_scn_resolution_y) {
+ m_scn_rate_x = m_scn_resolution_x / (float)default_configure->target_screen_height;
+ m_scn_rate_y = m_scn_resolution_y / (float)default_configure->target_screen_width;
+ }
+ }
+ }
+ }
+}
+
+sclboolean CSCLUtils::update_screen_resolution()
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->update_screen_resolution();
+ }
+ if (ret) {
+ update_scale_rate_values();
+ }
+ return ret;
+}
+
+_CSCLUtils::_CSCLUtils()
+{
+ m_impl = 0;
+}
+
+void _CSCLUtils::init()
+{
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ impl->init();
+ }
+}
+
+void _CSCLUtils::fini()
+{
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ impl->fini();
+ }
+}
+
+sclboolean _CSCLUtils::get_screen_resolution(sclint *x, sclint *y)
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->get_screen_resolution(x, y);
+ }
+ return ret;
+}
+
+sclboolean _CSCLUtils::update_screen_resolution()
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->update_screen_resolution();
+ }
+ return ret;
+}
+
+sclboolean _CSCLUtils::play_tts(const sclchar *str)
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->play_tts(str);
+ }
+ return ret;
+}
+
+sclboolean _CSCLUtils::play_sound(const sclchar* snd_style)
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->play_sound(snd_style);
+ }
+ return ret;
+}
+
+sclboolean _CSCLUtils::play_vibration(const sclchar* vibe_style, const scllong duration)
+{
+ sclboolean ret = FALSE;
+ CSCLUtilsImpl *impl = GetCSCLUtilsImpl();
+ if (impl) {
+ ret = impl->play_vibration(vibe_style, duration);
+ }
+ return ret;
+}
+
+CSCLUtilsImpl* _CSCLUtils::GetCSCLUtilsImpl()
+{
+ if (m_impl == 0) {
+#ifdef __WIN32__
+ m_impl = new CSCLUtilsImplWin32;
+#else
+ m_impl = new CSCLUtilsImplLinux;
+#endif
+ }
+ return m_impl;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <map>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclstructs.h"
+
+#ifndef __SCL_UTILS_H__
+#define __SCL_UTILS_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+#ifndef _POSIX_PATH_MAX
+#define _POSIX_PATH_MAX 255
+#endif
+
+namespace scl
+{
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLUtilsImpl
+{
+public :
+ CSCLUtilsImpl() { m_scr_size.width = 0;m_scr_size.height = 0; }
+
+ virtual void init() = 0;
+ virtual void fini() = 0;
+
+ virtual sclboolean get_screen_resolution(sclint *x, sclint *y) = 0;
+ virtual sclboolean update_screen_resolution() = 0;
+ virtual sclboolean play_tts(const sclchar *str) = 0;
+ virtual sclboolean play_sound(const sclchar* snd_style) = 0;
+ virtual sclboolean play_vibration(const sclchar* vibe_style, const scllong duration) = 0;
+
+ virtual sclboolean open_devices() = 0;
+ virtual sclboolean close_devices() = 0;
+
+ virtual sclint log(const sclchar *msg) = 0;
+
+protected:
+ SclSize m_scr_size;
+};
+
+class CSCLUtilsImplLinux : public CSCLUtilsImpl
+{
+public :
+ void init();
+ void fini();
+
+ sclboolean get_screen_resolution(sclint *x, sclint *y);
+ sclboolean update_screen_resolution();
+ sclboolean play_tts(const sclchar *str);
+ sclboolean play_sound(const sclchar* snd_style);
+ sclboolean play_vibration(const sclchar* vibe_style, const scllong duration);
+
+ sclboolean open_devices();
+ sclboolean close_devices();
+
+ sclint log(const sclchar *msg);
+};
+
+class CSCLUtilsImplWin32 : public CSCLUtilsImpl
+{
+public :
+ void init();
+ void fini();
+
+ sclboolean get_screen_resolution(sclint *x, sclint *y);
+ sclboolean update_screen_resolution();
+ sclboolean play_tts(const sclchar *str);
+ sclboolean play_sound(const sclchar* snd_style);
+ sclboolean play_vibration(const sclchar* vibe_style, const scllong duration);
+
+ sclboolean open_devices();
+ sclboolean close_devices();
+
+ sclint log(const sclchar *msg);
+};
+
+class _CSCLUtils
+{
+public :
+ _CSCLUtils();
+
+ virtual void init();
+ virtual void fini();
+ virtual sclboolean get_screen_resolution(sclint *x, sclint *y);
+ virtual sclboolean update_screen_resolution();
+ virtual sclboolean play_tts(const sclchar *str);
+ virtual sclboolean play_sound(const sclchar* snd_style);
+ virtual sclboolean play_vibration(const sclchar* vibe_style, const scllong duration);
+protected :
+ CSCLUtilsImpl* GetCSCLUtilsImpl();
+
+private :
+ CSCLUtilsImpl* m_impl;
+};
+
+class EXAPI CSCLUtils : public _CSCLUtils
+{
+private:
+ CSCLUtils();
+public :
+ virtual ~CSCLUtils();
+
+ static CSCLUtils* get_instance();
+
+ void init();
+ void fini();
+
+ void scale_x(scl16 *x);
+ void scale_y(scl16 *y);
+ scl16 get_scaled_x(scl16 x);
+ scl16 get_scaled_y(scl16 y);
+ sclfloat get_smallest_scale_rate();
+ sclfloat get_scale_rate_x();
+ sclfloat get_scale_rate_y();
+ sclfloat get_smallest_custom_scale_rate();
+ sclfloat get_custom_scale_rate_x();
+ sclfloat get_custom_scale_rate_y();
+
+ void set_custom_scale_rate_x(sclfloat x);
+ void set_custom_scale_rate_y(sclfloat y);
+
+ sclchar* get_str_dup(const sclchar* str);
+
+ sclboolean sleep(sclulong msc);
+
+ sclchar* get_composed_path(sclchar* buf, const sclchar* prefix, const sclchar* path);
+ sclchar* get_decomposed_path(sclchar* buf, const sclchar* prefix, const sclchar* path);
+ const SclNinePatchInfo* get_nine_patch_info(const sclchar *image_path);
+
+ sclboolean get_autopopup_window_variables(sclchar * const autopopup_keys[MAX_SIZE_OF_AUTOPOPUP_STRING], sclbyte *num_keys,
+ sclbyte *num_columns, sclbyte *num_rows, sclint *width, sclint *height);
+
+ scl16 get_unique_id();
+
+ sclboolean is_rect_overlap(SclRectangle rect1, SclRectangle rect2);
+ sclfloat get_distance(sclint x1, sclint y1, sclint x2, sclint y2);
+ sclfloat get_distance(SclPoint pt1, SclPoint pt2);
+
+ sclfloat get_approximate_distance(sclint x1, sclint y1, sclint x2, sclint y2);
+ sclfloat get_approximate_distance(SclPoint pt1, SclPoint pt2);
+
+ sclint log(const sclchar *fmt, ...);
+
+ void update_scale_rate_values();
+ sclboolean update_screen_resolution();
+private :
+ sclfloat m_scn_rate_x;
+ sclfloat m_scn_rate_y;
+
+ sclfloat m_custom_scale_rate_x;
+ sclfloat m_custom_scale_rate_y;
+
+ sclint m_scn_resolution_x;
+ sclint m_scn_resolution_y;
+
+ std::map<sclchar*, SclNinePatchInfo> m_nine_patch_info_map;
+};
+
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_UTILS_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_VERSION_H__
+#define __SCL_VERSION_H__
+
+#define SCL_VERSION "0.5.0-1"
+
+#endif //__SCL_VERSION_H
+
+/*
+Version History
+ 0.1.1-1
+ - Started recording version information of SCL library
+ 0.1.2-1
+ - Modified the autopopup layout generation code for fulfilling UX requirement
+ 0.1.3-1
+ - Modified the private key to be set only by custom id and skip default values
+ 0.1.4-1
+ - Modified to send key events in autopopup layout when possible
+ 0.1.5-1
+ - Modified type for the variable inner_width from sclbyte to sclint
+ 0.1.6-1
+ - Fixed the bug that longkey behaves incorrectly with multi-touch events
+ 0.1.7-1
+ - Minor changes for tizen 2.0 open
+ 0.1.8-1
+ - Modified the EFL backend to call elm_win_raise() for popup windows as well
+ 0.2.2-1
+ - Implemented synchronization feature with window manager
+*/
--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __SCL_WINDOW_BACKENDCALLBACK_H__
+#define __SCL_WINDOW_BACKENDCALLBACK_H__
+
+using namespace scl;
+
+//SCL_BEGIN_DECLS
+/* FIXME : Need to check the dependency cause by the next include statement */
+
+struct ISCLUIWindowBackendCallback {
+ virtual void update_window(int x, int w, int width, int height, void* user_data) { }
+
+};
+
+#endif //__SCL_WINDOW_BACKENDCALLBACK_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclwindows-nui.h"
+#include "scldebug.h"
+#include "sclcontroller.h"
+#include "sclcontext.h"
+#include "sclresourcecache.h"
+#include "scluibuilder.h"
+#include "sclwindows.h"
+#include "sclres_manager.h"
+
+#include <glib.h>
+#include <Elementary.h>
+#include <malloc.h>
+#ifdef WAYLAND
+#define EFL_BETA_API_SUPPORT
+#include <Ecore_Wl2.h>
+#else
+#include <Ecore_X.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#endif
+#include <dlog.h>
+#include "sclkeyfocushandler.h"
+
+using namespace scl;
+
+#ifndef WAYLAND
+static Ecore_X_Atom ATOM_WM_CLASS = 0;
+static Ecore_X_Window app_window = 0;
+#endif
+
+const sclint rotation_values_EFL[ROTATION_MAX] = {
+ 0, // ROTATION_0
+ 90, // ROTATION_90_CW
+ 180, // ROTATION_180
+ 270, // ROTATION_90_CCW
+};
+
+#include "sclgraphics-nui.h"
+#ifdef TEST_NEWBACKEND
+#include <Ecore_Evas.h>
+#include <Ecore.h>
+#include <vector>
+extern std::vector<ImageCache> g_ImageCache;
+extern std::vector<TextCache> g_TextCache;
+#else
+#endif
+
+/* When the base window is resized, any mouse events generated before this timestamp value
+ * that are waiting in the event queue, could be considered as outdated so we are going to
+ * skip those events */
+unsigned int g_timestamp_last_base_window_resized = 0;
+
+/**
+ * Constructor
+ */
+CSCLWindowsImplNui::CSCLWindowsImplNui()
+{
+ SCL_DEBUG();
+#ifndef WAYLAND
+ /* Initializes all window resources */
+ ATOM_WM_CLASS = ecore_x_atom_get("WM_CLASS");
+#endif
+
+ m_window_backend_callback = NULL;
+ m_window_backend_callback_data = NULL;
+}
+
+/**
+ * De-constructor
+ */
+CSCLWindowsImplNui::~CSCLWindowsImplNui()
+{
+ SCL_DEBUG();
+}
+
+static void window_show_cb(void *data, Evas *e, Evas_Object *obj, void *event)
+{
+ LOGD("INSIDE =-=-=-=- window_show_cb, Trying to Grab Key Board : \n");
+#ifdef USING_KEY_GRAB
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ if (windows && focus_handler)
+ focus_handler->grab_keyboard(windows->get_base_window());
+#endif
+}
+
+void CSCLWindowsImplNui::init()
+{
+}
+
+void CSCLWindowsImplNui::fini()
+{
+}
+
+/**
+ * Create a content window and binds it into given parent window as a child
+ */
+sclwindow
+CSCLWindowsImplNui::create_base_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ sclwindow ret = SCLWINDOW_INVALID;
+
+ if (window_context) {
+ window_context->etc_info = NULL;
+ window_context->window = parent;
+
+ //Adding window show event handler
+ evas_object_event_callback_add(static_cast<Evas_Object*>(parent), EVAS_CALLBACK_SHOW, window_show_cb, NULL);
+
+ set_window_accepts_focus(parent, FALSE);
+
+#ifndef WAYLAND
+ ecore_x_icccm_name_class_set(elm_win_xwindow_get(static_cast<Evas_Object*>(parent)), "Virtual Keyboard", "ISF");
+#endif
+
+ ret = window_context->window;
+ }
+
+ int rots[4] = {0, 90, 180, 270};
+ elm_win_wm_rotation_available_rotations_set(static_cast<Evas_Object*>(parent), rots, 4);
+
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (utils) {
+ utils->log("WinNui_createbasewin %p, %d %d\n",
+ parent, width, height);
+ }
+ return ret;
+}
+
+/**
+ * Creates a window
+ */
+sclwindow
+CSCLWindowsImplNui::create_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ Evas_Object *win = NULL;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ win = elm_win_add(static_cast<Evas_Object*>(parent), "SCLPopup", ELM_WIN_UTILITY);
+
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+ elm_win_title_set(win, "ISF Popup");
+
+ set_window_accepts_focus(win, FALSE);
+
+ int rots[4] = {0, 90, 180, 270};
+ elm_win_wm_rotation_available_rotations_set(win, rots, 4);
+
+ scl16 new_width = 0;
+ scl16 new_height = 0;
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context) {
+ if (context->get_rotation() == ROTATION_90_CW || context->get_rotation() == ROTATION_90_CCW) {
+ new_width = height;
+ new_height = width;
+ } else {
+ new_width = width;
+ new_height = height;
+ }
+ }
+
+#ifndef FULL_SCREEN_TEST
+ //evas_object_resize(win, width, height);
+#endif
+
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_window = (Ecore_Wl2_Window *)(elm_win_wl_window_get(win));
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_0], 0, 0, new_width, new_height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CW], 0, 0, new_width, new_height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_180], 0, 0, new_width, new_height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CCW], 0, 0, new_width, new_height);
+#else
+ /*
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_0], 0, 0, new_width, new_height);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_90_CW], 0, 0, new_width, new_height);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_180], 0, 0, new_width, new_height);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_90_CCW], 0, 0, new_width, new_height);
+ */
+ ecore_x_icccm_name_class_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), "ISF Popup", "ISF");
+
+ Ecore_X_Atom ATOM_WINDOW_EFFECT_ENABLE = 0;
+ unsigned int effect_state = 0; // 0 -> disable effect 1-> enable effect
+
+ ATOM_WINDOW_EFFECT_ENABLE = ecore_x_atom_get("_NET_CM_WINDOW_EFFECT_ENABLE");
+ if (ATOM_WINDOW_EFFECT_ENABLE) {
+ ecore_x_window_prop_card32_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), ATOM_WINDOW_EFFECT_ENABLE, &effect_state, 1);
+ } else {
+ if (utils) {
+ utils->log("Could not get _NET_CM_WINDOW_EFFECT_ENABLE ATOM \n");
+ }
+ }
+#endif
+
+ if (context)
+ set_window_rotation(win, context->get_rotation());
+
+ //elm_win_override_set(win, EINA_TRUE);
+ if (utils) {
+ utils->log("WinNui_createwin %p, %d %d\n",
+ win, width, height);
+ }
+ return win;
+}
+
+
+/**
+* Creates a window
+*/
+sclwindow
+CSCLWindowsImplNui::create_magnifier_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ Evas_Object *win = NULL;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ // FIXME
+#if 0
+ win = elm_win_add(static_cast<Evas_Object*>(parent), "Magnifier", ELM_WIN_UTILITY);
+ LOGD("Created magnifier window %p, using parent %p", win, parent);
+
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+ elm_win_title_set(win, "ISF Magnifier");
+
+ /* We are not going to accept mouse events for magnifier window */
+ Eina_Rectangle rect_unset = { -1, -1, 1, 1 };
+ elm_win_input_rect_set(win, &rect_unset);
+
+ set_window_accepts_focus(win, FALSE);
+
+ int rots[4] = { 0, 90, 180, 270 };
+ elm_win_wm_rotation_available_rotations_set(win, rots, 4);
+
+#ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ sclint scrx, scry, winx, winy;
+ if (windows && utils) {
+ utils->get_screen_resolution(&scrx, &scry);
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context) evas_object_resize(win, scrx, height + window_context->height);
+ }
+#endif
+
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_window = (Ecore_Wl2_Window *)(elm_win_wl_window_get(win));
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_0], 0, 0, width, height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CW], 0, 0, height, width);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_180], 0, 0, width, height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CCW], 0, 0, height, width);
+#else
+ /*
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_0], 0, 0, width, height);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_90_CW], 0, 0, height, width);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_180], 0, 0, width, height);
+ ecore_x_e_window_rotation_geometry_set(elm_win_xwindow_get(win),
+ rotation_values_EFL[ROTATION_90_CCW], 0, 0, height, width);
+ */
+ ecore_x_icccm_name_class_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), "Key Magnifier", "ISF");
+ Ecore_X_Atom ATOM_WINDOW_EFFECT_ENABLE = 0;
+ unsigned int effect_state = 0; // 0 -> disable effect 1-> enable effect
+ ATOM_WINDOW_EFFECT_ENABLE = ecore_x_atom_get("_NET_CM_WINDOW_EFFECT_ENABLE");
+ if (ATOM_WINDOW_EFFECT_ENABLE) {
+ ecore_x_window_prop_card32_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), ATOM_WINDOW_EFFECT_ENABLE, &effect_state, 1);
+ } else {
+ if (utils) {
+ utils->log("Could not get _NET_CM_WINDOW_EFFECT_ENABLE ATOM \n");
+ }
+ }
+#endif
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context)
+ set_window_rotation(win, context->get_rotation());
+#endif
+
+ if (utils) {
+ utils->log("WinNui_createmagwin %p, %d %d\n",
+ win, width, height);
+ }
+
+ return win;
+}
+
+/**
+ * Creates the dim window
+ */
+sclwindow
+CSCLWindowsImplNui::create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ Evas_Object *win = NULL;
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ win = elm_win_add(static_cast<Evas_Object*>(parent), "SCLPopup", ELM_WIN_UTILITY);
+
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+ elm_win_title_set(win, "ISF Dim");
+
+ evas_object_resize(win, width, height);
+
+ int rots[4] = {0, 90, 180, 270};
+ elm_win_wm_rotation_available_rotations_set(win, rots, 4);
+
+ set_window_accepts_focus(win, FALSE);
+
+#ifndef WAYLAND
+ ecore_x_icccm_name_class_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), "ISF Popup", "ISF");
+
+ Ecore_X_Atom ATOM_WINDOW_EFFECT_ENABLE = 0;
+ unsigned int effect_state = 0; // 0 -> disable effect 1-> enable effect
+
+ ATOM_WINDOW_EFFECT_ENABLE = ecore_x_atom_get("_NET_CM_WINDOW_EFFECT_ENABLE");
+ if (ATOM_WINDOW_EFFECT_ENABLE) {
+ ecore_x_window_prop_card32_set(elm_win_xwindow_get(static_cast<Evas_Object*>(win)), ATOM_WINDOW_EFFECT_ENABLE, &effect_state, 1);
+ } else {
+ if (utils) {
+ utils->log("Could not get _NET_CM_WINDOW_EFFECT_ENABLE ATOM \n");
+ }
+ }
+#endif
+
+ CSCLContext *context = CSCLContext::get_instance();
+ if (context)
+ set_window_rotation(win, context->get_rotation());
+
+ /*Evas_Object *bg;
+ bg = elm_bg_add(win);
+ elm_win_resize_object_add(win, bg);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ SclColor color = scl_dim_window_configure.dim_color;
+ evas_object_color_set(bg, color.r, color.g, color.b, color.a);
+ evas_object_show(bg);*/
+
+ hide_window(win);
+
+ if (utils) {
+ utils->log("WinNui_createdimwin %p, %d %d\n",
+ win, width, height);
+ }
+ return win;
+}
+
+/**
+ * Make a window relation between parent and child
+ * Caution: Currently, If we use transient_for them the ISE will occure some crash. It needs to check X11
+ */
+void
+CSCLWindowsImplNui::set_parent(const sclwindow parent, const sclwindow window)
+{
+ SCL_DEBUG();
+
+#ifndef WAYLAND
+ if (parent && window) {
+ ecore_x_icccm_transient_for_set(elm_win_xwindow_get(static_cast<Evas_Object*>(window)),
+ elm_win_xwindow_get(static_cast<Evas_Object*>(parent)));
+ }
+#endif
+}
+
+Eina_Bool destroy_later(void *data)
+{
+ evas_object_hide((Evas_Object*)data);
+ evas_object_del((Evas_Object*)data);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/**
+ * Destroys the given window
+ */
+bool
+CSCLWindowsImplNui::destroy_window(sclwindow window)
+{
+ SCL_DEBUG();
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ SclWindowContext *window_context = NULL;
+ if (windows && window && utils) {
+ window_context = windows->get_window_context(window);
+ if (window_context) {
+ utils->log("WinNui_destroywin %p %p (basewin %p mag %p)\n", window,
+ (!(window_context->is_virtual)) ? elm_win_xwindow_get(static_cast<Evas_Object*>(window)) : 0x01,
+ windows->get_base_window(), windows->get_magnifier_window());
+ if (window_context->etc_info) {
+ Eina_List *list = (Eina_List*)(window_context->etc_info);
+ Eina_List *iter = NULL;
+ Eina_List *iter_next = NULL;
+ void *data = NULL;
+
+ EINA_LIST_FOREACH_SAFE(list, iter, iter_next, data) {
+ if (data) {
+ EFLObject *object = (EFLObject*)(data);
+ if (object) {
+ Evas_Object* eo = object->object;
+ if (object->extracted) {
+ //evas_object_image_data_set(eo, NULL);
+ void *image_data = evas_object_image_data_get(eo, 1);
+ if (image_data) {
+ free(image_data);
+ }
+ }
+ if (eo) {
+ evas_object_del(eo);
+ object->object = NULL;
+ }
+ if (object->type == EFLOBJECT_TEXTBLOCK) {
+ Evas_Textblock_Style *st = (Evas_Textblock_Style*)(object->data);
+ if (st) {
+ evas_textblock_style_free(st);
+ }
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < (sclint)g_TextCache.size();loop++) {
+ if (g_TextCache[loop].text == object->object) {
+ g_TextCache[loop].used = FALSE;
+ }
+ }
+#endif
+ } else if (object->type == EFLOBJECT_IMAGE) {
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < (sclint)g_ImageCache.size();loop++) {
+ if (g_ImageCache[loop].image == object->object) {
+ g_ImageCache[loop].used = FALSE;
+ }
+ }
+#endif
+ }
+ delete object;
+ }
+ }
+ list = eina_list_remove_list(list, iter);
+ }
+ window_context->etc_info = NULL;
+ }
+
+ if (!(window_context->is_virtual)) {
+ /* FIXME : A workaround for the bug that event on a window being hidden is delivered to
+ e17, instead of the window itself or the window right below - Should report to WM */
+ if (window == windows->get_nth_popup_window(SCL_WINDOW_Z_TOP)) {
+ ecore_timer_add(0.1f, destroy_later, (void*)window);
+ } else {
+ Evas_Object *win = (Evas_Object*)window;
+ evas_object_hide(win);
+ evas_object_del(win);
+ }
+ }
+ utils->log("WinNui_destroywin %p (basewin %p mag %p)\n", window,
+ windows->get_base_window(), windows->get_magnifier_window());
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Shows the given window
+ */
+void
+CSCLWindowsImplNui::show_window(const sclwindow window, sclboolean queue)
+{
+ SCL_DEBUG();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (windows && context && window) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ if (!(context->get_hidden_state())) {
+ if (window_context) {
+ if (!(window_context->is_virtual)) {
+ evas_object_show((Evas_Object*)window);
+ }
+
+ if (!(windows->get_update_pending())) {
+ update_window(window);
+ }
+ }
+ }
+
+#ifndef WAYLAND
+ if (windows->get_base_window() == window) {
+ int ret = 0;
+ Atom type_return;
+ int format_return;
+ unsigned long nitems_return;
+ unsigned long bytes_after_return;
+ unsigned char *data = NULL;
+
+ Ecore_X_Window win = elm_win_xwindow_get(static_cast<Evas_Object*>(window));
+ ret = XGetWindowProperty((Display *)ecore_x_display_get(),
+ ecore_x_window_root_get(win),
+ ecore_x_atom_get("_ISF_ACTIVE_WINDOW"),
+ 0, G_MAXLONG, False, XA_WINDOW, &type_return,
+ &format_return, &nitems_return, &bytes_after_return,
+ &data);
+
+ if (data) {
+ if (ret == Success) {
+ if ((type_return == XA_WINDOW) && (format_return == 32) && (data)) {
+ app_window = *(Window *)data;
+ }
+ }
+ XFree(data);
+ }
+ }
+#endif
+ scl8 popup_index = windows->find_popup_window_index(window);
+ if (windows->get_magnifier_window() == window || popup_index != NOT_USED) {
+ /*
+ * FIXME a solution to make magnifier window always on top
+ * N_SE-17689: magnifier window showing behind of candidate window
+ *
+ * N_SE-52548: ...and modified if() for other popup windows as well...
+ */
+ if (window_context && !(window_context->is_virtual)) {
+#ifndef WAYLAND
+ ecore_x_icccm_transient_for_set
+ (elm_win_xwindow_get(static_cast<Evas_Object*>(window)), app_window);
+#endif
+ elm_win_raise((Evas_Object *)window);
+ }
+ }
+
+ if (utils) {
+ utils->log("WinNui_showwin %p (basewin %p mag %p)\n",
+ window,
+ windows->get_base_window(), windows->get_magnifier_window());
+ }
+ }
+}
+
+/**
+ * Hides the given window
+ */
+void
+CSCLWindowsImplNui::hide_window(const sclwindow window, sclboolean fForce)
+{
+ SCL_DEBUG();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclWindowContext *window_context = NULL;
+
+ if (windows && window) {
+#ifdef USING_KEY_GRAB
+ if (window == windows->get_base_window()) {
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+ focus_handler->ungrab_keyboard(window);
+ }
+#endif
+
+ window_context = windows->get_window_context(window);
+ if (window_context) {
+ if (!(window_context->is_virtual)) {
+ Evas_Object *win = (Evas_Object*)window;
+ /* FIXME : A workaround for the bug that event on a window being hidden is delivered to
+ e17, instead of the window itself or the window right below - Should report to WM */
+ if (window == windows->get_nth_popup_window(SCL_WINDOW_Z_TOP)) {
+ evas_object_move(win, -10000, -10000);
+ } else {
+#ifdef WAYLAND
+ /* Under wayland environment, the visibility of keyboard window is controlled by
+ * wayland server, so it is not allowed to call evas_object_hide() for keyboard window
+ * directly on the keyboard side */
+ if (win != windows->get_base_window()) {
+ evas_object_hide(win);
+ }
+#else
+ evas_object_hide(win);
+#endif
+ }
+ }
+ }
+ }
+
+ if (windows && utils && window) {
+ // Memory optimization */
+ if (window == windows->get_magnifier_window() || window == windows->get_dim_window()) {
+ if (window_context) {
+ if (window_context->etc_info) {
+#ifdef TEST_NEWBACKEND
+#else
+ Eina_List *list = (Eina_List*)(window_context->etc_info);
+ Eina_List *iter = NULL;
+ Eina_List *iter_next = NULL;
+ void *data = NULL;
+ int iIndex = 0;
+ EINA_LIST_FOREACH_SAFE(list, iter, iter_next, data) {
+ if (data) {
+ EFLObject *object = (EFLObject*)(data);
+ if (object) {
+ sclboolean bShouldRemove = FALSE;
+ bShouldRemove = TRUE;
+ if (bShouldRemove) {
+ Evas_Object* eo = object->object;
+ if (object->extracted) {
+ void *image_data = evas_object_image_data_get(eo, 1);
+ if (image_data) {
+ free(image_data);
+ }
+ }
+ if (eo) {
+ evas_object_del(eo);
+ object->object = NULL;
+ }
+ if (object->type == EFLOBJECT_TEXTBLOCK) {
+ Evas_Textblock_Style *st = (Evas_Textblock_Style*)(object->data);
+ if (st) {
+ evas_textblock_style_free(st);
+ }
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < g_TextCache.size();loop++) {
+ if (g_TextCache[loop].text == object->object) {
+ g_TextCache[loop].used = FALSE;
+ }
+ }
+#endif
+ } else if (object->type == EFLOBJECT_IMAGE) {
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < g_ImageCache.size();loop++) {
+ if (g_ImageCache[loop].image == object->object) {
+ g_ImageCache[loop].used = FALSE;
+ }
+ }
+#endif
+ }
+ delete object;
+ list = eina_list_remove_list(list, iter);
+ }
+ }
+ iIndex++;
+ }
+ }
+ window_context->etc_info = list;
+#endif
+ }
+ }
+ //Evas *evas = evas_object_evas_get((Evas_Object*)window);
+ //evas_render_idle_flush(evas);
+ }
+ if (window == windows->get_base_window()) {
+ elm_cache_all_flush();
+ malloc_trim(0);
+ }
+ utils->log("WinNui_hidewin %p (basewin %p mag %p)\n",
+ window,
+ windows->get_base_window(), windows->get_magnifier_window());
+ }
+}
+
+/**
+ * Moves the window to the given position
+ */
+sclint magnifierx, magnifiery;
+void
+CSCLWindowsImplNui::move_window(const sclwindow window, scl16 x, scl16 y)
+{
+ SCL_DEBUG();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+
+ if (utils && context && windows && window) {
+ SclWindowContext *window_context = windows->get_window_context(window);
+ unsigned short win_width = 0;
+ unsigned short win_height = 0;
+ if (window_context) {
+ win_width = window_context->geometry.width;
+ win_height = window_context->geometry.height;
+ }
+
+ scl16 rotatex = x;
+ scl16 rotatey = y;
+ scl16 orgx = x;
+ scl16 orgy = y;
+
+ sclint scr_w, scr_h;
+ /* get window size */
+ utils->get_screen_resolution(&scr_w, &scr_h);
+
+#ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ if (window == windows->get_magnifier_window()) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window(), FALSE);
+ rotatex = orgx = 0;
+ if (context->get_rotation_degree() == 90 || context->get_rotation_degree() == 270) {
+ rotatey = orgy = scr_w - base_window_context->height - win_height;
+ win_width = base_window_context->width;
+ win_height = base_window_context->height + win_height;
+ } else {
+ rotatey = orgy = scr_h - base_window_context->height - win_height;
+ win_width = base_window_context->width;
+ win_height = base_window_context->height + win_height;
+ }
+ magnifierx = x;
+ magnifiery = y - orgy;
+ }
+#endif
+
+ switch (context->get_rotation()) {
+ case ROTATION_90_CW: {
+ rotatex = orgy;
+ rotatey = scr_w - orgx - win_width;
+ }
+ break;
+ case ROTATION_180: {
+ rotatex = scr_w - orgx - win_width;
+ rotatey = scr_h - orgy - win_height;
+ }
+ break;
+ case ROTATION_90_CCW: {
+ rotatex = scr_h - orgy - win_height;
+ rotatey = orgx;
+ }
+ break;
+ case ROTATION_0: break;
+ default: break;
+ }
+
+ #ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ if (window == windows->get_magnifier_window()) {
+ if (rotatex == window_context->x && rotatey == window_context->y) return;
+ }
+ #endif
+
+ Evas_Object *win = (Evas_Object*)window;
+#ifndef FULL_SCREEN_TEST
+ if (window != windows->get_base_window()) {
+ evas_object_move(win, rotatex, rotatey);
+ }
+#endif
+ //Evas_Object *window_object = (Evas_Object*)window;
+ //Evas *evas = evas_object_evas_get(window_object);
+ //evas_render_idle_flush(evas);
+
+ utils->log("WinNui_movewin %p %d %d %d %d (basewin %p mag %p)\n",
+ window,
+ x, y, rotatex, rotatey,
+ windows->get_base_window(), windows->get_magnifier_window());
+ }
+}
+
+/**
+* Resizes the window to the given metric
+*/
+void
+CSCLWindowsImplNui::resize_window(const sclwindow window, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (!windows || !utils) return;
+
+#ifdef DO_NOT_MOVE_MAGNIFIER_WINDOW
+ if (window == windows->get_magnifier_window()) {
+ SclWindowContext *window_context = windows->get_window_context(windows->get_base_window());
+ if (window_context->width != width || window_context->height != height) {
+ sclint scrx, scry, winx, winy;
+ utils->get_screen_resolution(&scrx, &scry);
+ if (context->get_rotation_degree() == 90 || context->get_rotation_degree() == 270) {
+ evas_object_resize((Evas_Object*)window, scry, height + window_context->height);
+ } else {
+ evas_object_resize((Evas_Object*)window, scrx, height + window_context->height);
+ }
+ }
+ return;
+ }
+#endif
+
+ Evas_Object *win = (Evas_Object*)window;
+#ifndef FULL_SCREEN_TEST
+ if (windows && utils && window) {
+ utils->log("WinNui_resizewin %p %d %d (basewin %p mag %p)\n",
+ window, width, height,
+ windows->get_base_window(), windows->get_magnifier_window());
+ }
+#endif
+ //Evas_Object *window_object = (Evas_Object*)window;
+ //Evas *evas = evas_object_evas_get(window_object);
+ /*CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ windows->update_window(window);
+ }*/
+ //evas_render_idle_flush(evas);
+ if (windows && window) {
+ if (window != windows->get_base_window()) {
+#ifdef WAYLAND
+ Ecore_Wl2_Window *wl_window = (Ecore_Wl2_Window *)(elm_win_wl_window_get(win));
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_0], 0, 0, width, height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CW], 0, 0, height, width);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_180], 0, 0, width, height);
+ ecore_wl2_window_rotation_geometry_set(wl_window,
+ rotation_values_EFL[ROTATION_90_CCW], 0, 0, height, width);
+#else
+ evas_object_resize(win, width, height);
+#endif
+ } else {
+ g_timestamp_last_base_window_resized = (unsigned int)(ecore_loop_time_get() * 1000.0f);
+ }
+
+ if (window == windows->get_dim_window()) {
+ hide_window(window);
+ }
+ }
+}
+
+/**
+* Resizes the window to the given metric
+*/
+void
+CSCLWindowsImplNui::move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+ Evas_Object *win = (Evas_Object*)window;
+#ifndef FULL_SCREEN_TEST
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ if (windows && utils && window) {
+ if (window != windows->get_base_window()) {
+ evas_object_move(win, x, y);
+ evas_object_resize(win, width, height);
+ }
+ utils->log("WinNui_moveresizewin %p %d %d %d %d (basewin %p)\n",
+ window, x, y, width, height, windows->get_base_window());
+ }
+#endif
+ //Evas_Object *window_object = (Evas_Object*)window;
+ //Evas *evas = evas_object_evas_get(window_object);
+ /*CSCLWindows *windows = CSCLWindows::get_instance();
+ if (windows) {
+ windows->update_window(window);
+ }*/
+ //evas_render_idle_flush(evas);
+}
+
+/**
+* Update the window to redraw given area
+*/
+void
+CSCLWindowsImplNui::update_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ if (m_window_backend_callback) {
+ LOGI("call update_window. x(%d), y(%d), w(%d), h(%d)", x, y, width, height);
+ m_window_backend_callback->update_window(x, y, width, height, m_window_backend_callback_data);
+ }
+ else {
+ LOGW("### No update window callback ###");
+ }
+
+ //return;
+
+ sclboolean removeall = FALSE;
+ SclRectangle updatearea = {x, y, width, height};
+ if (x + y + width + height == 0) {
+ removeall = TRUE;
+ }
+
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ SclWindowContext *window_context = NULL;
+
+ if (windows && window) {
+ //window_context = windows->get_window_context(window, FALSE);
+ window_context = windows->get_window_context(window);
+ }
+ if (windows && utils && window_context) {
+ if (window_context->is_virtual) {
+ SclWindowContext *base_window_context = windows->get_window_context(windows->get_base_window());
+ if (base_window_context) {
+ updatearea.x += (window_context->geometry.x - base_window_context->geometry.x);
+ updatearea.y += (window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+ if (window_context->etc_info) {
+ Eina_List *list = (Eina_List*)(window_context->etc_info);
+ Eina_List *iter = NULL;
+ Eina_List *iter_next = NULL;
+ void *data = NULL;
+ int iIndex = 0;
+
+ EINA_LIST_FOREACH_SAFE(list, iter, iter_next, data) {
+ if (data) {
+ EFLObject *object = (EFLObject*)(data);
+ if (object) {
+ Evas_Object* eo = object->object;
+ sclboolean bShouldRemove = FALSE;
+ if (removeall || utils->is_rect_overlap(object->position, updatearea)) {
+ bShouldRemove = TRUE;
+ }
+ if (iIndex == 0 && !removeall) {
+ bShouldRemove = FALSE; // window's background
+ }
+ if (object->type == EFLOBJECT_CLIPOBJECT) {
+ bShouldRemove = FALSE; // Clip objects are removed when the parent image object is removed
+ }
+ if (eo == NULL) { /* If this object is already removed, proceed removing */
+ bShouldRemove = TRUE;
+ }
+ if (bShouldRemove) {
+#ifdef TEST_NEWBACKEND
+ //if (object->type == EFLOBJECT_IMAGE) {
+ SCL_DEBUG_ELAPSED_TIME_START();
+ if (TRUE) {
+ if (window_context->width != object->position.width || window_context->height != object->position.height ||
+ object->type == EFLOBJECT_TEXTBLOCK || window == windows->get_magnifier_window()) {
+ evas_object_hide(object->object);
+ }
+ } else {
+#else
+ if (object->extracted) {
+ void *image_data = evas_object_image_data_get(eo, 1);
+ if (image_data) {
+ free(image_data);
+ }
+ }
+ if (eo) {
+ evas_object_del(eo);
+ object->object = NULL;
+ }
+ if (object->type == EFLOBJECT_TEXTBLOCK) {
+ Evas_Textblock_Style *st = (Evas_Textblock_Style*)(object->data);
+ if (st) {
+ evas_textblock_style_free(st);
+ }
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < g_TextCache.size();loop++) {
+ if (g_TextCache[loop].text == object->object) {
+ g_TextCache[loop].used = FALSE;
+ }
+ }
+#endif
+ } else if (object->type == EFLOBJECT_IMAGE) {
+#ifdef TEST_NEWBACKEND
+ for (sclint loop = 0;loop < g_ImageCache.size();loop++) {
+ if (g_ImageCache[loop].image == object->object) {
+ g_ImageCache[loop].used = FALSE;
+ }
+ }
+#endif
+ EFLObject *clip_object = (EFLObject*)(object->data);
+ if (clip_object) {
+ if (clip_object->object) {
+ evas_object_del(clip_object->object);
+ clip_object->object = NULL;
+ }
+ }
+ }
+ delete object;
+ list = eina_list_remove_list(list, iter);
+#endif
+#ifdef TEST_NEWBACKEND
+ }
+#endif
+ }
+ }
+ iIndex++;
+ }
+ }
+ window_context->etc_info = list;
+
+ /*while ((Eina_List*)(window_context->etc_info))
+ {
+ EFLObject *object = (EFLObject*)eina_list_data_get((Eina_List*)(window_context->etc_info));
+ if (object) {
+ Evas_Object* eo = object->object;
+ if (eo) {
+ evas_object_del(eo);
+ object->object = NULL;
+ }
+ }
+ window_context->etc_info = eina_list_remove_list((Eina_List*)(window_context->etc_info), (Eina_List*)(winctx->etc_info));
+ delete object;
+ }
+ window_context->etc_info = NULL;*/
+ }
+ CSCLUIBuilder *builder = CSCLUIBuilder::get_instance();
+ builder->show_layout(window, x, y, width, height);
+ }
+
+ /*evas_image_cache_flush(evas_object_evas_get((Evas_Object*)window));
+ elm_cache_all_flush();
+ malloc_trim(0);*/
+ //edje_file_cache_flush();
+}
+
+/**
+ * Returns the position of x,y,width,height of the given window
+ */
+sclboolean
+CSCLWindowsImplNui::get_window_rect(const sclwindow window, SclRectangle *rect)
+{
+ SCL_DEBUG();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+
+ if (utils && context && rect && window) {
+ int x = 0, y = 0, width = 0, height = 0;
+ sclint scr_w = 0, scr_h = 0;
+ elm_win_screen_position_get(static_cast<Evas_Object*>(window), &x, &y);
+ evas_object_geometry_get(static_cast<Evas_Object*>(window), NULL, NULL, &width, &height);
+
+ utils->log("WinNui_getwinrect %p %d %d %d %d\n",
+ window, x, y, width, height);
+
+ /* get window size */
+ utils->get_screen_resolution(&scr_w, &scr_h);
+
+ switch (context->get_rotation())
+ {
+ case ROTATION_90_CW:
+ {
+ rect->width = width;
+ rect->height = height;
+ rect->x = scr_w - y - width;
+ rect->y = x;
+ }
+ break;
+ case ROTATION_180:
+ {
+ rect->x = scr_w - width - x;
+ rect->y = scr_h - height - y;
+ rect->width = width;
+ rect->height = height;
+ }
+ break;
+ case ROTATION_90_CCW:
+ {
+ rect->width = width;
+ rect->height = height;
+ rect->x = y;
+ rect->y = scr_h - x - height;
+ }
+ break;
+ default:
+ {
+ rect->x = x;
+ rect->y = y;
+ rect->width = width;
+ rect->height = height;
+ }
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Sets rotation
+ */
+void
+CSCLWindowsImplNui::set_window_rotation(const sclwindow window, SCLRotation rotation)
+{
+ SCL_DEBUG();
+}
+
+/**
+ * Shows a message box
+ */
+void
+CSCLWindowsImplNui::show_message_box(const sclwindow parent, scl8 msgType, sclchar* title, sclchar* msg)
+{
+ SCL_DEBUG();
+}
+
+void
+CSCLWindowsImplNui::set_keep_above(const sclwindow window, sclboolean keepabove)
+{
+ SCL_DEBUG();
+}
+
+void CSCLWindowsImplNui::set_window_accepts_focus(const sclwindow window, sclboolean acceptable)
+{
+ elm_win_prop_focus_skip_set(static_cast<Evas_Object*>(window), !acceptable);
+}
+
+void CSCLWindowsImplNui::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
+{
+ m_window_backend_callback = callback;
+ m_window_backend_callback_data = data;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclwindows.h"
+#include "sclwindowbackendcallback.h"
+#include <Evas.h>
+#include <Eina.h>
+
+#ifndef __SCL_WINDOWS_NUI_H__
+#define __SCL_WINDOWS_NUI_H__
+
+typedef enum {
+ EFLOBJECT_NONE,
+ EFLOBJECT_IMAGE,
+ EFLOBJECT_CLIPOBJECT,
+ EFLOBJECT_TEXTBLOCK,
+ EFLOBJECT_RECTANGLE,
+} EFLOBJECT_TYPE;
+
+namespace scl
+{
+typedef struct {
+ EFLOBJECT_TYPE type;
+ SclRectangle position;
+ Evas_Object *object;
+ const char *etc_info;
+ sclboolean extracted;
+ void *data;
+} EFLObject;
+
+class CSCLWindowsImplNui : public CSCLWindowsImpl
+{
+public :
+ CSCLWindowsImplNui();
+ ~CSCLWindowsImplNui();
+
+ void init();
+ void fini();
+
+ sclwindow create_base_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height);
+ sclwindow create_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height);
+ sclwindow create_magnifier_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height);
+ sclwindow create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height);
+ bool destroy_window(sclwindow window);
+ void show_window(const sclwindow window, sclboolean queue);
+ void hide_window(const sclwindow window, sclboolean fForce = FALSE);
+ void move_window(const sclwindow window, scl16 x, scl16 y);
+ void resize_window(const sclwindow window, scl16 width, scl16 height);
+ void move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height);
+ void update_window(const sclwindow window, scl16 x = 0, scl16 y = 0, scl16 width = 0, scl16 height = 0);
+ void set_window_rotation(const sclwindow window, SCLRotation rotation);
+ void show_message_box(const sclwindow parent, scl8 msgType, sclchar* title, sclchar* msg);
+ sclboolean get_window_rect(const sclwindow window, SclRectangle *rect);
+ void set_parent(const sclwindow parent, const sclwindow window);
+ void set_keep_above(const sclwindow window, sclboolean keepabove);
+
+ /* EFL specific utility functions */
+ void set_window_accepts_focus(const sclwindow window, sclboolean accepts);
+
+ void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data);
+
+private:
+ ISCLUIWindowBackendCallback* m_window_backend_callback;
+ void* m_window_backend_callback_data;
+};
+} /* End of scl namespace */
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "sclwindows.h"
+#ifdef __WIN32__
+#include "sclwindows-win32.h"
+#elif defined(__EFL__)
+#include "sclwindows-efl.h"
+#elif defined(__NUI__)
+#include "sclwindows-nui.h"
+#else
+#include "sclwindows-gtk.h"
+#endif
+#include "scldebug.h"
+#include "sclevents.h"
+#include "sclresourcecache.h"
+#include "sclcontroller.h"
+#include "sclactionstate.h"
+#include "sclres_manager.h"
+#include "sclkeyfocushandler.h"
+#include "sclanimator.h"
+#include "scleventhandler.h"
+#include <dlog.h>
+
+using namespace scl;
+
+CSCLWindows::CSCLWindows()
+{
+ SCL_DEBUG();
+
+ sclint loop;
+
+ m_impl = NULL;
+
+ memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
+ memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
+ memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
+ memset(m_popup_window_context, 0x00, sizeof(SclWindowContext) * MAX_POPUP_WINDOW);
+
+ m_pending_update = FALSE;
+ m_initialized = FALSE;
+
+ for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
+ m_Z_order_list[loop] = SCLWINDOW_INVALID;
+ }
+}
+
+CSCLWindows::~CSCLWindows()
+{
+ SCL_DEBUG();
+
+ if (m_impl) {
+ delete m_impl;
+ m_impl = NULL;
+ }
+}
+
+void CSCLWindows::init()
+{
+ int loop;
+ CSCLWindowsImpl *impl = get_scl_windows_impl();
+ if (impl) {
+ impl->init();
+ }
+ for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
+ m_Z_order_list[loop] = SCLWINDOW_INVALID;
+ }
+ m_initialized = TRUE;
+}
+
+void CSCLWindows::fini()
+{
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+
+ if (impl) {
+ impl->fini();
+
+ if (SCLWINDOW_INVALID != m_base_window_context.window) {
+ impl->destroy_window(m_base_window_context.window);
+ m_base_window_context.window = SCLWINDOW_INVALID;
+ }
+
+ if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
+ impl->destroy_window(m_magnifier_window_context.window);
+ m_magnifier_window_context.window = SCLWINDOW_INVALID;
+ }
+
+ if (SCLWINDOW_INVALID != m_dim_window_context.window) {
+ impl->destroy_window(m_dim_window_context.window);
+ m_dim_window_context.window = SCLWINDOW_INVALID;
+ }
+
+ for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
+ if (!m_popup_window_context[loop].is_virtual) {
+ impl->destroy_window(m_popup_window_context[loop].window);
+ }
+ m_popup_window_context[loop].window = SCLWINDOW_INVALID;
+ }
+ }
+ }
+
+ m_initialized = FALSE;
+}
+
+CSCLWindowsImpl*
+CSCLWindows::get_scl_windows_impl()
+{
+ if (m_impl == 0) {
+#ifdef __WIN32__
+ m_impl = new CSCLWindowsImplWin32;
+#elif defined(__EFL__)
+ m_impl = new CSCLWindowsImplEfl;
+#elif defined(__NUI__)
+ m_impl = new CSCLWindowsImplNui;
+#else
+ m_impl = new CSCLWindowsImplGtk;
+#endif
+ }
+ return m_impl;
+}
+
+CSCLWindows*
+CSCLWindows::get_instance()
+{
+ static CSCLWindows instance;
+ return &instance;
+}
+
+sclwindow CSCLWindows::open_popup(const SclWindowOpener opener, const SclRectangle &geometry, sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual, sclboolean use_dim_window, sclint img_offset_x, sclint img_offset_y, sclint timeout)
+{
+ sclwindow window = SCLWINDOW_INVALID;
+
+ CSCLEvents *events = CSCLEvents::get_instance();
+ CSCLActionState *state = CSCLActionState::get_instance();
+ CSCLController *controller = CSCLController::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLWindows *windows = CSCLWindows::get_instance();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (events && state && controller && cache && context && windows && utils) {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
+ if (m_popup_window_context[loop].layout == layout) return SCLWINDOW_INVALID;
+ }
+ }
+
+ window = create_window(opener, geometry, inputmode, layout, popup_type, is_virtual, img_offset_x, img_offset_y, timeout);
+ events->destroy_timer(SCL_TIMER_POPUP_TIMEOUT);
+ if (timeout > 0) {
+ events->create_timer(SCL_TIMER_POPUP_TIMEOUT, timeout, layout);
+ }
+
+ LOGD("create window (%p) x: %d, y:%d, width:%d, height:%d , layout:%d, popuptype:%d",
+ window, geometry.x, geometry.y, geometry.width, geometry.height, layout, popup_type);
+
+ events->connect_window_events(window, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
+ controller->handle_engine_signal(SCL_SIG_POPUP_SHOW, window);
+
+ /* Shows the dim window if it uses the dim_window */
+ if (use_dim_window) {
+ sclwindow dim_window = get_dim_window();
+
+ /* Currently, get_window_rect does not work normally (need to check X). So I have commented it*/
+ SclRectangle rect;
+ get_window_rect(get_base_window(), &rect);
+ resize_window(dim_window, rect.width, rect.height);
+ move_window(dim_window, rect.x, rect.y);
+ events->connect_window_events(dim_window, SCL_EVENT_MOUSE);
+ /*If we use transient_for them the ISE will occur some crash. It needs to check X11*/
+ set_parent(opener.window, dim_window);
+ SclWindowContext *dim_window_context = get_window_context(get_dim_window());
+ if (dim_window_context) {
+ if (dim_window_context->is_virtual) {
+ set_parent(opener.window, window);
+ } else {
+ set_parent(dim_window, window);
+ }
+ }
+ show_window(dim_window);
+ } else {
+ /*If we use transient_for them the ISE will occur some crash. It needs to check X11*/
+ set_parent(opener.window, window);
+ }
+ show_window(window);
+
+ push_window_in_Z_order_list(window);
+
+ state->set_cur_action_state(ACTION_STATE_POPUP_INIT);
+
+ const SclLayout *cur_layout = cache->get_cur_layout(window);
+ if (cur_layout) {
+ /* If the newly opened popup window has POPUP_GRAB style, lets press the nearest button on the new window */
+ if (cur_layout->style == LAYOUT_STYLE_POPUP_GRAB) {
+ sclwindow pressed_window = context->get_cur_pressed_window(context->get_last_touch_device_id());
+ sclbyte pressed_key = context->get_cur_pressed_key(context->get_last_touch_device_id());
+
+ const SclLayoutKeyCoordinate* coordinate = cache->get_cur_layout_key_coordinate(pressed_window, pressed_key);
+
+ sclwindow moving_window = context->get_cur_moving_window(context->get_last_touch_device_id());
+ SclPoint moving_point = context->get_cur_moving_point(context->get_last_touch_device_id());
+ SclWindowContext *moving_window_context = windows->get_window_context(moving_window);
+ SclWindowContext *popup_window_context = windows->get_window_context(window);
+ if (moving_window_context && popup_window_context) {
+ moving_point.x =
+ (moving_window_context->geometry.x - popup_window_context->geometry.x) + moving_point.x;
+ moving_point.y =
+ (moving_window_context->geometry.y - popup_window_context->geometry.y) + moving_point.y;
+ }
+
+ /* Find the nearest button on the autopopup window */
+ sclboolean ended = FALSE;
+ sclfloat min_dist = (float)((sclu32)(-1));
+ sclint min_dist_index = NOT_USED;
+ for (sclint loop = 0;loop < MAX_KEY && !ended;loop++) {
+ SclButtonContext *popup_button_context = cache->get_cur_button_context(window, loop);
+ const SclLayoutKeyCoordinate *popup_coordinate = cache->get_cur_layout_key_coordinate(window, loop);
+ if (popup_button_context && popup_coordinate) {
+ if (!(popup_button_context->used)) {
+ ended = TRUE;
+ } else if (popup_button_context->state != BUTTON_STATE_DISABLED &&
+ popup_coordinate->button_type != BUTTON_TYPE_UIITEM) {
+ if (popup_coordinate) {
+ float dist = utils->get_approximate_distance(moving_point.x, moving_point.y,
+ popup_coordinate->x + (popup_coordinate->width / 2) -
+ cur_layout->mouse_manipulate_x,
+ popup_coordinate->y + (popup_coordinate->height / 2) -
+ cur_layout->mouse_manipulate_y);
+ if (dist < min_dist) {
+ min_dist_index = loop;
+ min_dist = dist;
+ }
+ }
+ }
+ }
+ }
+ /* When we found the nearest button, make it pressed */
+ if (min_dist_index != NOT_USED) {
+ const SclLayoutKeyCoordinate *popup_coordinate =
+ cache->get_cur_layout_key_coordinate(window, min_dist_index);
+ if (popup_coordinate) {
+ sclint x = popup_coordinate->x + (popup_coordinate->width / 2) -
+ cur_layout->mouse_manipulate_x;
+ sclint y = popup_coordinate->y + (popup_coordinate->height / 2) -
+ cur_layout->mouse_manipulate_y;
+ controller->mouse_press(window, x, y, context->get_last_touch_device_id());
+ }
+ }
+
+ /* The below code block seems unnecessary since we already invoked mouse_press() */
+ /*context->set_cur_pressed_window(context->get_last_touch_device_id(), window);
+ context->set_cur_pressed_key(context->get_last_touch_device_id(), min_dist_index);
+ if (button_context) {
+ button_context->state = BUTTON_STATE_NORMAL;
+ }*/
+
+ if (windows && coordinate)
+ windows->update_window(window, coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+
+ return window;
+}
+
+bool CSCLWindows::close_popup(sclwindow window, sclboolean timed_out)
+{
+ LOGD("close_popup window (%p)", window);
+
+ CSCLEventHandler *handler = CSCLEventHandler::get_instance();
+
+ if (handler) {
+ SclNotiPopupClosingDesc desc;
+ desc.ui_event_desc = NULL;
+ desc.input_mode = NULL;
+ desc.timed_out = timed_out;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ if (sclres_manager) {
+ const PSclInputModeConfigure sclres_input_mode_configure =
+ sclres_manager->get_input_mode_configure_table();
+ SclWindowContext *window_context = get_window_context(window);
+ if (window_context && sclres_input_mode_configure) {
+ if (scl_check_arrindex(window_context->inputmode, MAX_SCL_INPUT_MODE)) {
+ desc.input_mode = sclres_input_mode_configure[window_context->inputmode].name;
+ }
+ }
+ }
+
+ if (SCL_EVENT_PASS_ON == handler->on_event_notification(SCL_UINOTITYPE_POPUP_CLOSING, &desc)) {
+ SclNotiPopupClosedDesc closed_desc;
+ closed_desc.ui_event_desc = NULL;
+ closed_desc.input_mode = desc.input_mode;
+ closed_desc.timed_out = desc.timed_out;
+ handler->on_event_notification(SCL_UINOTITYPE_POPUP_CLOSED, &desc);
+
+ CSCLKeyFocusHandler *focus_handler = CSCLKeyFocusHandler::get_instance();
+ if (focus_handler) {
+ focus_handler->popup_closed(window);
+ }
+ pop_window_in_Z_order_list(window);
+
+ hide_window(get_dim_window());
+ hide_window(window);
+ return destroy_window(window);
+ }
+ }
+
+ return FALSE;
+}
+
+bool CSCLWindows::close_all_popups(sclwindow skip_window /* = SCLWINDOW_INVALID */, sclboolean timed_out)
+{
+ sclboolean all_closed = TRUE;
+ /* Close all the popup windows except the targetWindow */
+ int loop = 0;
+ sclwindow window;
+ do {
+ window = get_nth_popup_window(loop);
+ if (window) {
+ if (window != skip_window) {
+ close_popup(window, timed_out);
+ } else {
+ all_closed = FALSE;
+ }
+ }
+ loop++;
+ } while (window);
+
+ /* If there is a popup still opened, don't destroy POPUP_TIMEOUT timer */
+ return all_closed;
+}
+
+sclwindow
+CSCLWindows::create_base_window(const sclwindow parent, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ if (m_initialized) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+
+ m_base_window_context.hidden = TRUE;
+ m_base_window_context.geometry.width = width;
+ m_base_window_context.geometry.height = height;
+ m_base_window_context.is_virtual = FALSE;
+ m_base_window_context.popup_type = POPUP_TYPE_NONE;
+ m_base_window_context.opener.window = parent;
+ m_base_window_context.geometry.x = m_base_window_context.geometry.y = 0;
+ m_base_window_context.etc_info = NULL;
+ m_base_window_context.window = SCLWINDOW_INVALID;
+
+ if (impl) {
+ m_base_window_context.window = impl->create_base_window(parent, &m_base_window_context, width, height);
+ push_window_in_Z_order_list(m_base_window_context.window);
+ }
+ }
+
+ // Update the position information
+ //get_window_context(parent, TRUE);
+
+ return m_base_window_context.window;
+}
+
+/**
+ * Creates a new top-level window
+ *
+ * @Code
+ * CSCLGwes* gwes = CSCLGwes::get_instance();
+ * sclwindow popupWindow = gwes->m_windows->create_window(window, 100, 500, 200, 100, 4, POPUP_TYPE_BTN_RELEASE_POPUP, FALSE);
+ * if (popupWindow != NULL) {
+ * gwes->m_events->connect_window_events(popupWindow, SCL_EVENT_MOUSE | SCL_EVENT_EXPOSE);
+ * cache->recompute_layout(popupWindow);
+ * gwes->m_windows->show_window(popupWindow);
+ * }
+ */
+sclwindow
+CSCLWindows::create_window(const SclWindowOpener opener, const SclRectangle &geometry, sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual, sclint img_offset_x, sclint img_offset_y, sclint timeout)
+{
+ SCL_DEBUG();
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ sclwindow window = SCLWINDOW_INVALID;
+
+ if (impl) {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == SCLWINDOW_INVALID) {
+ m_popup_window_context[loop].hidden = TRUE;
+ m_popup_window_context[loop].opener = opener;
+ m_popup_window_context[loop].etc_info = NULL;
+ m_popup_window_context[loop].inputmode = inputmode;
+ m_popup_window_context[loop].layout = layout;
+ m_popup_window_context[loop].popup_type = popup_type;
+ m_popup_window_context[loop].is_virtual = is_virtual;
+
+ m_popup_window_context[loop].geometry = geometry;
+
+ m_popup_window_context[loop].layout_image_offset.x = img_offset_x;
+ m_popup_window_context[loop].layout_image_offset.y = img_offset_y;
+
+ m_popup_window_context[loop].timeout = timeout;
+
+ if (!is_virtual) {
+ window = impl->create_window(opener.window,
+ &(m_popup_window_context[loop]), geometry.width, geometry.height);
+ } else {
+ window = reinterpret_cast<sclwindow>(loop + 1);
+ }
+ if (window) {
+ m_popup_window_context[loop].window = window;
+ }
+ //set_window_rotation(window, context->get_rotation_degree());
+ if (!m_popup_window_context[loop].is_virtual) {
+ impl->move_window(window, geometry.x, geometry.y);
+ }
+ break;
+ }
+ }
+
+ // Update the position information
+ //get_window_context(window, TRUE);
+
+ if (window == NULL) {
+ LOGW("Failed to create a new window. The size of window buffer has exceeded.");
+ }
+ }
+ return window;
+}
+
+sclwindow
+CSCLWindows::create_magnifier_window(const sclwindow parent, scl16 x, scl16 y, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ sclwindow window = SCLWINDOW_INVALID;
+
+ if (impl && m_initialized) {
+ if (m_magnifier_window_context.window == SCLWINDOW_INVALID) {
+ window = impl->create_magnifier_window(parent, &m_magnifier_window_context, width, height);
+ impl->set_keep_above(window, TRUE);
+ if (window) {
+ m_magnifier_window_context.window = window;
+ m_magnifier_window_context.geometry.width = width;
+ m_magnifier_window_context.geometry.height = height;
+ m_magnifier_window_context.hidden = TRUE;
+ }
+ } else {
+ window = m_magnifier_window_context.window;
+ }
+ set_parent(parent, window);
+
+ if (window == NULL) {
+ LOGW("Failed to create a new window. The size of window buffer has exceeded.");
+ } else {
+ LOGD("Magnifier Window %p created", window);
+ }
+ }
+
+ // Update the position information
+ //get_window_context(window, TRUE);
+
+ return window;
+}
+
+sclwindow
+CSCLWindows::get_magnifier_window()
+{
+ SCL_DEBUG();
+ return m_magnifier_window_context.window;
+}
+
+sclwindow
+CSCLWindows::create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ sclwindow window = SCLWINDOW_INVALID;
+
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclDefaultConfigure default_configure = NULL;
+ if (sclres_manager) {
+ default_configure = sclres_manager->get_default_configure();
+ }
+
+ if (impl && m_initialized && default_configure) {
+ if (m_dim_window_context.window == NULL) {
+ m_dim_window_context.hidden = TRUE;
+ if (default_configure->use_actual_dim_window) {
+ window = impl->create_dim_window(parent, &m_dim_window_context, width, height);
+ } else {
+ window = reinterpret_cast<sclwindow>(SCLWINDOW_VIRTUAL_DIM);
+ m_dim_window_context.is_virtual = TRUE;
+ }
+ if (window) {
+ m_dim_window_context.window = window;
+ }
+ } else {
+ window = m_dim_window_context.window;
+ }
+
+ if (window == NULL) {
+ LOGW("Failed to create a new window. The size of window buffer has exceeded");
+ }
+ }
+
+ return window;
+}
+
+sclwindow
+CSCLWindows::get_dim_window()
+{
+ SCL_DEBUG();
+ return m_dim_window_context.window;
+}
+
+bool
+CSCLWindows::destroy_window(sclwindow window)
+{
+ SCL_DEBUG();
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ sclboolean ret = FALSE;
+
+ if (impl) {
+ if (window == m_base_window_context.window) {
+ impl->destroy_window(window);
+ memset(&m_base_window_context, 0x00, sizeof(SclWindowContext));
+ m_base_window_context.window = SCLWINDOW_INVALID;
+ ret = TRUE;
+ } else if (window == m_magnifier_window_context.window) {
+ impl->destroy_window(window);
+ memset(&m_magnifier_window_context, 0x00, sizeof(SclWindowContext));
+ m_magnifier_window_context.window = SCLWINDOW_INVALID;
+ ret = TRUE;
+ } else if (window == m_dim_window_context.window) {
+ impl->destroy_window(window);
+ memset(&m_dim_window_context, 0x00, sizeof(SclWindowContext));
+ m_dim_window_context.window = SCLWINDOW_INVALID;
+ ret = TRUE;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ impl->destroy_window(window);
+ memset(&m_popup_window_context[loop], 0x00, sizeof(SclWindowContext));
+ ret = TRUE;
+ m_popup_window_context[loop].window = SCLWINDOW_INVALID;
+ break;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+sclwindow
+CSCLWindows::get_base_window()
+{
+ SCL_DEBUG();
+
+ return m_base_window_context.window;
+}
+
+sclboolean
+CSCLWindows::is_base_window(sclwindow window)
+{
+ SCL_DEBUG();
+
+ sclboolean ret = FALSE;
+
+ if (window != SCLWINDOW_INVALID) {
+ if (window == m_base_window_context.window) {
+ ret = TRUE;
+ }
+ }
+
+ return ret;
+}
+
+sclwindow
+CSCLWindows::find_by_etcinfo(void* etc_info)
+{
+ SCL_DEBUG();
+
+ sclwindow ret = SCLWINDOW_INVALID;
+
+ if (etc_info == m_base_window_context.etc_info) {
+ ret = m_base_window_context.window;
+ } else if (etc_info == m_magnifier_window_context.etc_info) {
+ ret = m_magnifier_window_context.window;
+ } else if (etc_info == m_dim_window_context.etc_info) {
+ ret = m_dim_window_context.window;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (etc_info == m_popup_window_context[loop].etc_info) {
+ ret = m_popup_window_context[loop].window;
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+SclWindowContext*
+//CSCLWindows::get_window_context(sclwindow window, sclboolean geometry_update)
+CSCLWindows::get_window_context(sclwindow window)
+{
+ SCL_DEBUG();
+
+ SclWindowContext* ret = NULL;
+
+ if (window == m_base_window_context.window) {
+ /*if (geometry_update) {
+ SclRectangle rect;
+ get_window_rect(window, &rect);
+ m_base_window_context.geometry.x = rect.x;
+ m_base_window_context.geometry.y = rect.y;
+ }*/
+ ret = &m_base_window_context;
+ } else if (window == m_magnifier_window_context.window) {
+ ret = &m_magnifier_window_context;
+ } else if (window == m_dim_window_context.window) {
+ ret = &m_dim_window_context;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ /*if (geometry_update) {
+ SclRectangle rect;
+ get_window_rect(window, &rect);
+ m_popup_window_context[loop].geometry.x = rect.x;
+ m_popup_window_context[loop].geometry.y = rect.y;
+ }*/
+ ret = &m_popup_window_context[loop];
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+void
+CSCLWindows::set_window_context(sclwindow window, SclWindowContext* context)
+{
+ SCL_DEBUG();
+
+ if (window == m_base_window_context.window) {
+ memcpy(&m_base_window_context, context, sizeof(SclWindowContext));
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ memcpy(&m_popup_window_context[loop], context, sizeof(SclWindowContext));
+ break;
+ }
+ }
+ }
+}
+
+scl8
+CSCLWindows::find_popup_window_index(sclwindow window)
+{
+ SCL_DEBUG();
+
+ scl8 ret = NOT_USED;
+
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ ret = loop;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+void
+CSCLWindows::move_window(const sclwindow window, scl16 x, scl16 y)
+{
+ SCL_DEBUG();
+
+ sclboolean is_virtual = FALSE;
+ if (window == m_base_window_context.window) {
+ m_base_window_context.geometry.x = x;
+ m_base_window_context.geometry.y = y;
+ is_virtual = m_base_window_context.is_virtual;
+ } else if (window == m_magnifier_window_context.window) {
+ m_magnifier_window_context.geometry.x = x;
+ m_magnifier_window_context.geometry.y = y;
+ is_virtual = m_magnifier_window_context.is_virtual;
+ } else if (window == m_dim_window_context.window) {
+ m_dim_window_context.geometry.x = x;
+ m_dim_window_context.geometry.y = y;
+ is_virtual = m_dim_window_context.is_virtual;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ m_popup_window_context[loop].geometry.x = x;
+ m_popup_window_context[loop].geometry.y = y;
+ is_virtual = m_popup_window_context[loop].is_virtual;
+ break;
+ }
+ }
+ }
+ if (!is_virtual) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->move_window(window, x, y);
+ }
+ }
+}
+
+void
+CSCLWindows::resize_window(const sclwindow window, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ sclboolean is_virtual = FALSE;
+ if (window == m_base_window_context.window) {
+ m_base_window_context.geometry.width = width;
+ m_base_window_context.geometry.height = height;
+ is_virtual = m_base_window_context.is_virtual;
+ } else if (window == m_magnifier_window_context.window) {
+ m_magnifier_window_context.geometry.width = width;
+ m_magnifier_window_context.geometry.height = height;
+ is_virtual = m_magnifier_window_context.is_virtual;
+ } else if (window == m_dim_window_context.window) {
+ m_dim_window_context.geometry.width = width;
+ m_dim_window_context.geometry.height = height;
+ is_virtual = m_dim_window_context.is_virtual;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ m_popup_window_context[loop].geometry.width = width;
+ m_popup_window_context[loop].geometry.height = height;
+ is_virtual = m_popup_window_context[loop].is_virtual;
+ break;
+ }
+ }
+ }
+ if (!is_virtual) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->resize_window(window, width, height);
+ }
+ }
+}
+
+void
+CSCLWindows::move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height)
+{
+ SCL_DEBUG();
+
+ sclboolean is_virtual = FALSE;
+ if (window == m_base_window_context.window) {
+ m_base_window_context.geometry.x = x;
+ m_base_window_context.geometry.y = y;
+ m_base_window_context.geometry.width = width;
+ m_base_window_context.geometry.height = height;
+ is_virtual = m_base_window_context.is_virtual;
+ } else if (window == m_magnifier_window_context.window) {
+ m_magnifier_window_context.geometry.x = x;
+ m_magnifier_window_context.geometry.y = y;
+ m_magnifier_window_context.geometry.width = width;
+ m_magnifier_window_context.geometry.height = height;
+ is_virtual = m_magnifier_window_context.is_virtual;
+ } else if (window == m_dim_window_context.window) {
+ m_dim_window_context.geometry.x = x;
+ m_dim_window_context.geometry.y = y;
+ m_dim_window_context.geometry.width = width;
+ m_dim_window_context.geometry.height = height;
+ is_virtual = m_dim_window_context.is_virtual;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ m_popup_window_context[loop].geometry.x = x;
+ m_popup_window_context[loop].geometry.y = y;
+ m_popup_window_context[loop].geometry.width = width;
+ m_popup_window_context[loop].geometry.height = height;
+ is_virtual = m_popup_window_context[loop].is_virtual;
+ break;
+ }
+ }
+ }
+ if (!is_virtual) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->move_resize_window(window, x, y, width, height);
+ }
+ }
+}
+
+
+/* Push given window into a Z-order list */
+void CSCLWindows::push_window_in_Z_order_list(sclwindow window)
+{
+ SCL_DEBUG();
+
+ sclint loop;
+
+ for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
+ if (m_Z_order_list[loop] == SCLWINDOW_INVALID) {
+ m_Z_order_list[loop] = window;
+ return;
+ }
+ }
+}
+
+/* Pop given window from a Z-order list */
+void CSCLWindows::pop_window_in_Z_order_list(sclwindow window)
+{
+ SCL_DEBUG();
+
+ sclint loop;
+ sclboolean found = FALSE;
+
+ for (loop = 0;loop < MAX_ZORDER_NUM - 1;loop++) {
+ if (m_Z_order_list[loop] == window || found) {
+ found = TRUE;
+ m_Z_order_list[loop] = m_Z_order_list[loop + 1];
+ }
+ }
+
+ m_Z_order_list[MAX_ZORDER_NUM - 1] = SCLWINDOW_INVALID;
+}
+
+/* Search n-th window in the Z-order stack, starting from the top (TOPMOST window would be the 0 index) */
+sclwindow CSCLWindows::get_nth_window_in_Z_order_list(sclbyte index)
+{
+ SCL_DEBUG();
+
+ sclint loop;
+
+ for (loop = MAX_ZORDER_NUM - 1;loop >= 0;loop--) {
+ if (m_Z_order_list[loop] != SCLWINDOW_INVALID) {
+ if (index == 0) {
+ return m_Z_order_list[loop];
+ }
+ index--;
+ }
+ }
+
+ return SCLWINDOW_INVALID;
+}
+
+sclwindow CSCLWindows::get_nth_popup_window(sclbyte index)
+{
+ SCL_DEBUG();
+
+ scl_assert_return_null(index >= 0 && index < MAX_POPUP_WINDOW);
+
+ if (index < MAX_POPUP_WINDOW) {
+ return m_popup_window_context[index].window;
+ }
+
+ return SCLWINDOW_INVALID;
+}
+
+sclbyte CSCLWindows::get_Z_order(sclwindow window)
+{
+ SCL_DEBUG();
+
+ sclbyte loop;
+ for (loop = 0;loop < MAX_ZORDER_NUM;loop++) {
+ if (m_Z_order_list[loop] == window) {
+ return loop;
+ }
+ }
+ return NOT_USED;
+}
+
+void CSCLWindows::set_parent(const sclwindow parent, const sclwindow window)
+{
+ /* Do not set parent if the window is a virtual window */
+ //SclWindowContext *window_context = get_window_context(window, FALSE);
+ SclWindowContext *window_context = get_window_context(window);
+ if (window_context) {
+ if (!(window_context->is_virtual)) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->set_parent(parent, window);
+ }
+ }
+ }
+}
+
+void CSCLWindows::set_window_rotation(const sclwindow window, SCLRotation rotation)
+{
+ SCL_DEBUG();
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ CSCLUtils *utils = CSCLUtils::get_instance();
+
+ if (impl && utils) {
+ if (window == NULL) {
+ impl->set_window_rotation(m_base_window_context.window, rotation);
+ if (SCLWINDOW_INVALID != m_magnifier_window_context.window) {
+ SclResParserManager *sclres_manager = SclResParserManager::get_instance();
+ PSclMagnifierWndConfigure magnifier_configure = NULL;
+ if (sclres_manager) {
+ magnifier_configure = sclres_manager->get_magnifier_configure();
+ }
+ if (magnifier_configure) {
+ m_magnifier_window_context.geometry.width =
+ magnifier_configure->width * utils->get_custom_scale_rate_x();
+ m_magnifier_window_context.geometry.height =
+ magnifier_configure->height * utils->get_custom_scale_rate_y();
+
+ impl->set_window_rotation(m_magnifier_window_context.window, rotation);
+ }
+ }
+
+ if (SCLWINDOW_INVALID != m_dim_window_context.window) {
+ /* For individual window rotation */
+ impl->set_window_rotation(m_dim_window_context.window, rotation);
+ //resize_window(m_dim_window_context.window, m_base_window_context.width, m_base_winctx.height);
+ //move_window(m_dim_window_context.window, m_base_window_context.x, m_base_winctx.y);
+ hide_window(m_dim_window_context.window);
+ }
+ /* For individual window rotation
+ for (int loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window != SCLWINDOW_INVALID) {
+ if (!m_popup_window_context[loop].isVirtual) {
+ get_scl_windows_impl()->set_window_rotation(m_popup_window_context[loop].window, degree);
+ }
+ }
+ }
+ */
+ } else {
+ impl->set_window_rotation(window, rotation);
+ LOGD("## set_window_rotation : %d", rotation);
+ }
+ }
+
+ // Update the position information
+ //get_window_context(window, TRUE);
+ SclWindowContext *window_context = get_window_context(window);
+ if (window_context) {
+ get_window_rect(window, &(window_context->geometry));
+ }
+}
+
+
+void
+CSCLWindows::show_window(const sclwindow window, sclboolean queue /*= FALSE*/)
+{
+ SCL_DEBUG();
+
+ if (window == m_base_window_context.window) {
+ m_base_window_context.hidden = FALSE;
+ } else if (window == m_magnifier_window_context.window) {
+ m_magnifier_window_context.hidden = FALSE;
+ } else if (window == m_dim_window_context.window) {
+ m_dim_window_context.hidden = FALSE;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ m_popup_window_context[loop].hidden = FALSE;
+ break;
+ }
+ }
+ }
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->show_window(window, queue);
+ }
+}
+
+void
+CSCLWindows::hide_window(const sclwindow window, sclboolean force /*= FALSE*/)
+{
+ SCL_DEBUG();
+
+ if (window == m_base_window_context.window) {
+ m_base_window_context.hidden = TRUE;
+ } else if (window == m_magnifier_window_context.window) {
+ m_magnifier_window_context.hidden = TRUE;
+ } else if (window == m_dim_window_context.window) {
+ m_dim_window_context.hidden = TRUE;
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ m_popup_window_context[loop].hidden = TRUE;
+ break;
+ }
+ }
+ }
+
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->hide_window(window, force);
+ }
+}
+
+void
+CSCLWindows::set_keep_above(const sclwindow window, sclboolean keep_above)
+{
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->set_keep_above(window, keep_above);
+ }
+}
+
+void
+CSCLWindows::set_update_pending(sclboolean pend)
+{
+ m_pending_update = pend;
+ if (!pend) {
+ update_window(m_base_window_context.window);
+ }
+}
+
+sclboolean
+CSCLWindows::get_update_pending()
+{
+ return m_pending_update;
+}
+
+void
+CSCLWindows::update_window(const sclwindow window,
+ scl16 x /*= 0*/, scl16 y /*= 0*/, scl16 width /*= 0*/, scl16 height /*= 0*/ )
+{
+ if (!m_pending_update) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ CSCLAnimator *animator = CSCLAnimator::get_instance();
+ CSCLResourceCache *cache = CSCLResourceCache::get_instance();
+ CSCLContext *context = CSCLContext::get_instance();
+ CSCLKeyFocusHandler* focus_handler = CSCLKeyFocusHandler::get_instance();
+
+ if (impl) {
+ impl->update_window(window, x, y, width, height);
+
+ /* If we are not updating the whole screen */
+ if (animator && cache && context && focus_handler && (x != 0 || y != 0 || width != 0 || height != 0)) {
+ sclboolean draw_highlight_ui = TRUE;
+ SclAnimationState *state = NULL;
+
+ if (animator) {
+ sclint id = animator->find_animator_by_type(ANIMATION_TYPE_HIGHLIGHT_UI);
+ state = animator->get_animation_state(id);
+ }
+ if (state) {
+ // If currently the highlight UI is being animated, don't update here
+ if (state->active) {
+ draw_highlight_ui = FALSE;
+ }
+ }
+
+ SclWindowContext *window_context = get_window_context(window);
+ if (focus_handler->get_current_focus_window() == window) {
+ sclint startx = 0;
+ sclint starty = 0;
+
+ SclWindowContext *base_window_context = get_window_context(get_base_window());
+ if (window_context && base_window_context) {
+ if (window_context->is_virtual) {
+ startx += (window_context->geometry.x - base_window_context->geometry.x);
+ starty += (window_context->geometry.y - base_window_context->geometry.y);
+ }
+ }
+ if (draw_highlight_ui && context->get_highlight_ui_enabled()) {
+ const SclLayoutKeyCoordinate *coordinate = NULL;
+ scl8 current_key_index = focus_handler->get_current_focus_key();
+ coordinate = cache->get_cur_layout_key_coordinate(window, current_key_index);
+ if (coordinate) {
+ // Update the highlighted area as well
+ LOGD("startx: %d, starty: %d", startx, starty);
+ LOGD("coordinate x(%d), y(%d), w(%d), h(%d)", coordinate->x, coordinate->y, coordinate->width, coordinate->height);
+
+ impl->update_window(window, startx + coordinate->x, starty + coordinate->y, coordinate->width, coordinate->height);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+sclboolean
+CSCLWindows::get_window_rect(const sclwindow window, SclRectangle *rect) {
+ SCL_DEBUG();
+
+ sclboolean is_virtual = FALSE;
+ sclboolean ret = FALSE;
+ if (rect) {
+ if (window == m_base_window_context.window) {
+ is_virtual = m_base_window_context.is_virtual;
+ if (is_virtual) {
+ *rect = m_base_window_context.geometry;
+ }
+ } else if (window == m_magnifier_window_context.window) {
+ is_virtual = m_magnifier_window_context.is_virtual;
+ if (is_virtual) {
+ *rect = m_magnifier_window_context.geometry;
+ }
+ } else if (window == m_dim_window_context.window) {
+ is_virtual = m_dim_window_context.is_virtual;
+ if (is_virtual) {
+ *rect = m_dim_window_context.geometry;
+ }
+ } else {
+ for (sclint loop = 0;loop < MAX_POPUP_WINDOW;loop++) {
+ if (m_popup_window_context[loop].window == window) {
+ is_virtual = m_popup_window_context[loop].is_virtual;
+ if (is_virtual) {
+ *rect = m_popup_window_context[loop].geometry;
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (!is_virtual) {
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ ret = impl->get_window_rect(window, rect);
+ }
+ }
+
+ return ret;
+}
+
+void CSCLWindows::set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data)
+{
+ CSCLWindowsImpl* impl = get_scl_windows_impl();
+ if (impl) {
+ impl->set_window_backend_callback(callback, data);
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scltypes.h"
+#include "sclconfig.h"
+#include "sclwindowbackendcallback.h"
+
+#ifndef __SCL_WINDOWS_H__
+#define __SCL_WINDOWS_H__
+
+#ifdef __cplusplus
+//SCL_BEGIN_DECLS
+#endif
+
+namespace scl
+{
+#define MAX_POPUP_WINDOW 1
+#define MAX_ZORDER_NUM (MAX_POPUP_WINDOW + 1 ) /* Popup + Base */
+
+#define SCL_WINDOW_Z_TOP 0
+
+/**@brief A struct for identifying who opened this window */
+typedef struct _SclWindowOpener {
+ sclwindow window;
+ sclint key;
+} SclWindowOpener;
+
+/**@brief window context structure */
+typedef struct _SclWindowContext {
+ sclboolean is_virtual;
+ sclwindow window;
+ sclshort inputmode;
+ sclshort layout;
+ sclboolean hidden;
+ SCLPopupType popup_type;
+
+ SclWindowOpener opener;
+ SclRectangle geometry;
+
+ sclint timeout;
+
+ SclPoint layout_image_offset;
+ const void* etc_info;
+} SclWindowContext;
+
+/**
+ * @brief The base class to work as a soft-based keyboard
+ *
+ * This class implements all functions for working as a soft-based keyboard
+ * In side of ISE developer, they can modify it by their requirements.
+ */
+class CSCLWindowsImpl
+{
+public :
+ CSCLWindowsImpl() {}
+ virtual ~CSCLWindowsImpl() {}
+
+ virtual void init() = 0;
+ virtual void fini() = 0;
+
+ virtual sclwindow create_base_window(const sclwindow parent,
+ SclWindowContext *window_context, scl16 width, scl16 height) = 0;
+ virtual sclwindow create_window(const sclwindow parent,
+ SclWindowContext *window_context, scl16 width, scl16 height) = 0;
+ virtual sclwindow create_magnifier_window(const sclwindow parent,
+ SclWindowContext *window_context, scl16 width, scl16 height) = 0;
+ virtual sclwindow create_dim_window(const sclwindow parent,
+ SclWindowContext *window_context, scl16 width, scl16 height) = 0;
+ virtual bool destroy_window(sclwindow window) = 0;
+ virtual void set_parent(const sclwindow parent, const sclwindow window) = 0;
+ virtual void show_window(const sclwindow window, sclboolean queue) = 0;
+ virtual void set_window_rotation(const sclwindow window, SCLRotation rotation) = 0;
+ virtual void hide_window(const sclwindow window, sclboolean force = FALSE) = 0;
+ virtual void move_window(const sclwindow window, scl16 x, scl16 y) = 0;
+ virtual void move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height) = 0;
+ virtual void resize_window(const sclwindow window, scl16 width, scl16 height) = 0;
+ virtual void update_window(const sclwindow window, scl16 x = 0, scl16 y = 0, scl16 width = 0, scl16 height = 0) = 0;
+ virtual sclboolean get_window_rect(const sclwindow window, SclRectangle *rect) = 0;
+
+ virtual void set_keep_above(const sclwindow window, sclboolean keep_above) = 0;
+
+ virtual void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data) = 0;
+};
+
+class CSCLWindows
+{
+private:
+ CSCLWindows();
+public :
+ virtual ~CSCLWindows();
+
+ static CSCLWindows* get_instance();
+
+ void init();
+ void fini();
+
+ sclwindow open_popup(const SclWindowOpener opener, const SclRectangle& geometry,
+ sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual,
+ sclboolean use_dim_window, sclint img_offset_x = 0, sclint img_offset_y = 0, sclint timeout = 0);
+ bool close_popup(sclwindow window, sclboolean timed_out = FALSE);
+ bool close_all_popups(sclwindow skip_window = SCLWINDOW_INVALID, sclboolean timed_out = FALSE);
+
+ sclwindow create_base_window(const sclwindow parent, scl16 width, scl16 height);
+
+ void show_window(const sclwindow window, sclboolean queue = FALSE);
+ void hide_window(const sclwindow window, sclboolean force = FALSE);
+ void set_parent(const sclwindow parent, const sclwindow window);
+ void set_keep_above(const sclwindow window, sclboolean keep_above);
+
+ void set_window_rotation(const sclwindow window, SCLRotation rotation);
+
+ void move_window(const sclwindow window, scl16 x, scl16 y);
+ void resize_window(const sclwindow window, scl16 width, scl16 height);
+ void move_resize_window(const sclwindow window, scl16 x, scl16 y, scl16 width, scl16 height);
+ void update_window(const sclwindow window, scl16 x = 0, scl16 y = 0, scl16 width = 0, scl16 height = 0);
+ sclboolean get_window_rect(const sclwindow window, SclRectangle *rect);
+ sclwindow get_base_window();
+ sclboolean is_base_window(sclwindow window);
+ sclwindow find_by_etcinfo(void* etc_info);
+ scl8 find_popup_window_index(sclwindow window);
+ //SclWindowContext* get_window_context(sclwindow window, sclboolean geometry_update = FALSE);
+ SclWindowContext* get_window_context(sclwindow window);
+ void set_window_context(sclwindow window, SclWindowContext* context);
+
+ sclwindow create_magnifier_window(const sclwindow parent, scl16 x, scl16 y, scl16 width, scl16 height);
+ sclwindow get_magnifier_window();
+
+ sclwindow get_nth_window_in_Z_order_list(sclbyte index);
+ sclwindow get_nth_popup_window(sclbyte index);
+ sclbyte get_Z_order(sclwindow window);
+
+ sclwindow create_dim_window(const sclwindow parent, SclWindowContext *window_context, scl16 width, scl16 height);
+ sclwindow get_dim_window();
+
+ void set_update_pending(sclboolean pend);
+ sclboolean get_update_pending();
+
+ void set_window_backend_callback(ISCLUIWindowBackendCallback *callback, void *data);
+
+protected :
+ CSCLWindowsImpl* get_scl_windows_impl();
+
+ sclwindow create_window(const SclWindowOpener opener, const SclRectangle &geometry,
+ sclshort inputmode, sclshort layout, SCLPopupType popup_type, sclboolean is_virtual,
+ sclint img_offset_x = 0, sclint img_offset_y = 0, sclint timeout = 0);
+ bool destroy_window(sclwindow window);
+
+ void push_window_in_Z_order_list(sclwindow window);
+ void pop_window_in_Z_order_list(sclwindow window);
+
+private :
+ CSCLWindowsImpl* m_impl;
+ SclWindowContext m_base_window_context;
+ SclWindowContext m_popup_window_context[MAX_POPUP_WINDOW];
+
+ SclWindowContext m_magnifier_window_context;
+ SclWindowContext m_dim_window_context;
+
+ sclboolean m_pending_update;
+ sclboolean m_initialized;
+
+ sclwindow m_Z_order_list[MAX_ZORDER_NUM];
+};
+
+
+} /* End of scl namespace */
+
+#ifdef __cplusplus
+//SCL_END_DECLS
+#endif
+
+#endif //__SCL_WINDOWS_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <string>
+#include <string.h>
+#include <stdio.h>
+#include "string_bin_parser.h"
+using namespace std;
+
+String_Bin_Parser::String_Bin_Parser(const FileStorage& storage, int offset, int size) {
+ m_storage.get_storage(storage, offset, size);
+ parse();
+}
+
+/*delete all strings*/
+String_Bin_Parser::~String_Bin_Parser() {
+ m_vec_str_depository.clear();
+}
+void
+String_Bin_Parser::parse() {
+ /* from the string encoder rule*/
+ static const int MAX_NUM_WIDTH = 4;
+
+ /* get the strings' num*/
+ int size = m_storage.get<sint_t>(MAX_NUM_WIDTH);
+
+ /* get each string */
+ for (int i = 0; i < size; ++i) {
+ const char* temp = m_storage.get_str();
+ m_vec_str_depository.push_back(temp);
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __STRING_BIN_PARSER_H__
+#define __STRING_BIN_PARSER_H__
+#include <string>
+#include <vector>
+#include "file_storage_impl.h"
+class String_Bin_Parser{
+ public:
+ String_Bin_Parser(const FileStorage& storage, int offset, int size);
+ ~String_Bin_Parser();
+ const std::vector<const char*>& get_string_depository()const {
+ return m_vec_str_depository;
+ }
+ private:
+ void parse();
+ std::vector<const char*> m_vec_str_depository;
+ FileStorage m_storage;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __NEW_STRING_COLLECTOR_H__
+#define __NEW_STRING_COLLECTOR_H__
+#include <vector>
+#include "istring_collector.h"
+class StringCollector: public IStringCollector{
+ public:
+ StringCollector() {
+ }
+ void add(char* str) {
+ if (str != NULL) {
+ m_vec_string_collection.push_back(str);
+ }
+ }
+ ~StringCollector() {
+ std::vector<char*>::iterator it;
+ for (it = m_vec_string_collection.begin();
+ it != m_vec_string_collection.end(); ++it) {
+ char* p = *it;
+ if (p) {
+ delete[] p;
+ }
+
+ p = NULL;
+ }
+
+ m_vec_string_collection.clear();
+ }
+
+ private:
+ std::vector<char*> m_vec_string_collection;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __STRING_PROVIDER_H__
+#define __STRING_PROVIDER_H__
+#include <string>
+#include <vector>
+#include "string_bin_parser.h"
+#include "istring_provider.h"
+class String_Provider: public IString_Provider{
+ public:
+ String_Provider(const String_Bin_Parser* sp): m_sp(sp) {}
+ const char* get_string_by_id(int id)const {
+ if (m_sp == NULL) return NULL;
+
+ const std::vector<const char*>& string_depository = m_sp->get_string_depository();
+ if (id >= 0 && id < (int)string_depository.size())
+ return string_depository.at(id);
+
+ return NULL;
+ }
+ private:
+ const String_Bin_Parser *m_sp;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "xml_parser_utils.h"
+#include <string.h>
+#include <assert.h>
+#include <sstream>
+
+using namespace std;
+
+int
+get_content_int(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ int num = -1;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+ if (key!= NULL) {
+ if (0 == strcmp("NOT_USED", (const char*)key)) {
+ num = -1;
+ } else {
+ num = atoi((const char*)key);
+ }
+ xmlFree(key);
+ }
+ return num;
+}
+
+bool
+get_content_bool(const xmlNodePtr cur_node) {
+ assert(cur_node != NULL);
+
+ bool bVal = false;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+
+ if (key != NULL) {
+ if (0 == xmlStrcmp(key, (const xmlChar*)"true")) {
+ bVal = true;
+ }
+ xmlFree(key);
+ }
+ return bVal;
+}
+
+bool
+equal_prop(const xmlNodePtr cur_node, const char* prop, const char* str) {
+ bool val = false;
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)prop);
+
+ if (NULL != key) {
+ if (0 == xmlStrcmp(key, (const xmlChar*)str)) {
+ val = true;
+ }
+ xmlFree(key);
+ }
+
+ return val;
+}
+
+bool
+get_prop_bool(const xmlNodePtr cur_node, const char* prop, sclboolean *ret) {
+ assert(cur_node != NULL);
+
+ bool succeeded = false;
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)prop);
+
+ if (ret && key != NULL) {
+ succeeded = true;
+ if (0 == xmlStrcmp(key, (const xmlChar*)"true")) {
+ *ret = true;
+ } else {
+ *ret = false;
+ }
+ xmlFree(key);
+ }
+
+ return succeeded;
+}
+
+int
+dex_string_to_int(const char* str) {
+ assert(str != NULL);
+
+ int val = -1;
+ stringstream convertor(str);
+
+ convertor >> hex >> val;
+ if (convertor.fail() == true) {
+ val = -1;
+ }
+
+ return val;
+}
+
+int
+get_content_dex_string_int(const xmlNodePtr cur_node) {
+ assert(NULL != cur_node);
+
+ int val = -1;
+
+ xmlChar* key = xmlNodeGetContent(cur_node);
+
+ if (key != NULL) {
+ val = dex_string_to_int((const char*)key);
+ xmlFree(key);
+ }
+
+ return val;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __XML_PARSER_UTILS_H__
+#define __XML_PARSER_UTILS_H__
+#include <assert.h>
+#include <limits.h>
+#include <libxml/parser.h>
+#include "scltypes.h"
+
+using namespace scl;
+
+int get_content_int(const xmlNodePtr cur_node);
+bool get_content_bool(const xmlNodePtr cur_node);
+
+
+bool equal_prop(const xmlNodePtr cur_node, const char* prop, const char* str);
+
+template <class T>
+bool get_prop_number(const xmlNodePtr cur_node, const char* prop, T *ret) {
+ assert(cur_node != NULL);
+
+ bool succeeded = false;
+
+ xmlChar* key = xmlGetProp(cur_node, (const xmlChar*)prop);
+
+ if (ret && key != NULL) {
+ succeeded = true;
+ *ret = (T)atoi((const char*)key);
+ xmlFree(key);
+ }
+
+ return succeeded;
+}
+bool get_prop_bool(const xmlNodePtr cur_node, const char* prop, sclboolean *ret);
+int dex_string_to_int(const char* str);
+int get_content_dex_string_int(const xmlNodePtr cur_node);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <libxml/parser.h>
+#include <assert.h>
+#include <limits.h>
+#include <string.h>
+#include <string>
+#include <vector>
+#include <algorithm>
+#include "xmlresource.h"
+#include "simple_debug.h"
+using namespace std;
+using namespace xmlresource;
+
+string g_entry_filepath;
+
+XMLResource::XMLResource() {
+ m_main_entry_parser = NULL;
+ m_input_mode_configure_parser = NULL;
+ m_layout_parser = NULL;
+ m_modifier_decoration_parser = NULL;
+ m_label_properties_parser = NULL;
+ m_default_configure_parser = NULL;
+ m_autopopup_configure_parser = NULL;
+ m_magnifier_configure_parser = NULL;
+ m_nine_patch_file_list_parser = NULL;
+}
+
+XMLResource::~XMLResource() {
+ m_main_entry_parser = NULL;
+ m_input_mode_configure_parser = NULL;
+ m_layout_parser = NULL;
+ m_modifier_decoration_parser = NULL;
+ m_label_properties_parser = NULL;
+ m_default_configure_parser = NULL;
+ m_autopopup_configure_parser = NULL;
+ m_magnifier_configure_parser = NULL;
+ m_nine_patch_file_list_parser = NULL;
+}
+
+XMLResource*
+XMLResource::get_instance() {
+ static XMLResource instance;
+ return &instance;
+}
+
+static void
+get_layout_files(PSclInputModeConfigure input_mode_table,
+ size_t input_mode_size, vector<string> &vec_file) {
+ vec_file.clear();
+ for (unsigned int mode = 0; mode < input_mode_size; mode++) {
+ SclInputModeConfigure &input_mode = input_mode_table[mode];
+ for (int direct = 0; direct < DISPLAYMODE_MAX; direct++) {
+ char * layout_file_path = input_mode.layouts[direct];
+ if (layout_file_path
+ && 0 != strcmp(layout_file_path, "")) {
+ vec_file.push_back(layout_file_path);
+ }
+ }
+ }
+
+ // quick sort
+ std::sort(vec_file.begin(), vec_file.end());
+ // use std::unique() to puts duplicates to the [last, end)
+ vector<string>::iterator last = std::unique(vec_file.begin(), vec_file.end());
+ // remove the duplicated items, [last, end)
+ vec_file.erase(last, vec_file.end());
+}
+
+void
+XMLResource::init(const char *entry_filepath) {
+ g_entry_filepath = entry_filepath;
+ if (m_main_entry_parser == NULL) {
+ m_main_entry_parser = MainEntryParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), entry_filepath);
+ if (0 != m_main_entry_parser->init(input_file)) {
+ /* main entry is necessary */
+ SCLLOG(SclLog::ERROR, "main entry init");
+ }
+ }
+
+ /* get each type of xml file name */
+ XMLFiles& xml_files = m_main_entry_parser->get_xml_files();
+
+ SCLLOG(SclLog::MESSAGE, "init inputmode configure\n\n");
+ if (m_input_mode_configure_parser == NULL) {
+ m_input_mode_configure_parser = InputModeConfigParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.input_mode_configure);
+ if (0 != m_input_mode_configure_parser->init(input_file)) {
+ /* input mode configure is necessary */
+ SCLLOG(SclLog::ERROR, "input mode configure init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init default_configure\n\n");
+ if (m_default_configure_parser == NULL) {
+ m_default_configure_parser = DefaultConfigParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.default_configure);
+
+ if (0 != m_default_configure_parser->init(input_file)) {
+ /* default configure is not necessary */
+ SCLLOG(SclLog::WARNING, "default configure init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init modifier_decoration\n\n");
+ if (m_modifier_decoration_parser == NULL) {
+ m_modifier_decoration_parser = ModifierDecorationParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.modifier_decoration);
+
+ if (0 != m_modifier_decoration_parser->init(input_file)) {
+ /* modifier decoration is not necessary */
+ SCLLOG(SclLog::WARNING, "modifier decoration init");
+ }
+ }
+ SCLLOG(SclLog::MESSAGE, "init label_properties\n\n");
+ if (m_label_properties_parser == NULL) {
+ m_label_properties_parser = LabelPropertyParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.key_label_property);
+
+ if (0 != m_label_properties_parser->init(input_file)) {
+ /* label properties is not necessary */
+ SCLLOG(SclLog::WARNING, "label properties init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init autopopup_configure\n\n");
+ if (m_autopopup_configure_parser == NULL) {
+ m_autopopup_configure_parser = AutoPopupConfigParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.autopopup_configure);
+ if (0 != m_autopopup_configure_parser->init(input_file)) {
+ /* autopopup configure is not necessary */
+ SCLLOG(SclLog::WARNING, "autopopup configure init");
+ }
+ }
+ SCLLOG(SclLog::MESSAGE, "init magnifier_configure\n\n");
+ if (m_magnifier_configure_parser == NULL) {
+ m_magnifier_configure_parser = MagnifierConfigParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.magnifier_configure);
+
+ if (0 != m_magnifier_configure_parser->init(input_file)) {
+ /* magnifier configure is not necessary */
+ SCLLOG(SclLog::WARNING, "magnifier configure init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init nine_patch_file_list\n\n");
+ if (m_nine_patch_file_list_parser == NULL) {
+ m_nine_patch_file_list_parser = NinePatchFileParser::get_instance();
+ char input_file[_POSIX_PATH_MAX] = {0};
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.nine_patch_file_list);
+
+ if (0 != m_nine_patch_file_list_parser->init(input_file)) {
+ /* nine patch file list is not necessary */
+ SCLLOG(SclLog::WARNING, "nine patch file list init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init layout\n\n");
+ if (m_layout_parser == NULL) {
+ m_layout_parser = LayoutParser::get_instance();
+
+ vector<string> vec_layout_file_name;
+ get_layout_files(
+ m_input_mode_configure_parser->get_input_mode_configure_table(),
+ m_input_mode_configure_parser->get_inputmode_size(),
+ vec_layout_file_name);
+ if ( 0 != m_layout_parser->init(get_resource_directory(),
+ vec_layout_file_name)) {
+ /* layout is necessary */
+ SCLLOG(SclLog::ERROR, "layout init");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "init Text XML resources OK.\n\n");
+}
+
+
+void
+XMLResource::load(int layout_id) {
+ m_layout_parser->load(layout_id);
+}
+
+void
+XMLResource::unload() {
+ m_layout_parser->unload();
+}
+
+bool
+XMLResource::loaded(int layout_id) {
+ return m_layout_parser->loaded(layout_id);
+}
+
+void
+XMLResource::reload() {
+ if (m_main_entry_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), g_entry_filepath.c_str());
+ if (0 != m_main_entry_parser->reload(input_file)) {
+ /* main entry is necessary */
+ SCLLOG(SclLog::ERROR, "main entry reload");
+ }
+
+ /* get each type of xml file name */
+ XMLFiles& xml_files = m_main_entry_parser->get_xml_files();
+
+ if (m_input_mode_configure_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.input_mode_configure);
+ if (0 != m_input_mode_configure_parser->reload(input_file)) {
+ /* input mode configure is necessary */
+ SCLLOG(SclLog::ERROR, "input mode configure reload");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "reload default_configure\n\n");
+ if (m_default_configure_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.default_configure);
+
+ if (0 != m_default_configure_parser->reload(input_file)) {
+ /* default configure is not necessary */
+ SCLLOG(SclLog::WARNING, "default configure reload");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "reload modifier_decoration\n\n");
+ if (m_modifier_decoration_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.modifier_decoration);
+
+ if (0 != m_modifier_decoration_parser->reload(input_file)) {
+ /* modifier decoration is not necessary */
+ SCLLOG(SclLog::WARNING, "modifier decoration reload");
+ }
+ }
+ SCLLOG(SclLog::MESSAGE, "reload label_properties\n\n");
+ if (m_label_properties_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.key_label_property);
+
+ if (0 != m_label_properties_parser->reload(input_file)) {
+ /* label properties is not necessary */
+ SCLLOG(SclLog::WARNING, "label properties reload");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "reload autopopup_configure\n\n");
+ if (m_autopopup_configure_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.autopopup_configure);
+ if (0 != m_autopopup_configure_parser->reload(input_file)) {
+ /* autopopup configure is not necessary */
+ SCLLOG(SclLog::WARNING, "autopopup configure reload");
+ }
+ }
+ SCLLOG(SclLog::MESSAGE, "reload magnifier_configure\n\n");
+ if (m_magnifier_configure_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.magnifier_configure);
+
+ if (0 != m_magnifier_configure_parser->reload(input_file)) {
+ /* magnifier configure is not necessary */
+ SCLLOG(SclLog::WARNING, "magnifier configure reload");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "reload nine_patch_file_list\n\n");
+ if (m_nine_patch_file_list_parser) {
+ char input_file[_POSIX_PATH_MAX] = { 0 };
+ snprintf(input_file, _POSIX_PATH_MAX, "%s/%s", get_resource_directory(), xml_files.nine_patch_file_list);
+
+ if (0 != m_nine_patch_file_list_parser->reload(input_file)) {
+ /* nine patch file list is not necessary */
+ SCLLOG(SclLog::WARNING, "nine patch file list reload");
+ }
+ }
+
+ SCLLOG(SclLog::MESSAGE, "reload layout\n\n");
+ if (m_layout_parser && m_input_mode_configure_parser) {
+ vector<string> vec_layout_file_name;
+ get_layout_files(
+ m_input_mode_configure_parser->get_input_mode_configure_table(),
+ m_input_mode_configure_parser->get_inputmode_size(),
+ vec_layout_file_name);
+ if (0 != m_layout_parser->reload(get_resource_directory(),
+ vec_layout_file_name)) {
+ /* layout is necessary */
+ SCLLOG(SclLog::ERROR, "layout init");
+ }
+ }
+ }
+}
+
+SclNinePatchInfo*
+XMLResource::get_nine_patch_list() {
+ return m_nine_patch_file_list_parser->get_nine_patch_list();
+}
+
+int
+XMLResource::get_labelproperty_size() {
+ return m_label_properties_parser->get_size();
+}
+
+bool
+XMLResource::get_nine_patch_info(const char *filename, SclNinePatchInfo *info) {
+ return m_nine_patch_file_list_parser->get_nine_patch_info(filename, info);
+}
+
+int
+XMLResource::get_inputmode_id(const char *name) {
+ return m_input_mode_configure_parser->get_inputmode_id(name);
+}
+
+const char*
+XMLResource::get_inputmode_name(int id) {
+ return m_input_mode_configure_parser->get_inputmode_name(id);
+}
+
+int
+XMLResource::get_inputmode_size() {
+ return m_input_mode_configure_parser->get_inputmode_size();
+}
+
+PSclInputModeConfigure
+XMLResource::get_input_mode_configure_table() {
+ return m_input_mode_configure_parser->get_input_mode_configure_table();
+}
+
+int
+XMLResource::get_layout_id(const char *name) {
+ return m_layout_parser->get_layout_index(name);
+}
+
+int
+XMLResource::get_layout_size() {
+ return m_layout_parser->get_layout_size();
+}
+
+int
+XMLResource::get_modifier_decoration_id(const char *name) {
+ return m_modifier_decoration_parser->get_modifier_decoration_id(name);
+}
+
+PSclLayout
+XMLResource::get_layout_table() {
+ return m_layout_parser->get_layout_table();
+}
+
+PSclLayoutKeyCoordinatePointerTable
+XMLResource::get_key_coordinate_pointer_frame() {
+ return m_layout_parser->get_key_coordinate_pointer_frame();
+}
+
+PSclModifierDecoration
+XMLResource::get_modifier_decoration_table() {
+ return m_modifier_decoration_parser->get_modifier_decoration_table();
+}
+
+PSclLabelPropertiesTable
+XMLResource::get_label_properties_frame() {
+ return m_label_properties_parser->get_label_properties_frame();
+}
+
+PSclDefaultConfigure
+XMLResource::get_default_configure() {
+ return m_default_configure_parser->get_default_configure();
+}
+
+PSclAutoPopupConfigure
+XMLResource::get_autopopup_configure() {
+ return m_autopopup_configure_parser->get_autopopup_configure();
+}
+
+PSclMagnifierWndConfigure
+XMLResource::get_magnifier_configure() {
+ return m_magnifier_configure_parser->get_magnifier_configure();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __XMLRESOURCE__
+#define __XMLRESOURCE__
+
+#include "main_entry_parser.h"
+#include "input_mode_configure_parser.h"
+#include "layout_parser.h"
+#include "modifier_decoration_parser.h"
+#include "label_properties_parser.h"
+#include "default_configure_parser.h"
+#include "autopopup_configure_parser.h"
+#include "magnifier_configure_parser.h"
+#include "nine_patch_file_list_parser.h"
+#include "sclres.h"
+
+namespace xmlresource {
+class XMLResource: public sclres::SclRes{
+ public:
+ ~XMLResource();
+ static XMLResource* get_instance();
+ void init(const char *entry_filepath);
+ void reload();
+
+ /* These functions are for dynamic (lazy) loading layouts */
+ void load(int layout_id);
+ void unload();
+ bool loaded(int layout_id);
+
+ public:
+ PSclInputModeConfigure get_input_mode_configure_table();
+ PSclLayout get_layout_table();
+ PSclLayoutKeyCoordinatePointerTable get_key_coordinate_pointer_frame();
+ PSclModifierDecoration get_modifier_decoration_table();
+ PSclLabelPropertiesTable get_label_properties_frame();
+ PSclDefaultConfigure get_default_configure();
+ PSclAutoPopupConfigure get_autopopup_configure();
+ PSclMagnifierWndConfigure get_magnifier_configure();
+ SclNinePatchInfo* get_nine_patch_list();
+ int get_inputmode_id(const char *name);
+ const char* get_inputmode_name(int id);
+ int get_inputmode_size();
+ int get_layout_id(const char* name);
+ int get_layout_size();
+ int get_labelproperty_size();
+ int get_modifier_decoration_id(const char *name);
+ bool get_nine_patch_info(const char *filename, SclNinePatchInfo *info);
+
+ const char* get_name() {
+ return "xmlparser";
+ }
+
+ private:
+ XMLResource();
+
+ private:
+ MainEntryParser *m_main_entry_parser;
+ InputModeConfigParser *m_input_mode_configure_parser;
+ LayoutParser *m_layout_parser;
+ ModifierDecorationParser *m_modifier_decoration_parser;
+ LabelPropertyParser *m_label_properties_parser;
+ DefaultConfigParser *m_default_configure_parser;
+ AutoPopupConfigParser *m_autopopup_configure_parser;
+ MagnifierConfigParser *m_magnifier_configure_parser;
+ NinePatchFileParser *m_nine_patch_file_list_parser;
+};
+}
+
+#endif
+
--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(xml2binary CXX)
+
+SET(SRCS
+ ../xmlresource/autopopup_configure_parser.cpp
+ ../xmlresource/default_configure_parser.cpp
+ ../xmlresource/input_mode_configure_parser.cpp
+ ../xmlresource/label_properties_parser.cpp
+ ../xmlresource/layout_parser.cpp
+ ../xmlresource/layout_parser_helper.cpp
+ ../xmlresource/magnifier_configure_parser.cpp
+ ../xmlresource/main_entry_parser.cpp
+ ../xmlresource/modifier_decoration_parser.cpp
+ ../xmlresource/nine_patch_file_list_parser.cpp
+ ../xmlresource/xml_parser_utils.cpp
+ ../xmlresource/xmlresource.cpp
+ encode_metadata.cpp
+ encode_input_mode_configure.cpp
+ encode_layout.cpp
+ encode_key_coordinate_frame.cpp
+ encode_label_properties_frame.cpp
+ encode_default_configure.cpp
+ encode_autopopup_configure.cpp
+ encode_magnifier_configure.cpp
+ encode_modifier_decoration.cpp
+ encode_nine_patch.cpp
+ metadata_handler.cpp
+ xml2dat.cpp
+ ../sclres/sclres.cpp
+ ../res/simple_debug.cpp
+)
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(BINDIR "${PREFIX}/bin")
+SET(METADATADIR "${PREFIX}/share/libscl-ui")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF()
+MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/xml2binary/include
+ ${CMAKE_SOURCE_DIR}/xmlresource/include
+ ${CMAKE_SOURCE_DIR}/scl/include
+ ${CMAKE_SOURCE_DIR}/res
+ ${CMAKE_SOURCE_DIR}/sclres )
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ elementary
+ libxml-2.0
+ glib-2.0
+ dlog
+ )
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -fpie -Wall")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -g")
+
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS})
+
+set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/metadata.xml DESTINATION ${METADATADIR})
--- /dev/null
+#!/usr/bin/python
+
+from xml.dom import minidom
+import shutil, os
+
+def write_note(output):
+ output.writelines("/*This file is generated by auto_codes.py.*/\n\n")
+
+def get_record_width_struct_name(record_name):
+ return (record_name + "_width").capitalize()
+
+def get_metadata(filename='metadata.xml'):
+ doc = minidom.parse(filename)
+ root = doc.documentElement
+
+ record_nodes = root.getElementsByTagName('record')
+ record_list = []
+ for record_node in record_nodes:
+ record_name = record_node.getAttribute('name')
+ fields_node = record_node.getElementsByTagName('field')
+
+ field_list = []
+ for field_node in fields_node:
+ field_name = field_node.getAttribute('name')
+ field_type = field_node.getAttribute('type')
+ field_data = {"name":field_name, "type":field_type}
+ field_list.append(field_data)
+ record_data = {"name":record_name, "field_list":field_list}
+ record_list.append(record_data);
+ return record_list
+
+def gen_auto_metadata_h(record_list):
+ output = open('_auto_metadata.h', 'w')
+ write_note(output)
+ codes_list = []
+ codes_list.append('#ifndef __AUTO_METADATA_H__\n')
+ codes_list.append('#define __AUTO_METADATA_H__\n\n')
+
+ codes_list.append('#include <memory.h>\n')
+ for record_data in record_list:
+ struct_name = get_record_width_struct_name(record_data['name'])
+
+ codes_list.append("typedef struct _" + struct_name + " {\n")
+ field_list = record_data['field_list']
+ for field_data in field_list:
+ codes_list.append("\tint " + field_data['name'] + ";\n")
+
+
+ codes_list.append("}" + struct_name + ";");
+ codes_list.append("\n\n")
+
+ for record_data in record_list:
+ function_name = "set_" + record_data['name'] + "_width"
+ struct_name = get_record_width_struct_name(record_data['name'])
+ parameter = "T& md_helper,\n\t";
+ parameter += struct_name + " & " + "record_width"
+ codes_list.append("template <class T>\n")
+ codes_list.append("void " + function_name + "(" + parameter + ") {\n")
+ codes_list.append("\tmd_helper.set_current_metadata_record(\"" + record_data['name'] + "\");\n")
+ codes_list.append("\tmemset(&record_width, 0x00, sizeof("+ struct_name +"));\n")
+ codes_list.append("\n")
+
+ field_list = record_data['field_list']
+ for field_data in field_list:
+ codes_list.append("\trecord_width." + field_data['name'] + " = md_helper.get_width(\"" + field_data['name'] + "\");\n")
+ codes_list.append('}\n\n')
+
+ codes_list.append("\n")
+ codes_list.append('#endif //End __AUTO_METADATA_H__\n')
+ output.writelines(codes_list)
+ output.close()
+
+record_list = get_metadata()
+gen_auto_metadata_h(record_list)
+shutil.copyfile('_auto_metadata.h', '../include/_auto_metadata.h')
+shutil.copyfile('_auto_metadata.h', '../../binary_xmlresource/include/_auto_metadata.h')
+os.remove('_auto_metadata.h')
+
+print '\n'
+print '----MESSAGE-----\n'
+print '_auto_metadata.h is generated in ../include/_auto_metadata.h successfully\n'
+print '_auto_metadata.h is generated in ../../binary_xmlresource/include/_auto_metadata.h successfully\n'
--- /dev/null
+<!--Example of metadata.xml -->
+<!-- 1. the order of the field list in record is not sensitive -->
+
+<metadata version = "0.1">
+<metadata_type>
+ <type name = "string_id" width = "2"/>
+</metadata_type>
+<record name = "input_mode_configure">
+ <field name = "name" type = "string_id" />
+ <field name = "layout_portrait" type = "string_id" />
+ <field name = "layout_landscape" type = "string_id" />
+ <field name = "use_virtual_window" type = "int8" />
+ <field name = "use_dim_window" type = "int8" />
+ <field name = "timeout" type = "int32" />
+</record>
+<record name = "layout">
+ <field name = "name" type = "string_id"/>
+ <field name = "display_mode" type = "int8"/>
+ <field name = "style" type = "int8"/>
+ <field name = "width" type = "int16"/>
+ <field name = "height" type = "int16"/>
+ <field name = "use_sw_button" type = "int8"/>
+ <field name = "use_magnifier_window" type = "int8"/>
+ <field name = "extract_background" type = "int8"/>
+ <field name = "key_width" type = "int16"/>
+ <field name = "key_height" type = "int16"/>
+ <field name = "key_spacing" type = "int16"/>
+ <field name = "row_spacing" type = "int16"/>
+ <field name = "use_sw_background" type = "int8"/>
+ <field name = "bg_color" type = "int8"/>
+ <field name = "bg_line_width" type = "float32"/>
+ <field name = "bg_line_color" type = "int8"/>
+ <field name = "add_grab_left" type = "int16"/>
+ <field name = "add_grab_right" type = "int16"/>
+ <field name = "add_grab_top" type = "int16"/>
+ <field name = "add_grab_bottom" type = "int16"/>
+ <field name = "image_path" type = "string_id"/>
+ <field name = "key_background_image" type = "string_id"/>
+ <field name = "sound_style" type = "string_id"/>
+ <field name = "vibe_style" type = "string_id"/>
+ <field name = "label_type" type = "string_id"/>
+ <field name = "modifier_decorator" type = "string_id"/>
+</record>
+<record name = "key_coordinate_record">
+ <field name = "x" type = "int16"/>
+ <field name = "y" type = "int16"/>
+ <field name = "width" type = "int16"/>
+ <field name = "height" type = "int16"/>
+ <field name = "add_hit_left" type = "int16"/>
+ <field name = "add_hit_right" type = "int16"/>
+ <field name = "add_hit_top" type = "int16"/>
+ <field name = "add_hit_bottom" type = "int16"/>
+ <field name = "popup_relative_x" type = "int16"/>
+ <field name = "popup_relative_y" type = "int16"/>
+ <field name = "extract_offset_x" type = "int16"/>
+ <field name = "extract_offset_y" type = "int16"/>
+ <field name = "sub_layout" type = "string_id"/>
+ <field name = "magnifier_offset_x" type = "int16"/>
+ <field name = "magnifier_offset_y" type = "int16"/>
+ <field name = "custom_id" type = "string_id"/>
+ <field name = "button_type" type = "int8"/>
+ <field name = "key_type" type = "int8"/>
+ <field name = "popup_type" type = "int8"/>
+ <field name = "use_magnifier" type = "int8"/>
+ <field name = "use_long_key_magnifier" type = "int8"/>
+ <field name = "popup_input_mode" type = "string_id"/>
+ <field name = "sound_style" type = "string_id"/>
+ <field name = "vibe_style" type = "string_id"/>
+ <field name = "is_side_button" type = "int8"/>
+ <field name = "label_count" type = "int16"/>
+ <field name = "label" type = "int16"/>
+ <field name = "label_type" type = "int16"/>
+ <field name = "image_label_path" type = "int16"/>
+ <field name = "image_label_type" type = "int16"/>
+ <field name = "bg_image_path" type = "int16"/>
+ <field name = "key_value_count" type = "int16"/>
+ <field name = "key_value" type = "int16"/>
+ <field name = "key_event" type = "int32"/>
+ <field name = "long_key_type" type = "int8"/>
+ <field name = "long_key_value" type = "int16"/>
+ <field name = "long_key_event" type = "int32"/>
+ <field name = "use_repeat_key" type = "int8"/>
+ <field name = "autopopup_key_labels" type = "string_id"/>
+ <field name = "autopopup_key_values" type = "string_id"/>
+ <field name = "autopopup_key_events" type = "int32"/>
+ <field name = "dont_close_popup" type = "int8"/>
+ <field name = "extra_option" type = "int8"/>
+ <field name = "multitouch_type" type = "int8"/>
+ <field name = "modifier_decorator" type = "string_id"/>
+ <field name = "magnifier_label" type = "string_id"/>
+</record>
+<record name = "label_properties_record">
+ <field name = "label_type" type = "int16"/>
+ <field name = "font_name" type = "int16"/>
+ <field name = "font_size" type = "int16"/>
+ <field name = "font_color" type = "int8"/>
+ <field name = "alignment" type = "int8"/>
+ <field name = "padding_x" type = "int16"/>
+ <field name = "padding_y" type = "int16"/>
+ <field name = "inner_width" type = "int16"/>
+ <field name = "inner_height" type = "int16"/>
+ <field name = "shadow_distance" type = "int16"/>
+ <field name = "shadow_direction" type = "int8"/>
+ <field name = "shadow_color" type = "int8"/>
+</record>
+<record name = "default_configure">
+ <field name = "display_mode" type = "int8"/>
+ <field name = "input_mode" type = "string_id"/>
+ <field name = "image_file_base_path" type = "string_id"/>
+ <field name = "target_screen_width" type = "int16"/>
+ <field name = "target_screen_height" type = "int16"/>
+ <field name = "auto_detect_landscape" type = "int8"/>
+ <field name = "use_magnifier_window" type = "int8"/>
+ <field name = "use_auto_popup" type = "int8"/>
+ <field name = "use_zoom_window" type = "int8"/>
+ <field name = "on_error_noti_send" type = "int8"/>
+ <field name = "use_word_deletion" type = "int8"/>
+ <field name = "sw_button_style" type = "int8"/>
+ <field name = "touch_offset_level" type = "int16"/>
+ <field name = "touch_offset" type = "int16"/>
+ <field name = "default_sub_layout" type = "string_id"/>
+ <field name = "use_actual_dim_window" type = "int8"/>
+ <field name = "dim_color" type = "int8"/>
+</record>
+<record name = "magnifier_configure">
+ <field name = "style" type = "int8"/>
+ <field name = "width" type = "int16"/>
+ <field name = "height" type = "int16"/>
+ <field name = "label_area_rect" type = "int16"/>
+ <field name = "bg_image_path" type = "string_id"/>
+ <field name = "bg_shift_image_path" type = "string_id"/>
+ <field name = "bg_shift_lock_image_path" type = "string_id"/>
+ <field name = "bg_long_key_image_path" type = "string_id"/>
+ <field name = "use_actual_window" type = "int8"/>
+ <field name = "label_type" type = "string_id"/>
+ <field name = "padding_x" type = "int16"/>
+ <field name = "padding_y" type = "int16"/>
+ <field name = "show_shift_label" type = "int8"/>
+</record>
+<record name = "autopopup_configure">
+ <field name = "bg_image_path" type = "string_id"/>
+ <field name = "bg_color" type = "int8"/>
+ <field name = "bg_line_width" type = "float32"/>
+ <field name = "bg_line_color" type = "int8"/>
+ <field name = "bg_padding" type = "int8"/>
+ <field name = "button_image_path" type = "string_id"/>
+ <field name = "sw_button_style" type = "int8"/>
+ <field name = "button_width" type = "int16"/>
+ <field name = "button_height" type = "int16"/>
+ <field name = "button_spacing" type = "int8"/>
+ <field name = "label_type" type = "string_id"/>
+ <field name = "decoration_image_path" type = "string_id"/>
+ <field name = "decoration_size" type = "int8"/>
+ <field name = "max_column" type = "int8"/>
+ <field name = "add_grab_left" type = "int16"/>
+ <field name = "add_grab_right" type = "int16"/>
+ <field name = "add_grab_top" type = "int16"/>
+ <field name = "add_grab_bottom" type = "int16"/>
+</record>
+<record name = "modifier_decoration">
+ <field name = "extract_background" type = "int8"/>
+ <field name = "name" type = "string_id"/>
+ <field name = "bg_image_path" type = "string_id"/>
+</record>
+<record name = "nine_patch">
+ <field name = "image_path" type = "string_id"/>
+ <field name = "left" type = "int16" />
+ <field name = "right" type = "int16" />
+ <field name = "top" type = "int16" />
+ <field name = "bottom" type = "int16" />
+</record>
+</metadata>
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_autopopup_configure.h"
+#include "xmlresource.h"
+#include "resource_storage_impl.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace xmlresource;
+static void _encode_color(ResourceStorage& storage, const SclColor& color, int width) {
+ if (width <= 0) return;
+
+ storage.put<sint_t>(color.r, width);
+ storage.put<sint_t>(color.g, width);
+ storage.put<sint_t>(color.b, width);
+ storage.put<sint_t>(color.a, width);
+}
+static void
+encode_autopopup_configure_record(ResourceStorage& storage, const PSclAutoPopupConfigure cur, const Autopopup_configure_width& record_width) {
+ //bg_image_path
+ storage.encode_string(cur->bg_image_path, record_width.bg_image_path);
+
+ //bg_color
+ _encode_color(storage, cur->bg_color, record_width.bg_color);
+
+ //double value
+ storage.put<float_t>(cur->bg_line_width, record_width.bg_line_width);
+
+ //bg_line_color
+ _encode_color(storage, cur->bg_line_color, record_width.bg_line_color);
+
+ //bg_padding
+ storage.put<sint_t>(cur->bg_padding, record_width.bg_padding);
+
+ //button_image_path
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ storage.encode_string(cur->button_image_path[i], record_width.button_image_path);
+ }
+
+ //sw_button_style
+ storage.put<sint_t>(cur->sw_button_style, record_width.sw_button_style);
+
+ //button_width
+ storage.put<sint_t>(cur->button_width, record_width.button_width);
+
+ //button_height
+ storage.put<sint_t>(cur->button_height, record_width.button_height);
+
+ //button_spacing
+ storage.put<sint_t>(cur->button_spacing, record_width.button_spacing);
+
+ storage.encode_string(cur->label_type, record_width.label_type);
+
+ for (int i = 0; i < MAX_WND_DECORATOR; ++i) {
+ storage.encode_string(cur->decoration_image_path[i], record_width.decoration_image_path);
+ }
+
+ //decoration_size
+ storage.put<sint_t>(cur->decoration_size, record_width.decoration_size);
+
+ //max_column
+ storage.put<sint_t>(cur->max_column, record_width.max_column);
+
+ //add_grab_left
+ storage.put<sint_t>(cur->add_grab_left, record_width.add_grab_left);
+
+ //add_grab_right
+ storage.put<sint_t>(cur->add_grab_right, record_width.add_grab_right);
+
+ //add_grab_top
+ storage.put<sint_t>(cur->add_grab_top, record_width.add_grab_top);
+
+ //add_grab_bottom
+ storage.put<sint_t>(cur->add_grab_bottom, record_width.add_grab_bottom);
+}
+
+int
+encode_autopopup_configure_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclAutoPopupConfigure autopopupConfigure = xmlresource->get_autopopup_configure();
+
+#ifdef __SCL_TXT_DEBUG
+ put_autopopup_configure(ENCODE, *autopopupConfigure);
+
+#endif
+
+ Autopopup_configure_width record_width;
+ set_autopopup_configure_width(md_helper, record_width);
+
+ storage.reserve(8);
+
+ encode_autopopup_configure_record(storage, autopopupConfigure, record_width);
+
+ int size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(size, 8, init_size);
+
+ return storage.get_size();
+}
+
+int
+encode_autopopup_configure_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+ ResourceStorage storage;
+ encode_autopopup_configure_file(storage, md_helper);
+ storage.toFile(file);
+ return storage.get_size();
+}
+int
+encode_autopopup_configure_file(const char* file, int &offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+ ResourceStorage storage;
+ encode_autopopup_configure_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_default_configure.h"
+#include "xmlresource.h"
+#include "resource_storage_impl.h"
+using namespace xmlresource;
+
+#include "put_record.h"
+#include "_auto_metadata.h"
+static void _encode_color(ResourceStorage& storage, const SclColor& color, int width) {
+ if (width <= 0) return;
+
+ storage.put<sint_t>(color.r, width);
+ storage.put<sint_t>(color.g, width);
+ storage.put<sint_t>(color.b, width);
+ storage.put<sint_t>(color.a, width);
+}
+static void
+encode_default_configure_record(ResourceStorage& storage, const PSclDefaultConfigure cur, const Default_configure_width& record_width) {
+ //display_mode
+ storage.put<sint_t>((int)cur->display_mode, record_width.display_mode);
+
+ //input_mode
+ storage.encode_string(cur->input_mode, record_width.input_mode);
+
+ //image_file_base_path
+ storage.encode_string(cur->image_file_base_path, record_width.image_file_base_path);
+
+ //target_screen_width
+ storage.put<sint_t>(cur->target_screen_width, record_width.target_screen_width);
+
+ //target_screen_height
+ storage.put<sint_t>(cur->target_screen_height, record_width.target_screen_height);
+
+ //auto_detect_landscape
+ storage.put<sint_t>(cur->auto_detect_landscape, record_width.auto_detect_landscape);
+
+ //use_magnifier_window
+ storage.put<sint_t>(cur->use_magnifier_window, record_width.use_magnifier_window);
+
+ //use_auto_popup
+ storage.put<sint_t>(cur->use_auto_popup, record_width.use_auto_popup);
+
+ //use_zoom_window
+ storage.put<sint_t>(cur->use_zoom_window, record_width.use_zoom_window);
+
+ //on_error_noti_send
+ storage.put<sint_t>(cur->on_error_noti_send, record_width.on_error_noti_send);
+
+ //use_word_deletion
+ storage.put<sint_t>(cur->use_word_deletion, record_width.use_word_deletion);
+
+ //sw_button_style
+ storage.put<sint_t>(cur->sw_button_style, record_width.sw_button_style);
+
+ //touch_offset_level
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ storage.put<sint_t>((int)cur->touch_offset_level[i], record_width.touch_offset_level);
+ }
+
+ //touch_offset
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ storage.put<sint_t>((int)cur->touch_offset[i].x, record_width.touch_offset);
+ storage.put<sint_t>((int)cur->touch_offset[i].y, record_width.touch_offset);
+ }
+
+ //default_sub_layout
+ storage.encode_string(cur->default_sub_layout, record_width.default_sub_layout);
+
+ //use_actual_dim_window
+ storage.put<sint_t>(cur->use_actual_dim_window, record_width.use_actual_dim_window);
+
+ //dim_color
+ _encode_color(storage, cur->dim_color, record_width.dim_color);
+}
+
+int
+encode_default_configure_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclDefaultConfigure defaultConfigure = xmlresource->get_default_configure();
+
+#ifdef __SCL_TXT_DEBUG
+ put_default_configure(ENCODE, *defaultConfigure);
+
+#endif
+ Default_configure_width record_width;
+ set_default_configure_width(md_helper, record_width);
+
+ storage.reserve(8);
+ encode_default_configure_record(storage, defaultConfigure, record_width);
+
+ int size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(size, 8, init_size);
+ return storage.get_size();
+}
+
+int
+encode_default_configure_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_default_configure_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
+
+int
+encode_default_configure_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_default_configure_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "resource_storage_impl.h"
+#include "encode_input_mode_configure.h"
+#include <string>
+#include <libxml/parser.h>
+#include "xmlresource.h"
+#include "imetadata_helper.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace std;
+using namespace xmlresource;
+
+static void
+encode_input_mode_configure_record(ResourceStorage& storage, const PSclInputModeConfigure cur, const Input_mode_configure_width& record_width) {
+ //name
+ storage.encode_string(cur->name, record_width.name);
+ //layout_portrait
+ storage.encode_string(cur->layouts[0], record_width.layout_portrait);
+ //layout_landscape
+ storage.encode_string(cur->layouts[1], record_width.layout_landscape);
+ //use_virtual_window
+ storage.put<sint_t>(cur->use_virtual_window, record_width.use_virtual_window);
+ //use_dim_window
+ storage.put<sint_t>(cur->use_dim_window, record_width.use_dim_window);
+ //timeout
+ storage.put<sint_t>(cur->timeout, record_width.timeout);
+}
+
+int encode_input_mode_configure_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+ /*size 4bytes*/
+ const int INPUT_MODE_CONFIGURE_SIZE_WIDTH = 4;
+
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclInputModeConfigure inputModeConfigureTable = xmlresource->get_input_mode_configure_table();
+ int size = xmlresource->get_inputmode_size();
+#ifdef __SCL_TXT_DEBUG
+ put_input_mode_configure_table(ENCODE, inputModeConfigureTable);
+
+#endif
+ PSclInputModeConfigure cur = inputModeConfigureTable;
+
+ //first 8 byte is the size of the block
+ storage.reserve(8);
+ storage.put<sint_t>(size, INPUT_MODE_CONFIGURE_SIZE_WIDTH);
+
+ Input_mode_configure_width record_width;
+ set_input_mode_configure_width(md_helper, record_width);
+ for ( int i = 0; i < size; ++i ) {
+ encode_input_mode_configure_record(storage, cur, record_width);
+ cur++;
+ }
+
+ int advance_size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(advance_size, 8, init_size);
+ return storage.get_size();
+}
+
+int encode_input_mode_configure_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_input_mode_configure_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
+
+int encode_input_mode_configure_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_input_mode_configure_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "resource_storage_impl.h"
+#include "encode_key_coordinate_frame.h"
+#include <string>
+#include "xmlresource.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace xmlresource;
+using namespace std;
+static void
+encode_key_coordinate_record(ResourceStorage& storage, const PSclLayoutKeyCoordinate cur, const Key_coordinate_record_width& record_width) {
+ if (cur == NULL) return;
+
+ //x
+ storage.put<sint_t>(cur->x, record_width.x);
+
+ //y
+ storage.put<sint_t>(cur->y, record_width.y);
+
+ //width
+ storage.put<sint_t>(cur->width, record_width.width);
+
+ //height
+ storage.put<sint_t>(cur->height, record_width.height);
+
+ //add_hit_left
+ storage.put<sint_t>(cur->add_hit_left, record_width.add_hit_left);
+
+ //add_hit_right
+ storage.put<sint_t>(cur->add_hit_right, record_width.add_hit_right);
+
+ //add_hit_top
+ storage.put<sint_t>(cur->add_hit_top, record_width.add_hit_top);
+
+ //add_hit_bottom
+ storage.put<sint_t>(cur->add_hit_bottom, record_width.add_hit_bottom);
+
+ //popup_relative_x
+ storage.put<sint_t>(cur->popup_relative_x, record_width.popup_relative_x);
+
+ //popup_relative_y
+ storage.put<sint_t>(cur->popup_relative_y, record_width.popup_relative_y);
+
+ //extract_offset_x
+ storage.put<sint_t>(cur->extract_offset_x, record_width.extract_offset_x);
+
+ //extract_offset_y
+ storage.put<sint_t>(cur->extract_offset_y, record_width.extract_offset_y);
+
+ storage.encode_string(cur->sub_layout, record_width.sub_layout);
+
+ //magnifier_offset_x
+ storage.put<sint_t>(cur->magnifier_offset_x, record_width.magnifier_offset_x);
+
+ //magnifier_offset_y
+ storage.put<sint_t>(cur->magnifier_offset_y, record_width.magnifier_offset_y);
+
+ storage.encode_string(cur->custom_id, record_width.custom_id);
+
+ //button_type
+ storage.put<sint_t>(cur->button_type, record_width.button_type);
+
+ //key_type
+ storage.put<sint_t>(cur->key_type, record_width.key_type);
+
+ //popup_type
+ storage.put<sint_t>(cur->popup_type, record_width.popup_type);
+
+ storage.put<sint_t>(cur->use_magnifier, record_width.use_magnifier);
+ storage.put<sint_t>(cur->use_long_key_magnifier, record_width.use_long_key_magnifier);
+
+ //popup_input_mode
+ for (int i = 0; i < SCL_DRAG_STATE_MAX; ++i) {
+ storage.encode_string(cur->popup_input_mode[i], record_width.popup_input_mode);
+ }
+
+ storage.encode_string(cur->sound_style, record_width.sound_style);
+ storage.encode_string(cur->vibe_style, record_width.vibe_style);
+ storage.put<sint_t>(cur->is_side_button, record_width.is_side_button);
+
+ //label_count
+ storage.put<sint_t>(cur->label_count, record_width.label_count);
+
+ //label
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ storage.encode_string(cur->label[i][j], record_width.label);
+ }
+ }
+
+ storage.encode_string(cur->label_type, record_width.label_type);
+
+ //label_image_path
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ storage.encode_string(cur->image_label_path[i][j], record_width.image_label_path);
+ }
+ }
+
+ storage.encode_string(cur->image_label_type, record_width.image_label_type);
+
+ //bg_image_path
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ storage.encode_string(cur->bg_image_path[i][j], record_width.bg_image_path);
+ }
+ }
+
+ //key_value_count
+ storage.put<sint_t>(cur->key_value_count, record_width.key_value_count);
+
+ //key_value
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ storage.encode_string(cur->key_value[i][j], record_width.key_value);
+ }
+ }
+ //key_event
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ storage.put<sint_t>(cur->key_event[i][j], record_width.key_event);
+ }
+ }
+
+ storage.put<sint_t>(cur->long_key_type, record_width.long_key_type);
+
+ //long_key_value
+ storage.encode_string(cur->long_key_value, record_width.long_key_value);
+
+ //long_key_event
+ storage.put<sint_t>(cur->long_key_event, record_width.long_key_event);
+
+ storage.put<sint_t>(cur->use_repeat_key, record_width.use_repeat_key);
+
+ //autopopup_keys
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_AUTOPOPUP_STRING; ++j) {
+ storage.encode_string(cur->autopopup_key_labels[i][j], record_width.autopopup_key_labels);
+ storage.encode_string(cur->autopopup_key_values[i][j], record_width.autopopup_key_values);
+ storage.put<sint_t>(cur->autopopup_key_events[i][j], record_width.autopopup_key_events);
+ }
+ }
+
+ storage.put<sint_t>(cur->dont_close_popup, record_width.dont_close_popup);
+
+ //extra_option
+ storage.put<sint_t>(cur->extra_option, record_width.extra_option);
+
+ //multitouch_type
+ storage.put<sint_t>(cur->multitouch_type, record_width.multitouch_type);
+
+ //modifier_decorator
+ storage.encode_string(cur->modifier_decorator, record_width.modifier_decorator);
+
+ //magnifier_label
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_LABEL_FOR_ONE; ++j) {
+ storage.encode_string(cur->magnifier_label[i][j], record_width.magnifier_label);
+ }
+ }
+
+ // hint_string
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < MAX_SIZE_OF_MULTITAP_CHAR; ++j) {
+ storage.encode_string(cur->hint_string[i][j], record_width.hint_string);
+ }
+ }
+}
+
+int get_layout_num(const PSclLayoutKeyCoordinatePointerTable keyCoordinatePointerFrame) {
+ assert(keyCoordinatePointerFrame != NULL);
+ int layout_num = MAX_SCL_LAYOUT;
+ for ( int i = 0; i < MAX_SCL_LAYOUT; ++i ) {
+ // NULL is the end flag
+ if (keyCoordinatePointerFrame[i][0] == NULL) {
+ layout_num = i;
+ break;
+ }
+ }
+
+ return layout_num;
+}
+
+int get_key_num(const PSclLayoutKeyCoordinatePointerTable keyCoordinatePointerFrame, const int layout_no) {
+ assert(keyCoordinatePointerFrame != NULL);
+ int key_num = MAX_KEY;
+
+ SclLayoutKeyCoordinatePointer* curLayoutRecordPointers = keyCoordinatePointerFrame[layout_no];
+ for (int i = 0; i < MAX_KEY; ++i) {
+ if (curLayoutRecordPointers[i] == NULL) {
+ key_num = i;
+ break;
+ }
+ }
+
+ return key_num;
+}
+
+
+int
+encode_key_coordinate_frame_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ XMLResource *xmlresource = XMLResource::get_instance();
+
+ int layout_num = xmlresource->get_layout_size();
+ assert(layout_num >= 0);
+ SclLayoutKeyCoordinatePointer _key_coordinate_pointer_frame[MAX_SCL_LAYOUT][MAX_KEY];
+ memset(_key_coordinate_pointer_frame, 0x00, MAX_KEY * MAX_SCL_LAYOUT * sizeof(SclLayoutKeyCoordinatePointer));
+
+ for (int i = 0; i < layout_num; ++i) {
+ xmlresource->load(i);
+ for (int j = 0; j < MAX_KEY; ++j) {
+ _key_coordinate_pointer_frame[i][j] = xmlresource->get_key_coordinate_pointer_frame()[i][j];
+ }
+ }
+ // 4 byte (range[0-4,294,967,295))
+ const int DATA_SIZE_BYTES = 4;
+ // 1 byte (range[0-128))
+ const int REC_NUM_BYTES = 1;
+ const int KEY_NUM_BYTES = 1;
+ // 2 byte (range[0-65536))
+ const int KEY_COORDIANTE_REC_DATA_SIZE_BYTES = 2;
+
+ int init_size = storage.get_size();
+ // data size
+ storage.reserve(DATA_SIZE_BYTES);
+
+ //TODO: assert layout_num < REC_NUM_BYTES's range
+ storage.put<uint_t>(layout_num, REC_NUM_BYTES);
+
+ int *pKey_num_array = new int[layout_num];
+ memset(pKey_num_array, 0x00, layout_num * sizeof(int));
+ for (int i = 0; i < layout_num; ++i) {
+ pKey_num_array[i] = get_key_num(_key_coordinate_pointer_frame, i);
+ //TODO: assert key_num < KEY_NUM_BYTES's range
+ storage.put<uint_t>(pKey_num_array[i], KEY_NUM_BYTES);
+ }
+
+ // key_coordinate_rec_data_size
+ storage.reserve(KEY_COORDIANTE_REC_DATA_SIZE_BYTES);
+
+ Key_coordinate_record_width record_width;
+ set_key_coordinate_record_width(&md_helper, record_width);
+
+
+ int key_coordinate_rec_data_size = 0;
+ for ( int i = 0; i < layout_num; ++i ) {
+ for ( int j = 0; j < pKey_num_array[i]; ++j ) {
+ int pre_size = storage.get_size();
+
+ SclLayoutKeyCoordinatePointer cur = _key_coordinate_pointer_frame[i][j];
+ if (!cur) break;
+ encode_key_coordinate_record(storage, cur, record_width);
+
+ int aft_size = storage.get_size();
+ if (key_coordinate_rec_data_size == 0) {
+ key_coordinate_rec_data_size = aft_size - pre_size;
+ }
+ assert(key_coordinate_rec_data_size == aft_size - pre_size);
+ }
+ }
+
+ delete[] pKey_num_array;
+
+ int advance_size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(advance_size, DATA_SIZE_BYTES, init_size);
+
+ // random put key_coordinate_rec_data_size
+ int key_coordinate_rec_data_offset = init_size +
+ DATA_SIZE_BYTES +
+ REC_NUM_BYTES +
+ layout_num * KEY_NUM_BYTES;
+ storage.random_put<uint_t>(key_coordinate_rec_data_size,
+ KEY_COORDIANTE_REC_DATA_SIZE_BYTES,
+ key_coordinate_rec_data_offset);
+
+ return storage.get_size();
+}
+
+int
+encode_key_coordinate_frame_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_key_coordinate_frame_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
+
+int
+encode_key_coordinate_frame_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_key_coordinate_frame_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "resource_storage_impl.h"
+#include "encode_label_properties_frame.h"
+#include <string>
+#include "xmlresource.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace xmlresource;
+using namespace std;
+static void _encode_color(ResourceStorage& storage, const SclColor& color, int width) {
+ if (width <= 0) return;
+ storage.put<sint_t>(color.r, width);
+ storage.put<sint_t>(color.g, width);
+ storage.put<sint_t>(color.b, width);
+ storage.put<sint_t>(color.a, width);
+}
+
+static void
+encode_label_properties_record(ResourceStorage& storage, const PSclLabelProperties cur, const Label_properties_record_width& record_width) {
+ if (cur == NULL) return;
+
+ //label_name
+ storage.encode_string(cur->label_type, record_width.label_type);
+
+ //font_name
+ storage.encode_string(cur->font_name, record_width.font_name);
+
+ //font_size
+ storage.put<sint_t>(cur->font_size, record_width.font_size);
+
+ //font color
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ _encode_color(storage, cur->font_color[i][j], record_width.font_color);
+ }
+ }
+
+ //alignment
+ storage.put<sint_t>(cur->alignment, record_width.alignment);
+
+ //padding_x
+ storage.put<sint_t>(cur->padding_x, record_width.padding_x);
+
+ //padding_y
+ storage.put<sint_t>(cur->padding_y, record_width.padding_y);
+
+ //inner_width
+ storage.put<sint_t>(cur->inner_width, record_width.inner_width);
+
+ //inner_height
+ storage.put<sint_t>(cur->inner_height, record_width.inner_height);
+
+ //shadow_distance
+ storage.put<sint_t>(cur->shadow_distance, record_width.shadow_distance);
+
+ //shadow_direction
+ storage.put<sint_t>(cur->shadow_direction, record_width.shadow_direction);
+
+ //shadow_color
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ _encode_color(storage, cur->shadow_color[i][j], record_width.shadow_color);
+ }
+ }
+}
+
+int
+encode_label_properties_frame_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ /*size 4bytes*/
+ const int _SIZE_WIDTH = 4;
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclLabelPropertiesTable labelPropertiesFrame = xmlresource->get_label_properties_frame();
+
+#ifdef __SCL_TXT_DEBUG
+ put_label_properties_frame(ENCODE, labelPropertiesFrame);
+
+#endif
+ int size = xmlresource->get_labelproperty_size();
+ int maxj = MAX_SIZE_OF_LABEL_FOR_ONE;
+
+ storage.reserve(8);
+
+ storage.put<sint_t>(size, _SIZE_WIDTH);
+ storage.put<sint_t>(maxj, _SIZE_WIDTH);
+
+ Label_properties_record_width record_width;
+ set_label_properties_record_width(md_helper, record_width);
+ for ( int i = 0; i < size; ++i ) {
+ for ( int j = 0; j < maxj; ++j ) {
+ SclLabelProperties cur = labelPropertiesFrame[i][j];
+ encode_label_properties_record(storage, &cur, record_width);
+ }
+ }
+
+ int advance_size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(advance_size, 8, init_size);
+
+ return storage.get_size();
+}
+
+int
+encode_label_properties_frame_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+
+ ResourceStorage storage;
+ encode_label_properties_frame_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
+
+int
+encode_label_properties_frame_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+
+ ResourceStorage storage;
+ encode_label_properties_frame_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "resource_storage_impl.h"
+#include "encode_layout.h"
+#include <string>
+#include <libxml/parser.h>
+#include "xmlresource.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace std;
+using namespace xmlresource;
+extern IString_Encoder& string_encoder;
+
+static void _encode_color(ResourceStorage& storage, const SclColor& color, int width) {
+ if (width <= 0) return;
+
+ storage.put<sint_t>(color.r, width);
+ storage.put<sint_t>(color.g, width);
+ storage.put<sint_t>(color.b, width);
+ storage.put<sint_t>(color.a, width);
+}
+
+static void
+encode_layout_record(ResourceStorage& storage, PSclLayout cur, const Layout_width& record_width) {
+ //name
+ storage.encode_string((const char*)cur->name, record_width.name);
+ //display mode
+ storage.put<sint_t>(cur->display_mode, record_width.display_mode);
+
+ //style
+ storage.put<sint_t>(cur->style, record_width.style);
+
+ //width
+ storage.put<sint_t>(cur->width, record_width.width);
+
+ //height
+ storage.put<sint_t>(cur->height, record_width.height);
+
+ //use_sw_button
+ storage.put<sint_t>(cur->use_sw_button, record_width.use_sw_button);
+
+ //use_magnifier_window
+ storage.put<sint_t>(cur->use_magnifier_window, record_width.use_magnifier_window);
+
+ //extract_background
+ storage.put<sint_t>(cur->extract_background, record_width.extract_background);
+
+ //key_width
+ storage.put<sint_t>(cur->key_width, record_width.key_width);
+
+ //key_height
+ storage.put<sint_t>(cur->key_height, record_width.key_height);
+ //key_spacing
+ storage.put<sint_t>(cur->key_spacing, record_width.key_spacing);
+ //row_spacing
+ storage.put<sint_t>(cur->row_spacing, record_width.row_spacing);
+
+ //use_sw_background
+ storage.put<sint_t>(cur->use_sw_background, record_width.use_sw_background);
+
+ _encode_color(storage, cur->bg_color, record_width.bg_color);
+
+ //bg_line_width
+ storage.put<float_t>(cur->bg_line_width, record_width.bg_line_width);
+
+ _encode_color(storage, cur->bg_line_color, record_width.bg_line_color);
+
+ //add_grab_left
+ storage.put<sint_t>(cur->add_grab_left, record_width.add_grab_left);
+
+ //add_grab_right
+ storage.put<sint_t>(cur->add_grab_right, record_width.add_grab_right);
+
+ //add_grab_top
+ storage.put<sint_t>(cur->add_grab_top, record_width.add_grab_top);
+
+ //add_grab_bottom
+ storage.put<sint_t>(cur->add_grab_bottom, record_width.add_grab_bottom);
+
+ //image_path
+ for (int i = 0; i < SCL_BUTTON_STATE_MAX; ++i) {
+ storage.encode_string(cur->image_path[i], record_width.image_path);
+ }
+
+ //key_background_image
+ for (int i = 0; i < SCL_SHIFT_STATE_MAX; ++i) {
+ for (int j = 0; j < SCL_BUTTON_STATE_MAX; ++j) {
+ storage.encode_string(cur->key_background_image[i][j], record_width.key_background_image);
+ }
+ }
+
+ //sound_style
+ storage.encode_string(cur->sound_style, record_width.sound_style);
+ //vibe_style
+ storage.encode_string(cur->vibe_style, record_width.vibe_style);
+ //label_name
+ storage.encode_string(cur->label_type, record_width.label_type);
+ //modifier_decorator
+ storage.encode_string(cur->modifier_decorator, record_width.modifier_decorator);
+}
+
+int
+encode_layout_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ // 4 byte (range[0-4,294,967,295))
+ const int DATA_SIZE_BYTES = 4;
+ // 1 byte (range[0-128))
+ const int REC_NUM_BYTES = 1;
+ // 2 byte (range[0-65536))
+ const int LAYOUT_REC_DATA_SIZE_BYTES = 2;
+
+ const int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclLayout layoutTable = xmlresource->get_layout_table();
+
+ int size = xmlresource->get_layout_size();
+
+#ifdef __SCL_TXT_DEBUG
+ put_layout_table(ENCODE, layoutTable);
+#endif
+
+ PSclLayout cur = layoutTable;
+
+ // data size
+ storage.reserve(DATA_SIZE_BYTES);
+
+ // rec_num
+ storage.put<sint_t>(size, REC_NUM_BYTES);
+
+ // rec data size
+ storage.reserve(LAYOUT_REC_DATA_SIZE_BYTES);
+
+ Layout_width record_width;
+ set_layout_width(md_helper, record_width);
+
+ int layout_rec_data_size = 0;
+ for ( int i = 0; i < size; ++i ) {
+ int pre_size = storage.get_size();
+ encode_layout_record(storage, cur, record_width);
+
+ int aft_size = storage.get_size();
+ if (layout_rec_data_size == 0) {
+ layout_rec_data_size = aft_size - pre_size;
+ }
+ assert(layout_rec_data_size == aft_size - pre_size);
+
+ cur++;
+ }
+
+ // back write data size
+ int advance_size = storage.get_size() - init_size;
+
+ // random put advance_size
+ int data_size_offset = init_size;
+ storage.random_put<sint_t>(advance_size, DATA_SIZE_BYTES, data_size_offset);
+
+ // random put layout_rec size
+ int layout_rec_data_offset = init_size + DATA_SIZE_BYTES + REC_NUM_BYTES;
+ storage.random_put<sint_t>(layout_rec_data_size, LAYOUT_REC_DATA_SIZE_BYTES, layout_rec_data_offset);
+
+ return storage.get_size();
+}
+
+int
+encode_layout_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_layout_file(storage, md_helper);
+
+ storage.toFile(file);
+
+ return storage.get_size();
+}
+
+int
+encode_layout_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_layout_file(storage, md_helper);
+
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_magnifier_configure.h"
+#include "xmlresource.h"
+#include "resource_storage_impl.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+using namespace xmlresource;
+static void
+encode_magnifier_configure_record(ResourceStorage& storage, const PSclMagnifierWndConfigure cur, const Magnifier_configure_width& record_width) {
+ //style
+ storage.put<sint_t>(cur->style, record_width.style);
+ //width
+ storage.put<sint_t>(cur->width, record_width.width);
+ //height
+ storage.put<sint_t>(cur->height, record_width.height);
+ //label_area_record.left
+ storage.put<sint_t>(cur->label_area_rect.left, record_width.label_area_rect);
+ //label_area_rect.right
+ storage.put<sint_t>(cur->label_area_rect.right, record_width.label_area_rect);
+
+ //label_area_record.top
+ storage.put<sint_t>(cur->label_area_rect.top, record_width.label_area_rect);
+ //label_area_rect.bottom
+ storage.put<sint_t>(cur->label_area_rect.bottom, record_width.label_area_rect);
+ //bg_image_path
+ storage.encode_string(cur->bg_image_path, record_width.bg_image_path);
+
+ //bg_shift_image_path
+ storage.encode_string(cur->bg_shift_image_path, record_width.bg_shift_image_path);
+
+ //bg_shift_lock_image_path
+ storage.encode_string(cur->bg_shift_lock_image_path, record_width.bg_shift_lock_image_path);
+
+ //bg_long_key_image_path
+ storage.encode_string(cur->bg_long_key_image_path, record_width.bg_long_key_image_path);
+ //use_actual_window
+ storage.put<sint_t>(cur->use_actual_window, record_width.use_actual_window);
+ //label_name
+ storage.encode_string(cur->label_type, record_width.label_type);
+ //padding_x
+ storage.put<sint_t>(cur->padding_x, record_width.padding_x);
+ //padding_y
+ storage.put<sint_t>(cur->padding_y, record_width.padding_y);
+ //show_shift_label
+ storage.put<sint_t>(cur->show_shift_label, record_width.show_shift_label);
+}
+
+int
+encode_magnifier_configure_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclMagnifierWndConfigure magnifierConfigure = xmlresource->get_magnifier_configure();
+
+
+#ifdef __SCL_TXT_DEBUG
+ put_magnifier_wnd_configure(ENCODE, *magnifierConfigure);
+
+#endif
+ Magnifier_configure_width record_width;
+ set_magnifier_configure_width(md_helper, record_width);
+
+ storage.reserve(8);
+ encode_magnifier_configure_record(storage, magnifierConfigure, record_width);
+
+ int advance_size = storage.get_size() - init_size;
+
+ storage.random_put<sint_t>(advance_size, 8, init_size);
+
+ return storage.get_size();
+}
+
+int
+encode_magnifier_configure_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+
+ ResourceStorage storage;
+ encode_magnifier_configure_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
+
+int
+encode_magnifier_configure_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+
+ ResourceStorage storage;
+ encode_magnifier_configure_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_metadata.h"
+#include <assert.h>
+#include <stdio.h>
+#include "metadata.h"
+using namespace std;
+static const int FIELD_NUM_WIDTH = 2;
+static void
+encode_metadata_record(ResourceStorage& storage, const MetaData_Record& metadata_record ) {
+ storage.put(metadata_record.m_name);
+ unsigned short field_num = metadata_record.vField.size();
+ storage.put<sint_t>(field_num, FIELD_NUM_WIDTH);
+
+ std::vector<MetaData_Field>::const_iterator it;
+ for (it = metadata_record.vField.begin(); it != metadata_record.vField.end(); ++it) {
+ storage.put(it->m_name);
+ storage.put(it->m_type);
+ storage.put<sint_t>(it->m_width, FIELD_SIZE_WIDTH);
+ }
+}
+void
+encode_metadata(ResourceStorage& storage, const MetaData& metadata ) {
+ int init_size = storage.get_size();
+
+ storage.reserve(8);
+ storage.put(metadata.m_version);
+
+ unsigned short size = metadata.m_vec_metadata_record.size();
+ storage.put<sint_t>(size, RECORD_SIZE_WIDTH);
+
+ for (int i = 0; i < size; ++i) {
+ encode_metadata_record(storage, metadata.m_vec_metadata_record.at(i));
+ }
+
+ int block_size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(block_size, 8, init_size);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_modifier_decoration.h"
+#include "xmlresource.h"
+#include "resource_storage_impl.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+#include <dlog.h>
+
+using namespace xmlresource;
+static void
+encode_modifier_decoration_record(ResourceStorage& storage, const PSclModifierDecoration cur, const Modifier_decoration_width& record_width) {
+ storage.put<sint_t>(cur->extract_background, record_width.extract_background);
+ storage.encode_string(cur->name, record_width.name);
+ for (int i = 0; i < DISPLAYMODE_MAX; ++i) {
+ for (int j = 0; j < KEY_MODIFIER_MAX; ++j) {
+ storage.encode_string(cur->bg_image_path[i][j], record_width.bg_image_path);
+ }
+ }
+}
+
+int
+encode_modifier_decoration_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ PSclModifierDecoration modifierDecorationTable = xmlresource->get_modifier_decoration_table();
+ if (modifierDecorationTable == NULL) {
+ LOGW("Error. modifier decoration table is NULL\n");
+ return 0;
+ }
+
+#ifdef __SCL_TXT_DEBUG
+ put_modifier_decoration(ENCODE, modifierDecorationTable);
+
+#endif
+ Modifier_decoration_width record_width;
+ set_modifier_decoration_width(md_helper, record_width);
+
+ storage.reserve(8);
+
+ storage.put<sint_t>(MAX_SCL_MODIFIER_DECORATION_NUM, 4);
+ PSclModifierDecoration cur = modifierDecorationTable;
+ for (int i = 0; i < MAX_SCL_MODIFIER_DECORATION_NUM; ++i) {
+ encode_modifier_decoration_record(storage, cur, record_width);
+ cur++;
+ }
+
+ int advance_size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(advance_size, 8, init_size);
+
+ return storage.get_size();
+}
+
+int
+encode_modifier_decoration_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+
+ encode_modifier_decoration_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
+
+int
+encode_modifier_decoration_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+
+ encode_modifier_decoration_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "encode_nine_patch.h"
+#include <string>
+#include "xmlresource.h"
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+#include "put_record.h"
+#include "_auto_metadata.h"
+#include <dlog.h>
+
+using namespace std;
+using namespace xmlresource;
+static void
+encode_nine_patch_info(ResourceStorage& storage, const SclNinePatchInfo* cur, const Nine_patch_width& record_width) {
+ assert(cur != NULL);
+ storage.encode_string(cur->image_path, record_width.image_path);
+ //left
+ storage.put<sint_t>(cur->left, record_width.left);
+ //right
+ storage.put<sint_t>(cur->right, record_width.right);
+ //top
+ storage.put<sint_t>(cur->top, record_width.top);
+ //bottom
+ storage.put<sint_t>(cur->bottom, record_width.bottom);
+}
+
+int
+encode_nine_patch_file(ResourceStorage& storage, IMetaData_Helper& md_helper) {
+ int init_size = storage.get_size();
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ if (xmlresource == NULL) {
+ LOGW("Error: failed to get xmlresource instance.\n");
+ return 0;
+ }
+ SclNinePatchInfo* ninePatchInfoTable = xmlresource->get_nine_patch_list();
+ if (ninePatchInfoTable == NULL) {
+ LOGW("Warning: nine patch list is null\n");
+ return 0;
+ }
+#ifdef __SCL_TXT_DEBUG
+ put_nine_patch_info(ENCODE, ninePatchInfoTable);
+
+#endif
+ storage.reserve(8);
+ storage.put<sint_t>(MAX_NINE_PATCH_FILE_LIST, 4);
+
+ Nine_patch_width record_width;
+ set_nine_patch_width(md_helper, record_width);
+ SclNinePatchInfo* cur = ninePatchInfoTable;
+ for (int i = 0; i < MAX_NINE_PATCH_FILE_LIST; ++i) {
+ encode_nine_patch_info(storage, cur, record_width);
+ cur++;
+ }
+
+ int size = storage.get_size() - init_size;
+ storage.random_put<sint_t>(size, 8, init_size);
+
+ return storage.get_size();
+}
+
+int
+encode_nine_patch_file(const char* file, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_nine_patch_file(storage, md_helper);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
+
+int
+encode_nine_patch_file(const char* file, int& offset, IMetaData_Helper& md_helper) {
+ if (!file) return 0;
+
+ ResourceStorage storage;
+ encode_nine_patch_file(storage, md_helper);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/*This file is generated by auto_codes.py.*/
+
+#ifndef __AUTO_METADATA_H__
+#define __AUTO_METADATA_H__
+
+#include <memory.h>
+typedef struct _Input_mode_configure_width {
+ int name;
+ int layout_portrait;
+ int layout_landscape;
+ int use_virtual_window;
+ int use_dim_window;
+ int timeout;
+}Input_mode_configure_width;
+
+typedef struct _Layout_width {
+ int name;
+ int display_mode;
+ int style;
+ int width;
+ int height;
+ int use_sw_button;
+ int use_magnifier_window;
+ int extract_background;
+ int key_width;
+ int key_height;
+ int key_spacing;
+ int row_spacing;
+ int use_sw_background;
+ int bg_color;
+ int bg_line_width;
+ int bg_line_color;
+ int add_grab_left;
+ int add_grab_right;
+ int add_grab_top;
+ int add_grab_bottom;
+ int image_path;
+ int key_background_image;
+ int sound_style;
+ int vibe_style;
+ int label_type;
+ int modifier_decorator;
+}Layout_width;
+
+typedef struct _Key_coordinate_record_width {
+ int x;
+ int y;
+ int width;
+ int height;
+ int add_hit_left;
+ int add_hit_right;
+ int add_hit_top;
+ int add_hit_bottom;
+ int popup_relative_x;
+ int popup_relative_y;
+ int extract_offset_x;
+ int extract_offset_y;
+ int sub_layout;
+ int magnifier_offset_x;
+ int magnifier_offset_y;
+ int custom_id;
+ int button_type;
+ int key_type;
+ int popup_type;
+ int use_magnifier;
+ int use_long_key_magnifier;
+ int popup_input_mode;
+ int sound_style;
+ int vibe_style;
+ int is_side_button;
+ int label_count;
+ int label;
+ int label_type;
+ int image_label_path;
+ int image_label_type;
+ int bg_image_path;
+ int key_value_count;
+ int key_value;
+ int key_event;
+ int long_key_type;
+ int long_key_value;
+ int long_key_event;
+ int use_repeat_key;
+ int autopopup_key_labels;
+ int autopopup_key_values;
+ int autopopup_key_events;
+ int dont_close_popup;
+ int extra_option;
+ int multitouch_type;
+ int modifier_decorator;
+ int magnifier_label;
+ int hint_string;
+}Key_coordinate_record_width;
+
+typedef struct _Label_properties_record_width {
+ int label_type;
+ int font_name;
+ int font_size;
+ int font_color;
+ int alignment;
+ int padding_x;
+ int padding_y;
+ int inner_width;
+ int inner_height;
+ int shadow_distance;
+ int shadow_direction;
+ int shadow_color;
+}Label_properties_record_width;
+
+typedef struct _Default_configure_width {
+ int display_mode;
+ int input_mode;
+ int image_file_base_path;
+ int target_screen_width;
+ int target_screen_height;
+ int auto_detect_landscape;
+ int use_magnifier_window;
+ int use_auto_popup;
+ int use_zoom_window;
+ int on_error_noti_send;
+ int use_word_deletion;
+ int sw_button_style;
+ int touch_offset_level;
+ int touch_offset;
+ int default_sub_layout;
+ int use_actual_dim_window;
+ int dim_color;
+}Default_configure_width;
+
+typedef struct _Magnifier_configure_width {
+ int style;
+ int width;
+ int height;
+ int label_area_rect;
+ int bg_image_path;
+ int bg_shift_image_path;
+ int bg_shift_lock_image_path;
+ int bg_long_key_image_path;
+ int use_actual_window;
+ int label_type;
+ int padding_x;
+ int padding_y;
+ int show_shift_label;
+}Magnifier_configure_width;
+
+typedef struct _Autopopup_configure_width {
+ int bg_image_path;
+ int bg_color;
+ int bg_line_width;
+ int bg_line_color;
+ int bg_padding;
+ int button_image_path;
+ int sw_button_style;
+ int button_width;
+ int button_height;
+ int button_spacing;
+ int label_type;
+ int decoration_image_path;
+ int decoration_size;
+ int max_column;
+ int add_grab_left;
+ int add_grab_right;
+ int add_grab_top;
+ int add_grab_bottom;
+}Autopopup_configure_width;
+
+typedef struct _Modifier_decoration_width {
+ int extract_background;
+ int name;
+ int bg_image_path;
+}Modifier_decoration_width;
+
+typedef struct _Nine_patch_width {
+ int image_path;
+ int left;
+ int right;
+ int top;
+ int bottom;
+}Nine_patch_width;
+
+template <class T>
+void set_input_mode_configure_width(T& md_helper,
+ Input_mode_configure_width & record_width) {
+ md_helper.set_current_metadata_record("input_mode_configure");
+ memset(&record_width, 0x00, sizeof(Input_mode_configure_width));
+
+ record_width.name = md_helper.get_width("name");
+ record_width.layout_portrait = md_helper.get_width("layout_portrait");
+ record_width.layout_landscape = md_helper.get_width("layout_landscape");
+ record_width.use_virtual_window = md_helper.get_width("use_virtual_window");
+ record_width.use_dim_window = md_helper.get_width("use_dim_window");
+ record_width.timeout = md_helper.get_width("timeout");
+}
+
+template <class T>
+void set_layout_width(T& md_helper,
+ Layout_width & record_width) {
+ md_helper.set_current_metadata_record("layout");
+ memset(&record_width, 0x00, sizeof(Layout_width));
+
+ record_width.name = md_helper.get_width("name");
+ record_width.display_mode = md_helper.get_width("display_mode");
+ record_width.style = md_helper.get_width("style");
+ record_width.width = md_helper.get_width("width");
+ record_width.height = md_helper.get_width("height");
+ record_width.use_sw_button = md_helper.get_width("use_sw_button");
+ record_width.use_magnifier_window = md_helper.get_width("use_magnifier_window");
+ record_width.extract_background = md_helper.get_width("extract_background");
+ record_width.key_width = md_helper.get_width("key_width");
+ record_width.key_height = md_helper.get_width("key_height");
+ record_width.key_spacing = md_helper.get_width("key_spacing");
+ record_width.row_spacing = md_helper.get_width("row_spacing");
+ record_width.use_sw_background = md_helper.get_width("use_sw_background");
+ record_width.bg_color = md_helper.get_width("bg_color");
+ record_width.bg_line_width = md_helper.get_width("bg_line_width");
+ record_width.bg_line_color = md_helper.get_width("bg_line_color");
+ record_width.add_grab_left = md_helper.get_width("add_grab_left");
+ record_width.add_grab_right = md_helper.get_width("add_grab_right");
+ record_width.add_grab_top = md_helper.get_width("add_grab_top");
+ record_width.add_grab_bottom = md_helper.get_width("add_grab_bottom");
+ record_width.image_path = md_helper.get_width("image_path");
+ record_width.key_background_image = md_helper.get_width("key_background_image");
+ record_width.sound_style = md_helper.get_width("sound_style");
+ record_width.vibe_style = md_helper.get_width("vibe_style");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.modifier_decorator = md_helper.get_width("modifier_decorator");
+}
+
+template <class T>
+void set_key_coordinate_record_width(T& md_helper,
+ Key_coordinate_record_width & record_width) {
+ md_helper.set_current_metadata_record("key_coordinate_record");
+ memset(&record_width, 0x00, sizeof(Key_coordinate_record_width));
+
+ record_width.x = md_helper.get_width("x");
+ record_width.y = md_helper.get_width("y");
+ record_width.width = md_helper.get_width("width");
+ record_width.height = md_helper.get_width("height");
+ record_width.add_hit_left = md_helper.get_width("add_hit_left");
+ record_width.add_hit_right = md_helper.get_width("add_hit_right");
+ record_width.add_hit_top = md_helper.get_width("add_hit_top");
+ record_width.add_hit_bottom = md_helper.get_width("add_hit_bottom");
+ record_width.popup_relative_x = md_helper.get_width("popup_relative_x");
+ record_width.popup_relative_y = md_helper.get_width("popup_relative_y");
+ record_width.extract_offset_x = md_helper.get_width("extract_offset_x");
+ record_width.extract_offset_y = md_helper.get_width("extract_offset_y");
+ record_width.sub_layout = md_helper.get_width("sub_layout");
+ record_width.magnifier_offset_x = md_helper.get_width("magnifier_offset_x");
+ record_width.magnifier_offset_y = md_helper.get_width("magnifier_offset_y");
+ record_width.custom_id = md_helper.get_width("custom_id");
+ record_width.button_type = md_helper.get_width("button_type");
+ record_width.key_type = md_helper.get_width("key_type");
+ record_width.popup_type = md_helper.get_width("popup_type");
+ record_width.use_magnifier = md_helper.get_width("use_magnifier");
+ record_width.use_long_key_magnifier = md_helper.get_width("use_long_key_magnifier");
+ record_width.popup_input_mode = md_helper.get_width("popup_input_mode");
+ record_width.sound_style = md_helper.get_width("sound_style");
+ record_width.vibe_style = md_helper.get_width("vibe_style");
+ record_width.is_side_button = md_helper.get_width("is_side_button");
+ record_width.label_count = md_helper.get_width("label_count");
+ record_width.label = md_helper.get_width("label");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.image_label_path = md_helper.get_width("image_label_path");
+ record_width.image_label_type = md_helper.get_width("image_label_type");
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+ record_width.key_value_count = md_helper.get_width("key_value_count");
+ record_width.key_value = md_helper.get_width("key_value");
+ record_width.key_event = md_helper.get_width("key_event");
+ record_width.long_key_type = md_helper.get_width("long_key_type");
+ record_width.long_key_value = md_helper.get_width("long_key_value");
+ record_width.long_key_event = md_helper.get_width("long_key_event");
+ record_width.use_repeat_key = md_helper.get_width("use_repeat_key");
+ record_width.autopopup_key_labels = md_helper.get_width("autopopup_key_labels");
+ record_width.autopopup_key_values = md_helper.get_width("autopopup_key_values");
+ record_width.autopopup_key_events = md_helper.get_width("autopopup_key_events");
+ record_width.dont_close_popup = md_helper.get_width("dont_close_popup");
+ record_width.extra_option = md_helper.get_width("extra_option");
+ record_width.multitouch_type = md_helper.get_width("multitouch_type");
+ record_width.modifier_decorator = md_helper.get_width("modifier_decorator");
+ record_width.magnifier_label = md_helper.get_width("magnifier_label");
+ record_width.hint_string = md_helper.get_width("hint_string");
+}
+
+template <class T>
+void set_label_properties_record_width(T& md_helper,
+ Label_properties_record_width & record_width) {
+ md_helper.set_current_metadata_record("label_properties_record");
+ memset(&record_width, 0x00, sizeof(Label_properties_record_width));
+
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.font_name = md_helper.get_width("font_name");
+ record_width.font_size = md_helper.get_width("font_size");
+ record_width.font_color = md_helper.get_width("font_color");
+ record_width.alignment = md_helper.get_width("alignment");
+ record_width.padding_x = md_helper.get_width("padding_x");
+ record_width.padding_y = md_helper.get_width("padding_y");
+ record_width.inner_width = md_helper.get_width("inner_width");
+ record_width.inner_height = md_helper.get_width("inner_height");
+ record_width.shadow_distance = md_helper.get_width("shadow_distance");
+ record_width.shadow_direction = md_helper.get_width("shadow_direction");
+ record_width.shadow_color = md_helper.get_width("shadow_color");
+}
+
+template <class T>
+void set_default_configure_width(T& md_helper,
+ Default_configure_width & record_width) {
+ md_helper.set_current_metadata_record("default_configure");
+ memset(&record_width, 0x00, sizeof(Default_configure_width));
+
+ record_width.display_mode = md_helper.get_width("display_mode");
+ record_width.input_mode = md_helper.get_width("input_mode");
+ record_width.image_file_base_path = md_helper.get_width("image_file_base_path");
+ record_width.target_screen_width = md_helper.get_width("target_screen_width");
+ record_width.target_screen_height = md_helper.get_width("target_screen_height");
+ record_width.auto_detect_landscape = md_helper.get_width("auto_detect_landscape");
+ record_width.use_magnifier_window = md_helper.get_width("use_magnifier_window");
+ record_width.use_auto_popup = md_helper.get_width("use_auto_popup");
+ record_width.use_zoom_window = md_helper.get_width("use_zoom_window");
+ record_width.on_error_noti_send = md_helper.get_width("on_error_noti_send");
+ record_width.use_word_deletion = md_helper.get_width("use_word_deletion");
+ record_width.sw_button_style = md_helper.get_width("sw_button_style");
+ record_width.touch_offset_level = md_helper.get_width("touch_offset_level");
+ record_width.touch_offset = md_helper.get_width("touch_offset");
+ record_width.default_sub_layout = md_helper.get_width("default_sub_layout");
+ record_width.use_actual_dim_window = md_helper.get_width("use_actual_dim_window");
+ record_width.dim_color = md_helper.get_width("dim_color");
+}
+
+template <class T>
+void set_magnifier_configure_width(T& md_helper,
+ Magnifier_configure_width & record_width) {
+ md_helper.set_current_metadata_record("magnifier_configure");
+ memset(&record_width, 0x00, sizeof(Magnifier_configure_width));
+
+ record_width.style = md_helper.get_width("style");
+ record_width.width = md_helper.get_width("width");
+ record_width.height = md_helper.get_width("height");
+ record_width.label_area_rect = md_helper.get_width("label_area_rect");
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+ record_width.bg_shift_image_path = md_helper.get_width("bg_shift_image_path");
+ record_width.bg_shift_lock_image_path = md_helper.get_width("bg_shift_lock_image_path");
+ record_width.bg_long_key_image_path = md_helper.get_width("bg_long_key_image_path");
+ record_width.use_actual_window = md_helper.get_width("use_actual_window");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.padding_x = md_helper.get_width("padding_x");
+ record_width.padding_y = md_helper.get_width("padding_y");
+ record_width.show_shift_label = md_helper.get_width("show_shift_label");
+}
+
+template <class T>
+void set_autopopup_configure_width(T& md_helper,
+ Autopopup_configure_width & record_width) {
+ md_helper.set_current_metadata_record("autopopup_configure");
+ memset(&record_width, 0x00, sizeof(Autopopup_configure_width));
+
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+ record_width.bg_color = md_helper.get_width("bg_color");
+ record_width.bg_line_width = md_helper.get_width("bg_line_width");
+ record_width.bg_line_color = md_helper.get_width("bg_line_color");
+ record_width.bg_padding = md_helper.get_width("bg_padding");
+ record_width.button_image_path = md_helper.get_width("button_image_path");
+ record_width.sw_button_style = md_helper.get_width("sw_button_style");
+ record_width.button_width = md_helper.get_width("button_width");
+ record_width.button_height = md_helper.get_width("button_height");
+ record_width.button_spacing = md_helper.get_width("button_spacing");
+ record_width.label_type = md_helper.get_width("label_type");
+ record_width.decoration_image_path = md_helper.get_width("decoration_image_path");
+ record_width.decoration_size = md_helper.get_width("decoration_size");
+ record_width.max_column = md_helper.get_width("max_column");
+ record_width.add_grab_left = md_helper.get_width("add_grab_left");
+ record_width.add_grab_right = md_helper.get_width("add_grab_right");
+ record_width.add_grab_top = md_helper.get_width("add_grab_top");
+ record_width.add_grab_bottom = md_helper.get_width("add_grab_bottom");
+}
+
+template <class T>
+void set_modifier_decoration_width(T& md_helper,
+ Modifier_decoration_width & record_width) {
+ md_helper.set_current_metadata_record("modifier_decoration");
+ memset(&record_width, 0x00, sizeof(Modifier_decoration_width));
+
+ record_width.extract_background = md_helper.get_width("extract_background");
+ record_width.name = md_helper.get_width("name");
+ record_width.bg_image_path = md_helper.get_width("bg_image_path");
+}
+
+template <class T>
+void set_nine_patch_width(T& md_helper,
+ Nine_patch_width & record_width) {
+ md_helper.set_current_metadata_record("nine_patch");
+ memset(&record_width, 0x00, sizeof(Nine_patch_width));
+
+ record_width.image_path = md_helper.get_width("image_path");
+ record_width.left = md_helper.get_width("left");
+ record_width.right = md_helper.get_width("right");
+ record_width.top = md_helper.get_width("top");
+ record_width.bottom = md_helper.get_width("bottom");
+}
+
+
+#endif //End __AUTO_METADATA_H__
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_AUTOPOPUP__CONFIGURE_H__
+#define __ENCODE_AUTOPOPUP_CONFIGURE_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+// return value: the block size of this file
+int encode_autopopup_configure_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+
+// return value: the size of this file
+// para "offset" will added to the new offset by adding size
+int encode_autopopup_configure_file(const char* file, int& offset, IMetaData_Helper& metadata);
+int encode_autopopup_configure_file(const char* file, IMetaData_Helper& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_DEFAULT_CONFIGURE_H__
+#define __ENCODE_DEFAULT_CONFIGURE_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_default_configure_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+
+int encode_default_configure_file(const char* file, int& offset, IMetaData_Helper& metadata);
+int encode_default_configure_file(const char* file, IMetaData_Helper& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_INPUT_MODE_CONFIGURE_H__
+#define __ENCODE_INPUT_MODE_CONFIGURE_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_input_mode_configure_file(const char* file, IMetaData_Helper& metadata);
+
+int encode_input_mode_configure_file(const char* file, int& offset, IMetaData_Helper& metadata);
+
+int encode_input_mode_configure_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_KEY_COORDINATE_FRAME_H__
+#define __ENCODE_KEY_COORDINATE_FRAME_H__
+#include "metadata.h"
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_key_coordinate_frame_file(ResourceStorage& storage, IMetaData_Helper& md_helper);
+int encode_key_coordinate_frame_file(const char* file, int& offset, IMetaData_Helper& md_helper);
+int encode_key_coordinate_frame_file(const char* file, IMetaData_Helper& md_helper);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_LABEL_PROPERTIES_FRAME_H__
+#define __ENCODE_LABEL_PROPERTIES_FRAME_H__
+
+#include "metadata.h"
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_label_properties_frame_file(ResourceStorage& storage, IMetaData_Helper& md_helper);
+int encode_label_properties_frame_file(const char* file, int& offset, IMetaData_Helper& md_helper);
+int encode_label_properties_frame_file(const char* file, IMetaData_Helper& md_helper);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_LAYOUT_H__
+#define __ENCODE_LAYOUT_H__
+#include "metadata.h"
+#include "imetadata_helper.h"
+int encode_layout_file(const char* file, IMetaData_Helper& md_helper);
+
+int encode_layout_file(const char* file, int& offset, IMetaData_Helper& md_helper);
+int encode_layout_file(ResourceStorage& storage, IMetaData_Helper& md_helper);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_MAGNIFIER_CONFIGURE_H__
+#define __ENCODE_MAGNIFIER_CONFIGURE_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_magnifier_configure_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+
+int encode_magnifier_configure_file(const char* file, int& offset, IMetaData_Helper& metadata);
+int encode_magnifier_configure_file(const char* file, IMetaData_Helper& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_METADATA_H__
+#define __ENCODE_METADATA_H__
+#include "metadata.h"
+#include "resource_storage_impl.h"
+void encode_metadata(ResourceStorage& storage, const MetaData& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_MODIFIER_DECORATION_H__
+#define __ENCODE_MODIFIER_DECORATION_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_modifier_decoration_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+int encode_modifier_decoration_file(const char* file, int& offset, IMetaData_Helper& metadata);
+int encode_modifier_decoration_file(const char* file, IMetaData_Helper& metadata);
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __ENCODE_NINE_PATCH_H__
+#define __ENCODE_NINE_PATCH_H__
+#include "imetadata_helper.h"
+#include "resource_storage_impl.h"
+int encode_nine_patch_file(ResourceStorage& storage, IMetaData_Helper& metadata);
+
+int encode_nine_patch_file(const char* file, int& offset, IMetaData_Helper& metadata);
+int encode_nine_patch_file(const char* file, IMetaData_Helper& metadata);
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INTERFACE_METADATA_ENCODER_H__
+#define __INTERFACE_METADATA_ENCODER_H__
+class IMetaData_Encoder{
+ public:
+ virtual int encode(const char* file) const = 0;
+ virtual int encode(const char* file, int& offset) const = 0;
+ virtual ~IMetaData_Encoder() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INTERFACE_METADATA_HELPER_H__
+#define __INTERFACE_METADATA_HELPER_H__
+class IMetaData_Helper{
+ public:
+ virtual void set_current_metadata_record(const char* record_name) = 0;
+ virtual unsigned short get_width(const char* field_name) const = 0;
+ virtual ~IMetaData_Helper() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INTERFACE_METADATA_PARSER_H__
+#define __INTERFACE_METADATA_PARSER_H__
+#include "metadata.h"
+class IMetaData_Parser{
+ public:
+ virtual const MetaData* get_metadata() const = 0;
+ virtual ~IMetaData_Parser() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __INTERFACE_STRING_ENCODER_H__
+#define __INTERFACE_STRING_ENCODER_H__
+class ResourceStorage;
+class IString_Encoder{
+ public:
+ virtual int add(const char*) = 0;
+ virtual int encode() const = 0;
+ virtual int encode(int& offset) const = 0;
+ virtual int encode(ResourceStorage&) const = 0;
+ virtual ~IString_Encoder() {}
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __META_FIELD_H__
+#define __META_FIELD_H__
+//each field:
+//1. the name
+//2. the width of the field
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <vector>
+const int FIELD_NAME_WIDTH = 128;
+const int FIELD_TYPE_WIDTH = 32;
+const int FIELD_SIZE_WIDTH = 2;
+class MetaData_Field{
+ public:
+ MetaData_Field():m_width(0) {
+ memset(m_name, 0, FIELD_NAME_WIDTH);
+ memset(m_type, 0, FIELD_TYPE_WIDTH);
+ }
+ MetaData_Field(const char*name, const char* type, const int width) {
+ assert(name);
+ assert(type);
+ assert(width >= 0);
+
+ memset(m_name, 0, FIELD_NAME_WIDTH);
+ memset(m_type, 0, FIELD_TYPE_WIDTH);
+
+ strncpy(m_name, name, FIELD_NAME_WIDTH - 1);
+ strncpy(m_type, type, FIELD_TYPE_WIDTH -1);
+
+ m_width = width;
+ }
+
+ MetaData_Field& operator=(const MetaData_Field& other) {
+ if (&other == this) return *this;
+
+ //field name
+ memset(m_name, 0, FIELD_NAME_WIDTH);
+ strncpy(m_name, other.m_name, FIELD_NAME_WIDTH - 1);
+ //field type
+ memset(m_type, 0, FIELD_TYPE_WIDTH);
+ strncpy(m_type, other.m_name, FIELD_TYPE_WIDTH - 1);
+ //field width
+ m_width = other.m_width;
+ return *this;
+ }
+
+ public:
+ char m_name[FIELD_NAME_WIDTH];
+ char m_type[FIELD_TYPE_WIDTH];
+ int m_width;
+};
+
+const int RECORD_NAME_WIDTH = 128;
+const int RECORD_SIZE_WIDTH = 2;
+
+class MetaData_Record{
+ public:
+ MetaData_Record() {};
+ char m_name[RECORD_NAME_WIDTH];
+ std::vector<MetaData_Field> vField;
+};
+
+class MetaData{
+ public:
+ char m_version[RECORD_NAME_WIDTH];
+ std::vector<MetaData_Record> m_vec_metadata_record;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __METADATA_HANDLER_H__
+#define __METADATA_HANDLER_H__
+#include <stdio.h>
+#include <libxml/parser.h>
+#include <string.h>
+#include "encode_metadata.h"
+#include "imetadata_encoder.h"
+#include "imetadata_parser.h"
+#include "imetadata_helper.h"
+class MetaData_Handler:private IMetaData_Encoder, IMetaData_Parser, public IMetaData_Helper{
+ private:
+ typedef struct __Metadata_Width {
+ int string_id_width;
+ }MetaData_Width;
+
+ public:
+ MetaData_Handler(const char* file);
+ void set_current_metadata_record(const char* record_name);
+ //encode all strings and output
+ // bin file is assigned by parameter "file"
+ int encode(const char* file)const;
+
+ //encode all strings and output
+ // bin file is assigned by parameter "file"
+ int encode(const char* file, int&offset)const;
+
+ // encode all strings and output to storage
+ int encode(ResourceStorage& storage)const;
+
+ unsigned short get_width(const char* field_name) const;
+
+ private:
+ unsigned short get_width(const char* name, const MetaData_Record& metadata_record) const;
+ int find_metadata_record_index(const char* name) const;
+ int parsing_field(const xmlNodePtr node, MetaData_Field& data, const MetaData_Width& metadataWidth);
+ int parsing_record(const xmlNodePtr curNode, MetaData_Record& metadataRecord, const MetaData_Width& metadataWidth);
+ int parsing_metadata_type(const xmlNodePtr curNode, MetaData_Width& metadataWidth);
+ void parsing_metadata();
+ const MetaData* get_metadata()const;
+
+ private:
+ MetaData metadata;
+ int m_current_metadata_record_id;
+ const char* file_name;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __RESOURCE_STORAGE_H__
+#define __RESOURCE_STORAGE_H__
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <sstream>
+#include "istring_encoder.h"
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef unsigned long long uint64;
+typedef char int8;
+typedef short int16;
+typedef int int32;
+typedef long long int64;
+typedef float float32;
+typedef double float64;
+
+typedef uint64 uint_t;
+typedef int64 sint_t;
+typedef float64 float_t;
+
+/* use string_encoder to collect strings and encode them when necessary*/
+extern IString_Encoder& string_encoder;
+
+class ResourceStorage{
+ private:
+ static const int __NEW_LENGTH__ = 0x10000;/*64k*/
+ static const int __RE_NEW_LENGTH__ = 0x10000;/*64k*/
+ static const int __MAX_NEW_SIZE__ = 0x2000000;/*32M*/
+
+ public:
+ ResourceStorage();
+ ~ResourceStorage();
+
+ // use reserve for temp reserve
+ // latter we can use random_put to put values
+ void reserve(int bytes);
+
+ // put the string to storage
+ void put(const char* str);
+
+ // encode the string id
+ void encode_string(const char* str, int width);
+
+ // put the data to storage with width assigned as para
+ // It is specially for:
+ // 1) sint_t(signed integer, includes int8, int16, int32, int64),
+ // 2) uint_t(unsigned integer, includes uint8, uint16, uint32, uint64),
+ // 3) float_t(float type, includes float32, float64)
+ // other type will get a complie error
+ template <typename T>
+ int put(T data, int width);
+
+ // put the data to a random_offset assigned by parameter "random_offset"
+ // after done, it will go back to current offset of the file
+ template <typename T>
+ int random_put(T data, int width, int random_offset);
+
+ // get the current used size
+ int get_size() const;
+
+ // get the capability of the storage
+ int capability() const;
+
+ // put the storage array to file
+ // the fileName assigned
+ // return size that put
+ int toFile(const char* fileName);
+
+ // put the storage array to file
+ // the fileName and offset assigned
+ // return size that put
+ int toFile(const char* fileName, int& offset);
+
+ // put the storage array to a big storage
+ // return size that put
+ int storage_cat(ResourceStorage& storage);
+
+ private:
+ void init();
+
+ /*template <typename T>
+ void put_primitive_data(T data, MetaType type, bool ignore = false);*/
+
+ // This function is used to check whether the
+ // storage is enough
+ // the para "width" is the size of request to use
+ void check_storage(int width);
+
+ // If the space is not enough, use this function to
+ // new a new storage
+ void expand_storage();
+
+ /*****************put methods****************/
+
+ //unify put_xx method name
+ //the width is sizeof(T)
+ template <typename T>
+ void put_primitive_data(T data);
+
+ void put_uint8(uint8 data);
+ void put_uint16(uint16 data);
+ void put_uint32(uint32 data);
+ void put_uint64(uint64 data);
+ void put_int8(int8 data);
+ void put_int16(int16 data);
+ void put_int32(int32 data);
+ void put_int64(int64 data);
+ void put_float32(float32 data);
+ void put_float64(float64 data);
+ /*****************put methods end****************/
+
+
+ //Pointer to the storage
+ char* m_storage;
+
+ //Record the actual used size
+ int m_size;
+
+ //The total size of the Storage
+ int m_capability;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __RESOURCE_STORAGE_IMPL_H__
+#define __RESOURCE_STORAGE_IMPL_H__
+#include "resource_storage.h"
+#include <dlog.h>
+
+inline ResourceStorage::
+ResourceStorage() {
+ init();
+}
+
+inline void ResourceStorage::init() {
+ m_storage = new char[__NEW_LENGTH__];
+ if (m_storage == NULL) {
+ //throw "init error of ResourceStorage";
+ m_size = 0;
+ m_capability = 0;
+ } else {
+ m_size = 0;
+ m_capability = __NEW_LENGTH__;
+ }
+}
+inline ResourceStorage::
+~ResourceStorage() {
+ delete []m_storage;
+ m_size = 0;
+ m_capability = 0;
+}
+
+inline int ResourceStorage::
+get_size() const {
+ return m_size;
+}
+
+
+inline void ResourceStorage::
+put(const char* str) {
+ /*Not allowed str null here*/
+ assert(str != NULL);
+ int len = strlen(str);
+ /*1(record string length) + len + 1(\0))*/
+ int width = 1 + len + 1;
+ check_storage(width);
+ *(m_storage + m_size) = len;
+ m_size += 1;
+
+ memcpy(m_storage + m_size, str, len);
+ m_size += len;
+
+ /*Add '\0' to the end*/
+ *(m_storage + m_size) = '\0';
+ m_size += 1;
+}
+
+inline int ResourceStorage::
+capability() const {
+ return m_capability;
+}
+
+inline int ResourceStorage::
+toFile(const char* fileName) {
+ if (m_storage == NULL) {
+ return -1;
+ }
+ FILE *fp = fopen(fileName, "rb+");
+ if (!fp) {
+ perror(fileName);
+ return -1;
+ }
+
+ int actual_size = m_size;
+ fwrite(m_storage, actual_size, 1, fp);
+ fclose(fp);
+
+ return actual_size;
+}
+inline int ResourceStorage::
+toFile(const char* fileName, int& offset) {
+ if (m_storage == NULL) {
+ return -1;
+ }
+ FILE *fp = fopen(fileName, "rb+");
+ if (!fp) {
+ perror(fileName);
+ return -1;
+ }
+
+ if (0 != fseek(fp, offset, 0)) {
+ perror(fileName);
+ fclose(fp);
+ return -1;
+ }
+
+ if (m_size < 0) {
+ fclose(fp);
+ return -1;
+ }
+ fwrite(m_storage, m_size, 1, fp);
+ fclose(fp);
+
+ offset += m_size;
+ return m_size;
+}
+inline void ResourceStorage::
+reserve(int bytes) {
+ check_storage(bytes);
+ m_size += bytes;
+}
+inline int ResourceStorage::
+storage_cat(ResourceStorage& storage) {
+ if (storage.get_size() == 0) return 0;
+
+ int size = storage.get_size();
+ check_storage(size);
+ memcpy(m_storage + m_size, storage.m_storage, size);
+
+ m_size += size;
+ return m_size;
+}
+
+inline void ResourceStorage::
+check_storage(int width) {
+ if (m_size + width > m_capability) {
+ expand_storage();
+ }
+}
+inline void ResourceStorage::
+expand_storage() {
+ unsigned int _new_size = (unsigned int)(m_capability + __RE_NEW_LENGTH__);
+ if (_new_size > (unsigned int)__MAX_NEW_SIZE__) {
+ LOGW("expand_storage failed: size is limited to %d\n", __MAX_NEW_SIZE__);
+ return;
+ }
+
+ char* _p = new char[_new_size];
+ if (_p == NULL) {
+ LOGW("expand_storage error\n");
+ return;
+ }
+ memset(_p, 0x00, _new_size);
+ memcpy(_p, m_storage, m_size);
+ delete[] m_storage;
+
+ m_storage = _p;
+ m_capability = _new_size;
+
+ _p = NULL;
+}
+///////////////////////////////////////
+inline void ResourceStorage::
+put_uint8(uint8 data) {
+ check_storage(sizeof(uint8));
+ uint8* p = (uint8*)(m_storage + m_size);
+ *p = data;
+ m_size += sizeof(uint8);
+}
+inline void ResourceStorage::
+put_uint16(uint16 data) {
+ check_storage(sizeof(uint16));
+ uint16* p = (uint16*)(m_storage + m_size);
+ *p = data;
+ m_size += sizeof(uint16);
+}
+inline void ResourceStorage::
+put_uint32(uint32 data) {
+ check_storage(sizeof(uint32));
+ uint32* p = (uint32*)(m_storage + m_size);
+ *p = data;
+ m_size += sizeof(uint32);
+}
+inline void ResourceStorage::
+put_uint64(uint64 data) {
+ check_storage(sizeof(uint64));
+ uint64* p = (uint64*)(m_storage + m_size);
+ *p = data;
+ m_size += sizeof(uint64);
+}
+// signed value --> unsigned value
+//that is ok
+inline void ResourceStorage::
+put_int8(int8 data) {
+ put_uint8(data);
+}
+inline void ResourceStorage::
+put_int16(int16 data) {
+ put_uint16(data);
+}
+inline void ResourceStorage::
+put_int32(int32 data) {
+ put_uint32(data);
+}
+inline void ResourceStorage::
+put_int64(int64 data) {
+ put_uint64(data);
+}
+
+//float32
+inline void ResourceStorage::
+put_float32(float32 data) {
+ union{
+ float32 m;
+ uint32 n;
+ };
+
+ m = data;
+ put_uint32(n);
+}
+//float64
+inline void ResourceStorage::
+put_float64(float64 data) {
+ union{
+ float64 m;
+ uint64 n;
+ };
+
+ m = data;
+ put_uint64(n);
+}
+
+//unify put_xx method name
+//the width is sizeof(T)
+template <>
+inline void ResourceStorage::
+put_primitive_data<uint8>(uint8 data) {
+ put_uint8(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<uint16>(uint16 data) {
+ put_uint16(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<uint32>(uint32 data) {
+ put_uint32(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<uint64>(uint64 data) {
+ put_uint64(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<int8>(int8 data) {
+ put_int8(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<int16>(int16 data) {
+ put_int16(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<int32>(int32 data) {
+ put_int32(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<int64>(int64 data) {
+ put_int64(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<float32>(float32 data) {
+ put_float32(data);
+}
+template <>
+inline void ResourceStorage::
+put_primitive_data<float64>(float64 data) {
+ put_float64(data);
+}
+
+//put integer value to storage
+//width is assigned by para "width"
+template <>
+inline int ResourceStorage::
+put<sint_t>(sint_t data, int width) {
+ switch (width) {
+ case 0:
+ /*Nothing to put*/
+ break;
+ case 1:
+ put_primitive_data<int8>((int8)data);
+ break;
+ case 2:
+ put_primitive_data<int16>((int16)data);
+ break;
+ case 4:
+ put_primitive_data<int32>((int32)data);
+ break;
+ case 8:
+ put_primitive_data<int64>((int64)data);
+ break;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+template <>
+inline int ResourceStorage::
+put<uint_t>(uint_t data, int width) {
+ switch (width) {
+ case 0:
+ /*Nothing to put*/
+ break;
+ case 1:
+ put_primitive_data<uint8>((uint8)data);
+ break;
+ case 2:
+ put_primitive_data<uint16>((uint16)data);
+ break;
+ case 4:
+ put_primitive_data<uint32>((uint32)data);
+ break;
+ case 8:
+ put_primitive_data<uint64>((uint64)data);
+ break;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+template <>
+inline int ResourceStorage::
+put<float_t>(float_t data, int width) {
+ switch (width) {
+ case 0:
+ break;
+ case 4:
+ put_primitive_data<float32>((float32)data);
+ break;
+ case 8:
+ put_primitive_data<float64>((float64)data);
+ break;
+ default:
+ return -1;
+ }
+ return 0;
+}
+template<>
+inline int ResourceStorage::
+random_put<sint_t>(sint_t data, int width, int offset) {
+ if (offset <0 || offset + width > m_size) {
+ return -1;
+ }
+
+ //remember current_offset
+ int current_offset = m_size;
+
+ //temperary turn to random_offset
+ int random_offset = offset;
+ m_size = random_offset;
+
+ int ret = put<sint_t>(data, width);
+ //reback to current_offset
+ m_size = current_offset;
+
+ return ret;
+}
+template<>
+inline int ResourceStorage::
+random_put<uint_t>(uint_t data, int width, int offset) {
+ if (offset <0 || offset + width > m_size) {
+ return -1;
+ }
+
+ //remember current_offset
+ int current_offset = m_size;
+
+ //temperary turn to random_offset
+ int random_offset = offset;
+ m_size = random_offset;
+
+ int ret = put<uint_t>(data, width);
+ //reback to current_offset
+ m_size = current_offset;
+
+ return ret;
+}
+template <>
+inline int ResourceStorage::
+random_put<float_t>(float_t data, int width, int offset) {
+ if (offset <0 || offset + width > m_size) {
+ return -1;
+ }
+
+ //remember current_offset
+ int current_offset = m_size;
+
+ //temperary turn to random_offset
+ int random_offset = offset;
+ m_size = random_offset;
+
+ int ret = put<float_t>(data, width);
+ //reback to current_offset
+ m_size = current_offset;
+
+ return ret;
+}
+
+///////////////////////////////////////
+inline void ResourceStorage::
+encode_string(const char* str, int width) {
+ if (width <= 0) return;
+
+ int id = string_encoder.add(str);
+ put<sint_t>(id, width);
+}
+
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef __STRING_ENCODER_H__
+#define __STRING_ENCODER_H__
+#include "istring_encoder.h"
+#include "resource_storage_impl.h"
+#include <vector>
+#include <string>
+/* limit the max num to 2^32-1*/
+const int MAX_NUM_WIDTH = 4;
+
+class String_Encoder:public IString_Encoder{
+ public:
+ String_Encoder() {
+ m_file.clear();
+ }
+
+ void set_path(const char* file) {
+ m_file = file;
+ }
+
+ /* @ insert str to string vector */
+ /* @ return the ID of the str */
+ int add(const char* str) {
+ if (str == NULL) return -1;
+
+ std::string str_temp = std::string(str);
+
+ /* check if the str_temp is already in the vector*/
+ std::vector<std::string>::iterator it;
+ for (it = m_vec_string.begin(); it != m_vec_string.end(); ++it) {
+ if (str_temp == *it) {
+ return (it - m_vec_string.begin());
+ }
+ }
+
+ /* the str_temp is not in the vector, so insert it to the vector*/
+ m_vec_string.push_back(str_temp);
+ return m_vec_string.size() -1;
+ }
+ int encode() const {
+ ResourceStorage storage;
+ encode(storage);
+ storage.toFile(m_file.c_str());
+ return storage.get_size();
+ }
+ int encode(int& offset) const {
+ ResourceStorage storage;
+ encode(storage);
+ storage.toFile(m_file.c_str(), offset);
+
+ return storage.get_size();
+ }
+
+ int encode(ResourceStorage& storage) const {
+ /* record the strings' num*/
+ storage.put<sint_t>(m_vec_string.size(), MAX_NUM_WIDTH);
+
+ /* record each string*/
+ std::vector<std::string>::const_iterator it;
+ for (it = m_vec_string.begin(); it != m_vec_string.end(); ++it) {
+ storage.put(it->c_str());
+ }
+
+ return storage.get_size();
+ }
+
+ private:
+ std::vector<std::string> m_vec_string;
+ std::string m_file;
+};
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "metadata_handler.h"
+
+MetaData_Handler::
+MetaData_Handler(const char* file) {
+ this->file_name = file;
+ m_current_metadata_record_id = -1;
+ parsing_metadata();
+}
+
+void MetaData_Handler::
+set_current_metadata_record(const char* record_name) {
+ if (record_name == NULL) {
+ m_current_metadata_record_id = -1;
+ return;
+ }
+ int idx = find_metadata_record_index(record_name);
+
+ m_current_metadata_record_id = idx;
+}
+
+int MetaData_Handler::
+encode(const char* file)const {
+ ResourceStorage storage;
+ encode_metadata(storage, metadata);
+ storage.toFile(file);
+
+ return storage.get_size();
+}
+
+int MetaData_Handler::
+encode(const char* file, int& offset)const {
+ ResourceStorage storage;
+ encode_metadata(storage, metadata);
+ storage.toFile(file, offset);
+
+ return storage.get_size();
+}
+
+int MetaData_Handler::
+encode(ResourceStorage& storage)const {
+ encode_metadata(storage, metadata);
+ return storage.get_size();
+}
+
+unsigned short MetaData_Handler::
+get_width(const char* field_name) const {
+ if (field_name == NULL) return 0;
+
+ int idx = m_current_metadata_record_id;
+ if (idx < 0 || idx > (int)metadata.m_vec_metadata_record.size()) return 0;
+
+ const MetaData_Record& metadata_record = metadata.m_vec_metadata_record.at(idx);
+
+ int width = get_width(field_name, metadata_record);
+
+ return width;
+}
+
+unsigned short MetaData_Handler::
+get_width(const char* name, const MetaData_Record& metadata_record) const {
+ assert(name);
+ for (size_t i = 0; i < metadata_record.vField.size(); ++i) {
+ if (0 == strcmp(name, metadata_record.vField.at(i).m_name)) {
+ return metadata_record.vField.at(i).m_width;
+ }
+ }
+ return 0;
+}
+
+int MetaData_Handler::
+find_metadata_record_index(const char* name)const {
+ assert(name);
+
+ for (size_t i = 0; i < metadata.m_vec_metadata_record.size(); ++i) {
+ const MetaData_Record& metadata_record = metadata.m_vec_metadata_record.at(i);
+
+ if (0 == strcmp(metadata_record.m_name, name)) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int MetaData_Handler::
+parsing_field(const xmlNodePtr node, MetaData_Field& data, const MetaData_Width& metadataWidth) {
+ memset(data.m_name, 0, sizeof(data.m_name));
+ memset(data.m_type, 0, sizeof(data.m_type));
+ data.m_width = 0;
+
+ xmlChar* name = xmlGetProp(node, (const xmlChar*)"name");
+ if (name == NULL) return -1;
+ /*FIXME strncpy ?*/
+ strncpy(data.m_name, (const char*)name, sizeof(data.m_name));
+ data.m_name[sizeof(data.m_name)-1] = '\0';
+ xmlFree(name);
+
+ xmlChar* type = xmlGetProp(node, (const xmlChar*)"type");
+ if (type == NULL) return -1;
+
+ int ret = 0;
+ if (0 == xmlStrcmp(type, (const xmlChar*)"string_id")) {
+ /*FIXME use vaule instead string*/
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = metadataWidth.string_id_width;
+ } else if (0 == xmlStrcmp(type, (const xmlChar*)"int8")) {
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = 1;
+ } else if (0 == xmlStrcmp(type, (const xmlChar*)"int16")) {
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = 2;
+ } else if (0 == xmlStrcmp(type, (const xmlChar*)"int32")) {
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = 4;
+ } else if (0 == xmlStrcmp(type, (const xmlChar*)"float32")) {
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = 4;
+ } else if (0 == xmlStrcmp(type, (const xmlChar*)"float64")) {
+ strncpy(data.m_type, (const char*)type, sizeof(data.m_type));
+ data.m_type[sizeof(data.m_type) - 1] = '\0';
+ data.m_width = 8;
+ } else {
+ ret = -1;
+ }
+
+ xmlFree(type);
+
+ return ret;
+}
+
+int MetaData_Handler::
+parsing_record(const xmlNodePtr curNode, MetaData_Record& metadataRecord, const MetaData_Width& metadataWidth) {
+ //parsing struct name
+ xmlChar* name = xmlGetProp(curNode, (const xmlChar*)"name");
+ if (name == NULL) return -1;
+ strncpy(metadataRecord.m_name, (const char*)name, sizeof(metadataRecord.m_name));
+ metadataRecord.m_name[sizeof(metadataRecord.m_name)-1] = '\0';
+ xmlFree(name);
+
+ xmlNodePtr childNode = curNode->xmlChildrenNode;
+
+ while (childNode != NULL) {
+ if (0 == xmlStrcmp(childNode->name, (const xmlChar *)"field")) {
+ MetaData_Field data;
+ int ret = parsing_field(childNode, data, metadataWidth);
+ if (ret != -1) {
+ metadataRecord.vField.push_back(data);
+ }
+ }
+
+ childNode = childNode->next;
+ }
+ return 0;
+}
+int MetaData_Handler::
+parsing_metadata_type(const xmlNodePtr curNode, MetaData_Width& metadataWidth) {
+ assert(curNode != NULL);
+ xmlNodePtr childNode = curNode->xmlChildrenNode;
+
+ while (childNode != NULL) {
+ if (0 == xmlStrcmp(childNode->name, (const xmlChar *)"type")) {
+ xmlChar* xmlname = xmlGetProp(childNode, (const xmlChar*)"name");
+ if (xmlname == NULL) continue;
+ xmlChar* xmlwidth = xmlGetProp(childNode, (const xmlChar*)"width");
+ if (xmlwidth == NULL) {
+ xmlFree(xmlname);
+ continue;
+ }
+
+ /*FIXME how to assume that the atoi will get the correct num*/
+ int width = atoi((const char*)xmlwidth);
+
+ if (0 == xmlStrcmp(xmlname, (const xmlChar*)"string_id")) {
+ metadataWidth.string_id_width = width;
+ }
+
+ xmlFree(xmlname);
+ xmlFree(xmlwidth);
+ }
+
+ childNode = childNode->next;
+ }
+ return 0;
+}
+void MetaData_Handler::
+parsing_metadata() {
+ xmlDocPtr doc;
+ xmlNodePtr curNode;
+
+ doc = xmlReadFile(file_name, NULL, 0);
+ if (doc == NULL) {
+ LOGE("Could not load file.\n");
+ return;
+ }
+
+ curNode = xmlDocGetRootElement(doc);
+ if (curNode == NULL) {
+ LOGE("empty document.\n");
+ xmlFreeDoc(doc);
+ return;
+ }
+ if (0 != xmlStrcmp(curNode->name, (const xmlChar*)"metadata"))
+ {
+ LOGE("root name %s error!\n", curNode->name);
+ xmlFreeDoc(doc);
+ return;
+ }
+
+ xmlChar* version = xmlGetProp(curNode, (const xmlChar*)"version");
+ if (version) {
+ strncpy(metadata.m_version, (const char*)version, sizeof(metadata.m_version));
+ metadata.m_version[sizeof(metadata.m_version)-1] = '\0';
+ xmlFree(version);
+ } else {
+ metadata.m_version[0] = '\0';
+ }
+
+ MetaData_Width metadataWidth;
+ curNode = curNode->xmlChildrenNode;
+ while (curNode) {
+ if (0 == xmlStrcmp(curNode->name, (const xmlChar*)"metadata_type")) {
+ parsing_metadata_type(curNode, metadataWidth);
+ } else if (0 == xmlStrcmp(curNode->name, (const xmlChar*)"record")) {
+ MetaData_Record metadataRecord;
+ int ret = parsing_record(curNode, metadataRecord, metadataWidth);
+ if (ret != -1) {
+ metadata.m_vec_metadata_record.push_back(metadataRecord);
+ }
+ }
+ curNode = curNode->next;
+ }
+ xmlFreeDoc(doc);
+}
+
+inline const MetaData* MetaData_Handler::
+get_metadata()const {
+ return &metadata;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <limits.h>
+#include <unistd.h>
+#include "string_encoder.h"
+#include "metadata_handler.h"
+#include "encode_layout.h"
+#include "encode_input_mode_configure.h"
+#include "encode_key_coordinate_frame.h"
+#include "encode_label_properties_frame.h"
+#include "encode_modifier_decoration.h"
+#include "encode_default_configure.h"
+#include "encode_magnifier_configure.h"
+#include "encode_autopopup_configure.h"
+#include "encode_nine_patch.h"
+#include "xmlresource.h"
+using namespace xmlresource;
+using namespace std;
+
+String_Encoder actual_string_encoder;
+IString_Encoder& string_encoder = actual_string_encoder;
+
+static inline void show_usage() {
+ static const char* message = { "xml2binary: missing folder operand\n"
+ "-------------------------------------------------------\n"
+ "| Usage: xml2binary operand1 operand2 |\n"
+ "| operand1: the folder where xml text files located |\n"
+ "| operand2: the folder you want to place the bin file|\n"
+ "------------------------------------------------------- \n"};
+ printf("%s", message);
+}
+
+int main(const int argc, char* argv[]) {
+ if (argc < 2) {
+ show_usage();
+ return -1;
+ }
+
+ char* xml_text_dir = NULL;
+ if (argv[1])
+ xml_text_dir = strdup(argv[1]);
+
+ if (xml_text_dir) {
+ if (0 != access(xml_text_dir, R_OK)) {
+ perror(xml_text_dir);
+ free(xml_text_dir);
+ return -1;
+ } else {
+ free(xml_text_dir);
+ xml_text_dir = NULL;
+ }
+ }
+
+ char* xml_bin_dir = NULL;
+ if (argc < 3) {
+ if (argv[1])
+ xml_bin_dir = strdup(argv[1]);
+ } else {
+ if (argv[2])
+ xml_bin_dir = strdup(argv[2]);
+ }
+
+ if (xml_bin_dir) {
+ if (0 != access(xml_bin_dir, W_OK)) {
+ perror(xml_bin_dir);
+ free(xml_bin_dir);
+ return -1;
+ } else {
+ free(xml_bin_dir);
+ xml_bin_dir = NULL;
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+
+ XMLResource *xmlresource = XMLResource::get_instance();
+ if (!xmlresource) {
+ printf("Failed build xmlresource instance.\n");
+ return -1;
+ }
+
+ xmlresource->set_resource_directory(xml_text_dir);
+ xmlresource->init("main_entry.xml");
+
+ static const char* metadata_path = "/usr/share/libscl-ui/metadata.xml";
+ if (0 != access(metadata_path, R_OK)) {
+ perror(metadata_path);
+ return -1;
+ }
+
+ MetaData_Handler md_handler(metadata_path);
+
+ char bin_file[_POSIX_PATH_MAX] = {0};
+ snprintf(bin_file, _POSIX_PATH_MAX, "%s/%s", xml_bin_dir, "sclresource.bin");
+
+ FILE *fp = fopen(bin_file, "wb");
+ if (!fp) {
+ perror(bin_file);
+ return -1;
+ }
+ fclose(fp);
+
+ enum{
+ ALLDATA = 0,
+ METADATA,
+ INPUT_MODE_CONFIGURE,
+ LAYOUT,
+ KEY_COORDINATE_FRAME,
+ LABEL_PROPERTIES_FRAME,
+ MODIFIER_DECORATION,
+ DEFAULT_CONFIGURE,
+ AUTOPOPUP_CONFIGURE,
+ MAGNIFIER_CONFIGURE,
+ NINE_PATCH,
+ STRING,
+ MAX_DATATYPE
+ };
+
+ int size_table[MAX_DATATYPE] = {0};
+ int offset_table[MAX_DATATYPE] = {0};
+ const int _SIZE_WIDTH = 8;
+ const int OFFSET_WIDTH = 8;
+ int offset = 0;
+ {
+ //Reserve for size_table
+ ResourceStorage rs;
+ rs.reserve(MAX_DATATYPE * (_SIZE_WIDTH + OFFSET_WIDTH));
+ int ret = rs.toFile(bin_file, offset);
+ if (ret < 0) {
+ printf("error\n");
+ return -1;
+ }
+ }
+
+ offset_table[METADATA] = offset;
+ size_table[METADATA] = md_handler.encode(bin_file, offset);
+ offset_table[INPUT_MODE_CONFIGURE] = offset;
+ size_table[INPUT_MODE_CONFIGURE] = encode_input_mode_configure_file(bin_file, offset, md_handler);
+
+ offset_table[LAYOUT] = offset;
+ size_table[LAYOUT] = encode_layout_file(bin_file, offset, md_handler);
+
+ offset_table[KEY_COORDINATE_FRAME] = offset;
+ size_table[KEY_COORDINATE_FRAME] = encode_key_coordinate_frame_file(bin_file, offset, md_handler);
+
+ offset_table[LABEL_PROPERTIES_FRAME] = offset;
+ size_table[LABEL_PROPERTIES_FRAME] = encode_label_properties_frame_file(bin_file, offset, md_handler);
+
+ offset_table[MODIFIER_DECORATION] = offset;
+ size_table[MODIFIER_DECORATION] = encode_modifier_decoration_file(bin_file, offset, md_handler);
+
+ offset_table[DEFAULT_CONFIGURE] = offset;
+ size_table[DEFAULT_CONFIGURE] = encode_default_configure_file(bin_file, offset, md_handler);
+
+ offset_table[AUTOPOPUP_CONFIGURE] = offset;
+ size_table[AUTOPOPUP_CONFIGURE] = encode_autopopup_configure_file(bin_file, offset, md_handler);
+
+ offset_table[MAGNIFIER_CONFIGURE] = offset;
+ size_table[MAGNIFIER_CONFIGURE] = encode_magnifier_configure_file(bin_file, offset, md_handler);
+
+ offset_table[NINE_PATCH] = offset;
+ size_table[NINE_PATCH] = encode_nine_patch_file(bin_file, offset, md_handler);
+
+ offset_table[STRING] = offset;
+ actual_string_encoder.set_path(bin_file);
+ size_table[STRING] = string_encoder.encode(offset);
+
+ offset_table[ALLDATA] = 0;
+ size_table[ALLDATA]= offset;
+
+ {
+ ResourceStorage rs;
+ for (int i = 0; i < MAX_DATATYPE; ++i) {
+ rs.put<sint_t>(size_table[i], _SIZE_WIDTH);
+ rs.put<sint_t>(offset_table[i], OFFSET_WIDTH);
+ }
+
+ int bin_offset = 0;
+ int ret = rs.toFile(bin_file, bin_offset);
+ if (ret < 0) {
+ printf("error\n");
+ return -1;
+ }
+ }
+
+ printf("xml2binary successfully.\n");
+
+ return 0;
+}