diff options
Diffstat (limited to 'navit')
117 files changed, 4278 insertions, 3417 deletions
diff --git a/navit/Doxyfile b/navit/Doxyfile index e21675546..b7e049301 100644 --- a/navit/Doxyfile +++ b/navit/Doxyfile @@ -1,1228 +1,2384 @@ -# Doxyfile 1.4.4 +# Doxyfile 1.8.9.1 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. # The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. PROJECT_NAME = navit -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. PROJECT_NUMBER = 0.0 -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. OUTPUT_DIRECTORY = ../doc -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. CREATE_SUBDIRS = NO -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, -# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, -# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. OUTPUT_LANGUAGE = English -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. +# The default value is: YES. REPEAT_BRIEF = YES -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. -ABBREVIATE_BRIEF = +ABBREVIATE_BRIEF = -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief # description. +# The default value is: NO. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. +# The default value is: NO. INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. FULL_PATH_NAMES = YES -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. JAVADOC_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. -MULTILINE_CPP_IS_BRIEF = NO +QT_AUTOBRIEF = NO -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. -DETAILS_AT_TOP = NO +MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. INHERIT_DOCS = YES -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. -ALIASES = +TCL_SUBST = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. EXTRACT_PRIVATE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. EXTRACT_STATIC = NO -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. EXTRACT_LOCAL_METHODS = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. HIDE_IN_BODY_DOCS = NO -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. +# The default value is: system dependent. CASE_SENSE_NAMES = YES -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. SHOW_INCLUDE_FILES = YES -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. SORT_BRIEF_DOCS = NO -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. SORT_BY_SCOPE_NAME = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. +# The default value is: YES. SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is YES. +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. -SHOW_DIRECTORIES = YES +SHOW_FILES = YES -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command <command> <input-file>, where <command> is the value of -# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output -# is used as the file version. See the manual for examples. +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. -FILE_VERSION_FILTER = +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = #--------------------------------------------------------------------------- -# configuration options related to warning and progress messages +# Configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. QUIET = NO -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. WARN_NO_PARAMDOC = NO -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- -# configuration options related to the input files +# Configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = -INPUT = +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm +INPUT_ENCODING = UTF-8 -FILE_PATTERNS = +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. RECURSIVE = YES -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. -EXCLUDE = +EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. +# The default value is: NO. EXCLUDE_SYMLINKS = NO -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). -EXAMPLE_PATH = +EXAMPLE_PATH = -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. -EXAMPLE_PATTERNS = +EXAMPLE_PATTERNS = -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. EXAMPLE_RECURSIVE = NO -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). -IMAGE_PATH = +IMAGE_PATH = -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command <filter> <input-file>, where <filter> -# is the value of the INPUT_FILTER tag, and <input-file> is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. -INPUT_FILTER = +INPUT_FILTER = -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. -FILTER_PATTERNS = +FILTER_PATTERNS = -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + #--------------------------------------------------------------------------- -# configuration options related to source browsing +# Configuration options related to source browsing #--------------------------------------------------------------------------- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. SOURCE_BROWSER = NO -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. REFERENCED_BY_RELATION = YES -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. REFERENCES_RELATION = YES -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. VERBATIM_HEADERS = YES +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# compiled with the --with-libclang option. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + #--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index +# Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. ALPHABETICAL_INDEX = NO -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- -# configuration options related to the HTML output +# Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a # standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO -HTML_HEADER = +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. +CHM_FILE = -HTML_FOOTER = +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +HHC_LOCATION = -HTML_STYLESHEET = +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. +GENERATE_CHI = NO -HTML_ALIGN_MEMBERS = YES +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. +CHM_INDEX_ENCODING = -GENERATE_HTMLHELP = NO +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. +BINARY_TOC = NO -CHM_FILE = +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. +TOC_EXPAND = NO -HHC_LOCATION = +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). +DISABLE_INDEX = NO -GENERATE_CHI = NO +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. +GENERATE_TREEVIEW = YES -BINARY_TOC = NO +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. +ENUM_VALUES_PER_LINE = 4 -TOC_EXPAND = NO +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +TREEVIEW_WIDTH = 250 -DISABLE_INDEX = NO +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +EXT_LINKS_IN_WINDOW = NO -ENUM_VALUES_PER_LINE = 4 +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. +FORMULA_FONTSIZE = 10 -GENERATE_TREEVIEW = YES +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. +SEARCHENGINE = NO -TREEVIEW_WIDTH = 250 +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- -# configuration options related to the LaTeX output +# Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# The default value is: YES. GENERATE_LATEX = YES -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_OUTPUT = latex -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. COMPACT_LATEX = NO -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. PAPER_TYPE = a4wide -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. To get the times font for +# instance you can specify +# EXTRA_PACKAGES=times +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER = -EXTRA_PACKAGES = +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! +LATEX_EXTRA_STYLESHEET = -LATEX_HEADER = +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. PDF_HYPERLINKS = NO -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a # higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. USE_PDFLATEX = NO -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HIDE_INDICES = NO +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE = plain + #--------------------------------------------------------------------------- -# configuration options related to the RTF output +# Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. GENERATE_RTF = NO -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. COMPACT_RTF = NO -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = +RTF_SOURCE_CODE = NO #--------------------------------------------------------------------------- -# configuration options related to the man page output +# Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. GENERATE_MAN = NO -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_OUTPUT = man -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_EXTENSION = .3 -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_LINKS = NO #--------------------------------------------------------------------------- -# configuration options related to the XML output +# Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. GENERATE_XML = NO -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- -XML_SCHEMA = +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. +GENERATE_DOCBOOK = NO -XML_DTD = +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. +DOCBOOK_OUTPUT = docbook -XML_PROGRAMLISTING = YES +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output +# Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. +# The default value is: NO. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- -# configuration options related to the Perl module output +# Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO, the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. PERLMOD_PRETTY = YES -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. MACRO_EXPANSION = NO -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. EXPAND_ONLY_PREDEF = NO -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# If the SEARCH_INCLUDES tag is set to YES, the include files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. SEARCH_INCLUDES = YES -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration options related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. +# The default value is: NO. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. EXTERNAL_GROUPS = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more # powerful graphs. +# The default value is: YES. CLASS_DIAGRAMS = YES -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: YES. HAVE_DOT = NO -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. UML_LOOK = NO -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. TEMPLATE_RELATIONS = NO -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. CALL_GRAPH = NO -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, +# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, +# gif:cairo:gd, gif:gd, gif:gd:gd and svg. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_IMAGE_FORMAT = png -# The tag DOT_PATH can be used to specify the path where the dot tool can be +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOTFILE_DIRS = -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). -DOTFILE_DIRS = +MSCFILE_DIRS = -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). -MAX_DOT_GRAPH_WIDTH = 1024 +DIAFILE_DIRS = -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. -MAX_DOT_GRAPH_HEIGHT = 1024 +PLANTUML_JAR_PATH = -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/navit/android.c b/navit/android.c index d35c105cf..6e62da1b3 100644 --- a/navit/android.c +++ b/navit/android.c @@ -118,6 +118,14 @@ Java_org_navitproject_navit_NavitGraphics_SizeChangedCallback( JNIEnv* env, jobj } JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_PaddingChangedCallback(JNIEnv* env, jobject thiz, int id, int left, int top, int right, int bottom) +{ + dbg(lvl_debug,"enter %p %d %d %d %d\n",(struct callback *)id, left, top, right, bottom); + if (id) + callback_call_4((struct callback *)id, left, top, right, bottom); +} + +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_ButtonCallback( JNIEnv* env, jobject thiz, int id, int pressed, int button, int x, int y) { dbg(lvl_debug,"enter %p %d %d\n",(struct callback *)id,pressed,button); diff --git a/navit/android/AndroidManifest.xml.cmake b/navit/android/AndroidManifest.xml.cmake index 9267f65a3..b5bd757cb 100644 --- a/navit/android/AndroidManifest.xml.cmake +++ b/navit/android/AndroidManifest.xml.cmake @@ -17,10 +17,12 @@ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:label="@string/app_name" android:icon="@drawable/icon" - android:name=".NavitAppConfig"> + android:name=".NavitAppConfig" + android:theme="@style/NavitBaseTheme"> <activity android:name="Navit" android:label="@string/app_name" - android:configChanges="locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize"> + android:configChanges="locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize" + android:theme="@style/NavitTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> diff --git a/navit/android/AndroidManifest.xml.in b/navit/android/AndroidManifest.xml.in index 5a43ee277..085276623 100644 --- a/navit/android/AndroidManifest.xml.in +++ b/navit/android/AndroidManifest.xml.in @@ -7,7 +7,8 @@ android:installLocation="auto"> <application android:label="@string/app_name" android:icon="@drawable/icon" - android:name=".NavitAppConfig"> + android:name=".NavitAppConfig" + android:theme="@style/NavitTheme"> <activity android:name="Navit" android:label="@string/app_name" android:configChanges="locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize"> diff --git a/navit/android/CMakeLists.txt b/navit/android/CMakeLists.txt index cd842be06..ca3bdbfa4 100644 --- a/navit/android/CMakeLists.txt +++ b/navit/android/CMakeLists.txt @@ -30,7 +30,6 @@ if (ANDROID) DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake COMMAND ${CMAKE_COMMAND} -D SRC=${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake -D DST=${CMAKE_CURRENT_BINARY_DIR}/AndroidManifest.xml - -D ANDROID_VERSION_INT="0" -D NAME=ANDROID_VERSION_INT -D ANDROID_VERSION_NAME=${PACKAGE_STRING} -D ANDROID_API_VERSION=${ANDROID_API_VERSION} diff --git a/navit/android/res/drawable-hdpi/ic_notify.png b/navit/android/res/drawable-hdpi/ic_notify.png Binary files differnew file mode 100644 index 000000000..7516b2fbd --- /dev/null +++ b/navit/android/res/drawable-hdpi/ic_notify.png diff --git a/navit/android/res/drawable-hdpi/icon.png b/navit/android/res/drawable-hdpi/icon.png Binary files differindex 3b01b5c3d..311c57b59 100644 --- a/navit/android/res/drawable-hdpi/icon.png +++ b/navit/android/res/drawable-hdpi/icon.png diff --git a/navit/android/res/drawable-ldpi/ic_notify.png b/navit/android/res/drawable-ldpi/ic_notify.png Binary files differnew file mode 100644 index 000000000..010d55fb3 --- /dev/null +++ b/navit/android/res/drawable-ldpi/ic_notify.png diff --git a/navit/android/res/drawable-ldpi/icon.png b/navit/android/res/drawable-ldpi/icon.png Binary files differindex b72d1e40b..da2553687 100644 --- a/navit/android/res/drawable-ldpi/icon.png +++ b/navit/android/res/drawable-ldpi/icon.png diff --git a/navit/android/res/drawable-mdpi/ic_notify.png b/navit/android/res/drawable-mdpi/ic_notify.png Binary files differnew file mode 100644 index 000000000..d6de8d53f --- /dev/null +++ b/navit/android/res/drawable-mdpi/ic_notify.png diff --git a/navit/android/res/drawable-mdpi/icon.png b/navit/android/res/drawable-mdpi/icon.png Binary files differindex 33bbab7f6..f8f68e8bc 100644 --- a/navit/android/res/drawable-mdpi/icon.png +++ b/navit/android/res/drawable-mdpi/icon.png diff --git a/navit/android/res/drawable-xhdpi/ic_notify.png b/navit/android/res/drawable-xhdpi/ic_notify.png Binary files differnew file mode 100644 index 000000000..72371c974 --- /dev/null +++ b/navit/android/res/drawable-xhdpi/ic_notify.png diff --git a/navit/android/res/drawable-xhdpi/icon.png b/navit/android/res/drawable-xhdpi/icon.png Binary files differnew file mode 100644 index 000000000..649fb32d4 --- /dev/null +++ b/navit/android/res/drawable-xhdpi/icon.png diff --git a/navit/android/res/drawable-xxhdpi/ic_notify.png b/navit/android/res/drawable-xxhdpi/ic_notify.png Binary files differnew file mode 100644 index 000000000..d47a41154 --- /dev/null +++ b/navit/android/res/drawable-xxhdpi/ic_notify.png diff --git a/navit/android/res/drawable-xxhdpi/icon.png b/navit/android/res/drawable-xxhdpi/icon.png Binary files differnew file mode 100644 index 000000000..398945c23 --- /dev/null +++ b/navit/android/res/drawable-xxhdpi/icon.png diff --git a/navit/android/res/values-v19/styles.xml b/navit/android/res/values-v19/styles.xml new file mode 100644 index 000000000..b3ea5c14f --- /dev/null +++ b/navit/android/res/values-v19/styles.xml @@ -0,0 +1,31 @@ +<resources> + + <!-- + Base application theme for API 19+. This theme completely replaces + NavitBaseTheme from BOTH res/values/styles.xml and + res/values-v19/styles.xml on API 19+ devices. + --> + <style name="NavitBaseTheme" parent="android:Theme.Holo"> + + <!-- Main theme colors --> + <!-- your app branding color for the app bar --> + <item name="android:colorPrimary">@color/navitYellow500</item> + <!-- darker variant for the status bar and contextual app bars --> + <item name="android:colorPrimaryDark">@color/navitYellow700</item> + <!-- theme UI controls like checkboxes and text fields --> + <item name="android:colorAccent">@color/navitBlue500</item> + </style> + + <!-- + Main Activity theme for API 19+. This theme completely replaces + NavitTheme from BOTH res/values/styles.xml and + res/values-v19/styles.xml on API 19+ devices. + --> + <style name="NavitTheme" parent="NavitBaseTheme"> + + <!-- API 19 theme customizations can go here. --> + <item name="android:windowTranslucentNavigation">true</item> + <item name="android:windowTranslucentStatus">true</item> + </style> + +</resources>
\ No newline at end of file diff --git a/navit/android/res/values-v21/styles.xml b/navit/android/res/values-v21/styles.xml new file mode 100644 index 000000000..a1d66bb3d --- /dev/null +++ b/navit/android/res/values-v21/styles.xml @@ -0,0 +1,46 @@ +<resources> + + <!-- + Base application theme for API 21+. This theme completely replaces + NavitBaseTheme from BOTH res/values/styles.xml and + res/values-v.../styles.xml on API 21+ devices. + --> + <style name="NavitBaseTheme" parent="android:Theme.Material"> + + <!-- Main theme colors --> + <!-- your app branding color for the app bar --> + <item name="android:colorPrimary">@color/navitYellow500</item> + <!-- darker variant for the status bar and contextual app bars --> + <item name="android:colorPrimaryDark">@color/navitYellow700</item> + <!-- theme UI controls like checkboxes and text fields --> + <item name="android:colorAccent">@color/navitBlue500</item> + </style> + + <!-- + Main Activity theme for API 21+. This theme completely replaces + NavitTheme from BOTH res/values/styles.xml and + res/values-v21/styles.xml on API 21+ devices. + --> + <style name="NavitTheme" parent="NavitBaseTheme"> + + <!-- API 21 theme customizations can go here. --> + + <!-- + Don't use translucent system bars on API 21 as they are drawn with a semitransparent + black background which can't be changed. + --> + <item name="android:windowTranslucentNavigation">false</item> + <item name="android:windowTranslucentStatus">false</item> + + <!-- + We could set any semi-transparent color here (or change it in code), but this would not + be available on API 19/20. Simply specifying full transparency allows us to implement a + separate mechanism that will work on all versions. + --> + <item name="android:navigationBarColor">@android:color/transparent</item> + <item name="android:statusBarColor">@android:color/transparent</item> + + <item name="android:windowDrawsSystemBarBackgrounds">true</item> + </style> + +</resources>
\ No newline at end of file diff --git a/navit/android/res/values/styles.xml b/navit/android/res/values/styles.xml new file mode 100644 index 000000000..91094e222 --- /dev/null +++ b/navit/android/res/values/styles.xml @@ -0,0 +1,42 @@ +<resources> + + <!-- + Base application theme, dependent on API level. This theme is replaced + by NavitBaseTheme from res/values-vXX/styles.xml on newer devices. + --> + <style name="NavitBaseTheme" parent="android:Theme.Holo"> + <!-- + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + --> + </style> + + <!-- Theme for Navit's main Activity. --> + <style name="NavitTheme" parent="NavitBaseTheme"> + <!-- All customizations that are NOT specific to a particular API-level can go here. --> + </style> + + <!-- TODO complete list of shades for both colors --> + <!-- + Primary color is derived average of icon colors (500 in Android parlance): + 213 164 19 #d5a411 hsl 45 92 84 + + Dark color is normally the 600 color (i.e. slightly darker than 500) + 209 155 19 #d19b13 hsl 43 91 82 + --> + + + <!-- Yellow from Navit icon background (300 and 700 are the extremes of the gradient, 500 is the average, 900 is the line color) --> + <color name="navitYellow300">#e9cb14</color> + <color name="navitYellow500">#d5a411</color> + <!-- <color name="navitYellow600">#d19b13</color> --> + <color name="navitYellow700">#c17d11</color> + <color name="navitYellow900">#43350f</color> + + <!-- Blue from arrow in Navit icon (500 is the midpoint of the gradient, 300 is the end, 900 is the line color) --> + <color name="navitBlue300">#329eff</color> + <color name="navitBlue500">#1a6cb6</color> + <color name="navitBlue900">#1f3157</color> + +</resources>
\ No newline at end of file diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index 90fcbe5eb..c8578df07 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -25,13 +25,18 @@ import java.io.InputStream; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import android.annotation.TargetApi;
import android.app.Activity;
+import android.app.ActivityManager.TaskDescription;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
@@ -44,9 +49,15 @@ import android.content.SharedPreferences; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.Point;
import android.media.AudioManager;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
@@ -59,6 +70,7 @@ import android.util.Log; import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
@@ -75,6 +87,11 @@ public class Navit extends Activity private NavitActivityResult ActivityResults[];
public static InputMethodManager mgr = null;
public static DisplayMetrics metrics = null;
+ public static int status_bar_height = 0;
+ public static int action_bar_default_height = 0;
+ public static int navigation_bar_height = 0;
+ public static int navigation_bar_height_landscape= 0;
+ public static int navigation_bar_width = 0;
public static Boolean show_soft_keyboard = false;
public static Boolean show_soft_keyboard_now_showing = false;
public static long last_pressed_menu_key = 0L;
@@ -97,7 +114,22 @@ public class Navit extends Activity static final String NAVIT_DATA_SHARE_DIR = NAVIT_DATA_DIR + "/share";
static final String FIRST_STARTUP_FILE = NAVIT_DATA_SHARE_DIR + "/has_run_once.txt";
public static final String NAVIT_PREFS = "NavitPrefs";
+ Boolean isFullscreen = false;
+
+ /**
+ * @brief A Runnable to restore soft input when the user returns to the activity.
+ *
+ * An instance of this class can be passed to the main message queue in the Activity's
+ * {@code onRestore()} method.
+ */
+ private class SoftInputRestorer implements Runnable {
+ public void run() {
+ Navit.this.showNativeKeyboard();
+ }
+ }
+
+
public void removeFileIfExists(String source) {
File file = new File(source);
@@ -246,6 +278,8 @@ public class Navit extends Activity super.onCreate(savedInstanceState);
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ else
+ this.getActionBar().hide();
dialogs = new NavitDialogs(this);
@@ -265,12 +299,30 @@ public class Navit extends Activity // Setup the status bar notification
// This notification is removed in the exit() function
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager
- Notification NavitNotification = new Notification(R.drawable.icon, getString(R.string.notification_ticker), System.currentTimeMillis()); // Create a new notification, with the text string to show when the notification first appears
+ Notification NavitNotification = new Notification(R.drawable.ic_notify, getString(R.string.notification_ticker), System.currentTimeMillis()); // Create a new notification, with the text string to show when the notification first appears
PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0);
- NavitNotification.setLatestEventInfo(getApplicationContext(), "Navit", getString(R.string.notification_event_default), appIntent); // Set the text in the notification
+// FIXME : needs a fix for sdk 23
+// NavitNotification.setLatestEventInfo(getApplicationContext(), "Navit", getString(R.string.notification_event_default), appIntent); // Set the text in the notification
NavitNotification.flags|=Notification.FLAG_ONGOING_EVENT; // Ensure that the notification appears in Ongoing
nm.notify(R.string.app_name, NavitNotification); // Set the notification
+ // Status and navigation bar sizes
+ // These are platform defaults and do not change with rotation, but we have to figure out which ones apply
+ // (is the navigation bar visible? on the side or at the bottom?)
+ Resources resources = getResources();
+ int shid = resources.getIdentifier("status_bar_height", "dimen", "android");
+ int adhid = resources.getIdentifier("action_bar_default_height", "dimen", "android");
+ int nhid = resources.getIdentifier("navigation_bar_height", "dimen", "android");
+ int nhlid = resources.getIdentifier("navigation_bar_height_landscape", "dimen", "android");
+ int nwid = resources.getIdentifier("navigation_bar_width", "dimen", "android");
+ status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0;
+ action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0;
+ navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0;
+ navigation_bar_height_landscape = (nhid > 0) ? resources.getDimensionPixelSize(nhlid) : 0;
+ navigation_bar_width = (nwid > 0) ? resources.getDimensionPixelSize(nwid) : 0;
+ Log.d(TAG, String.format("status_bar_height=%d, action_bar_default_height=%d, navigation_bar_height=%d, navigation_bar_height_landscape=%d, navigation_bar_width=%d",
+ status_bar_height, action_bar_default_height, navigation_bar_height, navigation_bar_height_landscape, navigation_bar_width));
+
// get the local language -------------
Locale locale = java.util.Locale.getDefault();
String lang = locale.getLanguage();
@@ -380,7 +432,13 @@ public class Navit extends Activity public void onResume()
{
super.onResume();
- Log.e("Navit", "OnResume");
+ Log.d("Navit", "OnResume");
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+ /* Required to make system bars fully transparent */
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+ }
//InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// DEBUG
// intent_data = "google.navigation:q=Wien Burggasse 27";
@@ -402,6 +460,26 @@ public class Navit extends Activity Log.e("Navit", "timestamp for navigate_to expired! not using data");
}
}
+ Log.d(TAG, "onResume");
+ if (show_soft_keyboard_now_showing) {
+ /* Calling showNativeKeyboard() directly won't work here, we need to use the message queue */
+ View cf = getCurrentFocus();
+ if (cf == null)
+ Log.e(TAG, "no view in focus, can't get a handler");
+ else
+ cf.getHandler().post(new SoftInputRestorer());
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ Log.d(TAG, "onPause");
+ if (show_soft_keyboard_now_showing) {
+ Log.d(TAG, "onPause:hiding soft input");
+ this.hideNativeKeyboard();
+ show_soft_keyboard_now_showing = true;
+ }
}
private void parseNavigationURI(String schemeSpecificPart) {
@@ -590,7 +668,68 @@ public class Navit extends Activity break;
}
}
+
+
+ /**
+ * @brief Shows the Options menu.
+ *
+ * Calling this method has the same effect as pressing the hardware Menu button, where present, or touching
+ * the overflow button in the Action bar.
+ */
+ public void showMenu() {
+ openOptionsMenu();
+ }
+
+ /**
+ * @brief Shows the native keyboard or other input method.
+ *
+ * @return {@code true} if an input method is going to be displayed, {@code false} if not
+ */
+ public int showNativeKeyboard() {
+ /*
+ * Apologies for the huge mess that this function is, but Android's soft input API is a big
+ * nightmare. Its devs have mercifully given us an option to show or hide the keyboard, but
+ * there is no reliable way to figure out if it is actually showing, let alone how much of the
+ * screen it occupies, so our best bet is guesswork.
+ */
+ Configuration config = getResources().getConfiguration();
+ if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO))
+ /* physical keyboard present, exit */
+ return 0;
+
+ /* Use SHOW_FORCED here, else keyboard won't show in landscape mode */
+ mgr.showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED);
+ show_soft_keyboard_now_showing = true;
+
+ /*
+ * Crude way to estimate the height occupied by the keyboard: for AOSP on KitKat and Lollipop it
+ * is about 62-63% of available screen width (in portrait mode) but no more than slightly above
+ * 46% of height (in landscape mode).
+ */
+ Display display_ = getWindowManager().getDefaultDisplay();
+ int width_ = display_.getWidth();
+ int height_ = display_.getHeight();
+ int maxHeight = height_ * 47 / 100;
+ int inputHeight = width_ * 63 / 100;
+ if (inputHeight > (maxHeight))
+ inputHeight = maxHeight;
+
+ /* the receiver isn't going to fire before the UI thread becomes idle, well after this method returns */
+ Log.d(TAG, "showNativeKeyboard:return (assuming true)");
+ return inputHeight;
+ }
+
+
+ /**
+ * @brief Hides the native keyboard or other input method.
+ */
+ public void hideNativeKeyboard() {
+ mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
+ show_soft_keyboard_now_showing = false;
+ }
+
+
void setDestination(float latitude, float longitude, String address) {
Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS
@@ -690,25 +829,33 @@ public class Navit extends Activity NavitDestroy();
}
- public void fullscreen(int fullscreen)
- {
- if(fullscreen != 0)
- {
+ public void fullscreen(int fullscreen) {
+ int w, h;
+
+ isFullscreen = (fullscreen != 0);
+ if (isFullscreen) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
- this.getActionBar().hide();
}
- else
- {
+ else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
- this.getActionBar().show();
}
+
+ Display display_ = getWindowManager().getDefaultDisplay();
+ if (Build.VERSION.SDK_INT < 17) {
+ w = display_.getWidth();
+ h = display_.getHeight();
+ } else {
+ Point size = new Point();
+ display_.getRealSize(size);
+ w = size.x;
+ h = size.y;
+ }
+ Log.d(TAG, String.format("Toggle fullscreen, w=%d, h=%d", w, h));
+ N_NavitGraphics.handleResize(w, h);
}
-
public void disableSuspend()
{
wl.acquire();
diff --git a/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java b/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java deleted file mode 100644 index 1db76dca8..000000000 --- a/navit/android/src/org/navitproject/navit/NavitAndroidOverlay.java +++ /dev/null @@ -1,239 +0,0 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.RectF;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.view.MotionEvent;
-import android.widget.ImageView;
-
-public class NavitAndroidOverlay extends ImageView implements Runnable
-{
- public Boolean draw_bubble = false;
- public static Boolean confirmed_bubble = false;
- public static long bubble_max_showing_timespan = 8000L; // 8 secs.
-
- public static class NavitAndroidOverlayBubble
- {
- int x;
- int y;
- String text = null;
- }
-
- private NavitAndroidOverlayBubble bubble_001 = null;
-
- public NavitAndroidOverlay(Context context)
- {
- super(context);
- }
-
- public void show_bubble()
- {
- //Log.e("Navit", "NavitAndroidOverlay -> show_bubble");
- if (!this.draw_bubble)
- {
- Handler handler = new Handler();
- handler.postDelayed(this, bubble_max_showing_timespan);
- NavitAndroidOverlay.confirmed_bubble = false;
- this.draw_bubble = true;
- }
- }
-
- public Boolean get_show_bubble()
- {
- return this.draw_bubble;
- }
-
- public void hide_bubble() {
- confirmed_bubble = false;
- draw_bubble = false;
- Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler,
- NavitGraphics.msg_type.CLB_REDRAW.ordinal());
- msg.sendToTarget();
- postInvalidate();
- }
-
- public void set_bubble(NavitAndroidOverlayBubble b)
- {
- this.bubble_001 = b;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event)
- {
- //Log.e("Navit", "NavitAndroidOverlay -> onTouchEvent");
- super.onTouchEvent(event);
-
- int x = (int) event.getX();
- int y = (int) event.getY();
-
- if ((this.draw_bubble) && (!NavitAndroidOverlay.confirmed_bubble))
- {
- // bubble is showing, test if we touch it to confirm destination
- float draw_factor = 1.0f;
- if (Navit.my_display_density.compareTo("mdpi") == 0)
- {
- draw_factor = 1.0f;
- }
- else if (Navit.my_display_density.compareTo("ldpi") == 0)
- {
- draw_factor = 0.7f;
- }
- else if (Navit.my_display_density.compareTo("hdpi") == 0)
- {
- draw_factor = 1.5f;
- }
- int dx = (int) ((20 / 1.5f) * draw_factor);
- int dy = (int) ((-100 / 1.5f) * draw_factor);
- int bubble_size_x = (int) ((150 / 1.5f) * draw_factor);
- int bubble_size_y = (int) ((60 / 1.5f) * draw_factor);
- RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy,
- this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy);
- if (box_rect.contains(x, y))
- {
- // bubble touched to confirm destination
- NavitAndroidOverlay.confirmed_bubble = true;
- // draw confirmed bubble
- this.postInvalidate();
-
- // set destination
- Message msg = Message.obtain(Navit.N_NavitGraphics.callback_handler,
- NavitGraphics.msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal());
-
- Bundle b = new Bundle();
- b.putInt("x", this.bubble_001.x);
- b.putInt("y", this.bubble_001.y);
- msg.setData(b);
- msg.sendToTarget();
-
- // consume the event
- return true;
- }
- }
-
- // false -> we dont use this event, give it to other layers
- return false;
- }
-
- public void onDraw(Canvas c)
- {
- //Log.e("Navit", "NavitAndroidOverlay -> onDraw");
-
- float draw_factor = 1.0f;
- if (Navit.my_display_density.compareTo("mdpi") == 0)
- {
- draw_factor = 1.0f;
- }
- else if (Navit.my_display_density.compareTo("ldpi") == 0)
- {
- draw_factor = 0.7f;
- }
- else if (Navit.my_display_density.compareTo("hdpi") == 0)
- {
- draw_factor = 1.5f;
- }
-
-
- if (this.draw_bubble)
- {
- //Log.e("Navit", "NavitAndroidOverlay -> onDraw -> bubble");
-
- int dx = (int) ((20 / 1.5f) * draw_factor);
- int dy = (int) ((-100 / 1.5f) * draw_factor);
- Paint bubble_paint = new Paint(0);
-
- int bubble_size_x = (int) ((150 / 1.5f) * draw_factor);
- int bubble_size_y = (int) ((60 / 1.5f) * draw_factor);
-
- // yellow-ish funny lines
- int lx = (int) ((15 / 1.5f) * draw_factor);
- int ly = (int) ((15 / 1.5f) * draw_factor);
- bubble_paint.setStyle(Style.FILL);
- bubble_paint.setAntiAlias(true);
- bubble_paint.setStrokeWidth(8 / 1.5f * draw_factor);
- bubble_paint.setColor(Color.parseColor("#FFF8C6"));
- c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly,
- this.bubble_001.x, this.bubble_001.y, bubble_paint);
- c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y,
- this.bubble_001.x, this.bubble_001.y, bubble_paint);
-
- // draw black funny lines to target
- bubble_paint.setStyle(Style.STROKE);
- bubble_paint.setAntiAlias(true);
- bubble_paint.setStrokeWidth(3);
- bubble_paint.setColor(Color.parseColor("#000000"));
- c.drawLine(this.bubble_001.x + dx, this.bubble_001.y + dy + bubble_size_y - ly,
- this.bubble_001.x, this.bubble_001.y, bubble_paint);
- c.drawLine(this.bubble_001.x + dx + lx, this.bubble_001.y + dy + bubble_size_y,
- this.bubble_001.x, this.bubble_001.y, bubble_paint);
-
-
- // filled rect yellow-ish
- bubble_paint.setStyle(Style.FILL);
- bubble_paint.setStrokeWidth(0);
- bubble_paint.setAntiAlias(false);
- bubble_paint.setColor(Color.parseColor("#FFF8C6"));
- RectF box_rect = new RectF(this.bubble_001.x + dx, this.bubble_001.y + dy,
- this.bubble_001.x + bubble_size_x + dx, this.bubble_001.y + bubble_size_y + dy);
- int rx = (int) (20 / 1.5f * draw_factor);
- int ry = (int) (20 / 1.5f * draw_factor);
- c.drawRoundRect(box_rect, rx, ry, bubble_paint);
-
- if (NavitAndroidOverlay.confirmed_bubble)
- {
- // filled red rect (for confirmed bubble)
- //bubble_paint.setStyle(Style.FILL);
- //bubble_paint.setStrokeWidth(0);
- //bubble_paint.setAntiAlias(false);
- bubble_paint.setColor(Color.parseColor("#EC294D"));
- c.drawRoundRect(box_rect, rx, ry, bubble_paint);
- }
-
- // black outlined rect
- bubble_paint.setStyle(Style.STROKE);
- bubble_paint.setStrokeWidth(3);
- bubble_paint.setAntiAlias(true);
- bubble_paint.setColor(Color.parseColor("#000000"));
- c.drawRoundRect(box_rect, rx, ry, bubble_paint);
-
- int inner_dx = (int) (30 / 1.5f * draw_factor);
- int inner_dy = (int) (36 / 1.5f * draw_factor);
- bubble_paint.setAntiAlias(true);
- bubble_paint.setStyle(Style.FILL);
- bubble_paint.setTextSize((int) (20 / 1.5f * draw_factor));
- bubble_paint.setStrokeWidth(3);
- bubble_paint.setColor(Color.parseColor("#3b3131"));
- c.drawText(Navit._("Route to here"), this.bubble_001.x + dx + inner_dx,
- this.bubble_001.y + dy + inner_dy, bubble_paint);
-
- }
- }
-
- public void run() {
- hide_bubble();
- }
-}
diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java index 728b49878..a41ab52be 100644 --- a/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -25,23 +25,31 @@ import java.util.ArrayList; import android.app.Activity; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; +import android.os.Build; import android.os.Handler; import android.os.Message; import android.util.FloatMath; import android.util.Log; import android.view.ContextMenu; +import android.view.Gravity; import android.view.KeyEvent; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup.LayoutParams; import android.view.inputmethod.InputMethodManager; +import android.widget.FrameLayout; import android.widget.RelativeLayout; @@ -55,8 +63,12 @@ public class NavitGraphics int pos_y; int pos_wraparound; int overlay_disabled; + int bgcolor; float trackball_x, trackball_y; View view; + SystemBarTintView navigationTintView; + SystemBarTintView statusTintView; + FrameLayout frameLayout; RelativeLayout relativelayout; NavitCamera camera; Activity activity; @@ -68,6 +80,14 @@ public class NavitGraphics private static long interval_for_long_press = 200L; private Handler timer_handler = new Handler(); + + public void setBackgroundColor(int bgcolor) { + this.bgcolor = bgcolor; + if (navigationTintView != null) + navigationTintView.setBackgroundColor(bgcolor); + if (statusTintView != null) + statusTintView.setBackgroundColor(bgcolor); + } public void SetCamera(int use_camera) { @@ -197,11 +217,8 @@ public class NavitGraphics Log.e("Navit", "NavitGraphics -> onSizeChanged scaledDensity=" + Navit.metrics.scaledDensity); super.onSizeChanged(w, h, oldw, oldh); - draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - draw_canvas = new Canvas(draw_bitmap); - bitmap_w = w; - bitmap_h = h; - SizeChangedCallback(SizeChangedCallbackID, w, h); + + handleResize(w, h); } public void do_longpress_action() @@ -352,7 +369,7 @@ public class NavitGraphics { float x = a.x - b.x; float y = a.y - b.y; - return FloatMath.sqrt(x * x + y * y); + return (float)Math.sqrt(x * x + y * y); } private PointF getFloatValue(Object instance, Object argument) @@ -685,6 +702,15 @@ public class NavitGraphics } + private class SystemBarTintView extends View { + + public SystemBarTintView(Context context) { + super(context); + this.setBackgroundColor(bgcolor); + } + + } + public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, int wraparound, int use_camera) { @@ -704,7 +730,22 @@ public class NavitGraphics } relativelayout.addView(view); + /* The navigational and status bar tinting code is meaningful only on API19+ */ + if(Build.VERSION.SDK_INT >= 19) + { + frameLayout = new FrameLayout(activity); + frameLayout.addView(relativelayout); + navigationTintView = new SystemBarTintView(activity); + statusTintView = new SystemBarTintView(activity); + frameLayout.addView(navigationTintView); + frameLayout.addView(statusTintView); + activity.setContentView(frameLayout); + } + else + { activity.setContentView(relativelayout); + } + view.requestFocus(); } else @@ -781,6 +822,7 @@ public class NavitGraphics }; public native void SizeChangedCallback(int id, int x, int y); + public native void PaddingChangedCallback(int id, int left, int right, int top, int bottom); public native void KeypressCallback(int id, String s); public native int CallbackMessageChannel(int i, String s); public native void ButtonCallback(int id, int pressed, int button, int x, int y); @@ -789,13 +831,144 @@ public class NavitGraphics public static native String[][] GetAllCountries(); private Canvas draw_canvas; private Bitmap draw_bitmap; - private int SizeChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; + private int SizeChangedCallbackID, PaddingChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; // private int count; + + /** + * @brief Adjust views used to tint navigation and status bars. + * + * This method is called from handleResize. + * + * It (re-)evaluates if and where the navigation bar is going to be shown, and calculates the + * padding for objects which should not be obstructed. + * + */ + private void adjustSystemBarsTintingViews() { + + /* frameLayout is only created on platforms supporting navigation and status bar tinting */ + if (frameLayout == null) + return; + + if (!(activity instanceof Navit)) { + Log.e("NavitGraphics", "Main Activity is not a Navit instance, cannot update padding"); + return; + } + + Navit navit = (Navit) activity; + + /* + * Determine visibility of status bar. + * The status bar is always visible unless we are in fullscreen mode. + */ + final Boolean isStatusShowing = !navit.isFullscreen; + + /* + * Determine visibility of navigation bar. + * This logic is based on the presence of a hardware menu button and is known to work on + * devices which allow switching between hw and sw buttons (OnePlus One running CyanogenMod). + */ + final Boolean isNavShowing = !ViewConfiguration.get(navit.getApplication()).hasPermanentMenuKey(); + Log.d("NavitGraphics", String.format("isStatusShowing=%b isNavShowing=%b", isStatusShowing, isNavShowing)); + + /* + * Determine where the navigation bar would be displayed. + * Logic is taken from AOSP RenderSessionImpl.findNavigationBar() + * (platform/frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java) + */ + final Boolean isLandscape = (navit.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); + final Boolean isNavAtBottom = (!isLandscape) || (navit.getResources().getConfiguration().smallestScreenWidthDp >= 600); + Log.d("NavitGraphics", String.format("isNavAtBottom=%b (Configuration.smallestScreenWidthDp=%d, isLandscape=%b)", + isNavAtBottom, navit.getResources().getConfiguration().smallestScreenWidthDp, isLandscape)); + + int left = 0; + int top = isStatusShowing ? Navit.status_bar_height : 0; + int right = (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0; + final int bottom = (!(isNavShowing && isNavAtBottom)) ? 0 : isLandscape ? Navit.navigation_bar_height_landscape : Navit.navigation_bar_height; + + /* hide tint bars during update to prevent ugly effects */ + statusTintView.setVisibility(View.GONE); + navigationTintView.setVisibility(View.GONE); + frameLayout.post(new Runnable() { + @Override + public void run() { + statusTintView.setVisibility(isStatusShowing ? View.VISIBLE : View.GONE); + FrameLayout.LayoutParams statusLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, Navit.status_bar_height, Gravity.TOP); + + /* Prevent tint views from overlapping when navigation is on the right */ + statusLayoutParams.setMargins(0, 0, (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0, 0); + statusTintView.setLayoutParams(statusLayoutParams); + Log.d("NavitGraphics", String.format("statusTintView: width=%d height=%d", + statusTintView.getWidth(), statusTintView.getHeight())); + navigationTintView.setVisibility(isNavShowing ? View.VISIBLE : View.GONE); + LayoutParams navigationLayoutParams = new FrameLayout.LayoutParams( + isNavAtBottom ? LayoutParams.MATCH_PARENT : Navit.navigation_bar_width, // X + isNavAtBottom ? bottom : LayoutParams.MATCH_PARENT, // Y + Gravity.BOTTOM | Gravity.RIGHT); + navigationTintView.setLayoutParams(navigationLayoutParams); + Log.d("NavitGraphics", String.format("navigationTintView: width=%d height=%d", + navigationTintView.getWidth(), navigationTintView.getHeight())); + } + }); + + Log.d("NavitGraphics", String.format("Padding left=%d top=%d right=%d bottom=%d", left, top, right, bottom)); + + PaddingChangedCallback(PaddingChangedCallbackID, left, top, right, bottom); + } + + /** + * @brief Handles resize events. + * + * This method is called whenever the main View is resized in any way. This is the case when its + * {@code onSizeChanged()} event handler fires or when toggling Fullscreen mode. + * + */ + public void handleResize(int w, int h) { + if (this.parent_graphics != null) + this.parent_graphics.handleResize(w, h); + else { + Log.d("NavitGraphics", String.format("handleResize w=%d h=%d", w, h)); + + adjustSystemBarsTintingViews(); + + draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + draw_canvas = new Canvas(draw_bitmap); + bitmap_w = w; + bitmap_h = h; + SizeChangedCallback(SizeChangedCallbackID, w, h); + } + } + + /** + * @brief Returns whether the device has a hardware menu button. + * + * Only Android versions starting with ICS (API version 14) support the API call to detect the presence of a + * Menu button. On earlier Android versions, the following assumptions will be made: On API levels up to 10, + * this method will always return {@code true}, as these Android versions relied on devices having a physical + * Menu button. On API levels 11 through 13 (Honeycomb releases), this method will always return + * {@code false}, as Honeycomb was a tablet-only release and did not require devices to have a Menu button. + * + * Note that this method is not aware of non-standard mechanisms on some customized builds of Android. For + * example, CyanogenMod has an option to add a menu button to the navigation bar. Even with that option, + * this method will still return `false`. + */ + public boolean hasMenuButton() { + if (Build.VERSION.SDK_INT <= 10) + return true; + else if (Build.VERSION.SDK_INT <= 13) + return false; + else + return ViewConfiguration.get(activity.getApplication()).hasPermanentMenuKey(); + } + public void setSizeChangedCallback(int id) { SizeChangedCallbackID = id; } + public void setPaddingChangedCallback(int id) + { + PaddingChangedCallbackID = id; + } public void setButtonCallback(int id) { ButtonCallbackID = id; @@ -921,7 +1094,7 @@ public class NavitGraphics //Log.e("NavitGraphics","draw_image"); // float fx = x; // float fy = y; - draw_canvas.drawBitmap(bitmap, x, y, paint); + draw_canvas.drawBitmap(bitmap, x, y, null); } /* takes an image and draws it on the screen as a prerendered maptile diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics2.java b/navit/android/src/org/navitproject/navit/NavitGraphics2.java deleted file mode 100644 index ee7b72cce..000000000 --- a/navit/android/src/org/navitproject/navit/NavitGraphics2.java +++ /dev/null @@ -1,404 +0,0 @@ -/** - * Navit, a modular navigation system. - * Copyright (C) 2005-2008 Navit Team - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -package org.navitproject.navit; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; -import java.util.ArrayList; - -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - -import android.app.Activity; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Rect; -import android.opengl.GLSurfaceView; -import android.opengl.GLU; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.widget.RelativeLayout; - - - -class ClearRenderer implements GLSurfaceView.Renderer { - public FloatBuffer flb[]; - public int flb_len; - boolean busy; - public void onSurfaceCreated(GL10 gl, EGLConfig config) { - // Do nothing special. - } - - public void onSurfaceChanged(GL10 gl, int w, int h) { - gl.glViewport(0, 0, w, h); - } - protected static FloatBuffer makeFloatBuffer(float[] arr) { - ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4); - bb.order(ByteOrder.nativeOrder()); - FloatBuffer fb = bb.asFloatBuffer(); - fb.put(arr); - fb.position(0); - return fb; - } - - - - public void onDrawFrame(GL10 gl) { - if (busy) { - return; - } - -gl.glClearColor(1.0f, 1.0f, 0.2f, 0.0f); - gl.glMatrixMode(GL10.GL_PROJECTION); - gl.glLoadIdentity(); - //GLU.gluOrtho2D(gl, 0.0f,1.3f,0.0f,1.0f); - GLU.gluOrtho2D(gl, 0.0f,320.0f,480.0f,0.0f); - - - gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); -gl.glShadeModel(GL10.GL_SMOOTH); - - gl.glMatrixMode(GL10.GL_MODELVIEW); - gl.glLoadIdentity(); - - - gl.glColor4f(0.25f, 0.25f, 0.75f, 1.0f); - //gl.glTranslatef(0f, 1f, 0.0f); - //gl.glScalef(1.0f/320, -1.0f/480, 0.001f); - //gl.glRotatef(0, 0, 1, 0); - - - Log.e("navit", "flb_len "+flb_len); - for (int i = 0 ; i < flb_len ; i++) { - if (flb[i] != null) { - gl.glVertexPointer(3, GL10.GL_FLOAT, 0, flb[i]); - gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); - gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, flb[i].capacity()/3); - } - } -// FloatBuffer buf=makeFloatBuffer(square); -// gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buf); -// gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); -// Log.e("navit", "capacity "+buf.capacity()); -// gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, buf.capacity()/3); - } -} - -public class NavitGraphics2 { - private NavitGraphics2 parent_graphics; - private ArrayList<NavitGraphics2> overlays=new ArrayList<NavitGraphics2>(); - int bitmap_w; - int bitmap_h; - int pos_x; - int pos_y; - int pos_wraparound; - int overlay_disabled; - float trackball_x,trackball_y; - GLSurfaceView view; - FloatBuffer[] flb; - - RelativeLayout relativelayout; - NavitCamera camera; - Activity activity; - ClearRenderer renderer; - - public void - SetCamera(int use_camera) - { - if (use_camera != 0 && camera == null) { - // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); - camera=new NavitCamera(activity); - relativelayout.addView(camera); - relativelayout.bringChildToFront(view); - } - } - public NavitGraphics2(Activity activity, NavitGraphics2 parent, int x, int y, int w, int h, int alpha, int wraparound, int use_camera) { - if (parent == null) { - this.activity=activity; - flb=new FloatBuffer[10000]; - view=new GLSurfaceView(activity) { - @Override protected void onDraw(Canvas canvas) - { - super.onDraw(canvas); - canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); - if (overlay_disabled == 0) { - Object overlays_array[]; - overlays_array=overlays.toArray(); - for (Object overlay : overlays_array) { - NavitGraphics2 overlay_graphics=(NavitGraphics2)overlay; - if (overlay_graphics.overlay_disabled == 0) { - int x=overlay_graphics.pos_x; - int y=overlay_graphics.pos_y; - if (overlay_graphics.pos_wraparound != 0 && x < 0) - x+=bitmap_w; - if (overlay_graphics.pos_wraparound != 0 && y < 0) - y+=bitmap_h; - canvas.drawBitmap(overlay_graphics.draw_bitmap, x, y, null); - } - } - } - } - @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) - { - super.onSizeChanged(w, h, oldw, oldh); - draw_bitmap=Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - draw_canvas=new Canvas(draw_bitmap); - bitmap_w=w; - bitmap_h=h; - SizeChangedCallback(SizeChangedCallbackID, w, h); - } - @Override public boolean onTouchEvent(MotionEvent event) - { - super.onTouchEvent(event); - int action = event.getAction(); - int x=(int)event.getX(); - int y=(int)event.getY(); - if (action == MotionEvent.ACTION_DOWN) { - // Log.e("NavitGraphics", "onTouch down"); - ButtonCallback(ButtonCallbackID, 1, 1, x, y); - } - if (action == MotionEvent.ACTION_UP) { - // Log.e("NavitGraphics", "onTouch up"); - ButtonCallback(ButtonCallbackID, 0, 1, x, y); - // if (++count == 3) - // Debug.stopMethodTracing(); - } - if (action == MotionEvent.ACTION_MOVE) { - // Log.e("NavitGraphics", "onTouch move"); - MotionCallback(MotionCallbackID, x, y); - } - return true; - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) - { - int i; - String s=null; - boolean handled=true; - i=event.getUnicodeChar(); - Log.e("NavitGraphics","onKeyDown "+keyCode+" "+i); - // Log.e("NavitGraphics","Unicode "+event.getUnicodeChar()); - if (i == 0) { - if (keyCode == android.view.KeyEvent.KEYCODE_DEL) { - s=java.lang.String.valueOf((char)8); - } else if (keyCode == android.view.KeyEvent.KEYCODE_MENU) { - s=java.lang.String.valueOf((char)1); - } else if (keyCode == android.view.KeyEvent.KEYCODE_SEARCH) { - s=java.lang.String.valueOf((char)19); - } else if (keyCode == android.view.KeyEvent.KEYCODE_BACK) { - s=java.lang.String.valueOf((char)27); - } else if (keyCode == android.view.KeyEvent.KEYCODE_CALL) { - s=java.lang.String.valueOf((char)3); - } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_UP) { - s=java.lang.String.valueOf((char)21); - handled=false; - } else if (keyCode == android.view.KeyEvent.KEYCODE_VOLUME_DOWN) { - s=java.lang.String.valueOf((char)4); - handled=false; - } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_CENTER) { - s=java.lang.String.valueOf((char)13); - } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_DOWN) { - s=java.lang.String.valueOf((char)16); - } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_LEFT) { - s=java.lang.String.valueOf((char)2); - } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_RIGHT) { - s=java.lang.String.valueOf((char)6); - } else if (keyCode == android.view.KeyEvent.KEYCODE_DPAD_UP) { - s=java.lang.String.valueOf((char)14); - } - } else if (i == 10) { - s=java.lang.String.valueOf((char)13); - } else { - s=java.lang.String.valueOf((char)i); - } - if (s != null) { - KeypressCallback(KeypressCallbackID, s); - } - return handled; - } - @Override public boolean onKeyUp(int keyCode, KeyEvent event) - { - Log.e("NavitGraphics","onKeyUp "+keyCode); - return true; - } - @Override public boolean onTrackballEvent(MotionEvent event) - { - Log.e("NavitGraphics","onTrackball "+event.getAction() + " " +event.getX()+" "+event.getY()); - String s=null; - if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) { - s=java.lang.String.valueOf((char)13); - } - if (event.getAction() == android.view.MotionEvent.ACTION_MOVE) { - trackball_x+=event.getX(); - trackball_y+=event.getY(); - Log.e("NavitGraphics","trackball "+trackball_x+" "+trackball_y); - if (trackball_x <= -1) { - s=java.lang.String.valueOf((char)2); - trackball_x+=1; - } - if (trackball_x >= 1) { - s=java.lang.String.valueOf((char)6); - trackball_x-=1; - } - if (trackball_y <= -1) { - s=java.lang.String.valueOf((char)16); - trackball_y+=1; - } - if (trackball_y >= 1) { - s=java.lang.String.valueOf((char)14); - trackball_y-=1; - } - } - if (s != null) { - KeypressCallback(KeypressCallbackID, s); - } - return true; - } - @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) - { - super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - Log.e("NavitGraphics","FocusChange "+gainFocus); - } - }; - view.setFocusable(true); - view.setFocusableInTouchMode(true); - renderer=new ClearRenderer(); - renderer.flb=new FloatBuffer[1000]; - renderer.flb_len=0; - view.setRenderer(renderer); - view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); - relativelayout=new RelativeLayout(activity); - if (use_camera != 0) { - SetCamera(use_camera); - } - relativelayout.addView(view); - activity.setContentView(relativelayout); - view.requestFocus(); - } else { - draw_bitmap=Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - bitmap_w=w; - bitmap_h=h; - pos_x=x; - pos_y=y; - pos_wraparound=wraparound; - draw_canvas=new Canvas(draw_bitmap); - parent.overlays.add(this); - } - parent_graphics=parent; - } - public native void SizeChangedCallback(int id, int x, int y); - public native void ButtonCallback(int id, int pressed, int button, int x, int y); - public native void MotionCallback(int id, int x, int y); - public native void KeypressCallback(int id, String s); - private Canvas draw_canvas; - private Bitmap draw_bitmap; - private int SizeChangedCallbackID,ButtonCallbackID,MotionCallbackID,KeypressCallbackID; - // private int count; - - public void setSizeChangedCallback(int id) - { - SizeChangedCallbackID=id; - } - public void setButtonCallback(int id) - { - ButtonCallbackID=id; - } - public void setMotionCallback(int id) - { - MotionCallbackID=id; - } - public void setKeypressCallback(int id) - { - KeypressCallbackID=id; - } - - protected void draw_polyline(Paint paint,int c[]) - { - } - - protected void draw_polygon(Paint paint,int c[]) - { - //float[] square = new float[] { -0.25f, -0.25f, 0.0f, - // 0.25f, -0.25f, 0.0f, - // -0.25f, 0.25f, 0.0f, - // 0.25f, 0.25f, 0.0f }; - int len=c.length/2; - float[] square = new float[3*len]; - for (int i = 0 ; i < len ; i++) { - square[i*3]=c[i*2]; - square[i*3+1]=c[i*2+1]; - square[i*3+2]=0; - } -// if (renderer.flb_len < 100) { -// renderer.flb[renderer.flb_len++]=ClearRenderer.makeFloatBuffer(square); -// } - if (renderer!=null && renderer.flb_len < 1000) { - renderer.flb[renderer.flb_len++]=ClearRenderer.makeFloatBuffer(square); - //renderer.flb_len=1; - } - - } - protected void draw_rectangle(Paint paint,int x, int y, int w, int h) - { - } - protected void draw_circle(Paint paint,int x, int y, int r) - { - } - protected void draw_text(Paint paint,int x, int y, String text, int size, int dx, int dy) - { - } - protected void draw_image(Paint paint, int x, int y, Bitmap bitmap) - { - } - protected void draw_mode(int mode) - { - Log.e("navit", "draw_mode "+mode); - if (mode == 2 && parent_graphics == null) { - view.draw(draw_canvas); - view.invalidate(); - view.requestRender(); - } - if (mode == 1 || (mode == 0 && parent_graphics != null)) { - if (renderer!=null) { - renderer.flb_len=0; - } - draw_bitmap.eraseColor(0); - } - if (mode == 0 && renderer != null) { - renderer.flb_len=0; - } - } - protected void draw_drag(int x, int y) - { - pos_x=x; - pos_y=y; - } - protected void overlay_disable(int disable) - { - overlay_disabled=disable; - } - protected void overlay_resize(int x, int y, int w, int h, int alpha, int wraparond) - { - pos_x=x; - pos_y=y; - } -} diff --git a/navit/attr.c b/navit/attr.c index 2ae4cec65..24b6cbe6a 100644 --- a/navit/attr.c +++ b/navit/attr.c @@ -835,7 +835,8 @@ attr_free_content_do(struct attr *attr) obj->func->unref(obj); } if (!(attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) && - !(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end)) + !(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) && + attr->type != attr_item_type) g_free(attr->u.data); } @@ -860,6 +861,8 @@ attr_dup_content(struct attr *src, struct attr *dst) dst->type=src->type; if (src->type >= attr_type_int_begin && src->type <= attr_type_int_end) dst->u.num=src->u.num; + else if (src->type == attr_item_type) + dst->u.item_type=src->u.item_type; else if (src->type >= attr_type_object_begin && src->type <= attr_type_object_end) { if (HAS_OBJECT_FUNC(src->type)) { struct navit_object *obj=src->u.data; diff --git a/navit/attr.h b/navit/attr.h index 27b37be60..4884ea95b 100644 --- a/navit/attr.h +++ b/navit/attr.h @@ -73,6 +73,7 @@ enum attr_format { #define AF_UNPAVED (1<<12) #define AF_FORD (1<<13) #define AF_UNDERGROUND (1<<14) +#define AF_HIGH_OCCUPANCY_CAR_ONLY (1<<18) #define AF_DANGEROUS_GOODS (1<<19) #define AF_EMERGENCY_VEHICLES (1<<20) #define AF_TRANSPORT_TRUCK (1<<21) diff --git a/navit/attr_def.h b/navit/attr_def.h index d5647f2f1..b3f77163b 100644 --- a/navit/attr_def.h +++ b/navit/attr_def.h @@ -253,6 +253,7 @@ ATTR(persistent) ATTR(waypoints_flag) /* toggle for "set as destination" to switch between start a new route or add */ ATTR(no_warning_if_map_file_missing) ATTR(duplicate) +ATTR(has_menu_button) ATTR2(0x0002ffff,type_int_end) ATTR2(0x00030000,type_string_begin) ATTR(type) diff --git a/navit/cache.c b/navit/cache.c index f1315cd9e..180b165c0 100644 --- a/navit/cache.c +++ b/navit/cache.c @@ -8,7 +8,7 @@ struct cache_entry { int usage; - int size; + unsigned int size; struct cache_entry_list *where; struct cache_entry *next; struct cache_entry *prev; @@ -24,8 +24,8 @@ struct cache { struct cache_entry_list t1,b1,t2,b2,*insert; int size,id_size,entry_size; int t1_target; - int misses; - int hits; + unsigned int misses; + unsigned int hits; GHashTable *hash; }; diff --git a/navit/command.c b/navit/command.c index 5b8aac910..4208c575c 100644 --- a/navit/command.c +++ b/navit/command.c @@ -917,7 +917,7 @@ command_call_function(struct context *ctx, struct result *res) callback_list_call_attr_4(cbl.u.callback_list, attr_command, function, list, &out, &valid); if (valid!=1){ dbg(lvl_error, "invalid command ignored: \"%s\"; see http://wiki.navit-project.org/index.php/" - "The_Navit_Command_Interface for valid commands.\n", function); + "OSD#Navit_commands for valid commands.\n", function); } if (out && out[0]) { result_free(res); diff --git a/navit/country.c b/navit/country.c index 52f471e17..7d13e69e7 100644 --- a/navit/country.c +++ b/navit/country.c @@ -362,9 +362,10 @@ country_search_new(struct attr *search, int partial) { struct country_search *ret=g_new(struct country_search, 1); ret->search=*search; - ret->search.u.str=linguistics_casefold(ret->search.u.str); - if (search->type != attr_country_id) + if (search->type != attr_country_id) { + ret->search.u.str=linguistics_casefold(ret->search.u.str); ret->len=strlen(ret->search.u.str); + } else ret->len=0; ret->partial=partial; diff --git a/navit/event.c b/navit/event.c index 96d2e0dd8..667e5bdc3 100644 --- a/navit/event.c +++ b/navit/event.c @@ -129,7 +129,7 @@ event_request_system(const char *system, const char *requestor) } return 1; } - event_type_new=plugin_get_event_type(system); + event_type_new=plugin_get_category_event(system); if (! event_type_new) { dbg(lvl_error,"unsupported event system '%s' requested from '%s'\n", system, requestor); return 0; diff --git a/navit/event_glib.c b/navit/event_glib.c index 9ffb12cbc..e9bad6c40 100644 --- a/navit/event_glib.c +++ b/navit/event_glib.c @@ -196,5 +196,5 @@ event_glib_new(struct event_methods *meth) void event_glib_init(void) { - plugin_register_event_type("glib", event_glib_new); + plugin_register_category_event("glib", event_glib_new); } diff --git a/navit/font/freetype/font_freetype.c b/navit/font/freetype/font_freetype.c index f41eff314..0508c5870 100644 --- a/navit/font/freetype/font_freetype.c +++ b/navit/font/freetype/font_freetype.c @@ -658,7 +658,7 @@ font_freetype_new(void *meth) void plugin_init(void) { - plugin_register_font_type("freetype", font_freetype_new); + plugin_register_category_font("freetype", font_freetype_new); #ifdef HAVE_FONTCONFIG FcInit(); #endif diff --git a/navit/graphics.c b/navit/graphics.c index 97b1c0f69..7680d96ce 100644 --- a/navit/graphics.c +++ b/navit/graphics.c @@ -274,7 +274,7 @@ struct graphics * graphics_new(struct attr *parent, struct attr **attrs) return NULL; } - graphicstype_new=plugin_get_graphics_type(type_attr->u.str); + graphicstype_new=plugin_get_category_graphics(type_attr->u.str); if (! graphicstype_new) { dbg(lvl_error,"Failed to load graphics plugin %s.\n", type_attr->u.str); return NULL; @@ -654,11 +654,12 @@ void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsig } /** - * Create a new image from file path scaled to w and h pixels + * @brief Create a new image from file path, optionally scaled to w and h pixels. + * * @param gra the graphics instance * @param path path of the image to load - * @param w width to rescale to - * @param h height to rescale to + * @param w width to rescale to, or IMAGE_W_H_UNSET for original width + * @param h height to rescale to, or IMAGE_W_H_UNSET for original height * @returns <> * @author Martin Schaller (04/2008) */ @@ -684,7 +685,7 @@ image_new_helper(struct graphics *gra, struct graphics_image *this_, char *path, case 1: /* The best variant both for cpu usage and quality would be prescaled png of a needed size */ mode++; - if (width != -1 && height != -1) { + if (width != IMAGE_W_H_UNSET && height != IMAGE_W_H_UNSET) { new_name=g_strdup_printf("%s_%d_%d.png", name, width, height); } break; @@ -782,12 +783,13 @@ image_new_helper(struct graphics *gra, struct graphics_image *this_, char *path, } /** - * Create a new image from file path scaled to w and h pixels and possibly rotated + * @brief Create a new image from file path, optionally scaled to w and h pixels and rotated. + * * @param gra the graphics instance * @param path path of the image to load - * @param w width to rescale to - * @param h height to rescale to - * @param rotate angle to rotate the image. Warning, graphics might only support 90 degree steps here + * @param w width to rescale to, or IMAGE_W_H_UNSET for original width + * @param h height to rescale to, or IMAGE_W_H_UNSET for original height + * @param rotate angle to rotate the image, in 90 degree steps (not supported by all plugins). * @returns <> * @author Martin Schaller (04/2008) */ @@ -818,7 +820,7 @@ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, char *pathi=paths[i]; int len=strlen(pathi); int i,k; - int newwidth=-1, newheight=-1; + int newwidth=IMAGE_W_H_UNSET, newheight=IMAGE_W_H_UNSET; ext=g_utf8_strrchr(pathi,-1,'.'); i=pathi-ext+len; @@ -855,8 +857,8 @@ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, } if(k==1 || s<=pathi || *s!='_') { - newwidth=-1; - newheight=-1; + newwidth=IMAGE_W_H_UNSET; + newheight=IMAGE_W_H_UNSET; if(ext) s=ext; else @@ -865,15 +867,12 @@ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, } /* If exact h and w values were given as function parameters, they take precedence over values guessed from the image name */ - if(w!=-1) + if(w!=IMAGE_W_H_UNSET) newwidth=w; - if(h!=-1) + if(h!=IMAGE_W_H_UNSET) newheight=h; name=g_strndup(pathi,s-pathi); -#if 0 - if (!strstr(name,"test.zip")) -#endif image_new_helper(gra, this_, pathi, name, newwidth, newheight, rotate, 0); if (!this_->priv && strstr(pathi, ".zip/")) image_new_helper(gra, this_, pathi, name, newwidth, newheight, rotate, 1); @@ -902,7 +901,7 @@ struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, */ struct graphics_image * graphics_image_new(struct graphics *gra, char *path) { - return graphics_image_new_scaled_rotated(gra, path, -1, -1, 0); + return graphics_image_new_scaled_rotated(gra, path, IMAGE_W_H_UNSET, IMAGE_W_H_UNSET, 0); } /** @@ -1071,59 +1070,94 @@ graphics_background_gc(struct graphics *this_, struct graphics_gc *gc) this_->meth.background_gc(this_->priv, gc ? gc->priv : NULL); } -#include "attr.h" -#include "popup.h" -#include <stdio.h> - -#if 0 -//############################################################################################################## -//# Description: -//# Comment: -//# Authors: Martin Schaller (04/2008) -//############################################################################################################## -static void popup_view_html(struct popup_item *item, char *file) -{ - char command[1024]; - sprintf(command,"firefox %s", file); - system(command); +/** + * @brief Shows the native on-screen keyboard or other input method + * + * This method is a wrapper around the respective method of the graphics plugin. + * + * The caller should populate the {@code kbd} argument with appropriate {@code mode} and {@code lang} + * members so the graphics plugin can determine the best matching layout. + * + * If an input method is shown, the graphics plugin should try to select the configuration which best + * matches the specified {@code mode}. For example, if {@code mode} specifies a numeric layout, the + * graphics plugin should select a numeric keyboard layout (if available), or the equivalent for another + * input method (such as setting stroke recognition to identify strokes as numbers). Likewise, when an + * alphanumeric-uppercase mode is requested, it should switch to uppercase input. + * + * Implementations should, however, consider that Navit's internal keyboard allows the user to switch + * modes at will (the only exception being degree mode) and thus must not "lock" the user into a limited + * layout with no means to switch to a general-purpose one. For example, house number entry in an + * address search dialog may default to numeric mode, but since some house numbers may contain + * non-numeric characters, a pure numeric keyboard is suitable only if the user has the option to switch + * to an alphanumeric layout. + * + * When multiple alphanumeric layouts are available, the graphics plugin should use the {@code lang} + * argument to determine the best layout. + * + * When selecting an input method, preference should always be given to the default or last selected + * input method and configuration if it matches the requested {@code mode} and {@code lang}. + * + * If the native input method is going to obstruct parts of Navit's UI, the graphics plugin should set + * {@code kbd->w} and {@code kbd->h} to the height and width to the appropriate value in pixels. A value + * of -1 indicates that the input method fills the entire available width or height of the space + * available to Navit. On windowed platforms, where the on-screen input method and Navit's window may be + * moved relative to each other as needed and can be displayed alongside each other, the graphics plugin + * should report 0 for both dimensions. + * + * @param this_ The graphics instance + * @param kbd The keyboard instance + * + * @return 1 if the native keyboard is going to be displayed, 0 if not, -1 if the method is not + * supported by the plugin + */ +int graphics_show_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd) { + int ret; + if (!this_->meth.show_native_keyboard) + ret = -1; + else + ret = this_->meth.show_native_keyboard(kbd); + dbg(lvl_debug, "return %d\n", ret); + return ret; } -struct transformatin *tg; -enum projection pg; -//############################################################################################################## -//# Description: -//# Comment: -//# Authors: Martin Schaller (04/2008) -//############################################################################################################## -static void graphics_popup(struct display_list *list, struct popup_item **popup) -{ - struct item *item; - struct attr attr; - struct map_rect *mr; - struct coord c; - struct popup_item *curr_item,*last=NULL; - item=list->data; - mr=map_rect_new(item->map, NULL, NULL, 0); - printf("id hi=0x%x lo=0x%x\n", item->id_hi, item->id_lo); - item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); - if (item) { - if (item_attr_get(item, attr_name, &attr)) { - curr_item=popup_item_new_text(popup,attr.u.str,1); - if (item_attr_get(item, attr_info_html, &attr)) { - popup_item_new_func(&last,"HTML Info",1, popup_view_html, g_strdup(attr.u.str)); - } - if (item_attr_get(item, attr_price_html, &attr)) { - popup_item_new_func(&last,"HTML Preis",2, popup_view_html, g_strdup(attr.u.str)); - } - curr_item->submenu=last; - } - } - map_rect_destroy(mr); +/** + * @brief Hides the native on-screen keyboard or other input method + * + * This method is a wrapper around the respective method of the graphics plugin. + * + * A call to this function indicates that Navit no longer needs the input method and is about to reclaim + * any screen real estate it may have previously reserved for the input method. + * + * On platforms that don't support overlapping windows this means that the on-screen input method should + * be hidden, as it may otherwise obstruct parts of Navit's UI. + * + * On windowed platforms, where on-screen input methods can be displayed alongside Navit or moved around + * as needed, the graphics driver should instead notify the on-screen method that it is no longer + * expecting user input, allowing the input method to take the appropriate action. + * + * The graphics plugin must free any data it has stored in {@code kbd->gra_priv} and reset the pointer + * to {@code NULL} to indicate it has done so. + * + * The caller may free {@code kbd} after this function returns. + * + * @param this The graphics instance + * @param kbd The keyboard instance + * + * @return True if the call was successfully passed to the plugin, false if the method is not supported + * by the plugin + */ +int graphics_hide_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd) { + if (!this_->meth.hide_native_keyboard) + return 0; + this_->meth.hide_native_keyboard(kbd); + return 1; } -#endif +#include "attr.h" +#include "popup.h" +#include <stdio.h> /** * FIXME @@ -1252,9 +1286,6 @@ static void label_line(struct graphics *gra, struct graphics_gc *fg, struct grap y+=dx*thm/l/64; p_t.x=x; p_t.y=y; -#if 0 - dbg(lvl_debug,"display_text: '%s', %d, %d, %d, %d %d\n", label, x, y, dx*0x10000/l, dy*0x10000/l, l); -#endif if (x < gra->r.rl.x && x + tl > gra->r.lu.x && y + tl > gra->r.lu.y && y - tl < gra->r.rl.y) gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label, &p_t, dx*0x10000/l, dy*0x10000/l); } @@ -1310,12 +1341,6 @@ intersection(struct point * a1, int adx, int ady, struct point * b1, int bdx, in a = -a; b = -b; } -#if 0 - if (a < 0 || b < 0) - return 0; - if (a > n || b > n) - return 0; -#endif if (n == 0) return 0; res->x = a1->x + a * adx / n; @@ -1397,10 +1422,6 @@ static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir) { struct circle *c; - -#if 0 - dbg(lvl_debug,"diameter=%d start=%d len=%d pos=%d dir=%d\n", diameter, start, len, *pos, dir); -#endif int count=64; int end=start+len; int i,step; @@ -1521,32 +1542,6 @@ int_sqrt(unsigned int n) return p; } -#if 0 -static void -debug_line(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int dx, int dy) -{ - struct point p[2]; - p[0]=p[1]=*pnt; - p[1].x+=dx; - p[1].y+=dy; - gra->meth.draw_lines(gra->priv, gc->priv, p, 2); -} - -static void -debug_point(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int s) -{ - struct point p[4]; - p[0]=p[1]=p[2]=*pnt; - p[0].x-=s; - p[0].y+=s; - p[1].x+=s; - p[1].y+=s; - p[2].y-=s; - p[3]=p[0]; - gra->meth.draw_lines(gra->priv, gc->priv, p, 4); -} -#endif - struct draw_polyline_shape { int wi; int step; @@ -1723,6 +1718,7 @@ graphics_draw_polyline_as_polygon(struct graphics_priv *gra_priv, struct graphic dbg(lvl_debug,"%d,%d width %d\n",pnt[i].x,pnt[i].y,width[i]); #endif ctx.shape.l=0; + ctx.shape.wi=0; ctx.res=g_alloca(sizeof(struct point)*maxpoints); i=0; draw_init_ctx(&ctx, maxpoints); @@ -2104,7 +2100,6 @@ displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc struct element *e=dc->e; struct graphics_image *img=dc->img; struct point p; - struct coord *c; char *path; while (di) { @@ -2121,7 +2116,6 @@ displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc count=limit_count(di->c, count); if (dc->type == type_poly_water_tiled) mindist=0; - c=di->c; #if 0 if (dc->e->type == element_polygon) { int max=1000; @@ -2135,9 +2129,9 @@ displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc } #endif if (dc->e->type == element_polyline) - count=transform(dc->trans, dc->pro, c, pa, count, mindist, e->u.polyline.width, width); + count=transform(dc->trans, dc->pro, di->c, pa, count, mindist, e->u.polyline.width, width); else - count=transform(dc->trans, dc->pro, c, pa, count, mindist, 0, NULL); + count=transform(dc->trans, dc->pro, di->c, pa, count, mindist, 0, NULL); switch (e->type) { case element_polygon: graphics_draw_polygon_clipped(gra, gc, pa, count); @@ -2232,7 +2226,7 @@ displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc case element_image: dbg(lvl_debug,"image: '%s'\n", di->label); if (gra->meth.draw_image_warp) { - img=graphics_image_new_scaled_rotated(gra, di->label, -1, -1, 0); + img=graphics_image_new_scaled_rotated(gra, di->label, IMAGE_W_H_UNSET, IMAGE_W_H_UNSET, 0); if (img) gra->meth.draw_image_warp(gra->priv, gra->gc[0]->priv, pa, count, img->priv); } else @@ -3051,3 +3045,4 @@ graphics_process_selection(struct graphics *gra, struct displaylist *dl) curr=g_list_next(curr); } } + diff --git a/navit/graphics.h b/navit/graphics.h index 810355f2d..2ffbd9ab0 100644 --- a/navit/graphics.h +++ b/navit/graphics.h @@ -17,6 +17,11 @@ * Boston, MA 02110-1301, USA. */ +/** @file + * + * @brief Exported functions / structures for the graphics subsystem. + */ + #ifndef NAVIT_GRAPHICS_H #define NAVIT_GRAPHICS_H @@ -59,6 +64,56 @@ struct graphics_image_buffer { int len; }; +struct graphics_keyboard_priv; + +/** + * Describes an instance of the native on-screen keyboard or other input method. + */ +struct graphics_keyboard { + int w; /**< The width of the area obscured by the keyboard (-1 for full width) */ + int h; /**< The height of the area obscured by the keyboard (-1 for full height) */ + /* TODO mode is currently a copy of the respective value in the internal GUI and uses the same values. + * This may need to be changed to something with globally available enum, possibly with revised values. + * The Android implementation (the first to support a native on-screen keyboard) does not use this field + * due to limitations of the platform. */ + int mode; /**< Mode flags for the keyboard */ + char *lang; /**< The preferred language for text input, may be {@code NULL}. */ + void *gui_priv; /**< Private data determined by the GUI. The GUI may store + * a pointer to a data structure of its choice here. It is + * the responsibility of the GUI to free the data structure + * when it is no longer needed. The graphics plugin should + * not access this member. */ + struct graphics_keyboard_priv *gra_priv; /**< Private data determined by the graphics plugin. The + * graphics plugin is responsible for its management. If it + * uses this member, it must free the associated data in + * its {@code hide_native_keyboard} method. */ +}; + +/** Magic value for unset/unspecified width/height. */ +#define IMAGE_W_H_UNSET (-1) + +/** @brief The functions to be implemented by graphics plugins. + * + * This struct lists the functions that Navit graphics plugins must implement. + * The plugin must supply its list of function implementations from its plugin_init() function. + * @see graphics_gtk_drawing_area#plugin_init() + * @see graphics_android#plugin_init() + */ + +/** + * Describes areas at each edge of the application window which may be obstructed by the system UI. + * + * This allows the map to use all available space, including areas which may be obscured by system UI + * elements, while constraining other elements such as OSDs or UI controls to an area that is guaranteed + * to be visible as long as Navit is in the foreground. + */ +struct padding { + int left; + int top; + int right; + int bottom; +}; + struct graphics_methods { void (*graphics_destroy)(struct graphics_priv *gr); void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode); @@ -74,6 +129,19 @@ struct graphics_methods { struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth); void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc); struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); + /** @brief Load an image from a file. + * + * @param gr graphics object + * @param meth output parameter for graphics methods object + * @param path file name/path of image to load + * @param w In: width to scale image to, or IMAGE_W_H_UNSET for original width. + * Out: Actual width of returned image. + * @param h heigth; see w + * @param hot output parameter for image hotspot + * @param rotate angle to rotate the image, in 90 degree steps (not supported by all plugins). + * @return pointer to allocated image, to be freed by image_free() + * @see image_free() + */ struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation); void *(*get_data)(struct graphics_priv *gr, const char *type); void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv); @@ -81,6 +149,8 @@ struct graphics_methods { void (*overlay_disable)(struct graphics_priv *gr, int disable); void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound); int (*set_attr)(struct graphics_priv *gr, struct attr *attr); + int (*show_native_keyboard)(struct graphics_keyboard *kbd); + void (*hide_native_keyboard)(struct graphics_keyboard *kbd); }; @@ -210,6 +280,9 @@ int graphics_displayitem_within_dist(struct displaylist *displaylist, struct dis void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); void graphics_clear_selection(struct graphics *gra, struct displaylist *dl); +int graphics_show_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd); +int graphics_hide_native_keyboard (struct graphics *this_, struct graphics_keyboard *kbd); + /* end of prototypes */ #ifdef __cplusplus } diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c index a543252ce..0d6aa30d2 100644 --- a/navit/graphics/android/graphics_android.c +++ b/navit/graphics/android/graphics_android.c @@ -25,6 +25,8 @@ #include "point.h" #include "graphics.h" #include "color.h" +#include "item.h" +#include "xmlconfig.h" #include "plugin.h" #include "event.h" #include "debug.h" @@ -32,14 +34,13 @@ #include "android.h" #include "command.h" -int dummy; - struct graphics_priv { jclass NavitGraphicsClass; jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_image_warp, NavitGraphics_draw_mode, NavitGraphics_draw_drag, - NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera; + NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, + NavitGraphics_setBackgroundColor; jclass PaintClass; jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; @@ -64,6 +65,8 @@ struct graphics_priv { struct callback_list *cbl; struct window win; + struct padding *padding; + jint bgcolor; }; struct graphics_font_priv { @@ -246,9 +249,9 @@ image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char * if (localBitmap) { ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); - if((*w!=-1 && *w!=ret->width) || (*h!=-1 && *w!=ret->height)) { + if((*w!=IMAGE_W_H_UNSET && *w!=ret->width) || (*h!=IMAGE_W_H_UNSET && *w!=ret->height)) { jclass scaledBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapClass, - gra->Bitmap_createScaledBitmap, localBitmap, (*w==-1)?ret->width:*w, (*h==-1)?ret->height:*h, JNI_TRUE); + gra->Bitmap_createScaledBitmap, localBitmap, (*w==IMAGE_W_H_UNSET)?ret->width:*w, (*h==IMAGE_W_H_UNSET)?ret->height:*h, JNI_TRUE); if(!scaledBitmap) { dbg(lvl_error,"Bitmap scaling to %dx%d failed for %s",*w,*h,path); } else { @@ -419,9 +422,11 @@ static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graph static void * get_data(struct graphics_priv *this, const char *type) { - if (strcmp(type,"window")) - return NULL; - return &this->win; + if (!strcmp(type,"padding")) + return this->padding; + if (!strcmp(type,"window")) + return &this->win; + return NULL; } static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) @@ -463,11 +468,29 @@ set_attr(struct graphics_priv *gra, struct attr *attr) case attr_use_camera: (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); return 1; + case attr_background_color: + gra->bgcolor = (attr->u.color->a / 0x101) << 24 + | (attr->u.color->r / 0x101) << 16 + | (attr->u.color->g / 0x101) << 8 + | (attr->u.color->b / 0x101); + dbg(lvl_debug, "set attr_background_color %04x %04x %04x %04x (%08x)\n", + attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, gra->bgcolor); + if (gra->NavitGraphics_setBackgroundColor != NULL) + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_setBackgroundColor, gra->bgcolor); + else + dbg(lvl_error, "NavitGraphics.setBackgroundColor not found, cannot set background color\n"); + return 1; default: return 0; } } + +int show_native_keyboard (struct graphics_keyboard *kbd); + +void hide_native_keyboard (struct graphics_keyboard *kbd); + + static struct graphics_methods graphics_methods = { graphics_destroy, draw_mode, @@ -490,16 +513,29 @@ static struct graphics_methods graphics_methods = { overlay_disable, overlay_resize, set_attr, + show_native_keyboard, + hide_native_keyboard, }; static void resize_callback(struct graphics_priv *gra, int w, int h) { dbg(lvl_debug,"w=%d h=%d ok\n",w,h); + dbg(lvl_debug,"gra=%p, %d callbacks in list\n", gra, g_list_length(gra->cbl)); callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); } static void +padding_callback(struct graphics_priv *gra, int left, int top, int right, int bottom) +{ + dbg(lvl_debug, "win.padding left=%d top=%d right=%d bottom=%d ok\n", left, top, right, bottom); + gra->padding->left = left; + gra->padding->top = top; + gra->padding->right = right; + gra->padding->bottom = bottom; +} + +static void motion_callback(struct graphics_priv *gra, int x, int y) { struct point p; @@ -549,6 +585,19 @@ set_activity(jobject graphics) return 1; } +/** + * @brief Initializes a new Android graphics instance. + * + * This initializes a new Android graphics instance, which can either be the main view or an overlay. + * + * @param ret The new graphics instance + * @param parent The graphics instance that contains the new instance ({@code NULL} for the main view) + * @param p The position of the overlay in its parent ({@code NULL} for the main view) + * @param w The width of the overlay (0 for the main view) + * @param h The height of the overlay (0 for the main view) + * @param wraparound (0 for the main view) + * @param use_camera Whether to use the camera (0 for overlays) + */ static int graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int wraparound, int use_camera) { @@ -556,6 +605,8 @@ graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, s jmethodID cid, Context_getPackageName; dbg(lvl_debug,"at 2 jnienv=%p\n",jnienv); + if (parent) + ret->padding = parent->padding; if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) return 0; if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init)) @@ -631,6 +682,14 @@ graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, s cb=callback_new_1(callback_cast(resize_callback), ret); (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setPaddingChangedCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetPaddingCallback method found\n"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(padding_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); if (cid == NULL) { dbg(lvl_error,"no SetButtonCallback method found\n"); @@ -686,7 +745,7 @@ graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, s } static jclass NavitClass; -static jmethodID Navit_disableSuspend, Navit_exit, Navit_fullscreen, Navit_runOptionsItem; +static jmethodID Navit_disableSuspend, Navit_exit, Navit_fullscreen, Navit_runOptionsItem, Navit_showMenu, Navit_showNativeKeyboard, Navit_hideNativeKeyboard; static int graphics_android_fullscreen(struct window *win, int on) @@ -702,6 +761,17 @@ graphics_android_disable_suspend(struct window *win) (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); } +/** + * @brief Runs an item from the Android menu. + * + * This is a callback function which implements multiple API functions. + * + * @param this The {@code graohics_prov} structure + * @param function The API function which was called + * @param in Parameters to pass to the API function + * @param out Points to a buffer which will receive a pointer to the output of the command + * @param valid + */ static void graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { @@ -717,18 +787,58 @@ graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, str (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_runOptionsItem, ncmd); } +/** + * @brief Shows the Android menu. + * + * This is the callback function associated with the {@code menu()} API function. + * + * @param this The {@code graohics_prov} structure + * @param function The API function which was called + * @param in Parameters to pass to the API function + * @param out Points to a buffer which will receive a pointer to the output of the command + * @param valid + */ +static void +graphics_android_cmd_menu(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + dbg(lvl_debug, "enter\n"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_showMenu); +} + +/** + * The command table. Each entry consists of an API function name and the callback function which implements + * this command. + */ static struct command_table commands[] = { {"map_download_dialog",command_cast(graphics_android_cmd_runMenuItem)}, {"set_map_location",command_cast(graphics_android_cmd_runMenuItem)}, {"backup_restore_dialog",command_cast(graphics_android_cmd_runMenuItem)}, + {"menu", command_cast(graphics_android_cmd_menu)}, }; +/** + * @brief Creates a new Android graphics instance. + * + * This method is called when the graphics plugin is initialized. It creates the main view, i.e. the map view. + * Unless overlay mode is enabled, it also holds any OSD items. + * + * @param nav The navit instance. + * @param meth The methods for the new graphics instance + * @param attrs The attributes for the new graphics instance + * @param cbl The callback list for the new graphics instance + * + * @return The new graphics instance + */ static struct graphics_priv * graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) { struct graphics_priv *ret; struct attr *attr; int use_camera=0; + jmethodID cid; + jint android_bgcolor; + + dbg(lvl_debug, "enter\n"); if (!event_request_system("android","graphics_android")) return NULL; ret=g_new0(struct graphics_priv, 1); @@ -738,6 +848,23 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at ret->win.priv=ret; ret->win.fullscreen=graphics_android_fullscreen; ret->win.disable_suspend=graphics_android_disable_suspend; + ret->padding = g_new0(struct padding, 1); + ret->padding->left = 0; + ret->padding->top = 0; + ret->padding->right = 0; + ret->padding->bottom = 0; + /* attr_background_color is the background color for system bars (API 17+ only) */ + if ((attr=attr_search(attrs, NULL, attr_background_color))) { + ret->bgcolor = (attr->u.color->a / 0x101) << 24 + | (attr->u.color->r / 0x101) << 16 + | (attr->u.color->g / 0x101) << 8 + | (attr->u.color->b / 0x101); + dbg(lvl_debug, "attr_background_color %04x %04x %04x %04x (%08x)\n", + attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, ret->bgcolor); + } else { + /* default is the same as for OSD */ + ret->bgcolor = 0x60000000; + } if ((attr=attr_search(attrs, NULL, attr_use_camera))) { use_camera=attr->u.num; } @@ -746,6 +873,26 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at } image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, use_camera)) { + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "hasMenuButton", "()Z"); + if (cid != NULL) { + attr = g_new0(struct attr, 1); + attr->type = attr_has_menu_button; + attr->u.num = (*jnienv)->CallBooleanMethod(jnienv, ret->NavitGraphics, cid); + + /* + * Although the attribute refers to information obtained by the graphics plugin, we are storing it + * with the navit object: the object is easier to access from anywhere in the program, and ultimately + * it refers to a configuration value affecting all of Navit, thus users are likely to look for it in + * the navit object (as the fact that graphics also handles input devices is not immedately obvious). + */ + navit_object_set_attr((struct navit_object *) nav, attr); + dbg(lvl_debug, "attr_has_menu_button=%d\n", attr->u.num); + g_free(attr); + } + ret->NavitGraphics_setBackgroundColor = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setBackgroundColor", "(I)V"); + if (ret->NavitGraphics_setBackgroundColor != NULL) { + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, ret->NavitGraphics_setBackgroundColor, ret->bgcolor); + } dbg(lvl_debug,"returning %p\n",ret); return ret; } else { @@ -754,6 +901,21 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at } } +/** + * @brief Creates a new overlay + * + * This method creates a graphics instance for a new overlay. If overlay mode is enabled, a separate overlay is + * created for each OSD item. + * + * @param gr The parent graphics instance, i.e. the one which will contain the overlay. + * @param meth The methods for the new graphics instance + * @param p The position of the overlay in its parent + * @param w The width of the overlay + * @param h The height of the overlay + * @param wraparound + * + * @return The graphics instance for the new overlay + */ static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) { @@ -971,6 +1133,11 @@ event_android_new(struct event_methods *meth) Navit_runOptionsItem = (*jnienv)->GetMethodID(jnienv, NavitClass, "runOptionsItem", "(I)V"); if (Navit_runOptionsItem == NULL) return NULL; + Navit_showMenu = (*jnienv)->GetMethodID(jnienv, NavitClass, "showMenu", "()V"); + if (Navit_showMenu == NULL) + return NULL; + Navit_showNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "showNativeKeyboard", "()I"); + Navit_hideNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "hideNativeKeyboard", "()V"); dbg(lvl_debug,"ok\n"); *meth=event_android_methods; @@ -978,10 +1145,59 @@ event_android_new(struct event_methods *meth) } +/** + * @brief Displays the native input method. + * + * This method decides whether a native on-screen input method, such as a virtual keyboard, needs to be + * displayed. A typical case in which there is no need for an on-screen input method is if a hardware + * keyboard is present. + * + * Note that the Android platform lacks reliable means of determining whether an on-screen input method + * is going to be displayed or how much screen space it is going to occupy. Therefore this method tries + * to guess these values. They have been tested and found to work correctly with the AOSP keyboard, and + * are thus expected to be compatible with most on-screen keyboards found on the market, but results may + * be unexpected with other input methods. + * + * @param kbd A {@code struct graphics_keyboard} which describes the requirements for the input method + * and will be populated with the data of the input method before the function returns. + * + * @return True if the input method is going to be displayed, false if not. + */ +int show_native_keyboard (struct graphics_keyboard *kbd) { + kbd->w = -1; + if (Navit_showNativeKeyboard == NULL) { + dbg(lvl_error, "method Navit.showNativeKeyboard() not found, cannot display keyboard\n"); + return 0; + } + kbd->h = (*jnienv)->CallIntMethod(jnienv, android_activity, Navit_showNativeKeyboard); + dbg(lvl_error, "keyboard size is %d x %d px\n", kbd->w, kbd->h); + dbg(lvl_error, "return\n"); + /* zero height means we're not showing a keyboard, therefore normalize height to boolean */ + return !!(kbd->h); +} + + +/** + * @brief Hides the native input method and frees associated private data. + * + * @param kbd The {@code struct graphics_keyboard} which was passed to the earlier call to + * {@link show_native_keyboard(struct graphics_keyboard *)}. The {@code gra_priv} member of the struct + * will be freed by this function. + */ +void hide_native_keyboard (struct graphics_keyboard *kbd) { + if (Navit_hideNativeKeyboard == NULL) { + dbg(lvl_error, "method Navit.hideNativeKeyboard() not found, cannot dismiss keyboard\n"); + return; + } + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_hideNativeKeyboard); + g_free(kbd->gra_priv); +} + + void plugin_init(void) { dbg(lvl_debug,"enter\n"); - plugin_register_graphics_type("android", graphics_android_new); - plugin_register_event_type("android", event_android_new); + plugin_register_category_graphics("android", graphics_android_new); + plugin_register_category_event("android", event_android_new); } diff --git a/navit/graphics/gd/graphics_gd.c b/navit/graphics/gd/graphics_gd.c index 47868d622..3ef6c520b 100644 --- a/navit/graphics/gd/graphics_gd.c +++ b/navit/graphics/gd/graphics_gd.c @@ -813,6 +813,8 @@ static struct graphics_methods graphics_methods = { overlay_disable, overlay_resize, set_attr, + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; static struct graphics_priv * @@ -824,7 +826,7 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin dbg(lvl_debug,"enter\n"); ret=g_new0(struct graphics_priv, 1); *meth=graphics_methods; - font_freetype_new=plugin_get_font_type("freetype"); + font_freetype_new=plugin_get_category_font("freetype"); if (!font_freetype_new) return NULL; font_freetype_new(&ret->freetype_methods); @@ -853,7 +855,7 @@ graphics_gd_new(struct navit *nav, struct graphics_methods *meth, struct attr ** struct font_priv * (*font_freetype_new)(void *meth); struct graphics_priv *ret; event_request_system("glib","graphics_gd_new"); - font_freetype_new=plugin_get_font_type("freetype"); + font_freetype_new=plugin_get_category_font("freetype"); if (!font_freetype_new) return NULL; *meth=graphics_methods; @@ -879,5 +881,5 @@ graphics_gd_new(struct navit *nav, struct graphics_methods *meth, struct attr ** void plugin_init(void) { - plugin_register_graphics_type("gd", graphics_gd_new); + plugin_register_category_graphics("gd", graphics_gd_new); } diff --git a/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c index 6ec67d1c0..387003c40 100644 --- a/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c +++ b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c @@ -205,7 +205,7 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *n GdkPixbufLoader *loader=gdk_pixbuf_loader_new(); if (!loader) return NULL; - if (*w != -1 || *h != -1) + if (*w != IMAGE_W_H_UNSET || *h != IMAGE_W_H_UNSET) gdk_pixbuf_loader_set_size(loader, *w, *h); gdk_pixbuf_loader_write(loader, buffer->start, buffer->len, NULL); gdk_pixbuf_loader_close(loader, NULL); @@ -213,7 +213,7 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *n g_object_ref(pixbuf); g_object_unref(loader); } else { - if (*w == -1 && *h == -1) + if (*w == IMAGE_W_H_UNSET && *h == IMAGE_W_H_UNSET) pixbuf=gdk_pixbuf_new_from_file(name, NULL); else pixbuf=gdk_pixbuf_new_from_file_at_size(name, *w, *h, NULL); @@ -1073,13 +1073,15 @@ static struct graphics_methods graphics_methods = { overlay_disable, overlay_resize, set_attr, + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; static struct graphics_priv * graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth) { struct font_priv * (*font_freetype_new)(void *meth); - font_freetype_new=plugin_get_font_type("freetype"); + font_freetype_new=plugin_get_category_font("freetype"); if (!font_freetype_new) return NULL; struct graphics_priv *this=g_new0(struct graphics_priv,1); @@ -1148,5 +1150,5 @@ plugin_init(void) #ifdef HAVE_API_WIN32 setlocale(LC_NUMERIC, "C"); /* WIN32 gtk resets LC_NUMERIC */ #endif - plugin_register_graphics_type("gtk_drawing_area", graphics_gtk_drawing_area_new); + plugin_register_category_graphics("gtk_drawing_area", graphics_gtk_drawing_area_new); } diff --git a/navit/graphics/null/graphics_null.c b/navit/graphics/null/graphics_null.c index e3d617af2..ecac7d528 100644 --- a/navit/graphics/null/graphics_null.c +++ b/navit/graphics/null/graphics_null.c @@ -236,6 +236,8 @@ static struct graphics_methods graphics_methods = { get_text_bbox, overlay_disable, overlay_resize, + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; static struct graphics_priv * @@ -352,6 +354,6 @@ event_null_new(struct event_methods *meth) void plugin_init(void) { - plugin_register_graphics_type("null", graphics_null_new); - plugin_register_event_type("null", event_null_new); + plugin_register_category_graphics("null", graphics_null_new); + plugin_register_category_event("null", event_null_new); } diff --git a/navit/graphics/opengl/graphics_opengl.c b/navit/graphics/opengl/graphics_opengl.c index b6e0fb41a..98230f0dc 100644 --- a/navit/graphics/opengl/graphics_opengl.c +++ b/navit/graphics/opengl/graphics_opengl.c @@ -451,7 +451,7 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, width = FreeImage_GetWidth(image); height = FreeImage_GetHeight(image); - if ((*w != width || *h != height) && 0 < *w && 0 < *h) { + if ((*w != width || *h != height) && *w != IMAGE_W_H_UNSET && *h != IMAGE_W_H_UNSET) { FIBITMAP *image2; image2 = FreeImage_Rescale(image, *w, *h, FILTER_BOX); FreeImage_Unload(image); @@ -1432,13 +1432,15 @@ static struct graphics_methods graphics_methods = { NULL, overlay_disable, overlay_resize, + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; static struct graphics_priv * graphics_opengl_new_helper(struct graphics_methods *meth) { struct font_priv *(*font_freetype_new) (void *meth); - font_freetype_new = plugin_get_font_type("freetype"); + font_freetype_new = plugin_get_category_font("freetype"); if (!font_freetype_new) { return NULL; @@ -1815,6 +1817,6 @@ event_opengl_new(struct event_methods *meth) void plugin_init(void) { - plugin_register_graphics_type("opengl", graphics_opengl_new); - plugin_register_event_type("opengl", event_opengl_new); + plugin_register_category_graphics("opengl", graphics_opengl_new); + plugin_register_category_event("opengl", event_opengl_new); } diff --git a/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp b/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp index 714f0753e..65163ea9d 100644 --- a/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp +++ b/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp @@ -696,7 +696,8 @@ static struct graphics_methods graphics_methods = { overlay_disable, NULL, set_attr, - + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; //############################################################################################################## @@ -853,7 +854,7 @@ static struct graphics_priv * graphics_qt_qpainter_new(struct navit *nav, struct return NULL; #endif #ifdef QT_QPAINTER_USE_FREETYPE - font_freetype_new=(struct font_priv *(*)(void *))plugin_get_font_type("freetype"); + font_freetype_new=(struct font_priv *(*)(void *))plugin_get_category_font("freetype"); if (!font_freetype_new) { dbg(lvl_error,"no freetype\n"); return NULL; @@ -920,9 +921,9 @@ static struct graphics_priv * graphics_qt_qpainter_new(struct navit *nav, struct //############################################################################################################## void plugin_init(void) { - plugin_register_graphics_type("qt_qpainter", graphics_qt_qpainter_new); + plugin_register_category_graphics("qt_qpainter", graphics_qt_qpainter_new); #ifdef QT_QPAINTER_USE_EVENT_QT - plugin_register_event_type("qt", event_qt_new); + plugin_register_category_event("qt", event_qt_new); #endif } diff --git a/navit/graphics/sdl/event.c b/navit/graphics/sdl/event.c index cd4b81802..f96b079b3 100644 --- a/navit/graphics/sdl/event.c +++ b/navit/graphics/sdl/event.c @@ -377,5 +377,5 @@ event_sdl_new(struct event_methods* methods) { /* ---------- SDL Eventhandling ---------- */ void sdl_event_init(void) { - plugin_register_event_type("sdl", event_sdl_new); + plugin_register_category_event("sdl", event_sdl_new); } diff --git a/navit/graphics/sdl/event_sdl.c b/navit/graphics/sdl/event_sdl.c index d640d5edb..28fe4fafb 100644 --- a/navit/graphics/sdl/event_sdl.c +++ b/navit/graphics/sdl/event_sdl.c @@ -339,5 +339,5 @@ event_sdl_new(struct event_methods* methods) void event_sdl_register(void) { - plugin_register_event_type("sdl", event_sdl_new); + plugin_register_category_event("sdl", event_sdl_new); } diff --git a/navit/graphics/sdl/graphics_sdl.c b/navit/graphics/sdl/graphics_sdl.c index e5d9f7872..b1a9c17b9 100644 --- a/navit/graphics/sdl/graphics_sdl.c +++ b/navit/graphics/sdl/graphics_sdl.c @@ -96,8 +96,6 @@ struct graphics_priv { /* </main> */ }; -static int dummy; - #ifdef USE_WEBOS # define WEBOS_KEY_SHIFT 0x130 # define WEBOS_KEY_SYM 0x131 @@ -875,7 +873,7 @@ get_data(struct graphics_priv *this, char const *type) win->disable_suspend=NULL; return win; } else { - return &dummy; + return NULL; } } @@ -909,6 +907,8 @@ static struct graphics_methods graphics_methods = { overlay_disable, NULL, /* overlay_resize */ NULL, /* set_attr */ + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; static struct graphics_priv * @@ -986,7 +986,7 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin struct font_priv *(*font_freetype_new) (void *meth); - font_freetype_new = plugin_get_font_type ("freetype"); + font_freetype_new = plugin_get_category_font ("freetype"); if (!font_freetype_new) { @@ -1407,7 +1407,7 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr * this->cbl = cbl; /* initialize fonts */ - font_freetype_new = plugin_get_font_type("freetype"); + font_freetype_new = plugin_get_category_font("freetype"); if (!font_freetype_new) { g_free(this); @@ -1852,9 +1852,9 @@ void plugin_init(void) { #ifdef USE_WEBOS - plugin_register_event_type("sdl", event_sdl_new); + plugin_register_category_event("sdl", event_sdl_new); #endif - plugin_register_graphics_type("sdl", graphics_sdl_new); + plugin_register_category_graphics("sdl", graphics_sdl_new); } // vim: sw=4 ts=8 diff --git a/navit/graphics/win32/graphics_win32.c b/navit/graphics/win32/graphics_win32.c index 124832a38..3d8fa351d 100644 --- a/navit/graphics/win32/graphics_win32.c +++ b/navit/graphics/win32/graphics_win32.c @@ -1445,9 +1445,9 @@ static struct graphics_image_priv *image_new(struct graphics_priv *gr, struct gr /* Hash_key will be freed ater the hash table, so set it to NULL here to disable freing it on this function return */ hash_key=NULL; if(ret) { - if (*w==-1) + if (*w==IMAGE_W_H_UNSET) *w=ret->width; - if (*h==-1) + if (*h==IMAGE_W_H_UNSET) *h=ret->height; if (*w!=ret->width || *h!=ret->height) { if(ret->png_pixels && ret->hBitmap) @@ -1582,6 +1582,8 @@ static struct graphics_methods graphics_methods = get_text_bbox, overlay_disable, overlay_resize, + NULL, /* show_native_keyboard */ + NULL, /* hide_native_keyboard */ }; @@ -1843,6 +1845,6 @@ static struct event_priv * void plugin_init(void) { - plugin_register_graphics_type("win32", graphics_win32_new); - plugin_register_event_type("win32", event_win32_new); + plugin_register_category_graphics("win32", graphics_win32_new); + plugin_register_category_event("win32", event_win32_new); } diff --git a/navit/gui.c b/navit/gui.c index ab16d8a9e..9b2ba4971 100644 --- a/navit/gui.c +++ b/navit/gui.c @@ -45,7 +45,7 @@ gui_new(struct attr *parent, struct attr **attrs) return NULL; } - guitype_new=plugin_get_gui_type(type_attr->u.str); + guitype_new=plugin_get_category_gui(type_attr->u.str); if (! guitype_new) return NULL; diff --git a/navit/gui/gtk/gui_gtk_window.c b/navit/gui/gtk/gui_gtk_window.c index 71bd26315..1741a54a0 100644 --- a/navit/gui/gtk/gui_gtk_window.c +++ b/navit/gui/gtk/gui_gtk_window.c @@ -808,5 +808,5 @@ plugin_init(void) #endif - plugin_register_gui_type("gtk", gui_gtk_new); + plugin_register_category_gui("gtk", gui_gtk_new); } diff --git a/navit/gui/internal/gui_internal.c b/navit/gui/internal/gui_internal.c index 3affd52e4..fd450b57c 100644 --- a/navit/gui/internal/gui_internal.c +++ b/navit/gui/internal/gui_internal.c @@ -88,6 +88,7 @@ #include "gui_internal_gesture.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" +#include "gui_internal_keyboard.h" /** @@ -743,9 +744,7 @@ gui_internal_call_linked_on_finish(struct gui_priv *this, struct widget *wm, voi struct widget * gui_internal_keyboard(struct gui_priv *this, int mode); - - - +struct widget * gui_internal_keyboard_show_native(struct gui_priv *this, struct widget *w, int mode, char *lang); static void @@ -1674,9 +1673,15 @@ gui_internal_keypress_do(struct gui_priv *this, char *key) dbg(lvl_info,"wi->state=0x%x\n", wi->state); } text=g_strdup_printf("%s%s", wi->text ? wi->text : "", key); + + gui_internal_keyboard_to_lower_case(this); } g_free(wi->text); wi->text=text; + + if(!wi->text || !*wi->text) + gui_internal_keyboard_to_upper_case(this); + if (wi->func) { wi->reason=gui_internal_reason_keypress; wi->func(this, wi, wi->data); @@ -2668,6 +2673,12 @@ static void gui_internal_resize(void *data, int w, int h) this->root.h=h; changed=1; } + /* + * If we're drawing behind system bars on Android, watching for actual size changes will not catch + * fullscreen toggle events. As a workaround, always assume a size change if padding is supplied. + */ + if (!changed && this->gra && graphics_get_data(this->gra, "padding")) + changed = 1; dbg(lvl_debug,"w=%d h=%d children=%p\n", w, h, this->root.children); navit_handle_resize(this->nav, w, h); if (this->root.children) { @@ -2697,7 +2708,9 @@ gui_internal_keynav_point(struct widget *w, int dx, int dy, struct point *p) static struct widget* gui_internal_keynav_find_next_sensitive_child(struct widget *wi) { GList *l=wi->children; - if (wi && wi->state & STATE_SENSITIVE) + if (wi->state & STATE_OFFSCREEN) + return NULL; + if (wi->state & STATE_SENSITIVE) return wi; while (l) { struct widget* tmp = gui_internal_keynav_find_next_sensitive_child(l->data); @@ -2742,6 +2755,9 @@ gui_internal_keynav_find_prev(struct widget *wi, struct widget *current_highligh // Reached current widget; last widget found is the result. return RESULT_FOUND; } + // If widget is off-screen, do not recurse into it. + if (wi->state & STATE_OFFSCREEN) + return NO_RESULT_YET; if (wi->state & STATE_SENSITIVE) *result= wi; GList *l=wi->children; @@ -3102,12 +3118,14 @@ static struct gui_internal_widget_methods gui_internal_widget_methods = { gui_internal_set_default_background, }; - -/* - * @brief Displays Route information +/** + * @brief finds the intersection point of 2 lines + * + * @param coord a1, a2, b1, b2 : coords of the start and + * end of the first and the second line + * @param coord res, will become the coords of the intersection if found + * @return : TRUE if intersection found, otherwise FALSE */ -/* FIXME where is the implementation? */ - int line_intersection(struct coord* a1, struct coord *a2, struct coord * b1, struct coord *b2, struct coord *res) { @@ -3125,18 +3143,19 @@ line_intersection(struct coord* a1, struct coord *a2, struct coord * b1, struct b = -b; } if (a < 0 || b < 0) - return 0; + return FALSE; if (a > n || b > n) - return 0; + return FALSE; if (n == 0) { dbg(lvl_info,"a=%d b=%d n=%d\n", a, b, n); dbg(lvl_info,"a1=0x%x,0x%x ad %d,%d\n", a1->x, a1->y, adx, ady); dbg(lvl_info,"b1=0x%x,0x%x bd %d,%d\n", b1->x, b1->y, bdx, bdy); - dbg_assert(n != 0); + dbg(lvl_info,"No intersection found, lines assumed parallel ?\n"); + return FALSE; } res->x = a1->x + a * adx / n; res->y = a1->y + a * ady / n; - return 1; + return TRUE; } struct heightline * @@ -3166,18 +3185,6 @@ item_get_heightline(struct item *item) return ret; } - -/* - * @brief Displays Route Height Profile - * - * @li The name of the active vehicle - * @param wm The button that was pressed. - * @param v Unused - */ -/* FIXME where is the implementation? */ - - - /** * @brief Called when the route is updated. */ @@ -3445,5 +3452,5 @@ static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods //############################################################################################################## void plugin_init(void) { - plugin_register_gui_type("internal", gui_internal_new); + plugin_register_category_gui("internal", gui_internal_new); } diff --git a/navit/gui/internal/gui_internal.h b/navit/gui/internal/gui_internal.h index cbe1e20df..ea5ab79ae 100644 --- a/navit/gui/internal/gui_internal.h +++ b/navit/gui/internal/gui_internal.h @@ -1,15 +1,14 @@ -struct widget; // defined in gui_internal.c +struct widget; struct graphics_image; struct gui_priv; -#define STATE_VISIBLE 1 -#define STATE_SELECTED 2 #define STATE_HIGHLIGHTED 4 #define STATE_SENSITIVE 8 #define STATE_EDIT 16 #define STATE_CLEAR 32 #define STATE_EDITABLE 64 #define STATE_SCROLLABLE 128 +#define STATE_OFFSCREEN 256 #define GESTURE_RINGSIZE 100 diff --git a/navit/gui/internal/gui_internal_bookmark.c b/navit/gui/internal/gui_internal_bookmark.c index 21102ba1a..eed0de123 100644 --- a/navit/gui/internal/gui_internal_bookmark.c +++ b/navit/gui/internal/gui_internal_bookmark.c @@ -104,6 +104,8 @@ gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *d gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, w, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); gui_internal_menu_render(this); } @@ -132,6 +134,8 @@ gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, w, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); gui_internal_menu_render(this); } @@ -161,6 +165,8 @@ gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, w, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); gui_internal_menu_render(this); } diff --git a/navit/gui/internal/gui_internal_command.c b/navit/gui/internal/gui_internal_command.c index 98a736fb8..d26bd677d 100644 --- a/navit/gui/internal/gui_internal_command.c +++ b/navit/gui/internal/gui_internal_command.c @@ -294,6 +294,8 @@ gui_internal_cmd_enter_coord(struct gui_priv *this, char *function, struct attr if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_DEGREE)); + else + gui_internal_keyboard_show_native(this, w, VKBD_DEGREE, NULL); gui_internal_menu_render(this); } @@ -444,13 +446,21 @@ gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct a navit_attr_iter_destroy(iter); gui_internal_menu_render(this); } + +/* + * @brief Displays Route Height Profile + * + * displays a heightprofile if a route is active and + * some heightinfo is provided by means of a map + * + * the name of the file providing the heightlines must + * comply with *.heightlines.bin + * + */ static void gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { - - struct widget * menu, *box; - struct map * map=NULL; struct map_rect * mr=NULL; struct route * route; @@ -458,17 +468,18 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st struct mapset *ms; struct mapset_handle *msh; int x,i,first=1,dist=0; + int diagram_points_count = 0; struct coord c,last,res; struct coord_rect rbbox,dbbox; struct map_selection sel; struct heightline *heightline,*heightlines=NULL; struct diagram_point *min,*diagram_point,*diagram_points=NULL; + struct point p[2]; sel.next=NULL; sel.order=18; sel.range.min=type_height_line_1; sel.range.max=type_height_line_3; - menu=gui_internal_menu(this,_("Height Profile")); box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); gui_internal_widget_append(menu, box); @@ -489,11 +500,24 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } } map_rect_destroy(mr); + mr = NULL; ms=navit_get_mapset(this->nav); if (!first && ms) { + int heightmap_installed = FALSE; msh=mapset_open(ms); while ((map=mapset_next(msh, 1))) { - mr=map_rect_new(map, &sel); + struct attr name_attr; + if (map_get_attr(map, attr_name, &name_attr, NULL)){ + dbg(lvl_debug,"map name = %s\n",name_attr.u.str); + if (strstr(name_attr.u.str,".heightlines.bin")){ + dbg(lvl_info,"reading heightlines from map %s\n",name_attr.u.str); + mr=map_rect_new(map, &sel); + heightmap_installed = TRUE; + } + else { + dbg(lvl_debug,"ignoring map %s\n",name_attr.u.str); + } + } if (mr) { while((item = map_rect_get_item(mr))) { if (item->type >= sel.range.min && item->type <= sel.range.max) { @@ -505,9 +529,20 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } } map_rect_destroy(mr); + mr = NULL; } } mapset_close(msh); + if (!heightmap_installed){ + char *text; + struct widget *w; + text=g_strdup_printf("%s",_("please install a map *.heightlines.bin to provide elevationdata")); + gui_internal_widget_append(box, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + gui_internal_menu_render(this); + return; + } } } map=NULL; @@ -537,7 +572,8 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st diagram_point->c.y=heightline->height; diagram_point->next=diagram_points; diagram_points=diagram_point; - dbg(lvl_info,"%d %d\n", diagram_point->c.x, diagram_point->c.y); + diagram_points_count ++; + dbg(lvl_debug,"%d %d\n", diagram_point->c.x, diagram_point->c.y); } } } @@ -548,18 +584,30 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st } last=c; } - } } - + while (heightlines){ + heightline=heightlines; + heightlines=heightlines->next; + g_free(heightline); + } if(mr) map_rect_destroy(mr); - gui_internal_menu_render(this); - - if(!diagram_points) + if(diagram_points_count < 2){ + char *text; + struct widget *w; + text=g_strdup_printf("%s",_("The route must cross at least 2 heightlines")); + gui_internal_widget_append(box, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + gui_internal_menu_render(this); + if(diagram_points) + g_free(diagram_points); return; + } + gui_internal_menu_render(this); first=1; diagram_point=diagram_points; while (diagram_point) { @@ -571,38 +619,42 @@ gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, st coord_rect_extend(&dbbox, &diagram_point->c); diagram_point=diagram_point->next; } - dbg(lvl_info,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); + dbg(lvl_debug,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); if (dbbox.rl.x > dbbox.lu.x && dbbox.lu.x*100/(dbbox.rl.x-dbbox.lu.x) <= 25) dbbox.lu.x=0; if (dbbox.lu.y > dbbox.rl.y && dbbox.rl.y*100/(dbbox.lu.y-dbbox.rl.y) <= 25) dbbox.rl.y=0; - dbg(lvl_info,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); + dbg(lvl_debug,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); x=dbbox.lu.x; first=1; - for (;;) { - struct point p[2]; - min=NULL; - diagram_point=diagram_points; - while (diagram_point) { - if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) - min=diagram_point; - diagram_point=diagram_point->next; + if (diagram_points_count > 1 && dbbox.rl.x != dbbox.lu.x && dbbox.lu.y != dbbox.rl.y){ + for (;;) { + min=NULL; + diagram_point=diagram_points; + while (diagram_point) { + if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) + min=diagram_point; + diagram_point=diagram_point->next; + } + if (! min) + break; + p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; + p[1].y=(box->h)-5-(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y; + dbg(lvl_debug,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); + graphics_draw_circle(this->gra, this->foreground, &p[1], 2); + if (first) + first=0; + else + graphics_draw_lines(this->gra, this->foreground, p, 2); + p[0]=p[1]; + x=min->c.x+1; } - if (! min) - break; - p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; - p[1].y=(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y+5; - dbg(lvl_info,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); - graphics_draw_circle(this->gra, this->foreground, &p[1], 2); - if (first) - first=0; - else - graphics_draw_lines(this->gra, this->foreground, p, 2); - p[0]=p[1]; - x=min->c.x+1; } - - + while (diagram_points){ + diagram_point=diagram_points; + diagram_points=diagram_points->next; + g_free(diagram_point); + } } static void @@ -860,6 +912,8 @@ gui_internal_cmd_log(struct gui_priv *this) gui_internal_widget_append(w, wl); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, w, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); gui_internal_menu_render(this); gui_internal_leave(this); } @@ -1075,7 +1129,6 @@ error: return; } - static void gui_internal_cmd_img(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) { diff --git a/navit/gui/internal/gui_internal_html.c b/navit/gui/internal/gui_internal_html.c index 8350dbdcc..9b42fbdec 100644 --- a/navit/gui/internal/gui_internal_html.c +++ b/navit/gui/internal/gui_internal_html.c @@ -491,9 +491,12 @@ gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); gui_internal_html_parse_text(this, doc); g_free(doc); - if (this->keyboard_required && this->keyboard) { + if (this->keyboard_required) { this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; - gui_internal_widget_append(this->html_container, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + if (this->keyboard) + gui_internal_widget_append(this->html_container, gui_internal_keyboard(this, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")))); + else + gui_internal_keyboard_show_native(this, this->html_container, VKBD_FLAG_2 | gui_internal_keyboard_init_mode(getenv("LANG")), getenv("LANG")); } gui_internal_menu_render(this); graphics_draw_mode(this->gra, draw_mode_end); diff --git a/navit/gui/internal/gui_internal_keyboard.c b/navit/gui/internal/gui_internal_keyboard.c index ea71eb593..3dc6ae556 100644 --- a/navit/gui/internal/gui_internal_keyboard.c +++ b/navit/gui/internal/gui_internal_keyboard.c @@ -12,39 +12,61 @@ #include "gui_internal_menu.h" #include "gui_internal_keyboard.h" +/** + * @brief Switch keyboard mode to uppercase if it's in lowercase mode and {@code VKBD_MODE_2} is set. + * + * Called when there's no input left in the input field. + * + * @param this The internal GUI instance + */ void gui_internal_keyboard_to_upper_case(struct gui_priv *this) { struct menu_data *md; + + if (!this->keyboard) + return; + md=gui_internal_menu_data(this); - // Switch to lowercase after the first key is pressed - if (md->keyboard_mode == 10) // Latin - gui_internal_keyboard_do(this, md->keyboard, 2); - if (md->keyboard_mode == 34) // Umlaut - gui_internal_keyboard_do(this, md->keyboard, 26); - if (md->keyboard_mode == 50) // Russian/Ukrainian/Belorussian - gui_internal_keyboard_do(this, md->keyboard, 42); + + if (md->keyboard_mode == (VKBD_LATIN_LOWER | VKBD_FLAG_2)) + gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_UPPER | VKBD_FLAG_2); + if (md->keyboard_mode == (VKBD_UMLAUT_LOWER | VKBD_FLAG_2)) + gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_UPPER | VKBD_FLAG_2); + if (md->keyboard_mode == (VKBD_CYRILLIC_LOWER | VKBD_FLAG_2)) + gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_UPPER | VKBD_FLAG_2); } +/** + * @brief Switch keyboard mode to lowercase if it's in uppercase mode and {@code VKBD_MODE_2} is set. + * + * Called on each alphanumeric input. + * + * @param this The internal GUI instance + */ void gui_internal_keyboard_to_lower_case(struct gui_priv *this) { struct menu_data *md; + + if (!this->keyboard) + return; + md=gui_internal_menu_data(this); - // Switch to lowercase after the first key is pressed - if (md->keyboard_mode == (VKBD_LATIN_UPPER | VKBD_FLAG_2)) // Latin + + if (md->keyboard_mode == (VKBD_LATIN_UPPER | VKBD_FLAG_2)) gui_internal_keyboard_do(this, md->keyboard, VKBD_LATIN_LOWER | VKBD_FLAG_2); - if (md->keyboard_mode == (VKBD_UMLAUT_UPPER | VKBD_FLAG_2)) // Umlaut + if (md->keyboard_mode == (VKBD_UMLAUT_UPPER | VKBD_FLAG_2)) gui_internal_keyboard_do(this, md->keyboard, VKBD_UMLAUT_LOWER | VKBD_FLAG_2); - if (md->keyboard_mode == (VKBD_CYRILLIC_UPPER | VKBD_FLAG_2)) // Russian/Ukrainian/Belorussian + if (md->keyboard_mode == (VKBD_CYRILLIC_UPPER | VKBD_FLAG_2)) gui_internal_keyboard_do(this, md->keyboard, VKBD_CYRILLIC_LOWER | VKBD_FLAG_2); } /** * @brief Processes a key press on the internal GUI keyboard * - * If the keyboard is currently in uppercase mode and {@code VKBD_MODE_2} is set, it is then switched to - * the corresponding lowercase mode. + * If the keyboard is currently in uppercase mode and {@code VKBD_MODE_2} is set, it is tswitched to + * the corresponding lowercase mode in {@code gui_internal_keypress_do}. * * @param this The internal GUI instance * @param wm @@ -101,7 +123,7 @@ struct gui_internal_keyb_mode { /*16: VKBD_NUMERIC */ {"123", 2, VKBD_LATIN_UPPER, VKBD_UMLAUT_UPPER}, /*24: VKBD_UMLAUT_UPPER */ {"ÄÖÜ", 2, VKBD_UMLAUT_LOWER, VKBD_LATIN_UPPER}, /*32: VKBD_UMLAUT_LOWER */ {"äöü", 2, VKBD_UMLAUT_UPPER, VKBD_LATIN_LOWER}, - /*40: VKBD_CYRILLIC_UPPER*/ {"АБВ", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_UPPER}, + /*40: VKBD_CYRILLIC_UPPER*/ {"АБВ", 2, VKBD_CYRILLIC_LOWER, VKBD_LATIN_UPPER}, /*48: VKBD_CYRILLIC_LOWER*/ {"абв", 2, VKBD_CYRILLIC_UPPER, VKBD_LATIN_LOWER}, /*56: VKBD_DEGREE */ {"DEG", 2, VKBD_FLAG_2, VKBD_FLAG_2} }; @@ -435,3 +457,100 @@ gui_internal_keyboard_init_mode(char *lang) g_free(lang); return ret; } + + +/** + * @brief Hides the platform's native on-screen keyboard or other input method + * + * This function is called as the {@code wfree} method of the placeholder widget for the platform's + * native on-screen keyboard. It is a wrapper around the corresponding method of the graphics plugin, + * which takes care of all platform-specific actions to hide the on-screen input method it previously + * displayed. + * + * A call to this function indicates that Navit no longer needs the input method and is about to destroy + * its placeholder widget. Navit will subsequently reclaim any screen real estate it may have previously + * reserved for the input method. + * + * This function will free the {@code struct graphics_keyboard} pointed to by {@code w->data} + * + * @param this The internal GUI instance + * @param w The placeholder widget + */ +void gui_internal_keyboard_hide_native(struct gui_priv *this_, struct widget *w) { + struct graphics_keyboard *kbd = (struct graphics_keyboard *) w->data; + + if (kbd) { + graphics_hide_native_keyboard(this_->gra, kbd); + g_free(kbd->lang); + g_free(kbd->gui_priv); + } else + dbg(lvl_warning, "no graphics_keyboard found, cleanup failed\n"); + g_free(w); +} + + +/** + * @brief Shows the platform's native on-screen keyboard or other input method + * + * This method is a wrapper around the corresponding method of the graphics plugin, which takes care of + * all platform-specific details. In particular, it is up to the graphics plugin to determine how to + * handle the request: it may show its on-screen keyboard or another input method (such as stroke + * recognition). It may choose to simply ignore the request, which will typically occur when a hardware + * keyboard (or other hardware input) is available. + * + * The platform's native input method may obstruct parts of Navit's UI. To prevent parts of the UI from + * becoming unreachable, this method will insert an empty box widget in the appropriate size at the + * appropriate position, provided the graphics plugin reports the correct values. Otherwise a zero-size + * widget is inserted. If the graphics driver decides not to display an on-screen input method, no + * widget will be created and the return value will be {@code NULL}. + * + * The widget's {@code wfree} function, to be called when the widget is destroyed, will be used to hide + * the platform keyboard when it is no longer needed. + * + * @param this The internal GUI instance + * @param w The parent of the widget requiring text input + * @param mode The requested keyboard mode + * @param lang The language for text input, used to select a keyboard layout + * + * @return The placeholder widget for the on-screen keyboard, may be {@code NULL} + */ +struct widget * gui_internal_keyboard_show_native(struct gui_priv *this, struct widget *w, int mode, char *lang) { + struct widget *ret = NULL; + struct menu_data *md = gui_internal_menu_data(this); + struct graphics_keyboard *kbd = g_new0(struct graphics_keyboard, 1); + int res; + + kbd->mode = mode; + if (lang) + kbd->lang = g_strdup(lang); + res = graphics_show_native_keyboard(this->gra, kbd); + + switch(res) { + case -1: + dbg(lvl_error, "graphics has no show_native_keyboard method, cannot display keyboard\n"); + /* no break */ + case 0: + g_free(kbd); + return NULL; + } + + ret = gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); + md->keyboard = ret; + md->keyboard_mode=mode; + ret->wfree = gui_internal_keyboard_hide_native; + if (kbd->h < 0) { + ret->h = w->h; + ret->hmin = w->hmin; + } else + ret->h = kbd->h; + if (kbd->w < 0) { + ret->w = w->w; + ret->wmin = w->wmin; + } else + ret->w = kbd->w; + dbg(lvl_error, "ret->w=%d, ret->h=%d\n", ret->w, ret->h); + ret->data = (void *) kbd; + gui_internal_widget_append(w, ret); + dbg(lvl_error, "return\n"); + return ret; +} diff --git a/navit/gui/internal/gui_internal_keyboard.h b/navit/gui/internal/gui_internal_keyboard.h index 336ba2c01..9b9039224 100644 --- a/navit/gui/internal/gui_internal_keyboard.h +++ b/navit/gui/internal/gui_internal_keyboard.h @@ -24,6 +24,7 @@ struct gui_priv; struct widget; struct widget *gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode); struct widget *gui_internal_keyboard(struct gui_priv *this, int mode); +struct widget *gui_internal_keyboard_show_native(struct gui_priv *this, struct widget *w, int mode, char *lang); int gui_internal_keyboard_init_mode(char *lang); void gui_internal_keyboard_to_upper_case(struct gui_priv *this); void gui_internal_keyboard_to_lower_case(struct gui_priv *this); diff --git a/navit/gui/internal/gui_internal_menu.c b/navit/gui/internal/gui_internal_menu.c index 7769953b9..33def9983 100644 --- a/navit/gui/internal/gui_internal_menu.c +++ b/navit/gui/internal/gui_internal_menu.c @@ -91,10 +91,31 @@ gui_internal_prune_menu_count(struct gui_priv *this, int count, int render) } } + +/** + * @brief Initializes a GUI screen + * + * This method initializes the internal GUI's screen on which all other elements (such as HTML menus, + * dialogs or others) are displayed. + * + * It sets up a view hierarchy, which includes a title bar and a client area to hold widgets defined by + * the caller. + * + * @param this The GUI instance + * @param label The label to display in the top bar + * + * @return The container for caller-defined widgets + */ struct widget * gui_internal_menu(struct gui_priv *this, const char *label) { struct widget *menu,*w,*w1,*topbox; + struct padding *padding = NULL; + + if (this->gra) { + padding = graphics_get_data(this->gra, "padding"); + } else + dbg(lvl_warning, "cannot get padding: this->gra is NULL\n"); gui_internal_search_idle_end(this); topbox=gui_internal_box_new_with_label(this, 0, label); @@ -102,8 +123,18 @@ gui_internal_menu(struct gui_priv *this, const char *label) topbox->h=this->root.h; gui_internal_widget_append(&this->root, topbox); menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); - menu->w=this->root.w; - menu->h=this->root.h; + + if (padding) { + menu->p.x = padding->left; + menu->p.y = padding->top; + menu->w = topbox->w - padding->left - padding->right; + menu->h = topbox->h - padding->top - padding->bottom; + } else { + menu->p.x = 0; + menu->p.y = 0; + menu->w = topbox->w; + menu->h = topbox->h; + } menu->background=this->background; gui_internal_apply_config(this); topbox->menu_data=g_new0(struct menu_data, 1); @@ -134,8 +165,17 @@ gui_internal_menu(struct gui_priv *this, const char *label) } if (this->flags & 192) { menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); - menu->w=this->root.w; - menu->h=this->root.h; + if (padding) { + menu->p.x = padding->left; + menu->p.y = padding->top; + menu->w = topbox->w - padding->left - padding->right; + menu->h = topbox->h - padding->top - padding->bottom; + } else { + menu->p.x = 0; + menu->p.y = 0; + menu->w = topbox->w; + menu->h = topbox->h; + } w1=gui_internal_time_help(this); gui_internal_widget_append(menu, w1); w1=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); @@ -147,8 +187,17 @@ gui_internal_menu(struct gui_priv *this, const char *label) gui_internal_widget_reset_pack(this, topbox); topbox->w=this->root.w; topbox->h=this->root.h; - menu->w=this->root.w; - menu->h=this->root.h; + if (padding) { + menu->p.x = padding->left; + menu->p.y = padding->top; + menu->w = topbox->w - padding->left - padding->right; + menu->h = topbox->h - padding->top - padding->bottom; + } else { + menu->p.x = 0; + menu->p.y = 0; + menu->w = topbox->w; + menu->h = topbox->h; + } return w; } diff --git a/navit/gui/internal/gui_internal_poi.c b/navit/gui/internal/gui_internal_poi.c index c3eed5e60..d4ffea8b3 100644 --- a/navit/gui/internal/gui_internal_poi.c +++ b/navit/gui/internal/gui_internal_poi.c @@ -533,6 +533,8 @@ gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *dat if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, keyboard_mode)); + else + gui_internal_keyboard_show_native(this, w, keyboard_mode, getenv("LANG")); gui_internal_menu_render(this); diff --git a/navit/gui/internal/gui_internal_search.c b/navit/gui/internal/gui_internal_search.c index a0d6a3b2e..e5e137e07 100644 --- a/navit/gui/internal/gui_internal_search.c +++ b/navit/gui/internal/gui_internal_search.c @@ -212,6 +212,9 @@ gui_internal_highlight_possible_keys(struct gui_priv *this, char *possible_keys) { struct menu_data *md; + if (!this->keyboard) + return; + md=gui_internal_menu_data(this); if (md && md->keyboard && !(this->flags & 2048)) { GList *lk=md->keyboard->children; @@ -225,9 +228,9 @@ gui_internal_highlight_possible_keys(struct gui_priv *this, char *possible_keys) if (child_->data && strcmp("\b", child_->data)) { // FIXME don't disable special keys if ( (strlen(possible_keys) == 0) || (g_strrstr(possible_keys, child_->data)!=NULL ) ) { - child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; + child_->state|= STATE_HIGHLIGHTED|STATE_SENSITIVE|STATE_CLEAR ; } else { - child_->state&= ~(STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SELECTED) ; + child_->state&= ~STATE_HIGHLIGHTED; } gui_internal_widget_render(this,child_); } @@ -431,13 +434,9 @@ gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data search_attr.type=attr_house_number; search_attr.u.str=wm->text; search_list_search(this->sl, &search_attr, 1); - // Text is not necessarily entered via the on-screen keyboard, - // but we now switch it to lower case anyway. - gui_internal_keyboard_to_lower_case(this); gui_internal_search_idle_start(this, wm->name, search_list, param); } else { // If not enough content is entered, we highlight all keys. - gui_internal_keyboard_to_upper_case(this); gui_internal_highlight_possible_keys(this, ""); } l=g_list_last(this->root.children); @@ -570,6 +569,8 @@ gui_internal_search(struct gui_priv *this, const char *what, const char *type, i wk->name=g_strdup(type); if (this->keyboard) gui_internal_widget_append(w, gui_internal_keyboard(this, keyboard_mode)); + else + gui_internal_keyboard_show_native(this, w, keyboard_mode, getenv("LANG")); gui_internal_menu_render(this); } diff --git a/navit/gui/internal/gui_internal_widget.c b/navit/gui/internal/gui_internal_widget.c index e78abb3dd..1dd28837f 100644 --- a/navit/gui/internal/gui_internal_widget.c +++ b/navit/gui/internal/gui_internal_widget.c @@ -321,18 +321,18 @@ static void gui_internal_box_render(struct gui_priv *this, struct widget *w) gui_internal_background_render(this, w); if (w->foreground && w->border) { - struct point pnt[5]; - pnt[0]=w->p; - pnt[1].x=pnt[0].x+w->w; - pnt[1].y=pnt[0].y; - pnt[2].x=pnt[0].x+w->w; - pnt[2].y=pnt[0].y+w->h; - pnt[3].x=pnt[0].x; - pnt[3].y=pnt[0].y+w->h; - pnt[4]=pnt[0]; - graphics_gc_set_linewidth(w->foreground, w->border ? w->border : 1); - graphics_draw_lines(this->gra, w->foreground, pnt, 5); - graphics_gc_set_linewidth(w->foreground, 1); + struct point pnt[5]; + pnt[0]=w->p; + pnt[1].x=pnt[0].x+w->w; + pnt[1].y=pnt[0].y; + pnt[2].x=pnt[0].x+w->w; + pnt[2].y=pnt[0].y+w->h; + pnt[3].x=pnt[0].x; + pnt[3].y=pnt[0].y+w->h; + pnt[4]=pnt[0]; + graphics_gc_set_linewidth(w->foreground, w->border ? w->border : 1); + graphics_draw_lines(this->gra, w->foreground, pnt, 5); + graphics_gc_set_linewidth(w->foreground, 1); } l=w->children; @@ -1226,7 +1226,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) GList * current_desc=NULL; struct table_data * table_data = (struct table_data*)w->data; int drawing_space_left=1; - int is_first_page=1; + int is_first_page; struct table_column_desc * dim=NULL; dbg_assert(table_data); @@ -1238,16 +1238,17 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) /* * Skip rows that are on previous pages. */ - cur_row = w->children; if(table_data->top_row && table_data->top_row != w->children && !table_data->scroll_buttons.button_box_hide) { cur_row = table_data->top_row; is_first_page=0; } else { + cur_row = w->children; table_data->top_row=NULL; + is_first_page=1; } - /* First, let's deactivate all columns that are in rows which are *before* + /* First, let's mark all columns as off-screen that are in rows which are *before* * our current page. * */ GList *row = w->children; @@ -1263,7 +1264,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) cur_column=g_list_next(cur_column)) { struct widget * cur_widget = (struct widget*) cur_column->data; - cur_widget->state &= ~STATE_SENSITIVE; + cur_widget->state |= STATE_OFFSCREEN; } row = g_list_next(row); } @@ -1297,8 +1298,6 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) cur_column=g_list_next(cur_column)) { struct widget * cur_widget = (struct widget*) cur_column->data; - dim = (struct table_column_desc*)current_desc->data; - if (drawing_space_left) { cur_widget->p.x=x; cur_widget->w=dim->width; @@ -1309,7 +1308,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) /* We pack the widget before rendering to ensure that the x and y * coordinates get pushed down. */ - cur_widget->state |= STATE_SENSITIVE; + cur_widget->state &= ~STATE_OFFSCREEN; gui_internal_widget_pack(this,cur_widget); gui_internal_widget_render(this,cur_widget); @@ -1318,8 +1317,8 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w) max_height = dim->height; } } else { - /* Deactivate contents that we don't have space for. */ - cur_widget->state &= ~STATE_SENSITIVE; + /* Mark contents that we don't have space for. */ + cur_widget->state |= STATE_OFFSCREEN; } } diff --git a/navit/gui/qml/gui_qml.cpp b/navit/gui/qml/gui_qml.cpp index cee0574bd..7a1016473 100644 --- a/navit/gui/qml/gui_qml.cpp +++ b/navit/gui/qml/gui_qml.cpp @@ -473,5 +473,5 @@ static struct gui_priv * gui_qml_new(struct navit *nav, struct gui_methods *meth } void plugin_init(void) { - plugin_register_gui_type("qml",gui_qml_new); + plugin_register_category_gui("qml",gui_qml_new); } diff --git a/navit/gui/win32/gui_win32.c b/navit/gui/win32/gui_win32.c index bdbdb357d..8a8cb37b9 100644 --- a/navit/gui/win32/gui_win32.c +++ b/navit/gui/win32/gui_win32.c @@ -639,5 +639,5 @@ static struct gui_priv *win32_gui_new( struct navit *nav, struct gui_methods *me void plugin_init(void) { - plugin_register_gui_type("win32", win32_gui_new); + plugin_register_category_gui("win32", win32_gui_new); } diff --git a/navit/map.c b/navit/map.c index 51cda59be..2736da9f8 100644 --- a/navit/map.c +++ b/navit/map.c @@ -24,7 +24,7 @@ * This file contains the code that makes navit able to load maps. Because * navit is able to open maps in different formats, this code does not handle * any map format itself. This is done by map plugins which register to this - * code by calling plugin_register_map_type(). + * code by calling plugin_register_category_map(). * * When opening a new map, the map plugin will return a pointer to a map_priv * struct, which can be defined by the map plugin and contains whatever private @@ -99,7 +99,7 @@ map_new(struct attr *parent, struct attr **attrs) dbg(lvl_error,"missing type\n"); return NULL; } - maptype_new=plugin_get_map_type(type->u.str); + maptype_new=plugin_get_category_map(type->u.str); if (! maptype_new) { dbg(lvl_error,"invalid type '%s'\n", type->u.str); return NULL; diff --git a/navit/map/binfile/binfile.c b/navit/map/binfile/binfile.c index 4ca4c6bf5..6b5108659 100644 --- a/navit/map/binfile/binfile.c +++ b/navit/map/binfile/binfile.c @@ -2848,6 +2848,6 @@ plugin_init(void) if (sizeof(struct zip_cd) != 46) { dbg(lvl_error,"error: sizeof(struct zip_cd)=%zu\n",sizeof(struct zip_cd)); } - plugin_register_map_type("binfile", map_new_binfile); + plugin_register_category_map("binfile", map_new_binfile); } diff --git a/navit/map/csv/csv.c b/navit/map/csv/csv.c index ea36432d1..2726e8ab9 100644 --- a/navit/map/csv/csv.c +++ b/navit/map/csv/csv.c @@ -25,6 +25,7 @@ #include <stdio.h> #include <string.h> #include <math.h> +#include <errno.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif @@ -864,7 +865,8 @@ map_new_csv(struct map_methods *meth, struct attr **attrs, struct callback_list fclose(fp); } else { - dbg(lvl_error,"Error opening csv map file %s, starting with empty map\n", m->filename); + dbg(lvl_error,"Error opening csv map file '%s': %s\n", m->filename, strerror(errno)); + return NULL; } } else { dbg(lvl_debug,"No data attribute, starting with in-memory map\n"); @@ -878,6 +880,6 @@ void plugin_init(void) { dbg(lvl_debug,"csv: plugin_init\n"); - plugin_register_map_type("csv", map_new_csv); + plugin_register_category_map("csv", map_new_csv); } diff --git a/navit/map/filter/filter.c b/navit/map/filter/filter.c index 63817ecc7..cecae7fc0 100644 --- a/navit/map/filter/filter.c +++ b/navit/map/filter/filter.c @@ -430,6 +430,6 @@ void plugin_init(void) { dbg(lvl_debug,"filter: plugin_init\n"); - plugin_register_map_type("filter", map_filter_new); + plugin_register_category_map("filter", map_filter_new); } diff --git a/navit/map/garmin/garmin.c b/navit/map/garmin/garmin.c index 609bcab0e..d00cb9794 100644 --- a/navit/map/garmin/garmin.c +++ b/navit/map/garmin/garmin.c @@ -993,5 +993,5 @@ gmap_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cb void plugin_init(void) { - plugin_register_map_type("garmin", gmap_new); + plugin_register_category_map("garmin", gmap_new); } diff --git a/navit/map/garmin_img/garmin_img.c b/navit/map/garmin_img/garmin_img.c index 58fe489da..f7dccf89c 100644 --- a/navit/map/garmin_img/garmin_img.c +++ b/navit/map/garmin_img/garmin_img.c @@ -1508,6 +1508,6 @@ map_new_garmin_img(struct map_methods *meth, struct attr **attrs) void plugin_init(void) { - plugin_register_map_type("garmin_img", map_new_garmin_img); + plugin_register_category_map("garmin_img", map_new_garmin_img); } diff --git a/navit/map/mg/map.c b/navit/map/mg/map.c index 9b0805e2d..13561e154 100644 --- a/navit/map/mg/map.c +++ b/navit/map/mg/map.c @@ -609,5 +609,5 @@ map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list * void plugin_init(void) { - plugin_register_map_type("mg", map_new_mg); + plugin_register_category_map("mg", map_new_mg); } diff --git a/navit/map/shapefile/shapefile.c b/navit/map/shapefile/shapefile.c index e67aaafee..e3eb4b723 100644 --- a/navit/map/shapefile/shapefile.c +++ b/navit/map/shapefile/shapefile.c @@ -682,7 +682,7 @@ void plugin_init(void) { dbg(lvl_debug,"shapefile: plugin_init\n"); - plugin_register_map_type("shapefile", map_new_shapefile); + plugin_register_category_map("shapefile", map_new_shapefile); } /************************************************************************/ diff --git a/navit/map/textfile/textfile.c b/navit/map/textfile/textfile.c index d70f989f9..43be12368 100644 --- a/navit/map/textfile/textfile.c +++ b/navit/map/textfile/textfile.c @@ -394,6 +394,6 @@ void plugin_init(void) { dbg(lvl_debug,"textfile: plugin_init\n"); - plugin_register_map_type("textfile", map_new_textfile); + plugin_register_category_map("textfile", map_new_textfile); } diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h index 7fde891dd..eca708591 100644 --- a/navit/maptool/maptool.h +++ b/navit/maptool/maptool.h @@ -115,11 +115,11 @@ struct item_bin_sink { void *priv_data[8]; GList *sink_funcs; }; - +#define NODE_ID_BITS 56 struct node_item { - unsigned int id; - char ref_way; struct coord c; + unsigned long long int nd_id:NODE_ID_BITS; + char ref_way; }; struct zip_info; @@ -131,7 +131,7 @@ struct country_table; * Must be at least 64 bit wide because IDs will soon exceed 32 bit. */ typedef unsigned long long int osmid; -#define OSMID_FMT LONGLONG_FMT +#define OSMID_FMT ULONGLONG_FMT /** Files needed for processing a relation. */ struct files_relation_processing { @@ -418,3 +418,6 @@ int zip_get_zipnum(struct zip_info *info); void zip_set_zipnum(struct zip_info *info, int num); void zip_close(struct zip_info *info); void zip_destroy(struct zip_info *info); + +/* Break compilation on 32 bit architectures, as we're going to cast osmid's to gpointer to use them as keys to GHashTable's */ +struct maptool_force_64 {char s[sizeof(gpointer)<sizeof(osmid)?-1:1];}; diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c index 37c0e7626..f30b06365 100644 --- a/navit/maptool/osm.c +++ b/navit/maptool/osm.c @@ -106,6 +106,8 @@ enum attr_strings_type { attr_string_ref, attr_string_exit_to, attr_string_street_destination, + attr_string_street_destination_forward, + attr_string_street_destination_backward, attr_string_house_number, attr_string_label, attr_string_postal, @@ -118,10 +120,16 @@ char *attr_strings[attr_string_last]; char *osm_types[]={"unknown","node","way","relation"}; -#define REF_MARKER (1 << 30) -#define IS_REF(c) ((c).x == REF_MARKER) -#define GET_REF(c) ((unsigned)(c).y) -#define SET_REF(c,ref) do { (c).x = REF_MARKER; (c).y = ref ; } while(0) +/* + * These macros are designed to handle maptool internal node id reference representation. This representation does not leak + * to binfile, so it's safe to change it without breaking binfile binary compatibility. + * Currently it keeps low 31 bits in y coordinate and up to 30 high order bits in x coordinate, allowing for 61 bit osm node id in total. + */ +#define REF_MARKER (1ull << 30) +#define REF_MASK (3ull << 30) +#define IS_REF(c) (((c).x & REF_MASK)==REF_MARKER) +#define GET_REF(c) ((((osmid)(c).x & ~REF_MARKER)<<31) + (c).y ) +#define SET_REF(c,ref) do { (c).x = REF_MARKER | ((osmid)(ref)>>31); (c).y = (osmid)(ref) & 0x7fffffffull; } while(0) /* Table of country codes with possible is_in spellings. * Note: If you update this list, check also country array in country.c @@ -395,7 +403,6 @@ struct country_table { static char *attrmap={ "n *=* point_unkn\n" -// "n Annehmlichkeit=Hochsitz poi_hunting_stand\n" "? addr:housenumber=* house_number\n" "? aeroway=aerodrome poi_airport\n" "? aeroway=airport poi_airport\n" @@ -506,7 +513,7 @@ static char *attrmap={ "? shop=car_repair poi_repair_service\n" "? shop=clothes poi_shop_apparel\n" "? shop=convenience poi_shop_grocery\n" - "? shop=drogist poi_shop_drugstore\n" + "? shop=chemist poi_shop_drugstore\n" "? shop=florist poi_shop_florist\n" "? shop=fruit poi_shop_fruit\n" "? shop=furniture poi_shop_furniture\n" @@ -519,6 +526,7 @@ static char *attrmap={ "? shop=photo poi_shop_photo\n" "? shop=shoes poi_shop_shoes\n" "? shop=supermarket poi_shopping\n" + "? shop=mall poi_mall\n" "? sport=10pin poi_bowling\n" "? sport=baseball poi_baseball\n" "? sport=basketball poi_basketball\n" @@ -790,7 +798,7 @@ build_attrmap_line(char *line) kvl=NULL; if (!(idx=(int)(long)g_hash_table_lookup(attr_hash, kv))) { idx=attr_present_count++; - g_hash_table_insert(attr_hash, kv, (gpointer)(long)idx); + g_hash_table_insert(attr_hash, kv, (gpointer)(long long)idx); } attr_mapping=g_realloc(attr_mapping, sizeof(struct attr_mapping)+(attr_mapping_count+1)*sizeof(int)); attr_mapping->attr_present_idx[attr_mapping_count++]=idx; @@ -923,7 +931,7 @@ item_bin_get_nodeid(struct item_bin *ib) osmid item_bin_get_wayid(struct item_bin *ib) { - long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); + unsigned long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); if (ret) return *ret; return 0; @@ -1048,6 +1056,8 @@ osm_add_tag(char *k, char *v) flagsa[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_HORSE|AF_BIKE|AF_PEDESTRIAN; else flags[0] |= AF_THROUGH_TRAFFIC_LIMIT; + if (! strcmp(v,"hov")) + flags[0] |= AF_HIGH_OCCUPANCY_CAR_ONLY; level=5; } if (! strcmp(k,"vehicle")) { @@ -1185,6 +1195,18 @@ osm_add_tag(char *k, char *v) attr_strings_save(attr_string_street_destination, v); level=5; } + if (! strcmp(k,"destination:forward")) + { + if (in_way) + attr_strings_save(attr_string_street_destination_forward, v); + level=5; + } + if (! strcmp(k,"destination:backward")) + { + if (in_way) + attr_strings_save(attr_string_street_destination_backward, v); + level=5; + } if (! strcmp(k,"exit_to")) { attr_strings_save(attr_string_exit_to, v); level=5; @@ -1308,8 +1330,9 @@ node_buffer_to_hash(void) { int i,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)node_buffer.base; + for (i = 0 ; i < count ; i++) - g_hash_table_insert(node_hash, (gpointer)(long)(ni[i].id), (gpointer)(long)i); + g_hash_table_insert(node_hash, (gpointer)(long long)(ni[i].nd_id), (gpointer)(long long)i); } void @@ -1357,23 +1380,24 @@ osm_add_node(osmid id, double lat, double lon) osmid_attr_value=id; current_node=allocate_node_item_in_buffer(); - current_node->id=id; + dbg_assert(id < ((2ull<<NODE_ID_BITS)-1)); + current_node->nd_id=id; current_node->ref_way=0; current_node->c.x=lon*6371000.0*M_PI/180; current_node->c.y=log(tan(M_PI_4+lat*M_PI/360))*6371000.0; if (! node_hash) { - if (current_node->id > id_last_node) { - id_last_node=current_node->id; + if (current_node->nd_id > id_last_node) { + id_last_node=current_node->nd_id; } else { fprintf(stderr,"INFO: Nodes out of sequence (new " OSMID_FMT " vs old " OSMID_FMT "), adding hash\n", - (osmid)current_node->id, id_last_node); + (osmid)current_node->nd_id, id_last_node); node_hash=g_hash_table_new(NULL, NULL); node_buffer_to_hash(); } } else - if (!g_hash_table_lookup(node_hash, (gpointer)(long)(current_node->id))) - g_hash_table_insert(node_hash, (gpointer)(long)(current_node->id), - (gpointer)(long)(current_node-(struct node_item *)node_buffer.base)); + if (!g_hash_table_lookup(node_hash, (gpointer)(long long)(current_node->nd_id))) + g_hash_table_insert(node_hash, (gpointer)(long long)(current_node->nd_id), + (gpointer)(long long)(current_node-(struct node_item *)node_buffer.base)); else { remove_last_node_item_from_buffer(); nodeid=0; @@ -1398,21 +1422,21 @@ node_item_find_index_in_ordered_list(osmid id) long long node_count=node_buffer.size/sizeof(struct node_item); long long search_step=node_count>4 ? node_count/4 : 1; long long search_index=node_count/2; - if (node_buffer_base[0].id > id) + if (node_buffer_base[0].nd_id > id) return -1; - if (node_buffer_base[node_count-1].id < id) + if (node_buffer_base[node_count-1].nd_id < id) return -1; - while (node_buffer_base[search_index].id != id) { + while (node_buffer_base[search_index].nd_id != id) { #if 0 fprintf(stderr,"search_index=%d node_count=%d search_step=%d id=%d node_buffer_base[search_index].id=%d\n", search_index, node_count, search_step, id, node_buffer_base[search_index].id); #endif - if (node_buffer_base[search_index].id < id) { + if (node_buffer_base[search_index].nd_id < id) { search_index+=search_step; if (search_step == 1) { if (search_index >= node_count) return -1; - if (node_buffer_base[search_index].id > id) + if (node_buffer_base[search_index].nd_id > id) return -1; } else { if (search_index >= node_count) @@ -1423,7 +1447,7 @@ node_item_find_index_in_ordered_list(osmid id) if (search_step == 1) { if (search_index < 0) return -1; - if (node_buffer_base[search_index].id < id) + if (node_buffer_base[search_index].nd_id < id) return -1; } else { if (search_index < 0) @@ -1444,7 +1468,7 @@ node_item_get(osmid id) if (node_hash) { // Use g_hash_table_lookup_extended instead of g_hash_table_lookup // to distinguish a key with a value 0 from a missing key. - if (!g_hash_table_lookup_extended (node_hash, (gpointer)(long)(id), NULL, + if (!g_hash_table_lookup_extended (node_hash, (gpointer)(id), NULL, (gpointer)&result_index)) { result_index=-1; } @@ -1738,9 +1762,9 @@ osm_end_way(struct maptool_osm *osm) return; if (dedupe_ways_hash) { - if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long)wayid)) + if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long long)wayid)) return; - g_hash_table_insert(dedupe_ways_hash, (gpointer)(long)wayid, (gpointer)1); + g_hash_table_insert(dedupe_ways_hash, (gpointer)(long long)wayid, (gpointer)1); } count=attr_longest_match(attr_mapping_way, attr_mapping_way_count, types, sizeof(types)/sizeof(enum item_type)); @@ -1778,6 +1802,8 @@ osm_end_way(struct maptool_osm *osm) item_bin_add_attr_string(item_bin, attr_street_name_systematic, attr_strings[attr_string_street_name_systematic]); item_bin_add_attr_string(item_bin, attr_street_name_systematic_nat, attr_strings[attr_string_street_name_systematic_nat]); item_bin_add_attr_string(item_bin, attr_street_destination, attr_strings[attr_string_street_destination]); + item_bin_add_attr_string(item_bin, attr_street_destination_forward, attr_strings[attr_string_street_destination_forward]); + item_bin_add_attr_string(item_bin, attr_street_destination_backward, attr_strings[attr_string_street_destination_backward]); item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value); if (debug_attr_buffer[0]) item_bin_add_attr_string(item_bin, attr_debug, debug_attr_buffer); @@ -2983,8 +3009,8 @@ write_item_way_subsection_index(FILE *out, FILE *out_index, FILE *out_graph, str idx[0]=item_bin_get_wayid(orig); idx[1]=ftello(out); if (way_hash) { - if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)idx[0], NULL, NULL))) - g_hash_table_insert(way_hash, (gpointer)(long)idx[0], (gpointer)(long)idx[1]); + if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long long)idx[0], NULL, NULL))) + g_hash_table_insert(way_hash, (gpointer)(long long)idx[0], (gpointer)(long long)idx[1]); } else { if (!last_id || *last_id != idx[0]) dbg_assert(fwrite(idx, sizeof(idx), 1, out_index)==1); @@ -3048,6 +3074,7 @@ resolve_ways(FILE *in, FILE *out) c[i].x=ni->c.x; c[i].y=ni->c.y; } + } item_bin_write(ib,out); } @@ -3103,7 +3130,6 @@ map_resolve_coords_and_split_at_intersections(FILE *in, FILE *out, FILE *out_ind struct item_bin *ib; struct node_item *ni; long long last_id=0; - processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; sig_alrm(0); while ((ib=read_item(in))) { diff --git a/navit/maptool/osm_o5m.c b/navit/maptool/osm_o5m.c index 1ca3b1c3c..d6957067d 100644 --- a/navit/maptool/osm_o5m.c +++ b/navit/maptool/osm_o5m.c @@ -16,7 +16,7 @@ struct o5m { int error; int lat, lon, uid, version; - long long id, rid[3], changeset; + unsigned long long id, rid[3], changeset; time_t timestamp; char *user; }; @@ -49,24 +49,24 @@ static unsigned long long get_uval(unsigned char **p) { unsigned char c; - long long ret=0; + unsigned long long ret=0; int shift=0; for (;;) { c=*((*p)++); - ret+=((long long)c & 0x7f) << shift; + ret+=((unsigned long long)c & 0x7f) << shift; if (!(c & 0x80)) return ret; shift+=7; } } -static unsigned long long +static long long get_sval(unsigned char **p) { - long long ret=get_uval(p); + unsigned long long ret=get_uval(p); if (ret & 1) { - return -((ret >> 1)+1); + return -((long long)(ret >> 1)+1); } else { return ret >> 1; } diff --git a/navit/maptool/osm_relations.c b/navit/maptool/osm_relations.c index 1ad04a281..591ca7d9d 100644 --- a/navit/maptool/osm_relations.c +++ b/navit/maptool/osm_relations.c @@ -135,7 +135,7 @@ relations_process(struct relations *rel, FILE *nodes, FILE *ways) { char buffer[128]; struct item_bin *ib=(struct item_bin *)buffer; - long long *id; + osmid *id; struct coord *c=(struct coord *)(ib+1),cn={0,0}; struct node_item *ni; GList *l; @@ -146,7 +146,7 @@ relations_process(struct relations *rel, FILE *nodes, FILE *ways) item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); while ((ni=read_node_item(nodes))) { - *id=ni->id; + *id=ni->nd_id; *c=ni->c; l=g_hash_table_lookup(rel->member_hash[0], id); while (l) { diff --git a/navit/navigation.c b/navit/navigation.c index ba9b5aaeb..cdad6331c 100644 --- a/navit/navigation.c +++ b/navit/navigation.c @@ -46,6 +46,10 @@ /* #define DEBUG */ +/** @file + * + * Generates navigation messages for a calculated route. + */ static int roundabout_extra_length=50; /* TODO: find out if this is being used elsewhere and, if so, move this definition somewhere more generic */ @@ -86,7 +90,7 @@ static int turn_2_limit = 45; static int sharp_turn_limit = 110; /** Minimum absolute delta for a U turn. - * Maneuvers whose absolute delta is less than this (but at least {@code min_turn_limit}) will always be announced as turns. + * Maneuvers whose absolute delta is less than this (but at least #min_turn_limit) will always be announced as turns. * Note that, depending on other conditions, even maneuvers whose delta exceeds the threshold may still be announced as (sharp) turns. */ static int u_turn_limit = 165; @@ -204,14 +208,14 @@ int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1}; /** Merging into a motorway-like road, direction undefined. * This value is not intended to be set directly but can be used for - * comparisons, e.g. {@code merge_or_exit & mex_merge}. */ + * comparisons, e.g. `merge_or_exit & mex_merge`. */ #define mex_merge 1 /** Exiting from a motorway-like road, direction undefined. * This should only be used for ramps leading to a non-motorway road. - * For interchanges, use {@code mex_interchange} instead. + * For interchanges, use #mex_interchange instead. * This value is not intended to be set directly but can be used for - * comparisons, e.g. {@code merge_or_exit & mex_exit}. */ + * comparisons, e.g. `merge_or_exit & mex_merge`. */ #define mex_exit 2 /** Motorway-like road splits in two. @@ -222,14 +226,14 @@ int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1}; #define mex_merge_right 9 /** Exiting from a motorway-like road to the right. - * See {@code mex_exit} for usage. */ + * @see mex_exit for usage */ #define mex_exit_right 10 /** Merging into a motorway-like road to the left (coming from the right) */ #define mex_merge_left 17 /** Exiting from a motorway-like road to the left. - * See {@code mex_exit} for usage. */ + * @see mex_exit for usage */ #define mex_exit_left 18 /** @@ -706,7 +710,7 @@ char *nav_status_to_text(int status) { ret = g_strdup("status_routing"); break; default: - ret = g_strdup_printf("status_unknown_%d)", status); + ret = g_strdup_printf("status_unknown_%d", status); } return ret; } @@ -4440,7 +4444,7 @@ navigation_set_route(struct navigation *this_, struct route *route) void navigation_init(void) { - plugin_register_map_type("navigation", navigation_map_new); + plugin_register_category_map("navigation", navigation_map_new); } struct object_func navigation_func = { diff --git a/navit/navit.c b/navit/navit.c index b130ed967..9e4ea421b 100644 --- a/navit/navit.c +++ b/navit/navit.c @@ -144,6 +144,7 @@ struct navit { int autozoom_min; int autozoom_max; int autozoom_active; + int autozoom_paused; struct event_timeout *button_timeout, *motion_timeout; struct callback *motion_timeout_callback; int ignore_button; @@ -176,6 +177,7 @@ struct navit { int imperial; int waypoints_flag; struct coord_geo center; + int auto_switch; /*auto switching between day/night layout enabled ?*/ }; struct gui *main_loop_gui; @@ -199,6 +201,7 @@ static void navit_cmd_set_center_cursor(struct navit *this_); static void navit_cmd_announcer_toggle(struct navit *this_); static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv); static int navit_set_vehicleprofile(struct navit *this_, struct vehicleprofile *vp); +static void navit_cmd_switch_layout_day_night(struct navit *this_, char *function, struct attr **in, struct attr ***out, int valid); struct object_func navit_func; struct navit *global_navit; @@ -659,12 +662,17 @@ navit_autozoom(struct navit *this_, struct coord *center, int speed, int draw) return; } + if(this_->autozoom_paused){ + this_->autozoom_paused--; + return; + } + distance = speed * this_->autozoom_secs; transform_get_size(this_->trans, &w, &h); transform(this_->trans, transform_get_projection(this_->trans), center, &pc, 1, 0, 0, NULL); scale = transform_get_scale(this_->trans); - + /* We make sure that the point we want to see is within a certain range * around the vehicle. The radius of this circle is the size of the * screen. This doesn't necessarily mean the point is visible because of @@ -699,6 +707,9 @@ void navit_zoom_in(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)/factor; + if(this_->autozoom_active){ + this_->autozoom_paused = 10; + } if (scale < 1) scale=1; navit_scale(this_, scale, p, 1); @@ -716,6 +727,9 @@ void navit_zoom_out(struct navit *this_, int factor, struct point *p) { long scale=transform_get_scale(this_->trans)*factor; + if(this_->autozoom_active){ + this_->autozoom_paused = 10; + } navit_scale(this_, scale, p, 1); } @@ -744,6 +758,7 @@ navit_zoom_out_cursor(struct navit *this_, int factor) static int navit_cmd_zoom_in(struct navit *this_) { + navit_zoom_in_cursor(this_, 2); return 0; } @@ -770,7 +785,7 @@ static GHashTable *cmd_attr_var_hash = NULL; * Store key value pair for the command system (for int typed values) * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes in[0] is the key string, in[1] is the integer value to store * @param out output attributes, unused * @param valid unused @@ -799,7 +814,7 @@ navit_cmd_set_int_var(struct navit *this, char *function, struct attr **in, stru * Store key value pair for the command system (for attr typed values, can be used as opaque handles) * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes in[0] is the key string, in[1] is the attr* value to store * @param out output attributes, unused * @param valid unused @@ -830,7 +845,7 @@ navit_cmd_set_attr_var(struct navit *this, char *function, struct attr **in, str * command to toggle the active state of a named layer of the current layout * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] is the name of the layer * @param out output unused * @param valid unused @@ -859,7 +874,7 @@ navit_cmd_toggle_layer(struct navit *this, char *function, struct attr **in, str * adds an item with the current coordinate of the vehicle to a named map * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] is the name of the map * @param out output attribute, 0 on error or the id of the created item on success * @param valid unused @@ -950,7 +965,7 @@ navit_cmd_map_add_curr_pos(struct navit *this, char *function, struct attr **in, * sets an attribute (name value pair) of a map item specified by map name and item id * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] - name of the map ; in[1] - item ; in[2] - attr name ; in[3] - attr value * @param out output attribute, 0 on error, 1 on success * @param valid unused @@ -1015,7 +1030,7 @@ navit_cmd_map_item_set_attr(struct navit *this, char *function, struct attr **in * Get attr variable given a key string for the command system (for opaque usage) * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] is the key string * @param out output attribute, the attr for the given key string if exists or NULL * @param valid unused @@ -1053,7 +1068,7 @@ navit_cmd_get_attr_var(struct navit *this, char *function, struct attr **in, str * Get value given a key string for the command system * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] is the key string * @param out output attribute, the value for the given key string if exists or 0 * @param valid unused @@ -1092,7 +1107,7 @@ GList *cmd_int_var_stack = NULL; * Push an integer to the stack for the command system * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attribute in[0] is the integer attibute to push * @param out output attributes, unused * @param valid unused @@ -1112,7 +1127,7 @@ navit_cmd_push_int(struct navit *this, char *function, struct attr **in, struct * Pop an integer from the command system's integer stack * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes unused * @param out output attribute, the value popped if stack isn't empty or 0 * @param valid unused @@ -1140,7 +1155,7 @@ navit_cmd_pop_int(struct navit *this, char *function, struct attr **in, struct a * Get current size of command system's integer stack * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes unused * @param out output attribute, the size of stack * @param valid unused @@ -1268,7 +1283,7 @@ navit_cmd_fmt_coordinates(struct navit *this, char *function, struct attr **in, * Join several string attributes into one * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes in[0] - separator, in[1..] - attributes to join * @param out output attribute joined attribute as string * @param valid unused @@ -1305,7 +1320,7 @@ navit_cmd_strjoin(struct navit *this, char *function, struct attr **in, struct a * Call external program * * @param navit The navit instance - * @param function unused (needed to match command function signiture) + * @param function unused (needed to match command function signature) * @param in input attributes in[0] - name of executable, in[1..] - parameters * @param out output attribute unused * @param valid unused @@ -1370,6 +1385,7 @@ static struct command_table commands[] = { {"set_center",command_cast(navit_cmd_set_center)}, {"set_center_cursor",command_cast(navit_cmd_set_center_cursor)}, {"set_destination",command_cast(navit_cmd_set_destination)}, + {"set_position",command_cast(navit_cmd_set_position)}, {"route_remove_next_waypoint",command_cast(navit_cmd_route_remove_next_waypoint)}, {"route_remove_last_waypoint",command_cast(navit_cmd_route_remove_last_waypoint)}, {"set_position",command_cast(navit_cmd_set_position)}, @@ -1387,6 +1403,7 @@ static struct command_table commands[] = { {"map_item_set_attr",command_cast(navit_cmd_map_item_set_attr)}, {"set_attr_var",command_cast(navit_cmd_set_attr_var)}, {"get_attr_var",command_cast(navit_cmd_get_attr_var)}, + {"switch_layout_day_night",command_cast(navit_cmd_switch_layout_day_night)}, }; void @@ -1424,12 +1441,14 @@ navit_new(struct attr *parent, struct attr **attrs) this_->autozoom_secs = 10; this_->autozoom_min = 7; this_->autozoom_active = 0; + this_->autozoom_paused = 0; this_->zoom_min = 1; this_->zoom_max = 2097152; this_->autozoom_max = this_->zoom_max; this_->follow_cursor = 1; this_->radius = 30; this_->border = 16; + this_->auto_switch = TRUE; transform_from_geo(pro, &g, &co); center.x=co.x; @@ -2041,22 +2060,22 @@ navit_init(struct navit *this_) dbg(lvl_info,"enter gui %p graphics %p\n",this_->gui,this_->gra); if (!this_->gui && !(this_->flags & 2)) { - dbg(lvl_error,"Warning: No GUI available.\n"); - return; + dbg(lvl_error,"FATAL: No GUI available.\n"); + exit(1); } if (!this_->gra && !(this_->flags & 1)) { - dbg(lvl_error,"Warning: No graphics subsystem available.\n"); - return; + dbg(lvl_error,"FATAL: No graphics subsystem available.\n"); + exit(1); } dbg(lvl_info,"Connecting gui to graphics\n"); if (this_->gui && this_->gra && gui_set_graphics(this_->gui, this_->gra)) { struct attr attr_type_gui, attr_type_graphics; gui_get_attr(this_->gui, attr_type, &attr_type_gui, NULL); graphics_get_attr(this_->gra, attr_type, &attr_type_graphics, NULL); - dbg(lvl_error,"failed to connect graphics '%s' to gui '%s'\n", attr_type_graphics.u.str, attr_type_gui.u.str); - dbg(lvl_error," Please see http://wiki.navit-project.org/index.php/Failed_to_connect_graphics_to_gui\n"); - dbg(lvl_error," for explanations and solutions\n"); - return; + dbg(lvl_error,"FATAL: Failed to connect graphics '%s' to gui '%s'\n", attr_type_graphics.u.str, attr_type_gui.u.str); + dbg(lvl_error,"Please see http://wiki.navit-project.org/index.php/Failed_to_connect_graphics_to_gui " + "for explanations and solutions\n"); + exit(1); } if (this_->speech && this_->navigation) { struct attr speech; @@ -2314,18 +2333,35 @@ navit_set_cursors(struct navit *this_) return; } + +/** + * @brief Calculates the position of the cursor on the screen. + * + * This method considers padding if supported by the graphics plugin. In that case, the inner rectangle + * (i.e. screen size minus padding) will be used to center the cursor and to determine cursor offset (as + * specified in `this_->radius`). + * + * @param this_ The navit object + * @param p Receives the screen coordinates for the cursor + * @param keep_orientation Whether to maintain the current map orientation. If false, the map will be + * rotated so that the bearing of the vehicle is up. + * @param dir Receives the new map orientation as requested by `screen_orientation` (can be `NULL`) + * + * @return Always 1 + */ static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir) { int width, height; struct navit_vehicle *nv=this_->vehicle; + struct padding *padding = NULL; float offset=this_->radius; // Cursor offset from the center of the screen (percent). #if 0 /* Better improve track.c to get that issue resolved or make it configurable with being off the default, the jumping back to the center is a bit annoying */ float min_offset = 0.; // Percent offset at min_offset_speed. float max_offset = 30.; // Percent offset at max_offset_speed. int min_offset_speed = 2; // Speed in km/h - int max_offset_speed = 50; // Speed ini km/h + int max_offset_speed = 50; // Speed in km/h // Calculate cursor offset from the center of the screen, upon speed. if (nv->speed <= min_offset_speed) { offset = min_offset; @@ -2336,7 +2372,20 @@ navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, } #endif + if (this_->gra) { + padding = graphics_get_data(this_->gra, "padding"); + } else + dbg(lvl_warning, "cannot get padding: this->gra is NULL\n"); + transform_get_size(this_->trans, &width, &height); + dbg(lvl_debug, "width=%d height=%d\n", width, height); + + if (padding) { + width -= (padding->left + padding->right); + height -= (padding->top + padding->bottom); + dbg(lvl_debug, "corrected for padding: width=%d height=%d\n", width, height); + } + if (this_->orientation == -1 || keep_orientation) { p->x=50*width/100; p->y=(50 + offset)*height/100; @@ -2355,6 +2404,14 @@ navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, if (dir) *dir=this_->orientation; } + + if (padding) { + p->x += padding->left; + p->y += padding->top; + } + + dbg(lvl_debug, "x=%d y=%d, offset=%f\n", p->x, p->y, offset); + return 1; } @@ -3323,24 +3380,27 @@ navit_get_displaylist(struct navit *this_) return this_->displaylist; } +/*todo : make it switch to nightlayout when we are in a tunnel */ void navit_layout_switch(struct navit *n) { - int currTs=0; - struct attr iso8601_attr,geo_attr,valid_attr,layout_attr; - double trise,tset,trise_actual; - struct layout *l; - int year, month, day; - - if (navit_get_attr(n,attr_layout,&layout_attr,NULL)!=1) { - return; //No layout - nothing to switch - } - if (!n->vehicle) - return; - l=layout_attr.u.layout; - - if (l->dayname || l->nightname) { + int currTs=0; + struct attr iso8601_attr,geo_attr,valid_attr,layout_attr; + double trise,tset,trise_actual; + struct layout *l; + int year, month, day; + int after_sunrise = FALSE; + int after_sunset = FALSE; + + if (navit_get_attr(n,attr_layout,&layout_attr,NULL)!=1) { + return; //No layout - nothing to switch + } + if (!n->vehicle) + return; + l=layout_attr.u.layout; + + if (l->dayname || l->nightname) { //Ok, we know that we have profile to switch //Check that we aren't calculating too fast @@ -3348,10 +3408,13 @@ navit_layout_switch(struct navit *n) currTs=iso8601_to_secs(iso8601_attr.u.str); dbg(lvl_debug,"currTs: %u:%u\n",currTs%86400/3600,((currTs%86400)%3600)/60); } + dbg(lvl_debug,"prevTs: %u:%u\n",n->prevTs%86400/3600,((n->prevTs%86400)%3600)/60); if (currTs-(n->prevTs)<60) { - //We've have to wait a little - return; + //We've have to wait a little + return; } + if (n->auto_switch == FALSE) + return; if (sscanf(iso8601_attr.u.str,"%d-%02d-%02dT",&year,&month,&day) != 3) return; if (vehicle_get_attr(n->vehicle->vehicle, attr_position_valid, &valid_attr,NULL) && valid_attr.u.num==attr_position_valid_invalid) { @@ -3361,47 +3424,112 @@ navit_layout_switch(struct navit *n) //No position - no sun return; } - //We calculate sunrise anyway, cause it is needed both for day and for night - if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { + if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles - dbg(lvl_warning,"trise: %u:%u, sun never visible, never switch profile\n",HOURS(trise),MINUTES(trise)); + dbg(lvl_debug,"trise: %u:%u, sun never visible, never switch profile\n",HOURS(trise),MINUTES(trise)); n->prevTs=currTs; return; - } - - trise_actual=trise; - dbg(lvl_debug,"trise: %u:%u\n",HOURS(trise),MINUTES(trise)); - if (l->dayname) { - - if ((HOURS(trise)*60+MINUTES(trise)==(currTs%86400)/60) || - (n->prevTs==0 && ((HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60)))) { - //The sun is rising now! - if (strcmp(l->name,l->dayname)) { - navit_set_layout_by_name(n,l->dayname); } - } + trise_actual=trise; + dbg(lvl_debug,"trise: %u:%u\n",HOURS(trise),MINUTES(trise)); + dbg(lvl_debug,"dayname = %s, name =%s \n",l->dayname, l->name); + if (HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60) { + after_sunrise = TRUE; } - if (l->nightname) { - if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { + dbg(lvl_debug,"nightname = %s, name = %s \n",l->nightname, l->name); + if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { //near the pole sun never rises/sets, so we should never switch profiles - dbg(lvl_warning,"tset: %u:%u, sun always visible, never switch profile\n",HOURS(tset),MINUTES(tset)); + dbg(lvl_debug,"tset: %u:%u, sun always visible, never switch profile\n",HOURS(tset),MINUTES(tset)); n->prevTs=currTs; return; - } - dbg(lvl_debug,"tset: %u:%u\n",HOURS(tset),MINUTES(tset)); - if (HOURS(tset)*60+MINUTES(tset)==((currTs%86400)/60) - || (n->prevTs==0 && (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) || - ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))))) { - //Time to sleep - if (strcmp(l->name,l->nightname)) { - navit_set_layout_by_name(n,l->nightname); - } - } } - + dbg(lvl_debug,"tset: %u:%u\n",HOURS(tset),MINUTES(tset)); + if (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) || + ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))) { + after_sunset = TRUE; + } + if (after_sunrise && !after_sunset && l->dayname) { + navit_set_layout_by_name(n,l->dayname); + dbg(lvl_debug,"layout set to day\n"); + } + else if (after_sunset && l->nightname) { + navit_set_layout_by_name(n,l->nightname); + dbg(lvl_debug,"layout set to night\n"); + } n->prevTs=currTs; - } + } +} + +/** + * @brief this command is used to change the layout and enable/disable the automatic layout switcher + * + * @param this_ The navit instance + * @param function unused + * @param in input attributes in[0], a string, see usage below + * @param out output attribute unused + * @param valid unused + * + * + * usage : + * manual : disable autoswitcher + * auto : enable autoswitcher + * manual_toggle : disable autoswitcher and toggle between day / night layout + * manual_day : disable autoswitcher and set to day layout + * manual_night : disable autoswitcher and set to night layout + * + * todo : make it return the state of the autoswitcher and + * the version of the active layout (day/night/undefined) + */ +static +void navit_cmd_switch_layout_day_night(struct navit *this_, char *function, struct attr **in, struct attr ***out, int valid) +{ + + if (!(in && in[0] && ATTR_IS_STRING(in[0]->type))) { + return; + } + + dbg(lvl_debug," called with mode =%s\n",in[0]->u.str); + + if (!this_->layout_current) + return; + + if (!this_->vehicle) + return; + + if (!strcmp(in[0]->u.str,"manual")) { + this_->auto_switch = FALSE; + } + else if (!strcmp(in[0]->u.str,"auto")) { + this_->auto_switch = TRUE; + this_->prevTs = 0; + navit_layout_switch(this_); + } + else if (!strcmp(in[0]->u.str,"manual_toggle")) { + if (this_->layout_current->dayname) { + navit_set_layout_by_name(this_,this_->layout_current->dayname); + this_->auto_switch = FALSE; + dbg(lvl_debug,"toggeled layout to = %s\n",this_->layout_current->name); + } + else if (this_->layout_current->nightname) { + navit_set_layout_by_name(this_,this_->layout_current->nightname); + this_->auto_switch = FALSE; + dbg(lvl_debug,"toggeled layout to = %s\n",this_->layout_current->name); + } + } + else if (!strcmp(in[0]->u.str,"manual_day") && this_->layout_current->dayname) { + navit_set_layout_by_name(this_,this_->layout_current->dayname); + this_->auto_switch = FALSE; + dbg(lvl_debug,"switched layout to = %s\n",this_->layout_current->name); + } + else if (!strcmp(in[0]->u.str,"manual_night") && this_->layout_current->nightname) { + navit_set_layout_by_name(this_,this_->layout_current->nightname); + this_->auto_switch = FALSE; + dbg(lvl_debug,"switched layout to = %s\n",this_->layout_current->name); + } + + dbg(lvl_debug,"auto = %i\n",this_->auto_switch); + return; } int diff --git a/navit/navit_shipped.xml b/navit/navit_shipped.xml index 9ac4f0faf..eb2191963 100644 --- a/navit/navit_shipped.xml +++ b/navit/navit_shipped.xml @@ -88,13 +88,14 @@ Navigation</text></img> <img cond='fullscreen==1' src='gui_leave_fullscreen' onclick='fullscreen=0'><text>Window Mode</text></img> <img cond='navit.pitch==0' src='gui_map' onclick='navit.pitch=pitch;redraw_map();back_to_map()'><text>3D</text></img> <img cond='navit.pitch!=0' src='gui_map' onclick='navit.pitch=0;redraw_map();back_to_map()'><text>2D</text></img> + <a href='#Settings Layers'><img src='gui_layers'><text>Layers</text></img></a> </a> <a name='Tools'><text>Tools</text> <img src='gui_actions' onclick='locale()'><text>Show Locale</text></img> </a> <a name='Route'><text>Route</text> <img src='gui_actions' onclick='route_description()'><text>Description</text></img> - <img src='gui_actions' onclick='route_height_profile()'><text>Height Profile</text></img> + <img src='gui_heightprofile' onclick='route_height_profile()'><text>Height Profile</text></img> <img cond='navit.waypoints_flag && (navit.route.route_status&1)' src='cursor_still' onclick='waypoints()'><text>Waypoints</text></img> <img cond='navit.waypoints_flag && (navit.route.route_status&1)' src='gui_stop' onclick='navit.route_remove_last_waypoint()'><text>Drop last Waypoint</text></img> @@ -122,6 +123,17 @@ Waypoint</text></img> "","navit.mapset.map[@data==%{se}].active=%{d}*",map.data,!map.active,"redraw_map();refresh();"); </script> </a> + <a name='Settings Layers' class='clist'><text>Layers</text> + <script> + foreach(layer;navit.layout.layer) + if (layer.name) + img("centry",layer.active?"gui_active":"gui_inactive",layer.name, + "","navit.layout.layer[@name==%{se}].active=%{d}*",layer.name,!layer.active,"redraw_map();refresh();"); + else + img("centry",layer.active?"gui_active":"gui_inactive", + "","navit.layout.layer[@name==%{se}].active=%{d}*",layer.name,!layer.active,"redraw_map();refresh();"); + </script> + </a> <a name='Settings Vehicles' class='clist'><text>Vehicle</text> <script> foreach(vehicle;navit.vehicle) @@ -152,7 +164,9 @@ Waypoint</text></img> ]]></gui> <!-- for a debug log --> <log enabled="no" type="textfile_debug" data="debug_%Y%m%d-%i.txt" flush_size="1000" flush_time="30"/> - <!-- osd items allow to position display and control items directly on top of the map: --> + <!-- osd items allow to position display and control items directly on top of the map. + You can find a list of all the available OSDs items here: + http://wiki.navit-project.org/index.php/OSD --> <osd enabled="no" type="compass"/> <osd enabled="no" type="navigation_next_turn"/> @@ -182,7 +196,7 @@ Waypoint</text></img> <!-- For the cumulative displacement filter to be enabled, set cdf_histsize="x" here, with x being an integer somewhere around 4 --> <tracking cdf_histsize="0"/> - <vehicleprofile name="car" route_depth="4:25%,8:40000,18:10000" flags="0x4000000" flags_forward_mask="0x4000002" flags_reverse_mask="0x4000001" maxspeed_handling="0" route_mode="0" static_speed="5" static_distance="25"> + <vehicleprofile name="car" route_depth="4:25%,8:40000,18:10000" flags="0x4000000" flags_forward_mask="0x4040002" flags_reverse_mask="0x4040001" maxspeed_handling="0" route_mode="0" static_speed="5" static_distance="25"> <roadprofile item_types="street_0,street_1_city,living_street,street_service,track_gravelled,track_unpaved,street_parking_lane" speed="10" route_weight="10" /> <roadprofile item_types="street_2_city,track_paved" speed="30" route_weight="30" /> <roadprofile item_types="street_3_city" speed="40" route_weight="40" /> @@ -643,14 +657,28 @@ Waypoint</text></img> <itemgra item_types="border_state" order="0-"> <polyline color="#808080" width="1"/> </itemgra> - <itemgra item_types="height_line_1" order="0-"> - <polyline color="#000000" width="4"/> + </layer> + <layer name="heightlines"> + <itemgra item_types="height_line_1" order="7"> + <polyline color="#000000" width="1"/> </itemgra> - <itemgra item_types="height_line_2" order="0-"> + <itemgra item_types="height_line_1" order="8-"> + <polyline color="#000000" width="3"/> + <text text_size="8"/> + </itemgra> + <itemgra item_types="height_line_2" order="8"> + <polyline color="#000000" width="1"/> + </itemgra> + <itemgra item_types="height_line_2" order="9-"> <polyline color="#000000" width="2"/> + <text text_size="8"/> + </itemgra> + <itemgra item_types="height_line_3" order="9-11"> + <polyline color="#000000" width="1"/> </itemgra> - <itemgra item_types="height_line_3" order="0-"> + <itemgra item_types="height_line_3" order="12-"> <polyline color="#000000" width="1"/> + <text text_size="8"/> </itemgra> </layer> <layer name="streets"> diff --git a/navit/osd.c b/navit/osd.c index 26e8952ee..a0c9183d1 100644 --- a/navit/osd.c +++ b/navit/osd.c @@ -52,7 +52,7 @@ osd_new(struct attr *parent, struct attr **attrs) if (! type) return NULL; - new=plugin_get_osd_type(type->u.str); + new=plugin_get_category_osd(type->u.str); if (! new) { dbg(lvl_error, "invalid OSD type '%s'\n", type->u.str); return NULL; @@ -171,15 +171,42 @@ osd_std_resize(struct osd_item *item) * or relative height is set to 0% (int value is equal to ATTR_REL_RELSHIFT), * object width (height) is not changed here, for button and image osds it means * to derive values from the underlying image. - * @param item - * @param w Available screen width in pixels (the width that corresponds to - * 100%) - * @param h Available screen height in pixels (the height that corresponds to - * 100%) + * + * This method considers padding if the graphics plugin supports it (i.e. its `get_data` method returns + * a valid pointer if `"padding"` is supplied as its arument): It will offset the origin of the item by + * the amount of padding in the left and top edges, and will reduce `w` and `h` by the total amount of + * padding in the respective dimension to obtain the equivalent of 100%. + * + * If the graphics driver does not support padding, none of these corrections take place (this is + * equivalent to 0 padding on all sides). + * + * @param item The item whose size and position are to be calculated + * @param w Available screen width in pixels + * @param h Available screen height in pixels */ void osd_std_calculate_sizes(struct osd_item *item, int w, int h) { + struct padding *padding = NULL; + + if (item->gr) { + padding = graphics_get_data(item->gr, "padding"); + if (padding) { + dbg(lvl_debug, "Got padding=%p for item=%p (item->gr=%p): left=%d top=%d right=%d bottom=%d\n", + padding, item, item->gr, padding->left, padding->top, padding->right, padding->bottom); + } else { + dbg(lvl_debug, "Got padding=%p for item=%p (item->gr=%p)\n", + padding, item, item->gr); + } + } else + dbg(lvl_warning, "cannot get padding for item=%p: item->gr is NULL\n", item); + + /* reduce w and h by total padding in the respective dimension */ + if (padding) { + w -= (padding->left + padding->right); + h -= (padding->top + padding->bottom); + } + if(item->rel_w!=ATTR_REL_RELSHIFT) item->w=attr_rel2real(item->rel_w, w, 1); if(item->w<0) @@ -190,13 +217,21 @@ osd_std_calculate_sizes(struct osd_item *item, int w, int h) item->h=0; item->p.x=attr_rel2real(item->rel_x, w, 1); item->p.y=attr_rel2real(item->rel_y, h, 1); + + /* add left and top padding to item->p */ + if (padding) { + item->p.x += padding->left; + item->p.y += padding->top; + } } /** * @brief Recalculates the size and position of an OSD item and * triggers a redraw of the item. * - * @param item + * This is a callback function that can be stored in the `resize_cb` member of an OSD item. + * + * @param item The OSD item to resize and redraw * @param priv * @param w Available screen width in pixels (the width that corresponds to * 100%) @@ -393,13 +428,44 @@ osd_set_keypress(struct navit *nav, struct osd_item *item) } } +/** + * @brief Sets up the graphics for an item. + * + * This method creates a new graphics overlay for an item and initializes its attributes (colors, font + * and callbacks for resize and key events). + * + * @param nav The navit object + * @param item The OSD item + * @param priv The `struct osd_priv` for the OSD item + */ void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv) { struct graphics *navit_gr; + int w, h; + struct padding *padding = NULL; navit_gr = navit_get_graphics(nav); - osd_std_calculate_sizes(item, navit_get_width(nav), navit_get_height(nav)); + w = navit_get_width(nav); + h = navit_get_height(nav); + + padding = graphics_get_data(navit_gr, "padding"); + + if (padding) { + dbg(lvl_debug, "Got padding=%p for item=%p: left=%d top=%d right=%d bottom=%d\n", + padding, item, padding->left, padding->top, padding->right, padding->bottom); + w -= (padding->left + padding->right); + h -= (padding->top + padding->bottom); + } else + dbg(lvl_debug, "Padding is NULL\n"); + + osd_std_calculate_sizes(item, w, h); + + if (padding) { + item->p.x += padding->left; + item->p.y += padding->top; + } + item->gr = graphics_overlay_new(navit_gr, &item->p, item->w, item->h, 1); item->graphic_bg = graphics_gc_new(item->gr); diff --git a/navit/osd/core/osd_core.c b/navit/osd/core/osd_core.c index 47fd5e49c..9b43a160b 100644 --- a/navit/osd/core/osd_core.c +++ b/navit/osd/core/osd_core.c @@ -156,9 +156,9 @@ format_distance(double distance, char *sep, int imperial) return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE, sep); } } else { - if (distance >= 100000) + if (distance >= 10000) return g_strdup_printf("%.0f%skm", distance / 1000, sep); - else if (distance >= 10000) + else if (distance >= 1000) return g_strdup_printf("%.1f%skm", distance / 1000, sep); else if (distance >= 300) return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep); @@ -1412,12 +1412,29 @@ osd_compass_new(struct navit *nav, struct osd_methods *meth, struct osd_button { int use_overlay; + /* FIXME: do we need navit_init_cb? It is set in two places but never read. + * osd_button_new sets it to osd_button_init (init callback), and + * osd_button_init sets it to osd_std_click (click callback). */ struct callback *draw_cb,*navit_init_cb; struct graphics_image *img; char *src_dir,*src; }; +/** + * @brief Adjusts width and height of an OSD item to fit the image it displays. + * + * A width or height of 0%, stored in relative attributes as {@code ATTR_REL_RELSHIFT}, is used as a flag + * indicating that the respective dimension is unset, i.e. determined by the dimensions of its image. + * + * If this is the case for height and/or width, the respective dimension will be updated to fit the image. + * + * Note that this method is used by several OSD items, notably {@code osd_image}, {@code osd_button} and + * {@code osd_android_menu}. + * + * @param opc The OSD item + * @param img The image displayed by the item + */ static void osd_button_adjust_sizes(struct osd_priv_common *opc, struct graphics_image *img) { @@ -1440,7 +1457,7 @@ osd_button_draw(struct osd_priv_common *opc, struct navit *nav) if (this->use_overlay) { struct graphics_image *img; - img=graphics_image_new(opc->osd_item.gr, this->src); + img=graphics_image_new_scaled(opc->osd_item.gr, this->src, opc->osd_item.w, opc->osd_item.h); osd_button_adjust_sizes(opc, img); p.x=(opc->osd_item.w-img->width)/2; p.y=(opc->osd_item.h-img->height)/2; @@ -1450,7 +1467,7 @@ osd_button_draw(struct osd_priv_common *opc, struct navit *nav) } else { struct graphics *gra; gra = navit_get_graphics(nav); - this->img = graphics_image_new(gra, this->src); + this->img = graphics_image_new_scaled(gra, this->src, opc->osd_item.w, opc->osd_item.h); if (!this->img) { dbg(lvl_warning, "failed to load '%s'\n", this->src); @@ -1477,18 +1494,32 @@ osd_button_init(struct osd_priv_common *opc, struct navit *nav) struct osd_button *this = (struct osd_button *)opc->data; struct graphics *gra = navit_get_graphics(nav); + + /* translate properties to real size */ + osd_std_calculate_sizes(&opc->osd_item, navit_get_width(nav), navit_get_height(nav)); + /* most graphics plugins cannot accept w=0 or h=0. They require special w=-1 or h=-1 for "no size"*/ + if((opc->osd_item.w <= 0) || (opc->osd_item.h <=0)) + { + opc->osd_item.w = -1; + opc->osd_item.h = -1; + } dbg(lvl_debug, "enter\n"); - this->img = graphics_image_new(gra, this->src); + dbg(lvl_debug, "Get: %s, %d, %d, %d, %d\n", this->src, opc->osd_item.rel_w, opc->osd_item.rel_h, opc->osd_item.w, opc->osd_item.h); + this->img = graphics_image_new_scaled(gra, this->src, opc->osd_item.w, opc->osd_item.h); if (!this->img) { dbg(lvl_warning, "failed to load '%s'\n", this->src); return; } + else + { + dbg(lvl_debug,"Got %s: %d, %d\n", this->src, this->img->width, this->img->height); + } osd_button_adjust_sizes(opc, this->img); if (this->use_overlay) { struct graphics_image *img; struct point p; osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); - img=graphics_image_new(opc->osd_item.gr, this->src); + img=graphics_image_new_scaled(opc->osd_item.gr, this->src, opc->osd_item.w, opc->osd_item.h); p.x=(opc->osd_item.w-this->img->width)/2; p.y=(opc->osd_item.h-this->img->height)/2; osd_fill_with_bgcolor(&opc->osd_item); @@ -1511,7 +1542,7 @@ osd_button_icon_path(struct osd_button *this_, char *src) { if (!this_->src_dir) return graphics_icon_path(src); - return g_strdup_printf("%s%s%s",this_->src_dir, G_DIR_SEPARATOR_S, src); + return g_strdup_printf("%s%s%s", this_->src_dir, G_DIR_SEPARATOR_S, src); } int @@ -1533,7 +1564,7 @@ osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr) } nav = opc->osd_item.navit; gra = navit_get_graphics(nav); - this_->img = graphics_image_new(gra, this_->src); + this_->img = graphics_image_new_scaled(gra, this_->src, opc->osd_item.w, opc->osd_item.h); if (!this_->img) { dbg(lvl_warning, "failed to load '%s'\n", this_->src); return 0; @@ -1692,12 +1723,16 @@ struct navigation_status { /** - * @brief Draws a {@code navigation_status} OSD. + * @brief Draws a `navigation_status` OSD. + * + * This method performs the actual operation of selecting and drawing the image. It can be called + * directly as a callback method for the `navigation.nav_status` attribute, or indirectly through the + * draw method. * * @param opc The OSD to draw * @param status The status of the navigation engine (the value of the {@code nav_status} attribute) */ -static void osd_navigation_status_draw(struct osd_priv_common *opc, int status) { +static void osd_navigation_status_draw_do(struct osd_priv_common *opc, int status) { struct navigation_status *this = (struct navigation_status *)opc->data; struct point p; int do_draw = opc->osd_item.do_draw; @@ -1757,6 +1792,29 @@ static void osd_navigation_status_draw(struct osd_priv_common *opc, int status) /** + * @brief Draws a `navigation_status` OSD. + * + * This is the draw method for the OSD. It exposes the standard signature for the `draw` method and acts + * as a wrapper around `osd_navigation_status_draw_do()`. + * + * @param osd The OSD to draw. + * @param navit The navit instance + * @param v The vehicle (not used but part of the prototype) + */ +static void osd_navigation_status_draw(struct osd_priv *osd, struct navit *navit, struct vehicle *v) { + struct navigation *nav = NULL; + struct attr attr; + + if (navit) + nav = navit_get_navigation(navit); + if (nav) { + if (navigation_get_attr(nav, attr_nav_status, &attr, NULL)) + osd_navigation_status_draw_do((struct osd_priv_common *) osd, attr.u.num); + } +} + + +/** * @brief Initializes a new {@code navigation_status} OSD. * * This function is registered as a callback function in {@link osd_navigation_status_new(struct navit *, struct osd_methods *, struct attr **)}. @@ -1775,9 +1833,9 @@ static void osd_navigation_status_init(struct osd_priv_common *opc, struct navit if (navit) nav = navit_get_navigation(navit); if (nav) { - navigation_register_callback(nav, attr_nav_status, callback_new_attr_1(callback_cast(osd_navigation_status_draw), attr_nav_status, opc)); + navigation_register_callback(nav, attr_nav_status, callback_new_attr_1(callback_cast(osd_navigation_status_draw_do), attr_nav_status, opc)); if (navigation_get_attr(nav, attr_nav_status, &attr, NULL)) - osd_navigation_status_draw(opc, attr.u.num); + osd_navigation_status_draw_do(opc, attr.u.num); } else dbg(lvl_error, "navigation instance is NULL, OSD will never update\n"); @@ -2001,6 +2059,7 @@ osd_nav_next_turn_new(struct navit *nav, struct osd_methods *meth, struct nav_toggle_announcer { int w,h; + /* FIXME this is actually the click callback, which is set once but never read. Do we need this? */ struct callback *navit_init_cb; char *icon_src; int icon_h, icon_w, active, last_state; @@ -2438,6 +2497,8 @@ struct osd_speed_warner { int bTextOnly; struct graphics_image *img_active,*img_passive,*img_off; char* label_str; + int timeout; + int wait_before_warn; }; static void @@ -2503,9 +2564,16 @@ osd_speed_warner_draw(struct osd_priv_common *opc, struct navit *navit, struct v if( this->speed_exceed_limit_offset+routespeed<tracking_speed && (100.0+this->speed_exceed_limit_percent)/100.0*routespeed<tracking_speed ) { if(this->announce_state==eNoWarn && this->announce_on) { - this->announce_state=eWarningTold; //warning told - navit_say(navit,_("Please decrease your speed")); + if(this->wait_before_warn>0){ + this->wait_before_warn--; + }else{ + this->announce_state=eWarningTold; //warning told + navit_say(navit,_("Please decrease your speed")); + } } + }else{ + /* reset speed warning */ + this->wait_before_warn = this->timeout; } if( tracking_speed <= routespeed ) { this->announce_state=eNoWarn; //no warning @@ -2560,7 +2628,7 @@ osd_speed_warner_init(struct osd_priv_common *opc, struct navit *nav) if (opc->osd_item.h < this->d) this->d=opc->osd_item.h; this->width=this->d/10; - + this->wait_before_warn = this->timeout; if(this->label_str && !strncmp("images:",this->label_str,7)) { char *tok1=NULL, *tok2=NULL, *tok3=NULL; strtok(this->label_str,":"); @@ -2645,7 +2713,12 @@ osd_speed_warner_new(struct navit *nav, struct osd_methods *meth, struct attr ** this->bTextOnly = 1; } } - + attr = attr_search(attrs, NULL, attr_timeout); + if (attr) + this->timeout = attr->u.num; + else + this->timeout = 10; // 10s timeout by default + attr = attr_search(attrs, NULL, attr_announce_on); if (attr) this->announce_on = attr->u.num; @@ -3807,21 +3880,21 @@ osd_auxmap_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) void plugin_init(void) { - plugin_register_osd_type("compass", osd_compass_new); - plugin_register_osd_type("navigation_next_turn", osd_nav_next_turn_new); - plugin_register_osd_type("button", osd_button_new); - plugin_register_osd_type("toggle_announcer", osd_nav_toggle_announcer_new); - plugin_register_osd_type("speed_warner", osd_speed_warner_new); - plugin_register_osd_type("speed_cam", osd_speed_cam_new); - plugin_register_osd_type("text", osd_text_new); - plugin_register_osd_type("gps_status", osd_gps_status_new); - plugin_register_osd_type("volume", osd_volume_new); - plugin_register_osd_type("scale", osd_scale_new); - plugin_register_osd_type("image", osd_image_new); - plugin_register_osd_type("stopwatch", osd_stopwatch_new); - plugin_register_osd_type("odometer", osd_odometer_new); - plugin_register_osd_type("auxmap", osd_auxmap_new); - plugin_register_osd_type("cmd_interface", osd_cmd_interface_new); - plugin_register_osd_type("route_guard", osd_route_guard_new); - plugin_register_osd_type("navigation_status", osd_navigation_status_new); + plugin_register_category_osd("compass", osd_compass_new); + plugin_register_category_osd("navigation_next_turn", osd_nav_next_turn_new); + plugin_register_category_osd("button", osd_button_new); + plugin_register_category_osd("toggle_announcer", osd_nav_toggle_announcer_new); + plugin_register_category_osd("speed_warner", osd_speed_warner_new); + plugin_register_category_osd("speed_cam", osd_speed_cam_new); + plugin_register_category_osd("text", osd_text_new); + plugin_register_category_osd("gps_status", osd_gps_status_new); + plugin_register_category_osd("volume", osd_volume_new); + plugin_register_category_osd("scale", osd_scale_new); + plugin_register_category_osd("image", osd_image_new); + plugin_register_category_osd("stopwatch", osd_stopwatch_new); + plugin_register_category_osd("odometer", osd_odometer_new); + plugin_register_category_osd("auxmap", osd_auxmap_new); + plugin_register_category_osd("cmd_interface", osd_cmd_interface_new); + plugin_register_category_osd("route_guard", osd_route_guard_new); + plugin_register_category_osd("navigation_status", osd_navigation_status_new); } diff --git a/navit/plugin.c b/navit/plugin.c index 2edf9ed74..8c61bc9b7 100644 --- a/navit/plugin.c +++ b/navit/plugin.c @@ -378,9 +378,9 @@ plugins_destroy(struct plugins *pls) } static void * -find_by_name(enum plugin_type type, const char *name) +find_by_name(enum plugin_category category, const char *name) { - GList *name_list=plugin_types[type]; + GList *name_list=plugin_categories[category]; while (name_list) { struct name_val *nv=name_list->data; if (!g_ascii_strcasecmp(nv->name, name)) @@ -391,23 +391,23 @@ find_by_name(enum plugin_type type, const char *name) } void * -plugin_get_type(enum plugin_type type, const char *type_name, const char *name) +plugin_get_category(enum plugin_category category, const char *category_name, const char *name) { GList *plugin_list; struct plugin *pl; char *mod_name, *filename=NULL, *corename=NULL; void *result=NULL; - dbg(lvl_debug, "type=\"%s\", name=\"%s\"\n", type_name, name); + dbg(lvl_debug, "category=\"%s\", name=\"%s\"\n", category_name, name); - if ((result=find_by_name(type, name))) { + if ((result=find_by_name(category, name))) { return result; } if (!pls) return NULL; plugin_list=pls->list; - filename=g_strjoin("", "lib", type_name, "_", name, NULL); - corename=g_strjoin("", "lib", type_name, "_", "core", NULL); + filename=g_strjoin("", "lib", category_name, "_", name, NULL); + corename=g_strjoin("", "lib", category_name, "_", "core", NULL); while (plugin_list) { pl=plugin_list->data; if ((mod_name=g_strrstr(pl->name, "/"))) @@ -421,7 +421,7 @@ plugin_get_type(enum plugin_type type, const char *type_name, const char *name) plugin_set_active(pl, 0); if (plugin_get_active(pl)) plugin_call_init(pl); - if ((result=find_by_name(type, name))) { + if ((result=find_by_name(category, name))) { g_free(filename); g_free(corename); return result; diff --git a/navit/plugin.h b/navit/plugin.h index 23901b4ed..4687a6460 100644 --- a/navit/plugin.h +++ b/navit/plugin.h @@ -25,16 +25,32 @@ extern "C" { struct plugin; -enum plugin_type { - plugin_type_graphics, - plugin_type_gui, - plugin_type_map, - plugin_type_osd, - plugin_type_speech, - plugin_type_vehicle, - plugin_type_event, - plugin_type_font, - plugin_type_last, +/** + * @brief All existing plugin categories. + * + * Plugins are grouped into categories. Plugins within one category offer the same + * functionality (GUI, graphics, map etc.). Consequently the category determines the API + * offered by a plugin. + */ +enum plugin_category { + /** Category for plugins which implement a graphics backend. */ + plugin_category_graphics, + /** Category for plugins which implement a GUI frontend. */ + plugin_category_gui, + /** Category for plugins which implement a driver for providing/loading map data. */ + plugin_category_map, + /** Category for plugins which implement an OSD. */ + plugin_category_osd, + /** Category for plugins which implement speech output. */ + plugin_category_speech, + /** Category for plugins which supply position data (typically from a GPS receiver). */ + plugin_category_vehicle, + /** Category for plugins which implement/wrap an event subsystem. */ + plugin_category_event, + /** Category for plugins which load fonts. */ + plugin_category_font, + /** Dummy for last entry. */ + plugin_category_last, }; #endif @@ -44,7 +60,7 @@ struct popup_item; #undef PLUGIN_FUNC1 #undef PLUGIN_FUNC3 #undef PLUGIN_FUNC4 -#undef PLUGIN_TYPE +#undef PLUGIN_CATEGORY #define PLUGIN_PROTO(name,...) void name(__VA_ARGS__) #ifdef PLUGIN_C @@ -81,25 +97,25 @@ struct name_val { void *val; }; -GList *plugin_types[plugin_type_last]; +GList *plugin_categories[plugin_category_last]; -#define PLUGIN_TYPE(type,newargs) \ -struct type##_priv; \ -struct type##_methods; \ +#define PLUGIN_CATEGORY(category,newargs) \ +struct category##_priv; \ +struct category##_methods; \ void \ -plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs) \ +plugin_register_category_##category(const char *name, struct category##_priv *(*new_) newargs) \ { \ struct name_val *nv; \ nv=g_new(struct name_val, 1); \ nv->name=g_strdup(name); \ nv->val=new_; \ - plugin_types[plugin_type_##type]=g_list_append(plugin_types[plugin_type_##type], nv); \ + plugin_categories[plugin_category_##category]=g_list_append(plugin_categories[plugin_category_##category], nv); \ } \ \ void * \ -plugin_get_##type##_type(const char *name) \ +plugin_get_category_##category(const char *name) \ { \ - return plugin_get_type(plugin_type_##type, #type, name); \ + return plugin_get_category(plugin_category_##category, #category, name); \ } #else @@ -115,11 +131,11 @@ void plugin_call_##name(t1 p1,t2 p2,t3 p3); void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3,t4 p4)); \ void plugin_call_##name(t1 p1,t2 p2,t3 p3,t4 p4); -#define PLUGIN_TYPE(type,newargs) \ -struct type##_priv; \ -struct type##_methods; \ -void plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs); \ -void *plugin_get_##type##_type(const char *name); +#define PLUGIN_CATEGORY(category,newargs) \ +struct category##_priv; \ +struct category##_methods; \ +void plugin_register_category_##category(const char *name, struct category##_priv *(*new_) newargs); \ +void *plugin_get_category_##category(const char *name); #endif @@ -148,7 +164,7 @@ struct plugins *plugins_new(void); struct plugin *plugin_new(struct attr *parent, struct attr ** attrs); void plugins_init(struct plugins *pls); void plugins_destroy(struct plugins *pls); -void *plugin_get_type(enum plugin_type type, const char *type_name, const char *name); +void *plugin_get_category(enum plugin_category category, const char *category_name, const char *name); /* end of prototypes */ #ifdef __cplusplus diff --git a/navit/plugin/j1850/j1850.c b/navit/plugin/j1850/j1850.c index b4648bcfe..26e18057d 100644 --- a/navit/plugin/j1850/j1850.c +++ b/navit/plugin/j1850/j1850.c @@ -502,5 +502,5 @@ plugin_init(void) struct attr callback,navit; struct attr_iter *iter; - plugin_register_osd_type("j1850", osd_j1850_new); + plugin_register_category_osd("j1850", osd_j1850_new); } diff --git a/navit/plugin/pedestrian/pedestrian.c b/navit/plugin/pedestrian/pedestrian.c index 444543694..7e5a4361d 100644 --- a/navit/plugin/pedestrian/pedestrian.c +++ b/navit/plugin/pedestrian/pedestrian.c @@ -1369,8 +1369,8 @@ plugin_init(void) (*jnienv)->CallVoidMethod(jnienv, android_activity, Activity_setRequestedOrientation, 0); #endif - plugin_register_osd_type("marker", osd_marker_new); - plugin_register_map_type("route_occluded", map_route_occluded_new); + plugin_register_category_osd("marker", osd_marker_new); + plugin_register_category_map("route_occluded", map_route_occluded_new); callback.type=attr_callback; callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit), attr_navit); config_add_attr(config, &callback); diff --git a/navit/plugin_def.h b/navit/plugin_def.h index 01acea7bf..985160e6f 100644 --- a/navit/plugin_def.h +++ b/navit/plugin_def.h @@ -23,11 +23,11 @@ struct callback_list; struct gui; PLUGIN_FUNC1(draw, struct container *, co) PLUGIN_FUNC3(popup, struct container *, map, struct popup *, p, struct popup_item **, list) -PLUGIN_TYPE(graphics, (struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)) -PLUGIN_TYPE(gui, (struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui)) -PLUGIN_TYPE(map, (struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)) -PLUGIN_TYPE(osd, (struct navit *nav, struct osd_methods *meth, struct attr **attrs)) -PLUGIN_TYPE(speech, (struct speech_methods *meth, struct attr **attrs, struct attr *parent)) -PLUGIN_TYPE(vehicle, (struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs)) -PLUGIN_TYPE(event, (struct event_methods *meth)) -PLUGIN_TYPE(font, (void *meth)) +PLUGIN_CATEGORY(graphics, (struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)) +PLUGIN_CATEGORY(gui, (struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui)) +PLUGIN_CATEGORY(map, (struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)) +PLUGIN_CATEGORY(osd, (struct navit *nav, struct osd_methods *meth, struct attr **attrs)) +PLUGIN_CATEGORY(speech, (struct speech_methods *meth, struct attr **attrs, struct attr *parent)) +PLUGIN_CATEGORY(vehicle, (struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs)) +PLUGIN_CATEGORY(event, (struct event_methods *meth)) +PLUGIN_CATEGORY(font, (void *meth)) diff --git a/navit/route.c b/navit/route.c index 37d1282a8..e367c3855 100644 --- a/navit/route.c +++ b/navit/route.c @@ -2831,11 +2831,12 @@ static void route_graph_clone_segment(struct route_graph *this, struct route_graph_segment *s, struct route_graph_point *start, struct route_graph_point *end, int flags) { struct route_graph_segment_data data; - data.flags=s->data.flags|flags; - data.offset=1; - data.maxspeed=-1; data.item=&s->data.item; + data.offset=1; + data.flags=s->data.flags|flags; data.len=s->data.len+1; + data.maxspeed=-1; + data.dangerous_goods=0; if (s->data.flags & AF_SPEED_LIMIT) data.maxspeed=RSD_MAXSPEED(&s->data); if (s->data.flags & AF_SEGMENTED) @@ -4201,8 +4202,8 @@ route_attr_iter_destroy(struct attr_iter *iter) void route_init(void) { - plugin_register_map_type("route", route_map_new); - plugin_register_map_type("route_graph", route_graph_map_new); + plugin_register_category_map("route", route_map_new); + plugin_register_category_map("route_graph", route_graph_map_new); } void diff --git a/navit/speech.c b/navit/speech.c index d3b09ae3a..cabd998dc 100644 --- a/navit/speech.c +++ b/navit/speech.c @@ -45,7 +45,7 @@ speech_new(struct attr *parent, struct attr **attrs) return NULL; } dbg(lvl_debug,"type='%s'\n", attr->u.str); - speech_new=plugin_get_speech_type(attr->u.str); + speech_new=plugin_get_category_speech(attr->u.str); dbg(lvl_debug,"new=%p\n", speech_new); if (! speech_new) { dbg(lvl_error,"wrong type '%s'\n", attr->u.str); diff --git a/navit/speech/android/speech_android.c b/navit/speech/android/speech_android.c index 3323245aa..2b3f2612c 100644 --- a/navit/speech/android/speech_android.c +++ b/navit/speech/android/speech_android.c @@ -145,5 +145,5 @@ speech_android_new(struct speech_methods *meth, struct attr **attrs, struct attr void plugin_init(void) { - plugin_register_speech_type("android", speech_android_new); + plugin_register_category_speech("android", speech_android_new); } diff --git a/navit/speech/cmdline/speech_cmdline.c b/navit/speech/cmdline/speech_cmdline.c index 49252f346..490811ce5 100644 --- a/navit/speech/cmdline/speech_cmdline.c +++ b/navit/speech/cmdline/speech_cmdline.c @@ -261,5 +261,5 @@ speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *paren void plugin_init(void) { - plugin_register_speech_type("cmdline", speechd_new); + plugin_register_category_speech("cmdline", speechd_new); } diff --git a/navit/speech/dbus/speech_dbus.c b/navit/speech/dbus/speech_dbus.c index 53ab46f03..0fdfb71ab 100644 --- a/navit/speech/dbus/speech_dbus.c +++ b/navit/speech/dbus/speech_dbus.c @@ -73,5 +73,5 @@ speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *p void plugin_init(void) { - plugin_register_speech_type("dbus", speech_dbus_new); + plugin_register_category_speech("dbus", speech_dbus_new); } diff --git a/navit/speech/espeak/speak.c b/navit/speech/espeak/speak.c index 523679b38..329a05d01 100644 --- a/navit/speech/espeak/speak.c +++ b/navit/speech/espeak/speak.c @@ -514,5 +514,5 @@ espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent void plugin_init(void) { - plugin_register_speech_type("espeak", espeak_new); + plugin_register_category_speech("espeak", espeak_new); } diff --git a/navit/speech/speech_dispatcher/speech_speech_dispatcher.c b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c index 05228187c..d22b3f795 100644 --- a/navit/speech/speech_dispatcher/speech_speech_dispatcher.c +++ b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c @@ -77,5 +77,5 @@ speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) void plugin_init(void) { - plugin_register_speech_type("speech_dispatcher", speechd_new); + plugin_register_category_speech("speech_dispatcher", speechd_new); } diff --git a/navit/track.c b/navit/track.c index 7e9f6fdff..5c16e4261 100644 --- a/navit/track.c +++ b/navit/track.c @@ -1227,5 +1227,5 @@ tracking_map_new(struct map_methods *meth, struct attr **attrs, struct callback_ void tracking_init(void) { - plugin_register_map_type("tracking", tracking_map_new); + plugin_register_category_map("tracking", tracking_map_new); } diff --git a/navit/types.h b/navit/types.h index 987b42a71..b91e01bd8 100644 --- a/navit/types.h +++ b/navit/types.h @@ -29,9 +29,11 @@ typedef int32_t s32; typedef uint32_t u32; #ifdef HAVE_API_WIN32_BASE +#define ULONGLONG_FMT "%I64u" #define LONGLONG_FMT "%I64d" #define LONGLONG_HEX_FMT "%I64x" #else +#define ULONGLONG_FMT "%llu" #define LONGLONG_FMT "%lld" #define LONGLONG_HEX_FMT "%llx" #endif diff --git a/navit/vehicle.c b/navit/vehicle.c index a280fb024..33cecb0e9 100644 --- a/navit/vehicle.c +++ b/navit/vehicle.c @@ -122,7 +122,7 @@ vehicle_new(struct attr *parent, struct attr **attrs) *colon = '\0'; dbg(lvl_debug, "source='%s' type='%s'\n", source->u.str, type); - vehicletype_new = plugin_get_vehicle_type(type); + vehicletype_new = plugin_get_category_vehicle(type); if (!vehicletype_new) { dbg(lvl_error, "invalid source '%s': unknown type '%s'\n", source->u.str, type); g_free(type); diff --git a/navit/vehicle/android/vehicle_android.c b/navit/vehicle/android/vehicle_android.c index d4b784a0e..89882d048 100644 --- a/navit/vehicle/android/vehicle_android.c +++ b/navit/vehicle/android/vehicle_android.c @@ -292,5 +292,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("android", vehicle_android_new_android); + plugin_register_category_vehicle("android", vehicle_android_new_android); } diff --git a/navit/vehicle/demo/vehicle_demo.c b/navit/vehicle/demo/vehicle_demo.c index c5cf7e045..59a119204 100644 --- a/navit/vehicle/demo/vehicle_demo.c +++ b/navit/vehicle/demo/vehicle_demo.c @@ -298,5 +298,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("demo", vehicle_demo_new); + plugin_register_category_vehicle("demo", vehicle_demo_new); } diff --git a/navit/vehicle/file/vehicle_file.c b/navit/vehicle/file/vehicle_file.c index f7a0024b9..bb6134042 100644 --- a/navit/vehicle/file/vehicle_file.c +++ b/navit/vehicle/file/vehicle_file.c @@ -1046,8 +1046,8 @@ vehicle_file_new_file(struct vehicle_methods void plugin_init(void) { dbg(lvl_debug, "vehicle_file:plugin_init:enter\n"); - plugin_register_vehicle_type("file", vehicle_file_new_file); - plugin_register_vehicle_type("pipe", vehicle_file_new_file); - plugin_register_vehicle_type("socket", vehicle_file_new_file); - plugin_register_vehicle_type("serial", vehicle_file_new_file); + plugin_register_category_vehicle("file", vehicle_file_new_file); + plugin_register_category_vehicle("pipe", vehicle_file_new_file); + plugin_register_category_vehicle("socket", vehicle_file_new_file); + plugin_register_category_vehicle("serial", vehicle_file_new_file); } diff --git a/navit/vehicle/file/vehicle_pipe.c b/navit/vehicle/file/vehicle_pipe.c index 0750edef3..420390d4e 100644 --- a/navit/vehicle/file/vehicle_pipe.c +++ b/navit/vehicle/file/vehicle_pipe.c @@ -23,5 +23,5 @@ void plugin_init(void) { - plugin_get_vehicle_type("file"); + plugin_get_category_vehicle("file"); } diff --git a/navit/vehicle/file/vehicle_serial.c b/navit/vehicle/file/vehicle_serial.c index 0750edef3..420390d4e 100644 --- a/navit/vehicle/file/vehicle_serial.c +++ b/navit/vehicle/file/vehicle_serial.c @@ -23,5 +23,5 @@ void plugin_init(void) { - plugin_get_vehicle_type("file"); + plugin_get_category_vehicle("file"); } diff --git a/navit/vehicle/file/vehicle_socket.c b/navit/vehicle/file/vehicle_socket.c index 0750edef3..420390d4e 100644 --- a/navit/vehicle/file/vehicle_socket.c +++ b/navit/vehicle/file/vehicle_socket.c @@ -23,5 +23,5 @@ void plugin_init(void) { - plugin_get_vehicle_type("file"); + plugin_get_category_vehicle("file"); } diff --git a/navit/vehicle/gpsd/vehicle_gpsd.c b/navit/vehicle/gpsd/vehicle_gpsd.c index 73d9e648d..a8c29cd97 100644 --- a/navit/vehicle/gpsd/vehicle_gpsd.c +++ b/navit/vehicle/gpsd/vehicle_gpsd.c @@ -471,5 +471,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("gpsd", vehicle_gpsd_new_gpsd); + plugin_register_category_vehicle("gpsd", vehicle_gpsd_new_gpsd); } diff --git a/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c index dda774e35..fa5eb8780 100644 --- a/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c +++ b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c @@ -244,5 +244,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("gpsd_dbus", vehicle_gpsd_dbus_new); + plugin_register_category_vehicle("gpsd_dbus", vehicle_gpsd_dbus_new); } diff --git a/navit/vehicle/gypsy/vehicle_gypsy.c b/navit/vehicle/gypsy/vehicle_gypsy.c index 2ff9389f7..589e53a3f 100644 --- a/navit/vehicle/gypsy/vehicle_gypsy.c +++ b/navit/vehicle/gypsy/vehicle_gypsy.c @@ -493,5 +493,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("gypsy", vehicle_gypsy_new_gypsy); + plugin_register_category_vehicle("gypsy", vehicle_gypsy_new_gypsy); } diff --git a/navit/vehicle/iphone/vehicle_iphone.c b/navit/vehicle/iphone/vehicle_iphone.c index 4c25c0235..94fec114a 100644 --- a/navit/vehicle/iphone/vehicle_iphone.c +++ b/navit/vehicle/iphone/vehicle_iphone.c @@ -161,5 +161,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("iphone", vehicle_iphone_new); + plugin_register_category_vehicle("iphone", vehicle_iphone_new); } diff --git a/navit/vehicle/maemo/vehicle_maemo.c b/navit/vehicle/maemo/vehicle_maemo.c index 661202d67..d686a6a03 100644 --- a/navit/vehicle/maemo/vehicle_maemo.c +++ b/navit/vehicle/maemo/vehicle_maemo.c @@ -325,5 +325,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("maemo", vehicle_maemo_new_maemo); + plugin_register_category_vehicle("maemo", vehicle_maemo_new_maemo); } diff --git a/navit/vehicle/null/vehicle_null.c b/navit/vehicle/null/vehicle_null.c index 134538cc3..643945c71 100644 --- a/navit/vehicle/null/vehicle_null.c +++ b/navit/vehicle/null/vehicle_null.c @@ -179,5 +179,5 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("null", vehicle_null_new_null); + plugin_register_category_vehicle("null", vehicle_null_new_null); } diff --git a/navit/vehicle/webos/vehicle_webos.c b/navit/vehicle/webos/vehicle_webos.c index e0a849b97..a5bba4bce 100644 --- a/navit/vehicle/webos/vehicle_webos.c +++ b/navit/vehicle/webos/vehicle_webos.c @@ -381,6 +381,6 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("webos", vehicle_webos_new); + plugin_register_category_vehicle("webos", vehicle_webos_new); } diff --git a/navit/vehicle/wince/vehicle_wince.c b/navit/vehicle/wince/vehicle_wince.c index 8dd3e40db..38cab3f1c 100644 --- a/navit/vehicle/wince/vehicle_wince.c +++ b/navit/vehicle/wince/vehicle_wince.c @@ -949,6 +949,6 @@ void plugin_init(void) { dbg(lvl_debug, "enter\n"); - plugin_register_vehicle_type("wince", vehicle_wince_new); - plugin_register_vehicle_type("file", vehicle_wince_new); + plugin_register_category_vehicle("wince", vehicle_wince_new); + plugin_register_category_vehicle("file", vehicle_wince_new); } diff --git a/navit/window.h b/navit/window.h index b2e2acb7a..706bea798 100644 --- a/navit/window.h +++ b/navit/window.h @@ -17,8 +17,11 @@ * Boston, MA 02110-1301, USA. */ +/** + * Describes the Navit application window or equivalent. + */ struct window { - void *priv; - int (*fullscreen)(struct window *win, int on); - void (*disable_suspend)(struct window *win); + void *priv; /**< Private data of the graphics implementation */ + int (*fullscreen)(struct window *win, int on); /**< Method to toggle fullscreen mode */ + void (*disable_suspend)(struct window *win); /**< Method to disable suspend mode or screen savers */ }; diff --git a/navit/xpm/gui_android_menu.svg b/navit/xpm/gui_android_menu.svg new file mode 100644 index 000000000..b47eae076 --- /dev/null +++ b/navit/xpm/gui_android_menu.svg @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + viewBox="0 0 48 48" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="gui_android_menu.svg"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1280" + inkscape:window-height="948" + id="namedview8" + showgrid="true" + inkscape:zoom="9.8333333" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + fit-margin-top="16" + fit-margin-bottom="16" + fit-margin-left="22" + fit-margin-right="22" + showguides="true" + inkscape:guide-bbox="true"> + <sodipodi:guide + position="0,12" + orientation="0,1" + id="guide4284" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="0,36" + orientation="0,1" + id="guide4286" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="0,16" + orientation="0,1" + id="guide4288" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="0,32" + orientation="0,1" + id="guide4290" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="12,0" + orientation="1,0" + id="guide4292" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="16,0" + orientation="1,0" + id="guide4294" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="32,0" + orientation="1,0" + id="guide4296" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <sodipodi:guide + position="36,0" + orientation="1,0" + id="guide4298" + inkscape:label="" + inkscape:color="rgb(0,0,255)" /> + <inkscape:grid + type="xygrid" + id="grid4300" /> + </sodipodi:namedview> + <circle + style="fill:#1a6cb6;stroke:none;stroke-width:0.79100001;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:1" + id="path4302" + cx="24" + cy="24" + r="24" /> + <path + d="m 24,20 c 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 -1.1,0 -2,0.9 -2,2 0,1.1 0.9,2 2,2 z m 0,2 c -1.1,0 -2,0.9 -2,2 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 z m 0,6 c -1.1,0 -2,0.9 -2,2 0,1.1 0.9,2 2,2 1.1,0 2,-0.9 2,-2 0,-1.1 -0.9,-2 -2,-2 z" + id="path6" + inkscape:connector-curvature="0" + style="fill:#ffffff" /> +</svg> diff --git a/navit/xpm/gui_heightprofile.svg b/navit/xpm/gui_heightprofile.svg new file mode 100644 index 000000000..0d80b5c12 --- /dev/null +++ b/navit/xpm/gui_heightprofile.svg @@ -0,0 +1,20 @@ +<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ for Navit --> + <defs> + <linearGradient y2="0%" x2="100%" y1="0%" x1="0%" id="grad1"> + <stop stop-color="rgb(90,90,90)" offset="0%"/> + <stop stop-color="rgb(175,175,175)" offset="100%"/> + </linearGradient> + </defs> + <g> + <title>Layer 1</title> + <polygon transform="translate(0, -3)" id="svg_2" fill="url(#grad1)" points="10,165 30,165 60,80 75,120 85,120 115,20 160,180 190,180 190,190 10,190"/> + <line id="svg_3" fill="none" stroke="gainsboro" stroke-width="6" y2="165" x2="30" y1="165" x1="10"/> + <line id="svg_4" fill="none" stroke="gainsboro" stroke-width="6" y2="80" x2="60" y1="165" x1="30" stroke-linecap="round"/> + <line id="svg_5" fill="none" stroke="gainsboro" stroke-width="6" y2="120" x2="75" y1="80" x1="60" stroke-linecap="round"/> + <line id="svg_6" fill="none" stroke="gainsboro" stroke-width="6" y2="120" x2="85" y1="120" x1="75" stroke-linecap="round"/> + <line id="svg_7" fill="none" stroke="gainsboro" stroke-width="6" y2="20" x2="115" y1="120" x1="85" stroke-linecap="round"/> + <line id="svg_8" fill="none" stroke="gainsboro" stroke-width="6" y2="180" x2="160" y1="20" x1="115" stroke-linecap="round"/> + <line id="svg_9" fill="none" stroke="gainsboro" stroke-width="6" y2="180" x2="190" y1="180" x1="160"/> + </g> +</svg> diff --git a/navit/xpm/gui_layers.svg b/navit/xpm/gui_layers.svg new file mode 100644 index 000000000..810b5a1d6 --- /dev/null +++ b/navit/xpm/gui_layers.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="18.02128" height="18" id="svg5952">
+ <defs id="defs5954">
+ <linearGradient id="linearGradient2485-94">
+ <stop id="stop2486-7" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+ <stop id="stop2487-83" style="stop-color:#aaaaaa;stop-opacity:1" offset="1"/>
+ </linearGradient>
+ <linearGradient id="linearGradient5704-5">
+ <stop id="stop5706-120" style="stop-color:#5a5a5a;stop-opacity:1" offset="0"/>
+ <stop id="stop5708-16" style="stop-color:#000000;stop-opacity:1" offset="1"/>
+ </linearGradient>
+ <linearGradient x1="974.19751" y1="182.46863" x2="979.80444" y2="184.8026" id="linearGradient4351" xlink:href="#linearGradient2485-94" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-173.95451)"/>
+ <linearGradient x1="968.88806" y1="178.31856" x2="977.93347" y2="181.70978" id="linearGradient4353" xlink:href="#linearGradient5704-5" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-173.95451)"/>
+ <linearGradient x1="974.19751" y1="182.46863" x2="979.80444" y2="184.8026" id="linearGradient4356" xlink:href="#linearGradient2485-94" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-170.95451)"/>
+ <linearGradient x1="968.88806" y1="178.31856" x2="977.93347" y2="181.70978" id="linearGradient4358" xlink:href="#linearGradient5704-5" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-170.95451)"/>
+ <linearGradient x1="974.19751" y1="182.46863" x2="979.80444" y2="184.8026" id="linearGradient4362" xlink:href="#linearGradient2485-94" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-167.95454)"/>
+ <linearGradient x1="968.88806" y1="178.31856" x2="977.93347" y2="181.70978" id="linearGradient4364" xlink:href="#linearGradient5704-5" gradientUnits="userSpaceOnUse" gradientTransform="translate(-963.97872,-167.95454)"/>
+ </defs>
+ <metadata id="metadata5957">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <use transform="translate(-961.86731,-168.04527)" id="use13602" x="0" y="0" width="1250" height="1250" xlink:href="#rect12856"/>
+ <path d="m 5.5212776,14.545453 11.0000004,0 -4,-4.9999999 -11.0000004,0 4,4.9999999 z" id="use8977" style="color:#000000;fill:url(#linearGradient4362);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4364);stroke-width:0.99994743;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"/>
+ <path d="m 5.5212776,11.545483 11.0000004,0 -4,-4.9999999 -11.0000004,0 4,4.9999999 z" id="use8059" style="color:#000000;fill:url(#linearGradient4356);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4358);stroke-width:0.99994743;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"/>
+ <path d="m 5.5212776,8.5454831 11.0000004,0 -4,-5 -11.0000004,0 4,5 z" id="use8061" style="color:#000000;fill:url(#linearGradient4351);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4353);stroke-width:0.99994743;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"/>
+</svg>
\ No newline at end of file diff --git a/navit/xpm/ic_notify.svg b/navit/xpm/ic_notify.svg new file mode 100644 index 000000000..8bf846dae --- /dev/null +++ b/navit/xpm/ic_notify.svg @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="22" + height="22" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + version="1.0" + sodipodi:docname="ic_notify.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/michael/src/navit/navit/android/res/drawable-hdpi/ic_notify.png" + inkscape:export-xdpi="147.27" + inkscape:export-ydpi="147.27"> + <defs + id="defs4"> + <linearGradient + id="linearGradient3365"> + <stop + style="stop-color:#ffffff;stop-opacity:0.61904764;" + offset="0" + id="stop3367" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3369" /> + </linearGradient> + <linearGradient + id="linearGradient3320"> + <stop + style="stop-color:#116cbf;stop-opacity:1;" + offset="0" + id="stop3322" /> + <stop + id="stop3354" + offset="0.08" + style="stop-color:#116cbf;stop-opacity:1;" /> + <stop + id="stop3352" + offset="0.4893617" + style="stop-color:#1a6cb6;stop-opacity:1;" /> + <stop + style="stop-color:#329eff;stop-opacity:1;" + offset="1" + id="stop3324" /> + </linearGradient> + <linearGradient + id="linearGradient3308"> + <stop + style="stop-color:#062643;stop-opacity:1;" + offset="0" + id="stop3310" /> + <stop + style="stop-color:#0d5799;stop-opacity:1;" + offset="1" + id="stop3312" /> + </linearGradient> + <linearGradient + id="linearGradient3235"> + <stop + style="stop-color:#c17d11;stop-opacity:1;" + offset="0" + id="stop3237" /> + <stop + style="stop-color:#e9cb14;stop-opacity:1;" + offset="1" + id="stop3239" /> + </linearGradient> + <linearGradient + id="linearGradient3227"> + <stop + style="stop-color:#76650c;stop-opacity:1;" + offset="0" + id="stop3229" /> + <stop + style="stop-color:#76650c;stop-opacity:0;" + offset="1" + id="stop3231" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="15.556349 : 133.02972 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="744.09448 : 526.18109 : 1" + inkscape:persp3d-origin="372.04724 : 350.78739 : 1" + id="perspective10" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3308" + id="linearGradient3314" + x1="-7.7781754" + y1="4.2563133" + x2="43.133514" + y2="4.2563133" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="33.636364" + inkscape:cx="10.429299" + inkscape:cy="11" + inkscape:document-units="px" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:window-width="1280" + inkscape:window-height="948" + inkscape:window-x="0" + inkscape:window-y="24" + showborder="true" + inkscape:window-maximized="1" + inkscape:object-paths="true" + inkscape:snap-bbox="false" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:object-nodes="true" + showguides="false" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Calque 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline" /> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="lignes" + style="display:inline"> + <path + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.79098374;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + d="m 3.1845705,2.9140622 c -1.0886716,0 -1.9765625,0.8878909 -1.9765625,1.9765625 l 0,5.6269533 C 2.9051239,9.2613772 5.0602154,8.3513287 7.0419924,8.0273435 l -2.625,-0.9511719 0.056641,-0.4589844 c 2.9757823,-0.3155887 5.8357996,0.1963758 8.5898436,1.375 l 0.216797,0.091797 -2.070313,4.9648438 -0.955078,-2.207031 c -2.0698525,1.111236 -3.5135663,3.176209 -4.333984,6.246094 l -0.089844,0.333984 -4.6230469,-3.347656 0,3.035156 c 0,1.088672 0.8878909,1.976563 1.9765625,1.976563 l 15.6289064,0 c 1.088671,0 1.978515,-0.887891 1.978515,-1.976563 l 0,-12.2187502 c 0,-1.0886716 -0.889844,-1.9765625 -1.978515,-1.9765625 l -15.6289064,0 z" + id="path4971" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:groupmode="layer" + id="layer4" + inkscape:label="bulle" + style="display:none"> + <path + sodipodi:type="arc" + style="fill:url(#linearGradient3314);fill-opacity:1;stroke:#1f3157;stroke-width:5.30526352;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="path3305" + sodipodi:cx="17.67767" + sodipodi:cy="4.2563133" + sodipodi:rx="25.455845" + sodipodi:ry="25.455845" + d="m 43.133514,4.2563133 a 25.455845,25.455845 0 1 1 -50.9116894,0 25.455845,25.455845 0 1 1 50.9116894,0 z" + transform="matrix(1.3194444,0,0,1.3194444,18.394598,29.399489)" /> + </g> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="rose des vents" + style="display:none"> + <g + id="g3256" + transform="matrix(0.7071068,0.7071068,-0.7071068,0.7071068,36.903806,-19.093669)" + style="opacity:0.5"> + <path + transform="translate(67.5,7)" + d="m -25.999999,61.185085 -5.673657,-27.511429 -27.511429,-5.673655 27.511429,-5.673657 5.673655,-27.5114293 5.673657,27.5114293 27.5114293,5.673655 -27.5114293,5.673657 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="2.3561945" + sodipodi:arg1="1.5707963" + sodipodi:r2="8.0237608" + sodipodi:r1="33.185085" + sodipodi:cy="28" + sodipodi:cx="-26" + sodipodi:sides="4" + id="path3258" + style="fill:#167bd9;fill-opacity:1;stroke:none" + sodipodi:type="star" /> + <path + transform="translate(67.5,7)" + d="m -25.999999,61.185085 6.826343,-33.011429 -40.011429,-0.173655 33.011429,6.826343 0.173655,-40.0114293 -6.826343,33.0114293 40.0114293,0.173655 -33.0114293,-6.826343 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="0.025433549" + sodipodi:arg1="1.5707963" + sodipodi:r2="6.8285527" + sodipodi:r1="33.185085" + sodipodi:cy="28" + sodipodi:cx="-26" + sodipodi:sides="4" + id="path3260" + style="fill:#c3dff9;fill-opacity:1;stroke:none" + sodipodi:type="star" /> + </g> + <g + id="g3252"> + <path + transform="translate(67.5,7)" + d="m -25.999999,61.185085 -5.673657,-27.511429 -27.511429,-5.673655 27.511429,-5.673657 5.673655,-27.5114293 5.673657,27.5114293 27.5114293,5.673655 -27.5114293,5.673657 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="2.3561945" + sodipodi:arg1="1.5707963" + sodipodi:r2="8.0237608" + sodipodi:r1="33.185085" + sodipodi:cy="28" + sodipodi:cx="-26" + sodipodi:sides="4" + id="path3248" + style="fill:#167bd9;fill-opacity:1;stroke:none" + sodipodi:type="star" /> + <path + transform="translate(67.5,7)" + d="m -25.999999,61.185085 6.826343,-33.011429 -40.011429,-0.173655 33.011429,6.826343 0.173655,-40.0114293 -6.826343,33.0114293 40.0114293,0.173655 -33.0114293,-6.826343 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="false" + sodipodi:arg2="0.025433549" + sodipodi:arg1="1.5707963" + sodipodi:r2="6.8285527" + sodipodi:r1="33.185085" + sodipodi:cy="28" + sodipodi:cx="-26" + sodipodi:sides="4" + id="path3250" + style="fill:#c3dff9;fill-opacity:1;stroke:none" + sodipodi:type="star" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer6" + inkscape:label="ondes" + style="display:inline" /> + <g + inkscape:groupmode="layer" + id="layer5" + inkscape:label="flèche" + style="display:inline" /> +</svg> diff --git a/navit/xslt/android.xslt b/navit/xslt/android.xslt index 28b9d8245..19b0855f8 100644 --- a/navit/xslt/android.xslt +++ b/navit/xslt/android.xslt @@ -4,11 +4,13 @@ <xsl:param name="ICON_SMALL" select="32"/> <xsl:param name="ICON_MEDIUM" select="32"/> <xsl:param name="ICON_BIG" select="64"/> + <xsl:param name="OSD_USE_OVERLAY">yes</xsl:param> <xsl:output method="xml" doctype-system="navit.dtd" cdata-section-elements="gui"/> <xsl:include href="default_plugins.xslt"/> <xsl:include href="map_sdcard_navitmap_bin.xslt"/> <xsl:include href="osd_minimum.xslt"/> + <xsl:include href="osd_android.xslt"/> <xsl:include href="cursor_scale.xslt"/> <xsl:template match="/config/plugins/plugin[1]" priority="100"> <plugin path="$NAVIT_PREFIX/lib/lib*.so" ondemand="yes"/> diff --git a/navit/xslt/android_all_densities.xslt b/navit/xslt/android_all_densities.xslt deleted file mode 100644 index 8ec64d330..000000000 --- a/navit/xslt/android_all_densities.xslt +++ /dev/null @@ -1,1471 +0,0 @@ -<?xml version="1.0"?> -<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude"> - <xsl:output method="xml" doctype-system="navit.dtd" cdata-section-elements="gui"/> - <xsl:variable name="OSD_FACTOR_"> - <xsl:choose> - <xsl:when test="string-length($OSD_FACTOR)"><xsl:value-of select="$OSD_FACTOR"/></xsl:when> - <xsl:otherwise>1</xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="CAR_FACTOR_"> - <xsl:choose> - <xsl:when test="string-length($CAR_FACTOR)"><xsl:value-of select="$CAR_FACTOR"/></xsl:when> - <xsl:otherwise>1</xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:include href="default_plugins.xslt"/> - <!--<xsl:include href="map_sdcard_navitmap_bin.xslt"/>--> - <xsl:include href="map_secondary_sdcard_navitmap_bin.xslt"/> - <xsl:include href="osd_android_minimum.xslt"/> - <xsl:template match="/config/plugins/plugin[1]" priority="100"> - <plugin path="$NAVIT_PREFIX/lib/libgraphics_android.so" ondemand="no"/> - <xsl:text>
 </xsl:text> - <plugin path="$NAVIT_PREFIX/lib/libvehicle_android.so" ondemand="no"/> - <xsl:text>
 </xsl:text> - <plugin path="$NAVIT_PREFIX/lib/libspeech_android.so" ondemand="no"/> - <xsl:text>
 </xsl:text> - <xsl:next-match/> - </xsl:template> - <xsl:template match="/config/navit/graphics"> - <graphics type="android" /> - </xsl:template> - <!-- make gui fonts bigger --> - <xsl:template match="/config/navit/gui[2]"> - <xsl:copy><xsl:copy-of select="@*[not(name()='font_size')]"/> - <xsl:attribute name="font_size"><xsl:value-of select="$MENU_VALUE_FONTSIZE"/></xsl:attribute> - <xsl:attribute name="icon_xs"><xsl:value-of select="$MENU_VALUE_ICONS_XS"/></xsl:attribute> - <xsl:attribute name="icon_s"><xsl:value-of select="$MENU_VALUE_ICONS_S"/></xsl:attribute> - <xsl:attribute name="icon_l"><xsl:value-of select="$MENU_VALUE_ICONS_L"/></xsl:attribute> - <xsl:attribute name="spacing"><xsl:value-of select="$MENU_VALUE_SPACING"/></xsl:attribute> - <xsl:apply-templates/></xsl:copy> - </xsl:template> - <!-- make gui fonts bigger --> - <!-- after map drag jump to position, initial zoom --> - <xsl:template match="/config/navit[1]"> - <xsl:copy><xsl:copy-of select="@*"/> - <!--<xsl:attribute name="timeout">0</xsl:attribute>--> - <xsl:attribute name="zoom">32</xsl:attribute> - <xsl:apply-templates/></xsl:copy> - </xsl:template> - <!-- after map drag jump to position, initial zoom --> - <xsl:template match="/config/navit/vehicle[1]"> - <xsl:copy><xsl:copy-of select="@*[not(name()='gpsd_query')]"/> - <xsl:attribute name="source">android:</xsl:attribute> - <xsl:attribute name="follow">1</xsl:attribute> - <xsl:apply-templates/></xsl:copy> - </xsl:template> - <!-- add new default look-and-feel for android --> - <xsl:template match="/config/navit/layout[1]"> -<layout name="Android-Car" color="#fef9ee" font="Liberation Sans"> - <xsl:text>
 </xsl:text> - <cursor w="{round(30*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" h="{round(32*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"> - <xsl:text>
 </xsl:text> - <itemgra speed_range="-2"> - <polyline color="#00BC00" radius="{round(0*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" width="{round(3*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"> - <coord x="0" y="0"/> - </polyline> - <circle color="#008500" radius="{round(6*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" width="{round(2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"> - <coord x="0" y="0"/> - </circle> - <circle color="#00BC00" radius="{round(9*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" width="{round(2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"> - <coord x="0" y="0"/> - </circle> - <circle color="#008500" radius="{round(13*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" width="{round(2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"> - <coord x="0" y="0"/> - </circle> - </itemgra> - <xsl:text>
 </xsl:text> - <itemgra speed_range="3-"> - <polygon color="#00000066"> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-18*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(8*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-18*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(-8*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-18*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - </polygon> - <polygon color="#008500"> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(-2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - </polygon> - <polygon color="#00BC00"> - <coord x="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(-2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - </polygon> - <polyline color="#008500" width="2"> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(-2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(-14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - </polyline> - <polyline color="#008500" width="2"> - <coord x="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="0" y="{round(-2*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - <coord x="{round(14*number($CAR_FACTOR_)*number($OSD_FACTOR_))}" y="{round(-12*number($CAR_FACTOR_)*number($OSD_FACTOR_))}"/> - </polyline> - </itemgra> - <xsl:text>
 </xsl:text> - </cursor> - <xsl:text>
 </xsl:text> - <!-- android layout --> - <!-- android layout --> - <!-- android layout --> - <layer name="polygons"> - <itemgra item_types="poly_wood" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#8ec78d"/> - <text text_size="5"/> - </itemgra> - - <!-- ocean --> - <itemgra item_types="poly_water_tiled"> - <polygon color="#82c8ea"/> - </itemgra> - <!-- ocean --> - - <!-- rivers with text --> - <itemgra item_types="poly_water" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#82c8ea"/> - <polyline color="#5096b8"/> - <text text_size="5"/> - </itemgra> - <!-- rivers with text --> - - - <itemgra item_types="poly_flats,poly_scrub,poly_military_zone,poly_marine,plantation,tundra" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#a0a0a0"/> - <text text_size="5"/> - </itemgra> - <itemgra item_types="poly_park" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#7cc334"/> - <text text_size="5"/> - </itemgra> - <itemgra item_types="poly_pedestrian" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="13"/> - <polyline color="#dddddd" width="9"/> - <polygon color="#dddddd"/> - </itemgra> - <itemgra item_types="poly_pedestrian" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="18"/> - <polyline color="#dddddd" width="14"/> - <polygon color="#dddddd"/> - </itemgra> - <itemgra item_types="poly_pedestrian" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="21"/> - <polyline color="#dddddd" width="17"/> - <polygon color="#dddddd"/> - </itemgra> - <itemgra item_types="poly_pedestrian" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="25"/> - <polyline color="#dddddd" width="21"/> - <polygon color="#dddddd"/> - </itemgra> - <itemgra item_types="poly_pedestrian" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="40"/> - <polyline color="#dddddd" width="34"/> - <polygon color="#dddddd"/> - </itemgra> - <itemgra item_types="poly_airport" order="{round(5-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#a0a0a0"/> - </itemgra> - - <!-- - <itemgra item_types="poly_sport,poly_sports_pitch" order="0-"> - <polygon color="#4af04f"/> - </itemgra> - <itemgra item_types="poly_industry,poly_place" order="0-"> - <polygon color="#e6e6e6"/> - </itemgra> - --> - - <!-- - <itemgra item_types="poly_street_1" order="{round(8-number($LAYOUT_001_ORDER_DELTA_1))}-{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#ffffff"/> - <polyline color="#d2d2d2" width="1"/> - </itemgra> - <itemgra item_types="poly_street_1" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#ffffff"/> - <polyline color="#d2d2d2" width="2"/> - </itemgra> - <itemgra item_types="poly_street_1" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#ffffff"/> - <polyline color="#d2d2d2" width="3"/> - </itemgra> - --> - - - <!-- - <itemgra item_types="poly_street_2" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#c0c0c0" width="1"/> - </itemgra> - <itemgra item_types="poly_street_2" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#c0c0c0" width="2"/> - </itemgra> - <itemgra item_types="poly_street_2" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#c0c0c0" width="3"/> - </itemgra> - --> - - <!-- - <itemgra item_types="poly_street_3" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#a0a0a0" width="1"/> - </itemgra> - <itemgra item_types="poly_street_3" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#a0a0a0" width="2"/> - </itemgra> - <itemgra item_types="poly_street_3" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polygon color="#fefc8c"/> - <polyline color="#a0a0a0" width="3"/> - </itemgra> - --> - - - - <!-- - <itemgra item_types="water_line" order="0-"> - <polyline color="#5096b8" width="2"/> - <text text_size="5"/> - </itemgra> - --> - - <!-- - <itemgra item_types="water_river" order="0-{round(5-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#82c8ea" width="2"/> - </itemgra> - --> - <itemgra item_types="water_river" order="{round(6-number($LAYOUT_001_ORDER_DELTA_1))}-{round(7-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#82c8ea" width="3"/> - </itemgra> - <itemgra item_types="water_river" order="{round(8-number($LAYOUT_001_ORDER_DELTA_1))}-{round(9-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#82c8ea" width="4"/> - </itemgra> - <itemgra item_types="water_river" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#82c8ea" width="4"/> - <text text_size="10"/> - </itemgra> - <itemgra item_types="water_canal" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#82c8ea" width="3"/> - <text text_size="10"/> - </itemgra> - <itemgra item_types="water_stream" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#82c8ea" width="2"/> - <text text_size="7"/> - </itemgra> - <itemgra item_types="water_drain" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#82c8ea" width="1"/> - <text text_size="5"/> - </itemgra> - <itemgra item_types="poly_apron" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#d0d0d0"/> - </itemgra> - <itemgra item_types="poly_terminal" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#e3c6a6"/> - </itemgra> - <itemgra item_types="poly_car_parking" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#e7cf87"/> - </itemgra> - <itemgra item_types="poly_building" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polygon color="#b6a6a6"/> - </itemgra> - <itemgra item_types="rail" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#696969" width="3"/> - <polyline color="#ffffff" width="1" dash="5,5"/> - </itemgra> - <itemgra item_types="ferry" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1" dash="10"/> - </itemgra> - - - <itemgra item_types="border_country" order="0-{round(4-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#9b1199" width="8" /> - </itemgra> - <itemgra item_types="border_country" order="{round(5-number($LAYOUT_001_ORDER_DELTA_1))}-{round(7-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#9b1199" width="12" /> - </itemgra> - <itemgra item_types="border_country" order="{round(8-number($LAYOUT_001_ORDER_DELTA_1))}-{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#9b1199" width="20" dash="10,5"/> - </itemgra> - <itemgra item_types="border_country" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#9b1199" width="30" dash="10,5,2,1"/> - </itemgra> - - - </layer> - <layer name="streets"> - - <!-- route --> - <itemgra item_types="street_route" order="{round(2-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="8"/> - </itemgra> - <itemgra item_types="street_route" order="{round(3-number($LAYOUT_001_ORDER_DELTA_1))}-{round(5-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="10"/> - </itemgra> - <itemgra item_types="street_route" order="{round(6-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="12"/> - </itemgra> - <itemgra item_types="street_route" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="16"/> - </itemgra> - <itemgra item_types="street_route" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}-{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="20"/> - </itemgra> - <itemgra item_types="street_route" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="28"/> - </itemgra> - <itemgra item_types="street_route" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="32"/> - </itemgra> - <itemgra item_types="street_route" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="52"/> - </itemgra> - <itemgra item_types="street_route" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="64"/> - </itemgra> - <itemgra item_types="street_route" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="68"/> - </itemgra> - <itemgra item_types="street_route" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="132"/> - </itemgra> - <itemgra item_types="street_route" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="268"/> - </itemgra> - <itemgra item_types="street_route" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#69e068" width="530"/> - </itemgra> - <!-- route --> - - - - <itemgra item_types="selected_line" order="{round(2-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="4"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(3-number($LAYOUT_001_ORDER_DELTA_1))}-{round(5-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="8"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(6-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="10"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="16"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}-{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="20"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="28"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="32"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="52"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="64"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="68"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="132"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="268"/> - </itemgra> - <itemgra item_types="selected_line" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ba00b8" width="530"/> - </itemgra> - <itemgra item_types="forest_way_1" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#0070c0" width="6"/> - </itemgra> - <itemgra item_types="forest_way_2" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#ff0000" width="3"/> - </itemgra> - <itemgra item_types="forest_way_3" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#ff0000" width="1" dash="2,4"/> - </itemgra> - <itemgra item_types="forest_way_4" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#119a2e" width="1" dash="4,10"/> - </itemgra> - <itemgra item_types="street_nopass" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="track_paved" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="track_gravelled" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ffffff" width="4" dash="4,8"/> - <polyline color="#800000" width="2" dash="4,8"/> - </itemgra> - <itemgra item_types="track_gravelled" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ffffff" width="5" dash="5,10"/> - <polyline color="#800000" width="3" dash="5,10"/> - </itemgra> - <itemgra item_types="track_gravelled" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#ffffff" width="7" dash="7,15"/> - <polyline color="#800000" width="5" dash="7,15"/> - </itemgra> - <itemgra item_types="track_unpaved" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="bridleway" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="cycleway" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="lift_cable_car" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#696969" width="1" dash="5"/> - </itemgra> - <itemgra item_types="lift_chair" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#696969" width="1" dash="5"/> - </itemgra> - <itemgra item_types="lift_drag" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#696969" width="1" dash="5"/> - </itemgra> - <itemgra item_types="footway" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ffffff" width="5" dash="5,10"/> - <polyline color="#ff0000" width="3" dash="5,10"/> - </itemgra> - <itemgra item_types="footway" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#ffffff" width="7" dash="7,15"/> - <polyline color="#ff0000" width="5" dash="7,15"/> - </itemgra> - <itemgra item_types="steps" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#000000" width="1"/> - </itemgra> - <itemgra item_types="street_pedestrian,living_street" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="13"/> - <polyline color="#dddddd" width="9"/> - </itemgra> - <itemgra item_types="street_pedestrian,living_street" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="18"/> - <polyline color="#dddddd" width="14"/> - </itemgra> - <itemgra item_types="street_pedestrian,living_street" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="21"/> - <polyline color="#dddddd" width="17"/> - </itemgra> - <itemgra item_types="street_pedestrian,living_street" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="25"/> - <polyline color="#dddddd" width="21"/> - </itemgra> - <itemgra item_types="street_pedestrian,living_street" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="40"/> - <polyline color="#dddddd" width="34"/> - </itemgra> - <itemgra item_types="street_service" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="7"/> - <polyline color="#fefefe" width="5"/> - </itemgra> - <itemgra item_types="street_service" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="8"/> - <polyline color="#fefefe" width="6"/> - </itemgra> - <itemgra item_types="street_service" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="9"/> - <polyline color="#fefefe" width="7"/> - </itemgra> - <itemgra item_types="street_service" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="10"/> - <polyline color="#fefefe" width="8"/> - </itemgra> - <itemgra item_types="street_service" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="11"/> - <polyline color="#fefefe" width="9"/> - </itemgra> - <itemgra item_types="street_parking_lane" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="6"/> - <polyline color="#fefefe" width="4"/> - </itemgra> - <itemgra item_types="street_parking_lane" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="7"/> - <polyline color="#fefefe" width="5"/> - </itemgra> - <itemgra item_types="street_parking_lane" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="8"/> - <polyline color="#fefefe" width="6"/> - </itemgra> - <itemgra item_types="street_parking_lane" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="9"/> - <polyline color="#fefefe" width="7"/> - </itemgra> - - <!-- very small "white" street --> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="1"/> - </itemgra> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="17"/> - <polyline color="#ffffff" width="13"/> - </itemgra> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="18"/> - <polyline color="#ffffff" width="14"/> - </itemgra> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="30"/> - <polyline color="#ffffff" width="26"/> - </itemgra> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="67"/> - <polyline color="#ffffff" width="61"/> - </itemgra> - <itemgra item_types="street_0,street_1_city,street_1_land" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#d2d2d2" width="132"/> - <polyline color="#ffffff" width="126"/> - </itemgra> - - - <!-- small --> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}-{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="9"/> - <polyline color="#fefc8c" width="7"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="13"/> - <polyline color="#fefc8c" width="11"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="19"/> - <polyline color="#fefc8c" width="15"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="30"/> - <polyline color="#fefc8c" width="26"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="63"/> - <polyline color="#fefc8c" width="57"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,ramp" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#c0c0c0" width="100"/> - <polyline color="#fefc8c" width="90"/> - </itemgra> - - - <!-- little bigger --> - <!-- - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#e0e0e0" width="2"/> - </itemgra> - --> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}-{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="9"/> - <polyline color="#fefc8c" width="7"/> - </itemgra> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="21"/> - <polyline color="#fefc8c" width="17"/> - </itemgra> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="25"/> - <polyline color="#fefc8c" width="21"/> - </itemgra> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="40"/> - <polyline color="#fefc8c" width="34"/> - </itemgra> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="79"/> - <polyline color="#fefc8c" width="73"/> - </itemgra> - <itemgra item_types="street_3_city,street_3_land,roundabout" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a0a0a0" width="156"/> - <polyline color="#fefc8c" width="150"/> - </itemgra> - - - <!-- big --> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(2-number($LAYOUT_001_ORDER_DELTA_1))}-{round(6-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#f8dc79" width="4"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#404040" width="3"/>--> - <polyline color="#f8dc79" width="4"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#000000" width="5"/>--> - <polyline color="#f8dc79" width="5"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#000000" width="6"/>--> - <polyline color="#f8dc79" width="6"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="9"/> - <polyline color="#f8dc79" width="7"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="13"/> - <polyline color="#f8dc79" width="9"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="18"/> - <polyline color="#f8dc79" width="14"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="21"/> - <polyline color="#f8dc79" width="17"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="24"/> - <polyline color="#f8dc79" width="20"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="39"/> - <polyline color="#f8dc79" width="33"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="78"/> - <polyline color="#f8dc79" width="72"/> - </itemgra> - <itemgra item_types="street_4_city,street_4_land,street_n_lanes" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#000000" width="156"/> - <polyline color="#f8dc79" width="150"/> - </itemgra> - - - <!-- autobahn / highway --> - <itemgra item_types="highway_city,highway_land" order="0-{round(1-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#fc843b" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(2-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#fc843b" width="3"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(3-number($LAYOUT_001_ORDER_DELTA_1))}-{round(5-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#fc843b" width="6"/> - <!--<polyline color="#fc843b" width="3"/>--> - <!--<polyline color="#fc843b" width="1"/>--> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(6-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#a8aab3" width="4"/>--> - <polyline color="#fc843b" width="6"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#a8aab3" width="7"/>--> - <polyline color="#fc843b" width="6"/> - <!--<polyline color="#a8aab3" width="1"/>--> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#fc843b" width="7"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <!--<polyline color="#a8aab3" width="9"/>--> - <polyline color="#fc843b" width="9"/> - <!--<polyline color="#a8aab3" width="1"/>--> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="13"/> - <polyline color="#fc843b" width="9"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="15"/> - <polyline color="#fc843b" width="10"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="25"/> - <polyline color="#fc843b" width="17"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="31"/> - <polyline color="#fc843b" width="24"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="33"/> - <polyline color="#fc843b" width="27"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="65"/> - <polyline color="#fc843b" width="59"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="133"/> - <polyline color="#fc843b" width="127"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - <itemgra item_types="highway_city,highway_land" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#a8aab3" width="264"/> - <polyline color="#fc843b" width="258"/> - <polyline color="#a8aab3" width="1"/> - </itemgra> - - - - - - <itemgra item_types="highway_exit_label" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - - - <itemgra item_types="highway_city,highway_land,street_4_city,street_4_land,street_n_lanes" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <text text_size="8"/> - </itemgra> - <itemgra item_types="street_2_city,street_2_land,street_3_city,street_3_land,ramp" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <text text_size="9"/> - </itemgra> - <itemgra item_types="street_nopass,street_0,street_1_city,street_1_land" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <text text_size="9"/> - </itemgra> - - <itemgra item_types="traffic_distortion" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="8"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}-{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="10"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="14"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="16"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="26"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="32"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="34"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(16-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="66"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(17-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="134"/> - </itemgra> - <itemgra item_types="traffic_distortion" order="{round(18-number($LAYOUT_001_ORDER_DELTA_1))}"> - <polyline color="#ff9000" width="265"/> - </itemgra> - </layer> - <layer name="polylines"> - <itemgra item_types="rail_tram" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#606060" width="2"/> - </itemgra> - </layer> - <layer name="labels"> - <itemgra item_types="house_number" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - - - <itemgra item_types="town_label,district_label,town_label_0e0,town_label_1e0,town_label_2e0,town_label_5e0,town_label_1e1,town_label_2e1,town_label_5e1,town_label_1e2,town_label_2e2,town_label_5e2,district_label_0e0,district_label_1e0,district_label_2e0,district_label_5e0,district_label_1e1,district_label_2e1,district_label_5e1,district_label_1e2,district_label_2e2,district_label_5e2" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - - - <itemgra item_types="district_label_1e3,district_label_2e3,district_label_5e3" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - <itemgra item_types="town_label_1e3,place_label" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="district_label_1e4,district_label_2e4,district_label_5e4" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - <itemgra item_types="town_label_2e3" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="town_label_5e3,town_label_1e4,town_label_2e4,town_label_5e4" order="{round(11-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="15"/> - </itemgra> - <itemgra item_types="district_label_1e5,district_label_2e5,district_label_5e5" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - <itemgra item_types="town_label_2e3" order="{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - <itemgra item_types="district_label_1e6,district_label_2e6,district_label_5e6,district_label_1e7" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="7"/> - </itemgra> - <itemgra item_types="town_label_5e3" order="{round(9-number($LAYOUT_001_ORDER_DELTA_1))}-{round(10-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="town_label_1e4" order="{round(8-number($LAYOUT_001_ORDER_DELTA_1))}-{round(9-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="town_label_2e4,town_label_5e4" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-{round(8-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="town_label_1e5,town_label_2e5,town_label_5e5" order="{round(5-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="15"/> - </itemgra> - <itemgra item_types="town_label_1e6,town_label_2e6,town_label_5e6,town_label_1e7" order="{round(5-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#000000" radius="3" text_size="20"/> - </itemgra> - <itemgra item_types="town_label_1e5,town_label_2e5,town_label_5e5" order="{round(4-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - <itemgra item_types="town_label_1e6,town_label_2e6,town_label_5e6,town_label_1e7" order="{round(4-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="15"/> - </itemgra> - <itemgra item_types="town_label_1e6,town_label_2e6,town_label_5e6,town_label_1e7" order="0-{round(3-number($LAYOUT_001_ORDER_DELTA_1))}"> - <circle color="#000000" radius="3" text_size="10"/> - </itemgra> - </layer> - - - <layer name="Internal"> - <itemgra item_types="track" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#3f3f3f" width="1"/> - </itemgra> - <itemgra item_types="track_tracked" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#3f3fff" width="3"/> - </itemgra> - <itemgra item_types="rg_segment" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <polyline color="#FF089C" width="1"/> - <arrows color="#FF089C" width="1"/> - </itemgra> - <itemgra item_types="rg_point" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#FF089C" radius="10" text_size="7"/> - </itemgra> - <itemgra item_types="nav_left_1" order="0-"> - <icon src="nav_left_1_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_left_2" order="0-"> - <icon src="nav_left_2_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_left_3" order="0-"> - <icon src="nav_left_3_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_right_1" order="0-"> - <icon src="nav_right_1_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_right_2" order="0-"> - <icon src="nav_right_2_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_right_3" order="0-"> - <icon src="nav_right_3_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_straight" order="0-"> - <icon src="nav_straight_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_turnaround" order="0-"> - <icon src="nav_turnaround_left_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l1" order="0-"> - <icon src="nav_roundabout_l1_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r1" order="0-"> - <icon src="nav_roundabout_r1_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l2" order="0-"> - <icon src="nav_roundabout_l2_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r2" order="0-"> - <icon src="nav_roundabout_r2_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l3" order="0-"> - <icon src="nav_roundabout_l3_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r3" order="0-"> - <icon src="nav_roundabout_r3_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l4" order="0-"> - <icon src="nav_roundabout_l4_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r4" order="0-"> - <icon src="nav_roundabout_r4_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l5" order="0-"> - <icon src="nav_roundabout_l5_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r5" order="0-"> - <icon src="nav_roundabout_r5_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l6" order="0-"> - <icon src="nav_roundabout_l6_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r6" order="0-"> - <icon src="nav_roundabout_r6_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l7" order="0-"> - <icon src="nav_roundabout_l7_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r7" order="0-"> - <icon src="nav_roundabout_r7_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_l8" order="0-"> - <icon src="nav_roundabout_l8_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_roundabout_r8" order="0-"> - <icon src="nav_roundabout_r8_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="route_end" order="0-"> - <icon src="nav_destination_bk.png" w="32" h="32"/> - </itemgra> - <itemgra item_types="nav_none" order="0-"> - <icon src="unknown.png"/> - </itemgra> - <itemgra item_types="announcement" order="{round(7-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="gui_sound_32_32.png"/> - <circle color="#FF089C" radius="10" text_size="7"/> - </itemgra> - </layer> - - - <layer name="POI Symbols" active="1"> - <itemgra item_types="mini_roundabout" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="mini_roundabout.png"/> - </itemgra> - <itemgra item_types="turning_circle" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="mini_roundabout.png"/> - </itemgra> - <itemgra item_types="poi_airport" order="{round(6-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="airport.png"/> - </itemgra> - <itemgra item_types="poi_fuel" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="fuel.png"/> - </itemgra> - <itemgra item_types="poi_bridge" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="bridge.png"/> - </itemgra> - <itemgra item_types="highway_exit" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="exit.png"/> - </itemgra> - <itemgra item_types="poi_auto_club" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="auto_club.png"/> - </itemgra> - <itemgra item_types="poi_bank" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="bank.png"/> - </itemgra> - <itemgra item_types="poi_danger_area" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="danger_16_16.png"/> - </itemgra> - <itemgra item_types="poi_forbidden_area" order="{round(13-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="forbiden_area.png"/> - </itemgra> - <itemgra item_types="poi_tunnel" order="{round(12-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="tunnel.png"/> - </itemgra> - <itemgra item_types="traffic_signals" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <icon src="traffic_signals.png"/> - </itemgra> - </layer> - <layer name="POI Labels" active="1"> - <itemgra item_types="poi_airport,town_ghost,poi_hotel,poi_car_parking,poi_car_dealer_parts,poi_fuel,poi_shopping,poi_attraction,poi_cafe,poi_bar,highway_exit,poi_camp_rv,poi_museum_history,poi_hospital,poi_dining,poi_fastfood,poi_police,poi_autoservice,poi_bank,poi_bus_station,poi_bus_stop,poi_business_service,poi_car_rent,poi_church,poi_cinema,poi_concert,poi_drinking_water,poi_emergency,poi_fair,poi_fish,poi_government_building,poi_hotspring,poi_information,poi_justice,poi_landmark,poi_library,poi_mall,poi_manmade_feature,poi_marine,poi_marine_type,poi_mark,poi_oil_field,poi_peak,poi_personal_service,poi_pharmacy,poi_post_office,poi_public_office,poi_rail_halt,poi_rail_station,poi_rail_tram_stop,poi_repair_service,poi_resort,poi_restaurant,poi_restricted_area,poi_sailing,poi_scenic_area,poi_school,poi_service,poi_shop_retail,poi_skiing,poi_social_service,poi_sport,poi_stadium,poi_swimming,poi_theater,poi_townhall,poi_trail,poi_truck_stop,poi_tunnel,poi_worship,poi_wrecker,poi_zoo,poi_biergarten,poi_castle,poi_ruins,poi_memorial,poi_monument,poi_shelter,poi_fountain,poi_viewpoint,vehicle" order="{round(15-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#606060" radius="0" width="0" text_size="10"/> - </itemgra> - <!-- - <itemgra item_types="poi_custom0,poi_custom1,poi_custom2,poi_custom3,poi_custom4,poi_custom5,poi_custom6,poi_custom7,poi_custom8,poi_custom9,poi_customa,poi_customb,poi_customc,poi_customd,poi_custome,poi_customf" order="{round(14-number($LAYOUT_001_ORDER_DELTA_1))}-"> - <circle color="#606060" radius="0" width="0" text_size="10"/> - </itemgra> - --> - </layer> - - - <layer name="Android-POI-Icons-full" active="0"> - <itemgra item_types="mini_roundabout" order="12-"> - <icon src="mini_roundabout.png"/> - </itemgra> - <itemgra item_types="turning_circle" order="12-"> - <icon src="mini_roundabout.png"/> - </itemgra> - <itemgra item_types="poi_airport" order="5-"> - <icon src="airport.png"/> - </itemgra> - <itemgra item_types="town_ghost" order="10-"> - <icon src="ghost_town.png"/> - </itemgra> - <itemgra item_types="poi_hotel" order="12-"> - <icon src="hotel.png"/> - </itemgra> - <itemgra item_types="poi_car_parking" order="11-"> - <icon src="parking.png"/> - </itemgra> - <itemgra item_types="poi_car_dealer_parts" order="12-"> - <icon src="car_dealer.png"/> - </itemgra> - <itemgra item_types="poi_fuel" order="12-"> - <icon src="fuel.png"/> - </itemgra> - <itemgra item_types="poi_shopping" order="12-"> - <icon src="shopping.png"/> - </itemgra> - <itemgra item_types="poi_attraction" order="11-"> - <icon src="attraction.png"/> - </itemgra> - <itemgra item_types="poi_cafe" order="12-"> - <icon src="cafe.png"/> - </itemgra> - <itemgra item_types="poi_bar" order="12-"> - <icon src="bar.png"/> - </itemgra> - <itemgra item_types="poi_bridge" order="12-"> - <icon src="bridge.png"/> - </itemgra> - <itemgra item_types="highway_exit" order="11-"> - <icon src="exit.png"/> - </itemgra> - <itemgra item_types="poi_camp_rv" order="12-"> - <icon src="camping.png"/> - </itemgra> - <itemgra item_types="poi_museum_history" order="12-"> - <icon src="museum.png"/> - </itemgra> - <itemgra item_types="poi_hospital" order="12-"> - <icon src="hospital.png"/> - </itemgra> - <itemgra item_types="poi_dining" order="12-"> - <icon src="dining.png"/> - </itemgra> - <itemgra item_types="poi_fastfood" order="12-"> - <icon src="fastfood.png"/> - </itemgra> - <itemgra item_types="poi_police" order="12-"> - <icon src="police.png"/> - </itemgra> - <itemgra item_types="poi_auto_club" order="12-"> - <icon src="auto_club.png"/> - </itemgra> - <itemgra item_types="poi_autoservice" order="12-"> - <icon src="car_dealer.png"/> - </itemgra> - <itemgra item_types="poi_bank" order="12-"> - <icon src="bank.png"/> - </itemgra> - <itemgra item_types="poi_bay" order="12-"> - <icon src="bay.png"/> - </itemgra> - <itemgra item_types="poi_bend" order="12-"> - <icon src="bend.png"/> - </itemgra> - <itemgra item_types="poi_boat_ramp" order="12-"> - <icon src="boat_ramp.png"/> - </itemgra> - <itemgra item_types="poi_border_station" order="12-"> - <icon src="border_station.png"/> - </itemgra> - <itemgra item_types="poi_bowling" order="12-"> - <icon src="bowling.png"/> - </itemgra> - <itemgra item_types="poi_bus_station" order="11-"> - <icon src="bus.png"/> - </itemgra> - <itemgra item_types="poi_bus_stop" order="12-"> - <icon src="bus.png"/> - </itemgra> - <itemgra item_types="poi_business_service" order="12-"> - <icon src="bussines_service.png"/> - </itemgra> - <itemgra item_types="poi_car_rent" order="12-"> - <icon src="car_rent.png"/> - </itemgra> - <itemgra item_types="poi_car_wash" order="12-"> - <icon src="car_wash.png"/> - </itemgra> - <itemgra item_types="poi_casino" order="12-"> - <icon src="casino.png"/> - </itemgra> - <itemgra item_types="poi_cemetery" order="12-"> - <icon src="cemetery.png"/> - </itemgra> - <itemgra item_types="poi_church" order="11-"> - <icon src="church.png"/> - </itemgra> - <itemgra item_types="poi_cinema" order="12-"> - <icon src="cinema.png"/> - </itemgra> - <itemgra item_types="poi_communication" order="12-"> - <icon src="communication.png"/> - </itemgra> - <itemgra item_types="poi_concert" order="12-"> - <icon src="concert.png"/> - </itemgra> - <itemgra item_types="poi_cove" order="12-"> - <icon src="cove.png"/> - </itemgra> - <itemgra item_types="poi_crossing" order="12-"> - <icon src="crossing.png"/> - </itemgra> - <itemgra item_types="poi_dam" order="12-"> - <icon src="dam.png"/> - </itemgra> - <itemgra item_types="poi_danger_area" order="12-"> - <icon src="danger_16_16.png"/> - </itemgra> - <itemgra item_types="poi_danger_sea_wreck" order="12-"> - <icon src="dangerous.png"/> - </itemgra> - <itemgra item_types="poi_daymark" order="12-"> - <icon src="daymark.png"/> - </itemgra> - <itemgra item_types="poi_diving" order="12-"> - <icon src="diving.png"/> - </itemgra> - <itemgra item_types="poi_drinking_water" order="13-"> - <icon src="drinking_water.png"/> - </itemgra> - <itemgra item_types="poi_emergency" order="12-"> - <icon src="emergency.png"/> - </itemgra> - <itemgra item_types="poi_fair" order="12-"> - <icon src="fair.png"/> - </itemgra> - <itemgra item_types="poi_firebrigade" order="12-"> - <icon src="firebrigade.png"/> - </itemgra> - <itemgra item_types="poi_fish" order="9-"> - <icon src="fish.png"/> - </itemgra> - <itemgra item_types="poi_forbidden_area" order="12-"> - <icon src="forbiden_area.png"/> - </itemgra> - <itemgra item_types="poi_shop_gps" order="15-"> - <icon src="garmin.png"/> - </itemgra> - <itemgra item_types="poi_golf" order="12-"> - <icon src="golf.png"/> - </itemgra> - <itemgra item_types="poi_government_building" order="12-"> - <icon src="goverment_building.png"/> - </itemgra> - <itemgra item_types="poi_height" order="12-"> - <icon src="height.png"/> - </itemgra> - <itemgra item_types="poi_heliport" order="8-"> - <icon src="heliport.png"/> - </itemgra> - <itemgra item_types="poi_hotspring" order="12-"> - <icon src="hotspring.png"/> - </itemgra> - <itemgra item_types="poi_icesport" order="12-"> - <icon src="icesport.png"/> - </itemgra> - <itemgra item_types="poi_information" order="12-"> - <icon src="information.png"/> - </itemgra> - <itemgra item_types="poi_justice" order="12-"> - <icon src="justice.png"/> - </itemgra> - <itemgra item_types="poi_landmark" order="11-"> - <icon src="landmark.png"/> - </itemgra> - <itemgra item_types="poi_levee" order="12-"> - <icon src="levee.png"/> - </itemgra> - <itemgra item_types="poi_level_crossing" order="11-"> - <icon src="level_crossing.png"/> - </itemgra> - <itemgra item_types="poi_library" order="12-"> - <icon src="library.png"/> - </itemgra> - <itemgra item_types="poi_locale" order="12-"> - <icon src="locale.png"/> - </itemgra> - <itemgra item_types="poi_loudspeaker" order="12-"> - <icon src="loudspeaker.png"/> - </itemgra> - <itemgra item_types="poi_mall" order="12-"> - <icon src="mall.png"/> - </itemgra> - <itemgra item_types="poi_manmade_feature" order="12-"> - <icon src="manmade_feature.png"/> - </itemgra> - <itemgra item_types="poi_marine" order="12-"> - <icon src="marine.png"/> - </itemgra> - <itemgra item_types="poi_marine_type" order="12-"> - <icon src="marine_type.png"/> - </itemgra> - <itemgra item_types="poi_mark" order="12-"> - <icon src="mark.png"/> - </itemgra> - <itemgra item_types="poi_military" order="11-"> - <icon src="military.png"/> - </itemgra> - <itemgra item_types="poi_mine" order="12-"> - <icon src="mine.png"/> - </itemgra> - <itemgra item_types="poi_nondangerous" order="12-"> - <icon src="nondangerous.png"/> - </itemgra> - <itemgra item_types="poi_oil_field" order="12-"> - <icon src="oil_field.png"/> - </itemgra> - <itemgra item_types="poi_peak" order="7-"> - <icon src="peak.png"/> - </itemgra> - <itemgra item_types="poi_personal_service" order="12-"> - <icon src="personal_service.png"/> - </itemgra> - <itemgra item_types="poi_pharmacy" order="12-"> - <icon src="pharmacy.png"/> - </itemgra> - <itemgra item_types="poi_post_office,poi_post_box" order="13-"> - <icon src="post.png"/> - </itemgra> - <itemgra item_types="poi_public_office" order="12-"> - <icon src="public_office.png"/> - </itemgra> - <itemgra item_types="poi_rail_halt" order="11-"> - <circle color="#ff0000" radius="3" width="3"/> - <circle color="#000000" radius="5" width="2" text_size="8"/> - </itemgra> - <itemgra item_types="poi_rail_station" order="9-"> - <circle color="#ff0000" radius="3" width="3"/> - <circle color="#000000" radius="6" width="2" text_size="8"/> - </itemgra> - <itemgra item_types="poi_rail_tram_stop" order="10-11"> - <circle color="#ff0000" radius="2" width="2"/> - </itemgra> - <itemgra item_types="poi_rail_tram_stop" order="12-"> - <circle color="#ff0000" radius="3" width="3"/> - <circle color="#606060" radius="5" width="2" text_size="8"/> - </itemgra> - <itemgra item_types="poi_repair_service" order="12-"> - <icon src="repair_service.png"/> - </itemgra> - <itemgra item_types="poi_resort" order="12-"> - <icon src="resort.png"/> - </itemgra> - <itemgra item_types="poi_restaurant" order="12-"> - <icon src="restaurant.png"/> - </itemgra> - <itemgra item_types="poi_restricted_area" order="12-"> - <icon src="restricted_area.png"/> - </itemgra> - <itemgra item_types="poi_restroom" order="13-"> - <icon src="restroom.png"/> - </itemgra> - <itemgra item_types="poi_sailing" order="12-"> - <icon src="sailing.png"/> - </itemgra> - <itemgra item_types="poi_scenic_area" order="12-"> - <icon src="scenic_area.png"/> - </itemgra> - <itemgra item_types="poi_school" order="12-"> - <icon src="school.png"/> - </itemgra> - <itemgra item_types="poi_service" order="12-"> - <icon src="service.png"/> - </itemgra> - <itemgra item_types="poi_shop_apparel" order="12-"> - <icon src="shop_apparel.png"/> - </itemgra> - <itemgra item_types="poi_shop_computer" order="12-"> - <icon src="shop_computer.png"/> - </itemgra> - <itemgra item_types="poi_shop_department" order="12-"> - <icon src="shop_department.png"/> - </itemgra> - <itemgra item_types="poi_shop_furniture" order="12-"> - <icon src="shop_furnish.png"/> - </itemgra> - <itemgra item_types="poi_shop_grocery" order="12-"> - <icon src="shop_grocery.png"/> - </itemgra> - <itemgra item_types="poi_shop_handg" order="12-"> - <icon src="shop_handg.png"/> - </itemgra> - <itemgra item_types="poi_shop_merchandise" order="12-"> - <icon src="shop_merchandise.png"/> - </itemgra> - <itemgra item_types="poi_shop_retail" order="12-"> - <icon src="shop_retail.png"/> - </itemgra> - <itemgra item_types="poi_shower" order="13-"> - <icon src="shower.png"/> - </itemgra> - <itemgra item_types="poi_skiing" order="11-"> - <icon src="skiing.png"/> - </itemgra> - <itemgra item_types="poi_social_service" order="12-"> - <icon src="social_service.png"/> - </itemgra> - <itemgra item_types="poi_sounding" order="12-"> - <icon src="sounding.png"/> - </itemgra> - <itemgra item_types="poi_sport" order="12-"> - <icon src="sport.png"/> - </itemgra> - <itemgra item_types="poi_stadium" order="11-"> - <icon src="stadium.png"/> - </itemgra> - <itemgra item_types="poi_swimming" order="12-"> - <icon src="swimming.png"/> - </itemgra> - <itemgra item_types="poi_telephone" order="13-"> - <icon src="telephone.png"/> - </itemgra> - <itemgra item_types="poi_theater" order="12-"> - <icon src="theater.png"/> - </itemgra> - <itemgra item_types="poi_tide" order="12-"> - <icon src="tide.png"/> - </itemgra> - <itemgra item_types="poi_tower" order="13-"> - <icon src="tower.png"/> - </itemgra> - <itemgra item_types="poi_townhall" order="12-"> - <icon src="townhall.png"/> - </itemgra> - <itemgra item_types="poi_trail" order="12-"> - <icon src="trail.png"/> - </itemgra> - <itemgra item_types="poi_truck_stop" order="12-"> - <icon src="truck_stop.png"/> - </itemgra> - <itemgra item_types="poi_tunnel" order="12-"> - <icon src="tunnel.png"/> - </itemgra> - <itemgra item_types="poi_wine" order="12-"> - <icon src="wine.png"/> - </itemgra> - <itemgra item_types="poi_worship" order="8-"> - <icon src="worship.png"/> - </itemgra> - <itemgra item_types="poi_wrecker" order="12-"> - <icon src="wrecker.png"/> - </itemgra> - <itemgra item_types="poi_zoo" order="9-"> - <icon src="zoo.png"/> - </itemgra> - <itemgra item_types="poi_picnic" order="12-"> - <icon src="picnic.png"/> - </itemgra> - <itemgra item_types="poi_gc_multi" order="12-"> - <icon src="gc_multi.png"/> - </itemgra> - <itemgra item_types="poi_gc_tradi" order="12-"> - <icon src="gc_tradi.png"/> - </itemgra> - <itemgra item_types="poi_gc_event" order="12-"> - <icon src="gc_event.png"/> - </itemgra> - <itemgra item_types="poi_gc_mystery" order="12-"> - <icon src="gc_mystery.png"/> - </itemgra> - <itemgra item_types="poi_gc_question" order="12-"> - <icon src="gc_question.png"/> - </itemgra> - <itemgra item_types="poi_gc_stages" order="12-"> - <icon src="gc_stages.png"/> - </itemgra> - <itemgra item_types="poi_gc_reference" order="12-"> - <icon src="gc_reference.png"/> - </itemgra> - <itemgra item_types="poi_gc_webcam" order="12-"> - <icon src="gc_webcam.png"/> - </itemgra> - <itemgra item_types="traffic_signals" order="13-"> - <icon src="traffic_signals.png"/> - </itemgra> - <itemgra item_types="poi_wifi" order="13-"> - <icon src="wifi.png"/> - </itemgra> - <itemgra item_types="poi_image" order="12-"> - <image/> - </itemgra> - <!-- I'm not sure if the following stuff should appear in any layout. Maybe portions should only apply to the bicyle layout. --> - <itemgra item_types="poi_bench" order="13-"> - <icon src="bench.png"/> - </itemgra> - <itemgra item_types="poi_biergarten" order="12-"> - <icon src="biergarten.png"/> - </itemgra> - <itemgra item_types="poi_boundary_stone" order="13-"> - <icon src="boundary_stone.png"/> - </itemgra> - <itemgra item_types="poi_castle" order="11-"> - <icon src="castle.png"/> - </itemgra> - <itemgra item_types="poi_ruins" order="11-"> - <icon src="ruins.png"/> - </itemgra> - <itemgra item_types="poi_hunting_stand" order="12-"> - <icon src="hunting_stand.png"/> - </itemgra> - <itemgra item_types="poi_memorial" order="12-"> - <icon src="memorial.png"/> - </itemgra> - <itemgra item_types="poi_monument" order="12-"> - <icon src="memorial.png"/> - </itemgra> - <itemgra item_types="poi_shelter" order="11-"> - <icon src="shelter.png"/> - </itemgra> - <itemgra item_types="poi_fountain" order="13-"> - <icon src="fountain.png"/> - </itemgra> - <itemgra item_types="poi_potable_water" order="13-"> - <icon src="potable_water.png"/> - </itemgra> - <itemgra item_types="poi_toilets" order="12-"> - <icon src="toilets.png"/> - </itemgra> - <itemgra item_types="poi_viewpoint" order="10-"> - <icon src="viewpoint.png"/> - </itemgra> - <itemgra item_types="tec_common" order="11-"> - <icon src="tec_common.png" w="24" h="24"/> - </itemgra> - <itemgra item_types="vehicle" order="0-"> - <icon src="gui_vehicle_16_16.png"/> - </itemgra> - <itemgra item_types="vehicle_pedestrian" order="0-"> - <icon src="gui_vehicle_pedestrian_16_16.png"/> - </itemgra> - <itemgra item_types="poi_custom0,poi_custom1,poi_custom2,poi_custom3,poi_custom4,poi_custom5,poi_custom6,poi_custom7,poi_custom8,poi_custom9,poi_customa,poi_customb,poi_customc,poi_customd,poi_custome,poi_customf" order="10-"> - <icon src="%s"/> - </itemgra> - </layer> - <layer name="Android-POI-Labels-full" active="0"> - <itemgra item_types="poi_airport,town_ghost,poi_hotel,poi_car_parking,poi_car_dealer_parts,poi_fuel,poi_shopping,poi_attraction,poi_cafe,poi_bar,highway_exit,poi_camp_rv,poi_museum_history,poi_hospital,poi_dining,poi_fastfood,poi_police,poi_autoservice,poi_bank,poi_bus_station,poi_bus_stop,poi_business_service,poi_car_rent,poi_church,poi_cinema,poi_concert,poi_drinking_water,poi_emergency,poi_fair,poi_fish,poi_government_building,poi_hotspring,poi_information,poi_justice,poi_landmark,poi_library,poi_mall,poi_manmade_feature,poi_marine,poi_marine_type,poi_mark,poi_oil_field,poi_peak,poi_personal_service,poi_pharmacy,poi_post_office,poi_public_office,poi_rail_halt,poi_rail_station,poi_rail_tram_stop,poi_repair_service,poi_resort,poi_restaurant,poi_restricted_area,poi_sailing,poi_scenic_area,poi_school,poi_service,poi_shop_retail,poi_skiing,poi_social_service,poi_sport,poi_stadium,poi_swimming,poi_theater,poi_townhall,poi_trail,poi_truck_stop,poi_tunnel,poi_worship,poi_wrecker,poi_zoo,poi_biergarten,poi_castle,poi_ruins,poi_memorial,poi_monument,poi_shelter,poi_fountain,poi_viewpoint,vehicle" order="14-"> - <circle color="#606060" radius="0" width="0" text_size="10"/> - </itemgra> - <itemgra item_types="poi_custom0,poi_custom1,poi_custom2,poi_custom3,poi_custom4,poi_custom5,poi_custom6,poi_custom7,poi_custom8,poi_custom9,poi_customa,poi_customb,poi_customc,poi_customd,poi_custome,poi_customf" order="14-"> - <circle color="#606060" radius="0" width="0" text_size="10"/> - </itemgra> - </layer> - - - - <!-- android layout --> - <!-- android layout --> - <!-- android layout --> - <xsl:text>
 </xsl:text> -</layout> - <xsl:text>
 </xsl:text> - <xsl:copy><xsl:copy-of select="@*|node()"/></xsl:copy> - </xsl:template> - <xsl:template match="/config/navit/layout[@name='XXRouteXX']"> -<xsl:text>
 </xsl:text> - <layout name="Route"> -<xsl:text>
 </xsl:text> - <layer name="streets"> -<xsl:text>
 </xsl:text> - <itemgra item_types="street_route_occluded" order="0-"> -<xsl:text>
 </xsl:text> - <polyline color="#69e068" width="20"/> -<xsl:text>
 </xsl:text> - </itemgra> -<xsl:text>
 </xsl:text> - </layer> -<xsl:text>
 </xsl:text> - </layout> -<xsl:text>
 </xsl:text> - </xsl:template> - <!-- add new default look-and-feel for android --> - <xsl:template match="/config/navit/speech"> - <xsl:copy><xsl:copy-of select="@*[not(name()='data')]"/><xsl:attribute name="type">android</xsl:attribute><xsl:apply-templates/></xsl:copy> - </xsl:template> - <xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:template> -</xsl:transform> diff --git a/navit/xslt/iphone.xslt b/navit/xslt/iphone.xslt index f15d04938..1e9540503 100644 --- a/navit/xslt/iphone.xslt +++ b/navit/xslt/iphone.xslt @@ -4,6 +4,7 @@ <xsl:param name="ICON_SMALL" select="32"/> <xsl:param name="ICON_MEDIUM" select="32"/> <xsl:param name="ICON_BIG" select="64"/> + <xsl:param name="OSD_USE_OVERLAY">yes</xsl:param> <xsl:output method="xml" doctype-system="navit.dtd" cdata-section-elements="gui"/> <xsl:include href="osd_minimum.xslt"/> diff --git a/navit/xslt/osd_android.xslt b/navit/xslt/osd_android.xslt new file mode 100644 index 000000000..a15d4f34d --- /dev/null +++ b/navit/xslt/osd_android.xslt @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude"> + <xsl:template match="/config/navit/osd[last()]"> + <xsl:copy><xsl:copy-of select="@*|node()"/></xsl:copy> + <xsl:text>
 </xsl:text> + <osd type="button" src="gui_android_menu_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="graphics.menu()" x="{round(-60*number($OSD_SIZE))}" y="{round(48*number($OSD_SIZE))}" enable_expression="!has_menu_button" use_overlay="yes"/> + </xsl:template> +</xsl:transform> diff --git a/navit/xslt/osd_android_minimum.xslt b/navit/xslt/osd_android_minimum.xslt deleted file mode 100644 index 063e3b08f..000000000 --- a/navit/xslt/osd_android_minimum.xslt +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0"?> -<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude"> - <xsl:template match="/config/navit/osd[1]"> - <xsl:variable name="OSD_SIZE_"> - <xsl:choose> - <xsl:when test="string-length($OSD_SIZE)"><xsl:value-of select="$OSD_SIZE"/></xsl:when> - <xsl:otherwise>1</xsl:otherwise> - </xsl:choose> - </xsl:variable> - <xsl:variable name="OSD_FACTOR_"> - <xsl:choose> - <xsl:when test="string-length($OSD_FACTOR)"><xsl:value-of select="$OSD_FACTOR"/></xsl:when> - <xsl:otherwise>1</xsl:otherwise> - </xsl:choose> - </xsl:variable> - <osd type="compass" enabled="yes" x="{round(-60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" y="{round(-80*number($OSD_SIZE_)*number($OSD_FACTOR_))}" w="{round(60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" h="{round(80*number($OSD_SIZE_)*number($OSD_FACTOR_))}" font_size="{round(200*number($OSD_SIZE_)*number($OSD_FACTOR_))}" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <osd type="text" label="${{navigation.item.destination_length[named]}}\n${{navigation.item.destination_time[arrival]}}" x="{round(-60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" y="0" w="{round(60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" h="{round(40*number($OSD_SIZE_)*number($OSD_FACTOR_))}" font_size="{round(200*number($OSD_SIZE_)*number($OSD_FACTOR_))}" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <osd type="navigation_next_turn" x="0" y="{round(-60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" w="{round(60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" h="{round(60*number($OSD_SIZE_)*number($OSD_FACTOR_))-round(20*number($OSD_SIZE_))}" icon_src="%s_wh_{round(44*number($OSD_SIZE_))}_{round(44*number($OSD_SIZE_))}.png" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <osd type="text" label="${{navigation.item[1].length[named]}}" x="0" y="{round(-20*number($OSD_SIZE_))}" w="{round(60*number($OSD_SIZE_)*number($OSD_FACTOR_))}" h="{round(20*number($OSD_SIZE_))}" font_size="{round(200*number($OSD_SIZE_))}" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <osd type="button" src="gui_zoom_in_{round(48*number($OSD_SIZE_))}_{round(48*number($OSD_SIZE_))}.png" command="zoom_in()" x="0" y="0" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <osd type="button" src="gui_zoom_out_{round(48*number($OSD_SIZE_))}_{round(48*number($OSD_SIZE_))}.png" command="zoom_out()" x="0" y="{ round(round(53*number($OSD_SIZE_))*number($OSD_FACTOR_))}" osd_configuration="1"/> - <xsl:text>
 </xsl:text> - <xsl:copy><xsl:copy-of select="@*|node()"/></xsl:copy> - </xsl:template> -</xsl:transform> diff --git a/navit/xslt/osd_minimum.xslt b/navit/xslt/osd_minimum.xslt index cda88dc88..d392a7cce 100644 --- a/navit/xslt/osd_minimum.xslt +++ b/navit/xslt/osd_minimum.xslt @@ -3,6 +3,7 @@ <xsl:template match="/config/navit/osd[1]"> <xsl:param name="NEXT_TURN_SIZE"><xsl:value-of select="round(12*number($OSD_SIZE)+number($ICON_BIG))"/></xsl:param> <xsl:param name="NEXT_TURN_TEXT_HIGHT"><xsl:value-of select="round(20*number($OSD_SIZE))"/></xsl:param> + <xsl:param name="OSD_USE_OVERLAY"><xsl:value-of select="$OSD_USE_OVERLAY='yes' or $OSD_USE_OVERLAY='true' or $OSD_USE_OVERLAY='1'"/></xsl:param> <osd type="compass" enabled="yes" x="{round(-60*number($OSD_SIZE))}" y="{round(-80*number($OSD_SIZE))}" w="{round(60*number($OSD_SIZE))}" h="{round(80*number($OSD_SIZE))}" font_size="{round(200*number($OSD_SIZE))}" enable_expression="vehicle.position_valid"/> <xsl:text>
 </xsl:text> @@ -14,11 +15,11 @@ <xsl:text>
 </xsl:text> <osd type="text" label="${{navigation.item[1].length[named]}}" x="0" y="{-$NEXT_TURN_TEXT_HIGHT}" w="{$NEXT_TURN_SIZE+$NEXT_TURN_TEXT_HIGHT}" h="{$NEXT_TURN_TEXT_HIGHT}" font_size="{round(200*number($OSD_SIZE))}" enable_expression="navigation.nav_status>=3"/> <xsl:text>
 </xsl:text> - <osd type="button" src="gui_zoom_in_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="zoom_in()" x="0" y="0" osd_configuration="1"/> + <osd type="button" src="gui_zoom_in_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="zoom_in()" x="0" y="0" osd_configuration="1" use_overlay="{$OSD_USE_OVERLAY}"/> <xsl:text>
 </xsl:text> - <osd type="button" src="gui_zoom_out_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="zoom_out()" x="0" y="{round(number($ICON_BIG)+8*number($OSD_SIZE))}" osd_configuration="1"/> + <osd type="button" src="gui_zoom_out_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="zoom_out()" x="0" y="{round(number($ICON_BIG)+8*number($OSD_SIZE))}" osd_configuration="1" use_overlay="{$OSD_USE_OVERLAY}"/> <xsl:text>
 </xsl:text> - <osd type="button" src="cursor_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="follow=0;set_center_cursor()" x="{round(-60*number($OSD_SIZE))}" y="{round(40*number($OSD_SIZE))}" enable_expression="follow>1"/> + <osd type="button" src="cursor_{number($ICON_BIG)}_{number($ICON_BIG)}.png" command="follow=0;set_center_cursor()" x="{round(number($ICON_BIG)+8*number($OSD_SIZE))}" y="0" enable_expression="follow>1" use_overlay="{$OSD_USE_OVERLAY}"/> <xsl:text>
 </xsl:text> <xsl:copy><xsl:copy-of select="@*|node()"/></xsl:copy> </xsl:template> diff --git a/navit/xslt/tomtom.xslt b/navit/xslt/tomtom.xslt new file mode 100644 index 000000000..3e34d9224 --- /dev/null +++ b/navit/xslt/tomtom.xslt @@ -0,0 +1,62 @@ +<?xml version="1.0"?> +<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/XInclude" version="1.0"> + + <xsl:output method="xml" indent="yes" cdata-section-elements="gui" doctype-system="navit.dtd"/> + + <xsl:template match="/"> + <xsl:apply-templates select="config"/> + </xsl:template> + + <xsl:template match="config"> + <xsl:copy> + <xsl:apply-templates select="navit"/> + </xsl:copy> + </xsl:template> + + <xsl:template match="navit"> + <xsl:copy> + <xsl:attribute name="zoom">32</xsl:attribute> + <xsl:attribute name="tracking">1</xsl:attribute> + <xsl:attribute name="orientation">-1</xsl:attribute> + <xsl:attribute name="autozoom_active">1</xsl:attribute> + <xsl:attribute name="recent_dest">25</xsl:attribute> + <graphics type="sdl" w="480" h="272" bpp="16" frame="0" flags="1"/> + <xsl:copy-of select="gui[@type='internal']"/> + <osd enabled="yes" type="text" x="80" y="0" w="320" h="40" font_size="360" align="0" label="${{tracking.item.street_name}} ${{tracking.item.street_name_systematic}}" background_color="#00008080"/> + <osd enabled="yes" type="text" x="80" y="232" w="80" h="40" font_size="360" align="0" label="${{navigation.item[1].length[named]}}" background_color="#00008080"/> + <osd enabled="yes" type="text" x="160" y="232" w="240" h="40" font_size="360" align="0" label="${{vehicle.position_speed}} / ${{tracking.item.route_speed}}" background_color="#00008080"/> + <osd enabled="yes" type="text" x="400" y="232" w="80" h="40" font_size="360" align="0" label="${{navigation.item.destination_length[named]}}" background_color="#00008080"/> + <osd enabled="yes" type="text" x="400" y="192" w="80" h="40" font_size="360" align="0" label="${{navigation.item.destination_time[arrival]}}" background_color="#00008080"/> + <osd enabled="yes" type="compass" x="400" y="80" w="80" h="112" background_color="#00008080" font_size="300"/> + <osd enabled="yes" type="gps_status" x="0" y="80" w="80" h="40" background_color="#00008080"/> + <osd enabled="yes" type="speed_warner" x="0" y="120" w="80" h="72" background_color="#00008080" font_size="300"/> + <osd enabled="yes" type="navigation_next_turn" x="0" y="192" w="80" h="80" icon_w="48" icon_h="48" icon_src="%s_wh_48_48.png" background_color="#00008080"/> + <osd enabled="yes" type="button" x="400" y="0" command="zoom_in()" src="tomtom_plus_80_80.png"/> + <osd enabled="yes" type="button" x="0" y="0" command="zoom_out()" src="tomtom_minus_80_80.png"/> + <vehicle name="Local GPS" profilename="car" enabled="yes" active="yes" follow="1" source="file:/var/run/gpspipe"> + <!-- Navit can write a tracklog in several formats (gpx, nmea or textfile): --> + <log enabled="no" type="gpx" attr_types="position_time_iso8601,position_direction,position_speed,position_radius" data="/mnt/sdcard/navit/track_%Y%m%d-%%i.gpx" flush_size="1000" flush_time="30"/> + </vehicle> + <vehicle name="Demo" profilename="car" enabled="yes" active="no" follow="1" source="demo://" speed="100"/> + <xsl:copy-of select="tracking"/> + + <xsl:copy-of select="vehicleprofile[@name='car']"/> + <xsl:copy-of select="vehicleprofile[@name='car_shortest']"/> + <xsl:copy-of select="vehicleprofile[@name='car_avoid_tolls']"/> + <xsl:copy-of select="vehicleprofile[@name='bike']"/> + <xsl:copy-of select="vehicleprofile[@name='pedestrian']"/> + + <xsl:copy-of select="route"/> + <xsl:copy-of select="navigation"/> + + <xsl:comment>Use espeak.</xsl:comment> + <speech type="cmdline" data="/mnt/sdcard/navit/bin/espeakdsp -v en '%s'"/> + + <mapset enabled="yes"> + <map type="binfile" enabled="yes" data="$NAVIT_SHAREDIR/maps/*.bin"/> + </mapset> + <xsl:copy-of select="layer"/> + <xsl:copy-of select="layout"/> + </xsl:copy> + </xsl:template> +</xsl:transform> |